#ifndef __SMB_H__ #define __SMB_H__ #include #define SMB2_MAGIC 0x424d53fe // commands enum { SMB2_NEGOTIATE = 0x0000, SMB2_SESSION_SETUP = 0x0001, SMB2_LOGOFF = 0x0002, SMB2_TREE_CONNECT = 0x0003, SMB2_TREE_DISCONNECT = 0x0004, SMB2_CREATE = 0x0005, SMB2_CLOSE = 0x0006, SMB2_FLUSH = 0x0007, SMB2_READ = 0x0008, SMB2_WRITE = 0x0009, SMB2_LOCK = 0x000A, SMB2_IOCTL = 0x000B, SMB2_CANCEL = 0x000C, SMB2_ECHO = 0x000D, SMB2_QUERY_DIRECTORY = 0x000E, SMB2_CHANGE_NOTIFY = 0x000F, SMB2_QUERY_INFO = 0x0010, SMB2_SET_INFO = 0x0011, SMB2_OPLOCK_BREAK = 0x0012 }; // flags enum { SMB2_FLAGS_SERVER_TO_REDIR = 0x00000001, SMB2_FLAGS_ASYNC_COMMAND = 0x00000002, SMB2_FLAGS_RELATED_OPERATIONS = 0x00000004, SMB2_FLAGS_SIGNED = 0x00000008 // integer overflow /* SMB2_FLAGS_DFS_OPERATIONS = 0x10000000, SMB2_FLAGS_REPLAY_OPERATION = 0x20000000 */ }; #define SMB2_FLAGS_DFS_OPERATIONS 0x10000000 #define SMB2_FLAGS_REPLAY_OPERATION 0x20000000 // symlink error response flags. enum { SYMLINK_FLAG_RELATIVE = 0x00000001 }; // negotiate flags enum { SMB2_NEGOTIATE_SIGNING_ENABLED = 0x0001, SMB2_NEGOTIATE_SIGNING_REQUIRED = 0x0002, SMB2_GLOBAL_CAP_DFS = 0x00000001, SMB2_GLOBAL_CAP_LEASING = 0x00000002, SMB2_GLOBAL_CAP_LARGE_MTU = 0x00000004, SMB2_GLOBAL_CAP_MULTI_CHANNEL = 0x00000008, SMB2_GLOBAL_CAP_PERSISTENT_HANDLES = 0x00000010, SMB2_GLOBAL_CAP_DIRECTORY_LEASING = 0x00000020, SMB2_GLOBAL_CAP_ENCRYPTION = 0x00000040 }; // session setup flags enum { SMB2_SESSION_FLAG_BINDING = 0x01 }; // session setup response flags enum { SMB2_SESSION_FLAG_IS_GUEST = 0x0001, SMB2_SESSION_FLAG_IS_NULL = 0x0002, SMB2_SESSION_FLAG_ENCRYPT_DATA = 0x0004 }; typedef struct smb2_header_sync { uint32_t protocol_id; uint16_t structure_size; uint16_t credit_charge; uint32_t status; uint16_t command; uint16_t credit; // _request / _response uint32_t flags; uint32_t next_command; uint32_t message_id[2]; // uint64_t uint32_t reserved; uint32_t tree_id; uint32_t session_id[2]; // uint64_t uint8_t signature[16]; } smb2_header_sync; typedef struct smb2_error_response { uint16_t structure_size; uint16_t reserved; uint32_t bytecount; //uint8_t error_data[1]; // variable. } smb2_error_response; typedef struct smb2_negotiate_request { uint16_t structure_size; uint16_t dialect_count; uint16_t security_mode; uint16_t reserved; uint32_t capabilities; uint8_t client_guid[16]; uint32_t client_start_time[2]; //uint16_t dialects[1]; // variable sized. } smb2_negotiate_request; typedef struct smb2_negotiate_response { uint16_t structure_size; uint16_t security_mode; uint16_t dialect_revision; uint16_t reserved; uint8_t server_guid[16]; uint32_t capabilities; uint32_t max_transact_size; uint32_t max_read_size; uint32_t max_write_size; uint32_t server_start_time[2]; uint16_t security_buffer_offset; uint16_t security_buffer_length; uint32_t reserved2; //uint8_t buffer[1]; // variable } smb2_negotiate_response; typedef struct smb2_session_setup_request { uint16_t structure_size; uint8_t flags; uint8_t security_mode; uint32_t capabilities; uint32_t channel; uint16_t security_buffer_offset; uint16_t security_buffer_length; uint32_t previous_session_id[2]; //uint8t_t buffer[1]; // variable } smb2_sessions_setup_request; typedef struct smb2_session_setup_response { uint16_t structure_size; uint16_t session_flags; uint16_t security_buffer_offset; uint16_t security_buffer_length; //uint8t_t buffer[1]; // variable } smb2_session_setup_response; typedef struct smb2_logoff_request { uint16_t structure_size; uint16_t reserved; } smb2_logoff_request; typedef struct smb2_logoff_response { uint16_t structure_size; uint16_t reserved; } smb2_logoff_response; #endif