1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-23 17:34:34 +03:00
samba-mirror/source4/libcli/smb2/smb2_calls.h
2007-10-10 13:46:18 -05:00

339 lines
7.0 KiB
C

/*
Unix SMB/CIFS implementation.
SMB2 client calls
Copyright (C) Andrew Tridgell 2005
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
struct smb2_negprot {
struct {
uint32_t unknown1; /* 0x00010024 */
uint16_t unknown2; /* 0x00 */
uint8_t unknown3[32]; /* all zero */
} in;
struct {
uint16_t buffer_code;
uint16_t _pad;
uint32_t unknown2; /* 0x06 */
uint8_t sessid[16];
uint32_t unknown3; /* 0x0d */
uint16_t unknown4; /* 0x00 */
uint32_t unknown5; /* 0x01 */
uint32_t unknown6; /* 0x01 */
uint16_t unknown7; /* 0x01 */
NTTIME current_time;
NTTIME boot_time;
uint16_t unknown8; /* 0x80 */
/* uint16_t secblob size here */
uint32_t unknown9; /* 0x204d4c20 */
DATA_BLOB secblob;
} out;
};
struct smb2_session_setup {
struct {
uint32_t unknown1; /* 0x11 */
uint32_t unknown2; /* 0xF */
uint32_t unknown3; /* 0x00 */
/* uint16_t secblob ofs/size here */
DATA_BLOB secblob;
} in;
struct {
uint16_t buffer_code;
uint16_t _pad;
/* uint16_t secblob ofs/size here */
DATA_BLOB secblob;
uint64_t uid; /* returned in header */
} out;
};
struct smb2_tree_connect {
struct {
uint32_t unknown1; /* 0x09 */
const char *path;
} in;
struct {
uint16_t buffer_code;
uint16_t unknown1; /* 0x02 */
uint32_t unknown2; /* 0x00 */
uint32_t unknown3; /* 0x00 */
uint32_t access_mask;
uint32_t tid;
} out;
};
/*
file handles in SMB2 are 16 bytes
*/
struct smb2_handle {
uint64_t data[2];
};
#define SMB2_CREATE_FLAG_REQUEST_OPLOCK 0x0100
#define SMB2_CREATE_FLAG_REQUEST_EXCLUSIVE_OPLOCK 0x0800
#define SMB2_CREATE_FLAG_GRANT_OPLOCK 0x0001
#define SMB2_CREATE_FLAG_GRANT_EXCLUSIVE_OPLOCK 0x0080
struct smb2_create {
struct {
uint16_t buffer_code; /* 0x39 */
uint16_t oplock_flags; /* SMB2_CREATE_FLAG_* */
uint32_t unknown2;
uint32_t unknown3[4];
uint32_t access_mask;
uint32_t file_attr;
uint32_t share_access;
uint32_t open_disposition;
uint32_t create_options;
/* ofs/len of name here, 16 bits */
uint32_t unknown6;
const char *fname;
uint32_t unknown7;
uint32_t unknown8;
uint32_t unknown9;
uint32_t unknown10;
uint64_t unknown11;
} in;
struct {
uint16_t buffer_code; /* 0x59 */
uint16_t oplock_flags; /* SMB2_CREATE_FLAG_* */
uint32_t create_action;
NTTIME create_time;
NTTIME access_time;
NTTIME write_time;
NTTIME change_time;
uint64_t alloc_size;
uint64_t size;
uint32_t file_attr;
uint32_t _pad;
struct smb2_handle handle;
uint32_t unknown4;
uint32_t unknown5;
} out;
};
#define SMB2_CLOSE_FLAGS_FULL_INFORMATION (1<<0)
struct smb2_close {
struct {
uint16_t buffer_code;
uint16_t flags; /* SMB2_CLOSE_FLAGS_* */
uint32_t _pad;
struct smb2_handle handle;
} in;
struct {
uint16_t buffer_code;
uint16_t flags;
uint32_t _pad;
NTTIME create_time;
NTTIME access_time;
NTTIME write_time;
NTTIME change_time;
uint64_t alloc_size;
uint64_t size;
uint32_t file_attr;
} out;
};
/* fs information levels */
#define SMB2_GETINFO_FS_01 0x0102
#define SMB2_GETINFO_FS_03 0x0302
#define SMB2_GETINFO_FS_04 0x0402
#define SMB2_GETINFO_FS_ATTRIB_INFO 0x0502
#define SMB2_GETINFO_FS_06 0x0602
#define SMB2_GETINFO_FS_07 0x0702
#define SMB2_GETINFO_FS_08 0x0802
/* class 3 levels */
#define SMB2_GETINFO_SECURITY 0x0003
/* file information levels */
#define SMB2_GETINFO_FILE_BASIC_INFO 0x0401
#define SMB2_GETINFO_FILE_SIZE_INFO 0x0501
#define SMB2_GETINFO_FILE_ID 0x0601
#define SMB2_GETINFO_FILE_EA_SIZE 0x0701
#define SMB2_GETINFO_FILE_ACCESS_INFO 0x0801
#define SMB2_GETINFO_FILE_0E 0x0e01
#define SMB2_GETINFO_FILE_ALL_EAS 0x0f01
#define SMB2_GETINFO_FILE_10 0x1001
#define SMB2_GETINFO_FILE_11 0x1101
#define SMB2_GETINFO_FILE_ALL_INFO 0x1201
#define SMB2_GETINFO_FILE_SHORT_INFO 0x1501
#define SMB2_GETINFO_FILE_STREAM_INFO 0x1601
#define SMB2_GETINFO_FILE_EOF_INFO 0x1c01
#define SMB2_GETINFO_FILE_STANDARD_INFO 0x2201
#define SMB2_GETINFO_FILE_ATTRIB_INFO 0x2301
struct smb2_getinfo {
struct {
uint16_t buffer_code;
uint16_t level;
uint32_t max_response_size;
uint32_t unknown1;
uint32_t flags; /* level specific */
uint32_t unknown3;
uint32_t unknown4;
struct smb2_handle handle;
} in;
struct {
uint16_t buffer_code;
DATA_BLOB blob;
} out;
};
union smb2_fileinfo {
struct {
NTTIME create_time;
NTTIME access_time;
NTTIME write_time;
NTTIME change_time;
uint32_t file_attr;
uint32_t unknown;
} basic_info;
struct {
uint64_t alloc_size;
uint64_t size;
uint32_t nlink;
uint8_t delete_pending;
uint8_t directory;
} size_info;
struct {
uint64_t file_id;
} file_id;
struct {
uint32_t ea_size;
} ea_size;
struct {
uint32_t access_mask;
} access_info;
struct {
uint32_t unknown1;
uint32_t unknown2;
} unknown0e;
struct {
struct smb_ea_list eas;
} all_eas;
struct {
uint32_t unknown; /* 2 */
} unknown10;
struct {
uint32_t unknown;
} unknown11;
struct {
NTTIME create_time;
NTTIME access_time;
NTTIME write_time;
NTTIME change_time;
uint32_t file_attr;
/* uint32_t _pad; */
uint64_t alloc_size;
uint64_t size;
uint32_t nlink;
uint8_t delete_pending;
uint8_t directory;
/* uint16_t _pad; */
uint64_t file_id;
uint32_t ea_size;
uint32_t access_mask;
uint64_t unknown5;
uint64_t unknown6;
const char *fname;
} all_info;
struct {
const char *short_name;
} short_info;
struct stream_information stream_info;
struct {
uint64_t size;
uint64_t unknown;
} eof_info;
struct {
NTTIME create_time;
NTTIME access_time;
NTTIME write_time;
NTTIME change_time;
uint64_t alloc_size;
uint64_t size;
uint32_t file_attr;
uint32_t unknown;
} standard_info;
struct {
uint32_t file_attr;
uint32_t unknown;
} attrib_info;
struct {
struct security_descriptor *sd;
} security;
};
struct smb2_write {
struct {
uint16_t buffer_code;
uint64_t offset;
struct smb2_handle handle;
uint8_t _pad[16];
DATA_BLOB data;
} in;
struct {
uint16_t buffer_code;
uint16_t _pad;
uint32_t nwritten;
uint8_t unknown[9];
} out;
};
struct smb2_read {
struct {
uint16_t buffer_code;
uint32_t length;
uint64_t offset;
struct smb2_handle handle;
uint8_t _pad[17];
} in;
struct {
uint16_t buffer_code;
uint8_t unknown[8];
DATA_BLOB data;
} out;
};