|
@@ -25,29 +25,29 @@
|
|
#include "bdsm/smb_utils.h"
|
|
#include "bdsm/smb_utils.h"
|
|
#include "bdsm/smb_stat.h"
|
|
#include "bdsm/smb_stat.h"
|
|
|
|
|
|
-static smb_file_t *smb_find_parse(smb_message_t *msg)
|
|
|
|
|
|
+static smb_file *smb_find_parse(smb_message *msg)
|
|
{
|
|
{
|
|
- smb_trans2_resp_t *tr2;
|
|
|
|
- smb_tr2_find2_params_t *params;
|
|
|
|
- smb_tr2_find2_entry_t *iter;
|
|
|
|
- smb_file_t *files, *tmp;
|
|
|
|
|
|
+ smb_trans2_resp *tr2;
|
|
|
|
+ smb_tr2_find2_params *params;
|
|
|
|
+ smb_tr2_find2_entry *iter;
|
|
|
|
+ smb_file *files, *tmp;
|
|
uint8_t *eod;
|
|
uint8_t *eod;
|
|
size_t count, i;
|
|
size_t count, i;
|
|
|
|
|
|
assert(msg != NULL);
|
|
assert(msg != NULL);
|
|
|
|
|
|
// Let's parse the answer we got from server
|
|
// Let's parse the answer we got from server
|
|
- tr2 = (smb_trans2_resp_t *)msg->packet->payload;
|
|
|
|
- params = (smb_tr2_find2_params_t *)tr2->payload;
|
|
|
|
- iter = (smb_tr2_find2_entry_t *)(tr2->payload + sizeof(smb_tr2_find2_params_t));
|
|
|
|
|
|
+ tr2 = (smb_trans2_resp *)msg->packet->payload;
|
|
|
|
+ params = (smb_tr2_find2_params *)tr2->payload;
|
|
|
|
+ iter = (smb_tr2_find2_entry *)(tr2->payload + sizeof(smb_tr2_find2_params));
|
|
eod = msg->packet->payload + msg->payload_size;
|
|
eod = msg->packet->payload + msg->payload_size;
|
|
count = params->count;
|
|
count = params->count;
|
|
files = NULL;
|
|
files = NULL;
|
|
|
|
|
|
for(i = 0; i < count && (uint8_t *)iter < eod; i++)
|
|
for(i = 0; i < count && (uint8_t *)iter < eod; i++)
|
|
{
|
|
{
|
|
- // Create a smb_file_t and fill it
|
|
|
|
- tmp = calloc(1, sizeof(smb_file_t));
|
|
|
|
|
|
+ // Create a smb_file and fill it
|
|
|
|
+ tmp = calloc(1, sizeof(smb_file));
|
|
assert(tmp != NULL);
|
|
assert(tmp != NULL);
|
|
|
|
|
|
tmp->name_len = smb_from_utf16((const char *)iter->name, iter->name_len,
|
|
tmp->name_len = smb_from_utf16((const char *)iter->name, iter->name_len,
|
|
@@ -66,23 +66,23 @@ static smb_file_t *smb_find_parse(smb_message_t *msg)
|
|
tmp->next = files;
|
|
tmp->next = files;
|
|
files = tmp;
|
|
files = tmp;
|
|
|
|
|
|
- iter = (smb_tr2_find2_entry_t *)(((char *)iter) + iter->next_entry);
|
|
|
|
|
|
+ iter = (smb_tr2_find2_entry *)(((char *)iter) + iter->next_entry);
|
|
}
|
|
}
|
|
|
|
|
|
return (files);
|
|
return (files);
|
|
}
|
|
}
|
|
|
|
|
|
-static smb_message_t *smb_tr2_recv(smb_session_t *s)
|
|
|
|
|
|
+static smb_message *smb_tr2_recv(smb_session *s)
|
|
{
|
|
{
|
|
- smb_message_t recv, *res;
|
|
|
|
- smb_trans2_resp_t *tr2;
|
|
|
|
|
|
+ smb_message recv, *res;
|
|
|
|
+ smb_trans2_resp *tr2;
|
|
size_t growth;
|
|
size_t growth;
|
|
int remaining;
|
|
int remaining;
|
|
|
|
|
|
if (!smb_session_recv_msg(s, &recv))
|
|
if (!smb_session_recv_msg(s, &recv))
|
|
return (NULL);
|
|
return (NULL);
|
|
|
|
|
|
- tr2 = (smb_trans2_resp_t *)recv.packet->payload;
|
|
|
|
|
|
+ tr2 = (smb_trans2_resp *)recv.packet->payload;
|
|
growth = tr2->total_data_count - tr2->data_count;
|
|
growth = tr2->total_data_count - tr2->data_count;
|
|
res = smb_message_grow(&recv, growth);
|
|
res = smb_message_grow(&recv, growth);
|
|
res->cursor = recv.payload_size;
|
|
res->cursor = recv.payload_size;
|
|
@@ -94,7 +94,7 @@ static smb_message_t *smb_tr2_recv(smb_session_t *s)
|
|
remaining = smb_session_recv_msg(s, &recv);
|
|
remaining = smb_session_recv_msg(s, &recv);
|
|
if (remaining)
|
|
if (remaining)
|
|
{
|
|
{
|
|
- tr2 = (smb_trans2_resp_t *)recv.packet->payload;
|
|
|
|
|
|
+ tr2 = (smb_trans2_resp *)recv.packet->payload;
|
|
smb_message_append(res, tr2->payload + 2 /*pad*/, tr2->data_count);
|
|
smb_message_append(res, tr2->payload + 2 /*pad*/, tr2->data_count);
|
|
remaining = (int)tr2->total_data_count -
|
|
remaining = (int)tr2->total_data_count -
|
|
(tr2->data_displacement + tr2->data_count);
|
|
(tr2->data_displacement + tr2->data_count);
|
|
@@ -104,27 +104,27 @@ static smb_message_t *smb_tr2_recv(smb_session_t *s)
|
|
return (res);
|
|
return (res);
|
|
}
|
|
}
|
|
|
|
|
|
-smb_file_t *smb_find(smb_session_t *s, smb_tid tid, const char *pattern)
|
|
|
|
|
|
+smb_file *smb_find(smb_session *s, smb_tid tid, const char *pattern)
|
|
{
|
|
{
|
|
- smb_message_t *msg;
|
|
|
|
- smb_trans2_req_t *tr2;
|
|
|
|
- smb_tr2_find2_t *find;
|
|
|
|
|
|
+ smb_message *msg;
|
|
|
|
+ smb_trans2_req *tr2;
|
|
|
|
+ smb_tr2_find2 *find;
|
|
size_t pattern_len, msg_len;
|
|
size_t pattern_len, msg_len;
|
|
int res;
|
|
int res;
|
|
|
|
|
|
assert(s != NULL && pattern != NULL && tid);
|
|
assert(s != NULL && pattern != NULL && tid);
|
|
|
|
|
|
pattern_len = strlen(pattern) + 1;
|
|
pattern_len = strlen(pattern) + 1;
|
|
- msg_len = sizeof(smb_trans2_req_t) + sizeof(smb_tr2_find2_t);
|
|
|
|
|
|
+ msg_len = sizeof(smb_trans2_req) + sizeof(smb_tr2_find2);
|
|
msg_len += pattern_len * 2 + 3;
|
|
msg_len += pattern_len * 2 + 3;
|
|
|
|
|
|
msg = smb_message_new(SMB_CMD_TRANS2, msg_len);
|
|
msg = smb_message_new(SMB_CMD_TRANS2, msg_len);
|
|
smb_message_set_default_flags(msg);
|
|
smb_message_set_default_flags(msg);
|
|
msg->packet->header.tid = tid;
|
|
msg->packet->header.tid = tid;
|
|
|
|
|
|
- tr2 = (smb_trans2_req_t *)msg->packet->payload;
|
|
|
|
|
|
+ tr2 = (smb_trans2_req *)msg->packet->payload;
|
|
tr2->wct = 15;
|
|
tr2->wct = 15;
|
|
- tr2->total_param_count = pattern_len * 2 + sizeof(smb_tr2_find2_t);
|
|
|
|
|
|
+ tr2->total_param_count = pattern_len * 2 + sizeof(smb_tr2_find2);
|
|
tr2->max_param_count = 10; // ?? Why not the same or 12 ?
|
|
tr2->max_param_count = 10; // ?? Why not the same or 12 ?
|
|
tr2->max_data_count = 0xffff;
|
|
tr2->max_data_count = 0xffff;
|
|
tr2->param_count = tr2->total_param_count;
|
|
tr2->param_count = tr2->total_param_count;
|
|
@@ -133,16 +133,16 @@ smb_file_t *smb_find(smb_session_t *s, smb_tid tid, const char *pattern)
|
|
tr2->data_offset = 88; // Offset of pattern in packet
|
|
tr2->data_offset = 88; // Offset of pattern in packet
|
|
tr2->setup_count = 1;
|
|
tr2->setup_count = 1;
|
|
tr2->cmd = SMB_TR2_FIND_FIRST;
|
|
tr2->cmd = SMB_TR2_FIND_FIRST;
|
|
- tr2->bct = sizeof(smb_tr2_find2_t) + pattern_len * 2 + 3;
|
|
|
|
|
|
+ tr2->bct = sizeof(smb_tr2_find2) + pattern_len * 2 + 3;
|
|
|
|
|
|
- find = (smb_tr2_find2_t *) tr2->payload;
|
|
|
|
|
|
+ find = (smb_tr2_find2 *) tr2->payload;
|
|
find->attrs = SMB_FIND2_ATTR_DEFAULT;
|
|
find->attrs = SMB_FIND2_ATTR_DEFAULT;
|
|
find->count = 1366; // ??
|
|
find->count = 1366; // ??
|
|
find->flags = SMB_FIND2_FLAG_DEFAULT;
|
|
find->flags = SMB_FIND2_FLAG_DEFAULT;
|
|
find->interest = 0x0104; // 'Find file both directory info'
|
|
find->interest = 0x0104; // 'Find file both directory info'
|
|
|
|
|
|
- smb_message_advance(msg, sizeof(smb_trans2_req_t));
|
|
|
|
- smb_message_advance(msg, sizeof(smb_tr2_find2_t));
|
|
|
|
|
|
+ smb_message_advance(msg, sizeof(smb_trans2_req));
|
|
|
|
+ smb_message_advance(msg, sizeof(smb_tr2_find2));
|
|
smb_message_put_utf16(msg, "", pattern, pattern_len);
|
|
smb_message_put_utf16(msg, "", pattern, pattern_len);
|
|
|
|
|
|
// Adds padding at the end if necessary.
|
|
// Adds padding at the end if necessary.
|
|
@@ -164,30 +164,30 @@ smb_file_t *smb_find(smb_session_t *s, smb_tid tid, const char *pattern)
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
-smb_file_t *smb_stat(smb_session_t *s, smb_tid tid, const char *path)
|
|
|
|
|
|
+smb_file *smb_fstat(smb_session *s, smb_tid tid, const char *path)
|
|
{
|
|
{
|
|
- smb_message_t *msg, reply;
|
|
|
|
- smb_trans2_req_t *tr2;
|
|
|
|
- smb_trans2_resp_t *tr2_resp;
|
|
|
|
- smb_tr2_query_t *query;
|
|
|
|
- smb_tr2_path_info_t *info;
|
|
|
|
- smb_file_t *file;
|
|
|
|
|
|
+ smb_message *msg, reply;
|
|
|
|
+ smb_trans2_req *tr2;
|
|
|
|
+ smb_trans2_resp *tr2_resp;
|
|
|
|
+ smb_tr2_query *query;
|
|
|
|
+ smb_tr2_path_info *info;
|
|
|
|
+ smb_file *file;
|
|
size_t path_len, msg_len;
|
|
size_t path_len, msg_len;
|
|
int res;
|
|
int res;
|
|
|
|
|
|
assert(s != NULL && path != NULL && tid);
|
|
assert(s != NULL && path != NULL && tid);
|
|
|
|
|
|
path_len = strlen(path) + 1;
|
|
path_len = strlen(path) + 1;
|
|
- msg_len = sizeof(smb_trans2_req_t) + sizeof(smb_tr2_query_t);
|
|
|
|
|
|
+ msg_len = sizeof(smb_trans2_req) + sizeof(smb_tr2_query);
|
|
msg_len += path_len * 2 + 3; // +3 for eventual padding
|
|
msg_len += path_len * 2 + 3; // +3 for eventual padding
|
|
|
|
|
|
msg = smb_message_new(SMB_CMD_TRANS2, msg_len);
|
|
msg = smb_message_new(SMB_CMD_TRANS2, msg_len);
|
|
smb_message_set_default_flags(msg);
|
|
smb_message_set_default_flags(msg);
|
|
msg->packet->header.tid = tid;
|
|
msg->packet->header.tid = tid;
|
|
|
|
|
|
- tr2 = (smb_trans2_req_t *)msg->packet->payload;
|
|
|
|
|
|
+ tr2 = (smb_trans2_req *)msg->packet->payload;
|
|
tr2->wct = 15;
|
|
tr2->wct = 15;
|
|
- tr2->total_param_count = path_len * 2 + sizeof(smb_tr2_query_t);
|
|
|
|
|
|
+ tr2->total_param_count = path_len * 2 + sizeof(smb_tr2_query);
|
|
tr2->max_param_count = 2; // ?? Why not the same or 12 ?
|
|
tr2->max_param_count = 2; // ?? Why not the same or 12 ?
|
|
tr2->max_data_count = 0xffff;
|
|
tr2->max_data_count = 0xffff;
|
|
tr2->param_count = tr2->total_param_count;
|
|
tr2->param_count = tr2->total_param_count;
|
|
@@ -196,13 +196,13 @@ smb_file_t *smb_stat(smb_session_t *s, smb_tid tid, const char *path)
|
|
tr2->data_offset = 96; // Offset of pattern in packet
|
|
tr2->data_offset = 96; // Offset of pattern in packet
|
|
tr2->setup_count = 1;
|
|
tr2->setup_count = 1;
|
|
tr2->cmd = SMB_TR2_QUERY_PATH;
|
|
tr2->cmd = SMB_TR2_QUERY_PATH;
|
|
- tr2->bct = sizeof(smb_tr2_query_t) + path_len * 2 + 3;
|
|
|
|
|
|
+ tr2->bct = sizeof(smb_tr2_query) + path_len * 2 + 3;
|
|
|
|
|
|
- query = (smb_tr2_query_t *)tr2->payload;
|
|
|
|
|
|
+ query = (smb_tr2_query *)tr2->payload;
|
|
query->interest = 0x0107; // Query File All Info
|
|
query->interest = 0x0107; // Query File All Info
|
|
|
|
|
|
- smb_message_advance(msg, sizeof(smb_trans2_req_t));
|
|
|
|
- smb_message_advance(msg, sizeof(smb_tr2_query_t));
|
|
|
|
|
|
+ smb_message_advance(msg, sizeof(smb_trans2_req));
|
|
|
|
+ smb_message_advance(msg, sizeof(smb_tr2_query));
|
|
smb_message_put_utf16(msg, "", path, path_len);
|
|
smb_message_put_utf16(msg, "", path, path_len);
|
|
|
|
|
|
// Adds padding at the end if necessary.
|
|
// Adds padding at the end if necessary.
|
|
@@ -229,9 +229,9 @@ smb_file_t *smb_stat(smb_session_t *s, smb_tid tid, const char *path)
|
|
return (NULL);
|
|
return (NULL);
|
|
}
|
|
}
|
|
|
|
|
|
- tr2_resp = (smb_trans2_resp_t *)reply.packet->payload;
|
|
|
|
- info = (smb_tr2_path_info_t *)(tr2_resp->payload + 4); //+4 is padding
|
|
|
|
- file = calloc(1, sizeof(smb_file_t));
|
|
|
|
|
|
+ tr2_resp = (smb_trans2_resp *)reply.packet->payload;
|
|
|
|
+ info = (smb_tr2_path_info *)(tr2_resp->payload + 4); //+4 is padding
|
|
|
|
+ file = calloc(1, sizeof(smb_file));
|
|
assert(file != NULL);
|
|
assert(file != NULL);
|
|
|
|
|
|
file->name_len = smb_from_utf16((const char *)info->name, info->name_len,
|
|
file->name_len = smb_from_utf16((const char *)info->name, info->name_len,
|