📄 3connect.c
字号:
} else {
Status = STATUS_BUFFER_OVERFLOW;
}
//RxDbgTrace( 0, (DEBUG_TRACE_ALWAYS), ("CoreBuildTreeConnectSmb beforesscopy buffer,rem %08lx %08lx\n",pBuffer,*pAndXSmbBufferSize));
SmbPutUshort(
&pTreeConnect->ByteCount,
(USHORT)(OriginalBufferSize
- *pAndXSmbBufferSize
- FIELD_OFFSET(REQ_TREE_CONNECT,Buffer)
)
);
RxDbgTrace( 0, (DEBUG_TRACE_ALWAYS), ("CoreBuildTreeConnectSmb end buffer,rem %08lx %08lx\n",pBuffer,*pAndXSmbBufferSize));
return Status;
}
NTSTATUS
LmBuildTreeConnectSmb(
PSMB_EXCHANGE pExchange,
PGENERIC_ANDX pAndXSmb,
PULONG pAndXSmbBufferSize)
/*++
Routine Description:
This routine builds the tree connect SMB for a pre NT server
Arguments:
pExchange - the exchange instance
pAndXSmb - the tree connect to be filled in...it's not really a andX
pAndXSmbBufferSize - the SMB buffer size on input modified to remaining size on
output.
Return Value:
RXSTATUS - The return status for the operation
--*/
{
NTSTATUS Status;
USHORT PasswordLength;
PMRX_NET_ROOT NetRoot;
UNICODE_STRING ServerName;
UNICODE_STRING NetRootName;
PSMBCE_SERVER pServer;
PREQ_TREE_CONNECT_ANDX pTreeConnectAndX = (PREQ_TREE_CONNECT_ANDX)pAndXSmb;
ULONG OriginalBufferSize = *pAndXSmbBufferSize;
BOOLEAN AppendServiceString;
PBYTE pBuffer;
PCHAR ServiceName;
ULONG Length;
PAGED_CODE();
NetRoot = pExchange->SmbCeContext.pVNetRoot->pNetRoot;
RxDbgTrace( 0, (DEBUG_TRACE_ALWAYS),
("LmBuildTreeConnectSmb buffer,remptr %08lx %08lx, nrt=%08lx\n",
pAndXSmb,
pAndXSmbBufferSize,
NetRoot->Type));
if(OriginalBufferSize < FIELD_OFFSET(REQ_TREE_CONNECT_ANDX,Buffer)) {
return STATUS_BUFFER_OVERFLOW;
}
pServer = SmbCeGetExchangeServer(pExchange);
SmbCeGetServerName(NetRoot->pSrvCall,&ServerName);
SmbCeGetNetRootName(NetRoot,&NetRootName);
ServiceName = s_NetRootTypeName[NetRoot->Type];
Length = strlen(ServiceName) + 1;
AppendServiceString = TRUE;
pTreeConnectAndX->WordCount = 4;
SmbPutUshort(&pTreeConnectAndX->AndXReserved,0);
SmbPutUshort(
&pTreeConnectAndX->Flags,0);
pBuffer = (PBYTE)pTreeConnectAndX + FIELD_OFFSET(REQ_TREE_CONNECT_ANDX,Buffer);
*pAndXSmbBufferSize -= (FIELD_OFFSET(REQ_TREE_CONNECT_ANDX,Buffer));
if (pServer->SecurityMode == SECURITY_MODE_SHARE_LEVEL) {
// The password information needs to be sent as part of the tree connect
// SMB for share level servers.
//RxDbgTrace( 0, (DEBUG_TRACE_ALWAYS), ("LmBuildTreeConnectSmb before btcsi buffer,rem %08lx %08lx\n",pBuffer,*pAndXSmbBufferSize));
Status = BuildTreeConnectSecurityInformation(
pExchange,
pBuffer,
(PBYTE)&PasswordLength,
pAndXSmbBufferSize);
if (Status == STATUS_SUCCESS) {
pBuffer += PasswordLength;
SmbPutUshort(&pTreeConnectAndX->PasswordLength,PasswordLength);
}
} else {
if(*pAndXSmbBufferSize < sizeof(CHAR)) {
return STATUS_BUFFER_OVERFLOW;
}
// No password is required for user level security servers as part of tree
// connect
SmbPutUshort(&pTreeConnectAndX->PasswordLength,0x1);
*((PCHAR)pBuffer) = '\0';
pBuffer += sizeof(CHAR);
*pAndXSmbBufferSize -= sizeof(CHAR);
Status = STATUS_SUCCESS;
}
if (Status == STATUS_SUCCESS) {
Status = BuildCanonicalNetRootInformation(
&ServerName,
&NetRootName,
pExchange->SmbCeContext.pVNetRoot->pNetRoot->Type,
(BOOLEAN)(pServer->Dialect >= NTLANMAN_DIALECT),
AppendServiceString,
&pBuffer,
pAndXSmbBufferSize);
//RxDbgTrace( 0, (DEBUG_TRACE_ALWAYS), ("LmBuildTreeConnectSmb beforesscopy buffer,rem %08lx %08lx\n",pBuffer,*pAndXSmbBufferSize));
if (Status == STATUS_SUCCESS) {
SmbPutUshort(
&pTreeConnectAndX->ByteCount,
(USHORT)(OriginalBufferSize
- *pAndXSmbBufferSize
- FIELD_OFFSET(REQ_TREE_CONNECT_ANDX,Buffer)
)
);
}
RxDbgTrace( 0, (DEBUG_TRACE_ALWAYS),
("LmBuildTreeConnectSmb end buffer,rem %08lx %08lx\n",
pBuffer,
*pAndXSmbBufferSize));
}
return Status;
}
NTSTATUS
NtBuildTreeConnectSmb(
PSMB_EXCHANGE pExchange,
PGENERIC_ANDX pAndXSmb,
PULONG pAndXSmbBufferSize)
/*++
Routine Description:
This routine builds the tree connect SMB for a pre NT server
Arguments:
pExchange - the exchange instance
pAndXSmb - the session setup to be filled in
pAndXSmbBufferSize - the SMB buffer size on input modified to remaining size on
output.
Return Value:
RXSTATUS - The return status for the operation
--*/
{
NTSTATUS Status = STATUS_SUCCESS;
UNICODE_STRING ServerName;
UNICODE_STRING NetRootName;
PSMBCE_SERVER pServer;
PREQ_TREE_CONNECT_ANDX pTreeConnect = (PREQ_TREE_CONNECT_ANDX)pAndXSmb;
ULONG OriginalBufferSize = *pAndXSmbBufferSize;
PBYTE pBuffer;
ULONG BufferSize;
PAGED_CODE();
BufferSize = OriginalBufferSize;
if(BufferSize < FIELD_OFFSET(REQ_TREE_CONNECT_ANDX,Buffer) + 1) {
return STATUS_BUFFER_OVERFLOW;
}
pServer = SmbCeGetExchangeServer(pExchange);
SmbCeGetServerName(pExchange->SmbCeContext.pVNetRoot->pNetRoot->pSrvCall,&ServerName);
SmbCeGetNetRootName(pExchange->SmbCeContext.pVNetRoot->pNetRoot,&NetRootName);
pTreeConnect->AndXCommand = 0xff; // No ANDX
pTreeConnect->AndXReserved = 0x00; // Reserved (MBZ)
SmbPutUshort(&pTreeConnect->AndXOffset, 0x0000); // No AndX as of yet.
pTreeConnect->WordCount = 4;
SmbPutUshort( &pTreeConnect->Flags, 0 );
pBuffer = (PBYTE)pTreeConnect + FIELD_OFFSET(REQ_TREE_CONNECT_ANDX,Buffer);
BufferSize -= FIELD_OFFSET(REQ_TREE_CONNECT_ANDX,Buffer);
if(pServer->SecurityMode == SECURITY_MODE_USER_LEVEL){
// No password information is required as part of tree connect for user level
// security servers. Therefore send a null string as the password.
SmbPutUshort(&pTreeConnect->PasswordLength,0x1);
*((PCHAR)pBuffer) = '\0';
pBuffer += sizeof(CHAR);
BufferSize -= sizeof(CHAR);
} else {
USHORT PasswordLength;
//plug in the password for this server.....qweee
Status = BuildTreeConnectSecurityInformation(
pExchange,
pBuffer,
(PBYTE)&PasswordLength,
&BufferSize);
if (Status == STATUS_SUCCESS ) {
pBuffer += PasswordLength;
SmbPutUshort(&pTreeConnect->PasswordLength,PasswordLength);
}
}
if (NT_SUCCESS(Status)) {
Status = BuildCanonicalNetRootInformation(
&ServerName,
&NetRootName,
NET_ROOT_WILD, //let the server tell us! pNetRoot->Type,
BooleanFlagOn(pServer->DialectFlags,DF_UNICODE),
TRUE, //postpend the service string
&pBuffer,
&BufferSize);
}
if (NT_SUCCESS(Status)) {
SmbPutUshort(
&pTreeConnect->ByteCount,
(USHORT)(OriginalBufferSize -
FIELD_OFFSET(REQ_TREE_CONNECT_ANDX,Buffer) -
BufferSize));
}
// update the buffer size to reflect the amount consumed.
*pAndXSmbBufferSize = BufferSize;
return Status;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -