mirror of
https://github.com/ksherlock/gopher.git
synced 2024-09-29 22:55:06 +00:00
169 lines
3.8 KiB
C
169 lines
3.8 KiB
C
|
#ifndef __SMB_H__
|
||
|
#define __SMB_H__
|
||
|
|
||
|
#include <stdint.h>
|
||
|
|
||
|
#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
|