static VOID SMBPacketLTOHSmbHeader( IN OUT SMB_HEADER* pHeader ) { SMB_LTOH32_INPLACE(pHeader->error); SMB_LTOH16_INPLACE(pHeader->flags2); SMB_LTOH16_INPLACE(pHeader->extra.pidHigh); SMB_LTOH16_INPLACE(pHeader->tid); SMB_LTOH16_INPLACE(pHeader->pid); SMB_LTOH16_INPLACE(pHeader->uid); SMB_LTOH16_INPLACE(pHeader->mid); }
static BOOLEAN RdrProcessNegotiateResponse( PRDR_OP_CONTEXT pContext, NTSTATUS status, PVOID pParam ) { PRDR_SOCKET pSocket = pContext->State.TreeConnect.pSocket; PSMB_PACKET pPacket = pParam; BOOLEAN bSocketLocked = FALSE; BOOLEAN bFreeContext = FALSE; PBYTE pGUID = NULL; PBYTE pSecurityBlob = NULL; DWORD securityBlobLen = 0; NEGOTIATE_RESPONSE_HEADER* pHeader = NULL; BAIL_ON_NT_STATUS(status); /* As a special case, it is possible to receive an SMB2 negotiate response * from an SMB1 negotiate request. */ if (pPacket->protocolVer == SMB_PROTOCOL_VERSION_2) { /* Short-circuit to SMB2 code path in connect2.c */ return RdrProcessNegotiateResponse2(pContext, status, pParam); } LWIO_LOCK_MUTEX(bSocketLocked, &pSocket->mutex); status = pPacket->pSMBHeader->error; BAIL_ON_NT_STATUS(status); status = UnmarshallNegotiateResponse( pPacket->pParams, pPacket->bufferUsed - (pPacket->pParams - pPacket->pRawBuffer), &pHeader, &pGUID, &pSecurityBlob, &securityBlobLen); BAIL_ON_NT_STATUS(status); // byte order conversions SMB_LTOH16_INPLACE(pHeader->dialectIndex); SMB_LTOH8_INPLACE(pHeader->securityMode); SMB_LTOH16_INPLACE(pHeader->maxMpxCount); SMB_LTOH16_INPLACE(pHeader->maxNumberVcs); SMB_LTOH32_INPLACE(pHeader->maxBufferSize); SMB_LTOH32_INPLACE(pHeader->maxRawSize); SMB_LTOH32_INPLACE(pHeader->sessionKey); SMB_LTOH32_INPLACE(pHeader->capabilities); SMB_LTOH32_INPLACE(pHeader->systemTimeLow); SMB_LTOH32_INPLACE(pHeader->systemTimeHigh); SMB_LTOH16_INPLACE(pHeader->serverTimeZone); SMB_LTOH8_INPLACE(pHeader->encryptionKeyLength); SMB_LTOH16_INPLACE(pHeader->byteCount); pSocket->ulMaxTransactSize = pHeader->maxBufferSize; pSocket->maxRawSize = pHeader->maxRawSize; pSocket->sessionKey = pHeader->sessionKey; pSocket->capabilities = pHeader->capabilities; pSocket->ucSecurityMode = pHeader->securityMode; pSocket->usMaxSlots = pHeader->maxMpxCount; pSocket->securityBlobLen = securityBlobLen; status = LwIoAllocateMemory( pSocket->securityBlobLen, (PVOID *) &pSocket->pSecurityBlob); BAIL_ON_NT_STATUS(status); memcpy(pSocket->pSecurityBlob, pSecurityBlob, pSocket->securityBlobLen); status = RdrSocketSetProtocol(pSocket, SMB_PROTOCOL_VERSION_1); BAIL_ON_NT_STATUS(status); pSocket->state = RDR_SOCKET_STATE_READY; RdrNotifyContextList( &pSocket->StateWaiters, bSocketLocked, &pSocket->mutex, STATUS_SUCCESS, pSocket); LWIO_UNLOCK_MUTEX(bSocketLocked, &pSocket->mutex); RdrNegotiateComplete(pContext, STATUS_SUCCESS, pSocket); status = STATUS_PENDING; BAIL_ON_NT_STATUS(status); cleanup: LWIO_UNLOCK_MUTEX(bSocketLocked, &pSocket->mutex); if (status != STATUS_PENDING) { RdrContinueContext(pContext->State.TreeConnect.pContinue, status, NULL); bFreeContext = TRUE; } if (bFreeContext) { RdrFreeTreeConnectContext(pContext); } RdrFreePacket(pPacket); return FALSE; error: if (status != STATUS_PENDING) { LWIO_UNLOCK_MUTEX(bSocketLocked, &pSocket->mutex); RdrSocketInvalidate(pSocket, status); RdrSocketRelease(pSocket); } goto cleanup; }