29#ifndef DETERMINISTICESPASYNCWEBSERVER_SMB2_H
30#define DETERMINISTICESPASYNCWEBSERVER_SMB2_H
40enum class Smb2Command : uint16_t
42 SMB2_NEGOTIATE = 0x0000,
43 SMB2_SESSION_SETUP = 0x0001,
45 SMB2_TREE_CONNECT = 0x0003,
46 SMB2_TREE_DISCONNECT = 0x0004,
54enum class Smb2Dialect : uint16_t
56 SMB2_DIALECT_0202 = 0x0202,
57 SMB2_DIALECT_0210 = 0x0210,
58 SMB2_DIALECT_0300 = 0x0300,
59 SMB2_DIALECT_0302 = 0x0302,
60 SMB2_DIALECT_0311 = 0x0311,
68static constexpr uint32_t SMB2_HEADER_SIZE = 64;
71struct Smb2SecurityMode
73 static constexpr uint16_t SMB2_NEGOTIATE_SIGNING_ENABLED = 0x0001;
74 static constexpr uint16_t SMB2_NEGOTIATE_SIGNING_REQUIRED = 0x0002;
80 static constexpr uint32_t SMB2_FLAGS_SERVER_TO_REDIR = 0x00000001;
84struct Smb2SessionFlags
86 static constexpr uint16_t SMB2_SESSION_FLAG_IS_GUEST = 0x0001;
87 static constexpr uint16_t SMB2_SESSION_FLAG_IS_NULL = 0x0002;
88 static constexpr uint16_t SMB2_SESSION_FLAG_ENCRYPT_DATA = 0x0004;
94 static constexpr uint32_t SMB2_STATUS_SUCCESS = 0x00000000;
95 static constexpr uint32_t SMB2_STATUS_MORE_PROCESSING_REQUIRED = 0xC0000016;
96 static constexpr uint32_t SMB2_STATUS_END_OF_FILE = 0xC0000011;
102 static constexpr uint8_t SMB2_SHARE_TYPE_DISK = 0x01;
103 static constexpr uint8_t SMB2_SHARE_TYPE_PIPE = 0x02;
104 static constexpr uint8_t SMB2_SHARE_TYPE_PRINT = 0x03;
110 static constexpr uint32_t SMB2_FILE_READ_DATA = 0x00000001;
111 static constexpr uint32_t SMB2_FILE_WRITE_DATA = 0x00000002;
112 static constexpr uint32_t SMB2_FILE_APPEND_DATA = 0x00000004;
113 static constexpr uint32_t SMB2_FILE_READ_ATTRIBUTES = 0x00000080;
114 static constexpr uint32_t SMB2_FILE_GENERIC_READ = 0x00120089;
115 static constexpr uint32_t SMB2_FILE_GENERIC_WRITE = 0x00120116;
119struct Smb2ShareAccess
121 static constexpr uint32_t SMB2_FILE_SHARE_READ = 0x01;
122 static constexpr uint32_t SMB2_FILE_SHARE_WRITE = 0x02;
123 static constexpr uint32_t SMB2_FILE_SHARE_DELETE = 0x04;
127struct Smb2Disposition
129 static constexpr uint32_t SMB2_FILE_SUPERSEDE = 0;
130 static constexpr uint32_t SMB2_FILE_OPEN = 1;
131 static constexpr uint32_t SMB2_FILE_CREATE = 2;
132 static constexpr uint32_t SMB2_FILE_OPEN_IF = 3;
133 static constexpr uint32_t SMB2_FILE_OVERWRITE = 4;
134 static constexpr uint32_t SMB2_FILE_OVERWRITE_IF = 5;
138struct Smb2CreateOptions
140 static constexpr uint32_t SMB2_FILE_DIRECTORY_FILE = 0x00000001;
141 static constexpr uint32_t SMB2_FILE_NON_DIRECTORY_FILE = 0x00000040;
153 uint16_t credit_response;
157struct Smb2NegotiateResp
159 uint16_t security_mode;
161 uint8_t server_guid[16];
162 uint32_t capabilities;
163 uint32_t max_transact;
166 const uint8_t *sec_buf;
167 uint16_t sec_buf_len;
175size_t smb2_transport_frame(uint8_t *out,
size_t cap,
const uint8_t *msg,
size_t msg_len);
182uint32_t smb2_transport_len(
const uint8_t *buf,
size_t len);
188size_t smb2_build_header(uint8_t *buf,
size_t cap, Smb2Command command, uint16_t credit_request, uint64_t message_id,
189 uint32_t tree_id, uint64_t session_id);
196bool smb2_parse_header(
const uint8_t *buf,
size_t len, Smb2Header *out);
204size_t smb2_build_negotiate(uint8_t *buf,
size_t cap,
const uint8_t client_guid[16], uint16_t security_mode);
214bool smb2_parse_negotiate_response(
const uint8_t *msg,
size_t len, Smb2NegotiateResp *out);
217struct Smb2SessionSetupResp
219 uint16_t session_flags;
220 const uint8_t *sec_buf;
221 uint16_t sec_buf_len;
236size_t smb2_build_session_setup(uint8_t *buf,
size_t cap, uint64_t message_id, uint64_t session_id,
237 uint8_t security_mode,
const uint8_t *sec_buf,
size_t sec_len);
251bool smb2_parse_session_setup_response(
const uint8_t *msg,
size_t len, Smb2SessionSetupResp *out);
258size_t smb2_build_tree_connect(uint8_t *buf,
size_t cap, uint64_t message_id, uint64_t session_id,
259 const uint8_t *path_utf16,
size_t path_len);
262struct Smb2TreeConnectResp
265 uint32_t share_flags;
266 uint32_t capabilities;
267 uint32_t maximal_access;
274bool smb2_parse_tree_connect_response(
const uint8_t *msg,
size_t len, Smb2TreeConnectResp *out);
286size_t smb2_build_create(uint8_t *buf,
size_t cap, uint64_t message_id, uint64_t session_id, uint32_t tree_id,
287 uint32_t desired_access, uint32_t share_access, uint32_t create_disposition,
288 uint32_t create_options,
const uint8_t *name_utf16,
size_t name_len);
294 uint64_t end_of_file;
295 uint32_t create_action;
296 uint32_t file_attributes;
303bool smb2_parse_create_response(
const uint8_t *msg,
size_t len, Smb2CreateResp *out);
309size_t smb2_build_close(uint8_t *buf,
size_t cap, uint64_t message_id, uint64_t session_id, uint32_t tree_id,
310 const uint8_t file_id[16]);
315 uint64_t end_of_file;
316 uint32_t file_attributes;
323bool smb2_parse_close_response(
const uint8_t *msg,
size_t len, Smb2CloseResp *out);
329size_t smb2_build_read(uint8_t *buf,
size_t cap, uint64_t message_id, uint64_t session_id, uint32_t tree_id,
330 const uint8_t file_id[16], uint32_t length, uint64_t offset);
343bool smb2_parse_read_response(
const uint8_t *msg,
size_t len, Smb2ReadResp *out);
349size_t smb2_build_write(uint8_t *buf,
size_t cap, uint64_t message_id, uint64_t session_id, uint32_t tree_id,
350 const uint8_t file_id[16],
const uint8_t *data,
size_t data_len, uint64_t offset);
362bool smb2_parse_write_response(
const uint8_t *msg,
size_t len, Smb2WriteResp *out);
User-facing configuration for DeterministicESPAsyncWebServer.