04 TRANSACTION结构体中一些重要的成员变量:
* InSetup:指向transaction data buffer中接收的Setup的指针 * OutSetup:指向transaction data buffer中响应的setup的指针(当接收完所有Transaction数据且还未存入transaction data buffer时设置该指针) * InParameters:指向transaction data buffer中接收的trans_parameters的指针 * OutParameters:指向transaction data buffer中响应的trans_parameters的指针 * InData:指向transaction data buffer中接收的trans_data的指针 * OutData:指向transaction data buffer中响应的trans_data的指针 * SetupCount:Transaction请求中包含的setup元素的个数(每个元素占2字节),它决定了InSetup缓冲区的大小 * MaxSetupCount:Transaction响应中客户端能接收的setup的最大字节数,它决定了OutSetup缓冲区的大小 * ParameterCount:当前请求数据包中接收的trans_parameter的字节数,或响应数据包中trans_parameter的大小 * TotalParameterCount:同一transaction请求序列中所有SMB数据包trans_parameter全部字节数,它决定了InParameters缓冲区的大小 * MaxParameterCount:Transaction响应中客户端能接收的trans_parameter的最大字节数,它决定了OutParameters缓冲区的大小 * DataCount:当前请求数据包中接收的trans_data的字节数,或响应数据包中trans_data的大小 * TotalDataCount:同一transaction请求序列所有SMB数据包trans_data的全部字节数,它决定了InData缓冲区的大小 * MaxDataCount:Transaction响应中客户端能接收的trans_data的最大字节数,它决定了OutData缓冲区的大小 * Function:定义NT transaction下属子命令码 * Tid:Tree标识符 * Pid:进程标识符 * Uid:用户标识符 * Mid/Fid:Multiplex标识符 * AllDataReceived:当ParameterCount等于TotalParamterCount && DataCount等于TotalDataCount时,该字段被设置为105 在transaction data buffer中,InParameters、OutParameters、InData、OutData缓冲区有三种布局。
第一种:除TRANS_MAILSLOT_WRITE和SetupCount字段置为0的”TRANS“数据包外,其它SMB_COM_TRANSACTION数据包的内存布局如下所述,In*和 Out*缓冲区是重叠的。
+---------------+------------------------------------------------------+ | TRANSACTION | transaction data buffer | +---------------+------------------------------------------------------+ | InSetup | InParameters | InData | | +------------------------------------------------------+ | OutParameters | OutData | +------------------------------------------------------+[译者注] 重叠的含义是指,InSetup、InParameters、InData所在内存位置,就是OutParameters、OutData所在内存位置。上图中InSetup和OutParameters的起始位置相同。简单来说,上述情况的内存布局可以具体表示为:
+---------------+------------------------------------------------------+ | TRANSACTION | InSetup | InParameters | InData | | +---------------+------------------------------------------------------+或
+---------------+------------------------------------------------------+ | TRANSACTION | OutParameters | OutData | +---------------+------------------------------------------------------+TRANSACTION结构体中的InSetup指针和OutParameters指针在内存中指向的都是同一个内存地址。
第二种:除第一种情况外的其它SMB_COM_TRANSACTION数据包和所有SMB_COM_TRANSACTION2数据包的内存布局如下所述,所有缓冲区都不重叠。
+---------------+-------------------------------------------------------------------+ | TRANSACTION | transaction data buffer | +---------------+-------------------------------------------------------------------+ | InSetup | InParameters | InData | OutParameters | OutData | +-------------------------------------------------------------------+