static int cipher_des_cbc_code(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, unsigned int inl) { int ret = DES_CBCUpdate(data(ctx), out, (unsigned char *)in, inl); switch (ret) { case RE_LEN: RSAREFerr(RSAREF_F_CIPHER_DES_CBC_CODE,RSAREF_R_LENGTH_NOT_BLOCK_ALIGNED); break; case 0: break; default: RSAREFerr(RSAREF_F_CIPHER_DES_CBC_CODE,RSAREF_R_UNKNOWN_FAULT); } return !ret; }
NTSTATUS SendNdfsWinxpMessage ( IN PPRIMARY_SESSION PrimarySession, IN PNDFS_REPLY_HEADER NdfsReplyHeader, IN PNDFS_WINXP_REPLY_HEADER NdfsWinxpReplyHeader, IN UINT32 ReplyDataSize, IN UINT16 Mid ) { NTSTATUS tdiStatus; UINT32 remaninigDataSize; // // If the replying data is less than max data size for the secondary, // Send header and body at a time and return to the caller // if (ReplyDataSize <= PrimarySession->SessionContext.SecondaryMaxDataSize) { //int desResult; UINT8 *cryptWinxpRequestMessage = PrimarySession->Thread.SessionSlot[Mid].CryptWinxpMessageBuffer; // // Set up reply NDFS header // RtlCopyMemory( NdfsReplyHeader->Protocol, NDFS_PROTOCOL, sizeof(NdfsReplyHeader->Protocol) ); NdfsReplyHeader->Status = NDFS_SUCCESS; NdfsReplyHeader->Flags = PrimarySession->SessionContext.Flags; NdfsReplyHeader->Uid2 = HTONS(PrimarySession->SessionContext.Uid); NdfsReplyHeader->Tid2 = HTONS(PrimarySession->SessionContext.Tid); NdfsReplyHeader->Mid2 = HTONS(Mid); NdfsReplyHeader->MessageSize4 = sizeof(NDFS_REPLY_HEADER) + (PrimarySession->SessionContext.MessageSecurity ? ADD_ALIGN8(sizeof(NDFS_WINXP_REPLY_HEADER) + ReplyDataSize) : (sizeof(NDFS_WINXP_REPLY_HEADER) + ReplyDataSize)); NdfsReplyHeader->MessageSize4 = HTONL(NdfsReplyHeader->MessageSize4); ASSERT( HTONL(NdfsReplyHeader->MessageSize4) <= PrimarySession->Thread.SessionSlot[Mid].ReplyMessageBufferLength ); tdiStatus = SendMessage( PrimarySession->ConnectionFileObject, &PrimarySession->SendNdasFcStatistics, NULL, (UINT8 *)NdfsReplyHeader, sizeof(NDFS_REPLY_HEADER) ); if (tdiStatus != STATUS_SUCCESS) { return tdiStatus; } // // If message security is not set, // send a header and body in raw, and return to the caller. // if (PrimarySession->SessionContext.MessageSecurity == 0) { tdiStatus = SendMessage( PrimarySession->ConnectionFileObject, &PrimarySession->SendNdasFcStatistics, NULL, (UINT8 *)NdfsWinxpReplyHeader, NTOHL(NdfsReplyHeader->MessageSize4) - sizeof(NDFS_REPLY_HEADER) ); return tdiStatus; } ASSERT( FALSE ); #if 0 if(NdfsWinxpReplyHeader->IrpMajorFunction == IRP_MJ_READ) SPY_LOG_PRINT( LFS_DEBUG_PRIMARY_NOISE, ("DispatchRequest: PrimarySession->SessionContext.RwDataSecurity = %d\n", PrimarySession->SessionContext.RwDataSecurity)); if(NdfsWinxpReplyHeader->IrpMajorFunction == IRP_MJ_READ && PrimarySession->SessionContext.RwDataSecurity == 0) { RtlCopyMemory(cryptWinxpRequestMessage, NdfsWinxpReplyHeader, sizeof(NDFS_WINXP_REPLY_HEADER)); RtlZeroMemory(&PrimarySession->DesCbcContext, sizeof(PrimarySession->DesCbcContext)); RtlZeroMemory(PrimarySession->Iv, sizeof(PrimarySession->Iv)); DES_CBCInit(&PrimarySession->DesCbcContext, PrimarySession->NetdiskPartition->NetdiskPartitionInformation.NetdiskInformation.Password, PrimarySession->Iv, DES_ENCRYPT); desResult = DES_CBCUpdate(&PrimarySession->DesCbcContext, (UINT8 *)NdfsWinxpReplyHeader, cryptWinxpRequestMessage, sizeof(NDFS_WINXP_REPLY_HEADER)); ASSERT(desResult == IDOK); tdiStatus = SendMessage( PrimarySession->ConnectionFileObject, (UINT8 *)NdfsWinxpReplyHeader, NdfsReplyHeader->MessageSize - sizeof(NDFS_REPLY_HEADER), NULL, &PrimarySession->Thread.TransportCtx ); } else { RtlZeroMemory(&PrimarySession->DesCbcContext, sizeof(PrimarySession->DesCbcContext)); RtlZeroMemory(PrimarySession->Iv, sizeof(PrimarySession->Iv)); DES_CBCInit(&PrimarySession->DesCbcContext, PrimarySession->NetdiskPartition->NetdiskPartitionInformation.NetdiskInformation.Password, PrimarySession->Iv, DES_ENCRYPT); desResult = DES_CBCUpdate(&PrimarySession->DesCbcContext, cryptWinxpRequestMessage, (UINT8 *)NdfsWinxpReplyHeader, NdfsReplyHeader->MessageSize-sizeof(NDFS_REPLY_HEADER)); ASSERT(desResult == IDOK); tdiStatus = SendMessage( PrimarySession->ConnectionFileObject, cryptWinxpRequestMessage, NdfsReplyHeader->MessageSize - sizeof(NDFS_REPLY_HEADER), NULL, &PrimarySession->Thread.TransportCtx ); } // // Return to the caller // return tdiStatus; #endif } ASSERT( (UINT8 *)NdfsWinxpReplyHeader == PrimarySession->Thread.SessionSlot[Mid].ExtendWinxpReplyMessagePool ); ASSERT( ReplyDataSize > PrimarySession->SessionContext.SecondaryMaxDataSize ); RtlCopyMemory( NdfsReplyHeader->Protocol, NDFS_PROTOCOL, sizeof(NdfsReplyHeader->Protocol) ); NdfsReplyHeader->Status = NDFS_SUCCESS; NdfsReplyHeader->Flags = PrimarySession->SessionContext.Flags; NdfsReplyHeader->Splitted = 1; // indicate the split. NdfsReplyHeader->Uid2 = HTONS(PrimarySession->SessionContext.Uid); NdfsReplyHeader->Tid2 = HTONS(PrimarySession->SessionContext.Tid); NdfsReplyHeader->Mid2 = 0; NdfsReplyHeader->MessageSize4 = sizeof(NDFS_REPLY_HEADER) + (PrimarySession->SessionContext.MessageSecurity ? ADD_ALIGN8(sizeof(NDFS_WINXP_REPLY_HEADER) + ReplyDataSize) : (sizeof(NDFS_WINXP_REPLY_HEADER) + ReplyDataSize) ); NdfsReplyHeader->MessageSize4 = HTONL(NdfsReplyHeader->MessageSize4); // // Send reply NDFS header // tdiStatus = SendMessage( PrimarySession->ConnectionFileObject, &PrimarySession->SendNdasFcStatistics, NULL, (UINT8 *)NdfsReplyHeader, sizeof(NDFS_REPLY_HEADER) ); if (tdiStatus != STATUS_SUCCESS) { return tdiStatus; } // // Send reply WinXp header // #if 0 if(PrimarySession->SessionContext.MessageSecurity) { int desResult; UINT8 *cryptWinxpRequestMessage = PrimarySession->Thread.SessionSlot[Mid].CryptWinxpMessageBuffer; RtlZeroMemory(&PrimarySession->DesCbcContext, sizeof(PrimarySession->DesCbcContext)); RtlZeroMemory(PrimarySession->Iv, sizeof(PrimarySession->Iv)); DES_CBCInit(&PrimarySession->DesCbcContext, PrimarySession->NetdiskPartition->NetdiskPartitionInformation.NetdiskInformation.Password, PrimarySession->Iv, DES_ENCRYPT); desResult = DES_CBCUpdate(&PrimarySession->DesCbcContext, cryptWinxpRequestMessage, (UINT8 *)NdfsWinxpReplyHeader, sizeof(NDFS_WINXP_REPLY_HEADER)); ASSERT(desResult == IDOK); tdiStatus = SendMessage( PrimarySession->ConnectionFileObject, cryptWinxpRequestMessage, sizeof(NDFS_WINXP_REPLY_HEADER), NULL, &PrimarySession->Thread.TransportCtx ); } else #endif { tdiStatus = SendMessage( PrimarySession->ConnectionFileObject, &PrimarySession->SendNdasFcStatistics, NULL, (UINT8 *)NdfsWinxpReplyHeader, sizeof(NDFS_WINXP_REPLY_HEADER) ); } if (tdiStatus != STATUS_SUCCESS) { return tdiStatus; } // // Send data body // remaninigDataSize = ReplyDataSize; while(1) { // // Set up reply NDFS header // RtlCopyMemory(NdfsReplyHeader->Protocol, NDFS_PROTOCOL, sizeof(NdfsReplyHeader->Protocol)); NdfsReplyHeader->Status = NDFS_SUCCESS; NdfsReplyHeader->Flags = PrimarySession->SessionContext.Flags; NdfsReplyHeader->Uid2 = HTONS(PrimarySession->SessionContext.Uid); NdfsReplyHeader->Tid2 = HTONS(PrimarySession->SessionContext.Tid); NdfsReplyHeader->Mid2 = 0; NdfsReplyHeader->MessageSize4 = sizeof(NDFS_REPLY_HEADER) + (PrimarySession->SessionContext.MessageSecurity ? ADD_ALIGN8(remaninigDataSize) : remaninigDataSize); NdfsReplyHeader->MessageSize4 = HTONL(NdfsReplyHeader->MessageSize4); if(remaninigDataSize > PrimarySession->SessionContext.SecondaryMaxDataSize) NdfsReplyHeader->Splitted = 1; else NdfsReplyHeader->Splitted = 0; // // Send NDFS reply header // tdiStatus = SendMessage( PrimarySession->ConnectionFileObject, &PrimarySession->SendNdasFcStatistics, NULL, (UINT8 *)NdfsReplyHeader, sizeof(NDFS_REPLY_HEADER) ); if(tdiStatus != STATUS_SUCCESS) { return tdiStatus; } // // Send a part of data body // #if 0 if(PrimarySession->SessionContext.MessageSecurity) { int desResult; UINT8 *cryptNdfsWinxpReplyHeader = PrimarySession->Thread.SessionSlot[Mid].CryptWinxpMessageBuffer; desResult = DES_CBCUpdate( &PrimarySession->DesCbcContext, cryptNdfsWinxpReplyHeader, (UINT8 *)(NdfsWinxpReplyHeader+1) + (ReplyDataSize - remaninigDataSize), NdfsReplyHeader->Splitted ? PrimarySession->SessionContext.SecondaryMaxDataSize : (NdfsReplyHeader->MessageSize - sizeof(NDFS_REPLY_HEADER)) ); ASSERT(desResult == IDOK); tdiStatus = SendMessage( PrimarySession->ConnectionFileObject, cryptNdfsWinxpReplyHeader, NdfsReplyHeader->Splitted ? PrimarySession->SessionContext.SecondaryMaxDataSize : (NdfsReplyHeader->MessageSize - sizeof(NDFS_REPLY_HEADER)), NULL, &PrimarySession->Thread.TransportCtx ); } else #endif { tdiStatus = SendMessage( PrimarySession->ConnectionFileObject, &PrimarySession->SendNdasFcStatistics, NULL, (UINT8 *)(NdfsWinxpReplyHeader+1) + (ReplyDataSize - remaninigDataSize), NdfsReplyHeader->Splitted ? PrimarySession->SessionContext.SecondaryMaxDataSize : (NTOHL(NdfsReplyHeader->MessageSize4) - sizeof(NDFS_REPLY_HEADER)) ); } if(tdiStatus != STATUS_SUCCESS) { return tdiStatus; } // // Decrease remaining bytes // if(NdfsReplyHeader->Splitted) remaninigDataSize -= PrimarySession->SessionContext.SecondaryMaxDataSize; else return STATUS_SUCCESS; ASSERT((INT32)remaninigDataSize > 0); } }
NTSTATUS ReceiveNtfsWinxpMessage ( IN PPRIMARY_SESSION PrimarySession, IN UINT16 Mid ) { PNDFS_REQUEST_HEADER ndfsRequestHeader = (PNDFS_REQUEST_HEADER)PrimarySession->Thread.SessionSlot[Mid].RequestMessageBuffer; PNDFS_WINXP_REQUEST_HEADER ndfsWinxpRequestHeader; UINT8 *cryptWinxpRequestMessage; NTSTATUS tdiStatus; //int desResult; cryptWinxpRequestMessage = PrimarySession->Thread.SessionSlot[Mid].CryptWinxpMessageBuffer; // // If the request is not split, receive the request at a time // and return to the caller. // if (ndfsRequestHeader->Splitted == 0) { ASSERT( NTOHL(ndfsRequestHeader->MessageSize4) <= PrimarySession->Thread.SessionSlot[Mid].RequestMessageBufferLength ); ndfsWinxpRequestHeader = (PNDFS_WINXP_REQUEST_HEADER)(ndfsRequestHeader+1); // // Receive non-encrypted request at a time and return to the caller. // if (ndfsRequestHeader->MessageSecurity == 0) { tdiStatus = RecvMessage( PrimarySession->ConnectionFileObject, &PrimarySession->RecvNdasFcStatistics, NULL, (UINT8 *)ndfsWinxpRequestHeader, NTOHL(ndfsRequestHeader->MessageSize4) - sizeof(NDFS_REQUEST_HEADER) ); PrimarySession->Thread.SessionSlot[Mid].NdfsWinxpRequestHeader = ndfsWinxpRequestHeader; return tdiStatus; } ASSERT( FALSE ); #if 0 // // Receive encrypted WinXP request header // and return to the caller // ASSERT(ndfsRequestHeader->MessageSecurity == 1); tdiStatus = RecvMessage( PrimarySession->ConnectionFileObject, cryptWinxpRequestMessage, sizeof(NDFS_WINXP_REQUEST_HEADER), NULL ); if(tdiStatus != STATUS_SUCCESS) { return tdiStatus; } RtlZeroMemory(&PrimarySession->DesCbcContext, sizeof(PrimarySession->DesCbcContext)); RtlZeroMemory(PrimarySession->Iv, sizeof(PrimarySession->Iv)); DES_CBCInit(&PrimarySession->DesCbcContext, PrimarySession->NetdiskPartition->NetdiskPartitionInformation.NetdiskInformation.Password, PrimarySession->Iv, DES_DECRYPT); desResult = DES_CBCUpdate(&PrimarySession->DesCbcContext, (UINT8 *)ndfsWinxpRequestHeader, cryptWinxpRequestMessage, sizeof(NDFS_WINXP_REQUEST_HEADER)); ASSERT(desResult == IDOK); // // Receive encrypted WinXP request data // ASSERT(ndfsRequestHeader->MessageSize >= sizeof(NDFS_REQUEST_HEADER) + sizeof(NDFS_WINXP_REQUEST_HEADER)); if(ndfsRequestHeader->MessageSize - sizeof(NDFS_REQUEST_HEADER) - sizeof(NDFS_WINXP_REQUEST_HEADER)) { if(ndfsWinxpRequestHeader->IrpMajorFunction == IRP_MJ_WRITE && ndfsRequestHeader->RwDataSecurity == 0) { tdiStatus = RecvMessage( PrimarySession->ConnectionFileObject, (UINT8 *)(ndfsWinxpRequestHeader+1), ndfsRequestHeader->MessageSize - sizeof(NDFS_REQUEST_HEADER) - sizeof(NDFS_WINXP_REQUEST_HEADER), NULL ); if(tdiStatus != STATUS_SUCCESS) { return tdiStatus; } } else { tdiStatus = RecvMessage( PrimarySession->ConnectionFileObject, cryptWinxpRequestMessage, ndfsRequestHeader->MessageSize - sizeof(NDFS_REQUEST_HEADER) - sizeof(NDFS_WINXP_REQUEST_HEADER), NULL ); if(tdiStatus != STATUS_SUCCESS) { return tdiStatus; } desResult = DES_CBCUpdate(&PrimarySession->DesCbcContext, (UINT8 *)(ndfsWinxpRequestHeader+1), cryptWinxpRequestMessage, ndfsRequestHeader->MessageSize - sizeof(NDFS_REQUEST_HEADER) - sizeof(NDFS_WINXP_REQUEST_HEADER)); ASSERT(desResult == IDOK); } } PrimarySession->Thread.SessionSlot[Mid].NdfsWinxpRequestHeader = ndfsWinxpRequestHeader; // // return to the caller // return STATUS_SUCCESS; #endif } ASSERT( ndfsRequestHeader->Splitted == 1 ); // // Allocate memory for extended WinXP header // // if(ndfsRequestHeader->MessageSize > (PrimarySession->RequestMessageBufferLength - sizeof(NDFS_REQUEST_HEADER) - sizeof(NDFS_WINXP_REQUEST_HEADER))) { ASSERT( PrimarySession->Thread.SessionSlot[Mid].ExtendWinxpRequestMessagePool == NULL ); PrimarySession->Thread.SessionSlot[Mid].ExtendWinxpRequestMessagePoolLength = NTOHL(ndfsRequestHeader->MessageSize4) - sizeof(NDFS_REQUEST_HEADER); PrimarySession->Thread.SessionSlot[Mid].ExtendWinxpRequestMessagePool = ExAllocatePoolWithTag( NonPagedPool, PrimarySession->Thread.SessionSlot[Mid].ExtendWinxpRequestMessagePoolLength, PRIMARY_SESSION_BUFFERE_TAG ); ASSERT( PrimarySession->Thread.SessionSlot[Mid].ExtendWinxpRequestMessagePool ); if (PrimarySession->Thread.SessionSlot[Mid].ExtendWinxpRequestMessagePool == NULL) { SPY_LOG_PRINT( LFS_DEBUG_PRIMARY_ERROR, ("ReceiveNtfsWinxpMessage: failed to allocate ExtendWinxpRequestMessagePool\n") ); return STATUS_INSUFFICIENT_RESOURCES; } ndfsWinxpRequestHeader = (PNDFS_WINXP_REQUEST_HEADER)(PrimarySession->Thread.SessionSlot[Mid].ExtendWinxpRequestMessagePool); } // else // ndfsWinxpRequestHeader = (PNDFS_WINXP_REQUEST_HEADER)(ndfsRequestHeader+1); // // Receive WinXP request header // if (ndfsRequestHeader->MessageSecurity == 0) { tdiStatus = RecvMessage( PrimarySession->ConnectionFileObject, &PrimarySession->RecvNdasFcStatistics, NULL, (UINT8 *)ndfsWinxpRequestHeader, sizeof(NDFS_WINXP_REQUEST_HEADER) ); if (tdiStatus != STATUS_SUCCESS) { return tdiStatus; } } #if 0 else { tdiStatus = RecvMessage( PrimarySession->ConnectionFileObject, cryptWinxpRequestMessage, sizeof(NDFS_WINXP_REQUEST_HEADER), NULL ); if(tdiStatus != STATUS_SUCCESS) { return tdiStatus; } RtlZeroMemory(&PrimarySession->DesCbcContext, sizeof(PrimarySession->DesCbcContext)); RtlZeroMemory(PrimarySession->Iv, sizeof(PrimarySession->Iv)); DES_CBCInit(&PrimarySession->DesCbcContext, PrimarySession->NetdiskPartition->NetdiskPartitionInformation.NetdiskInformation.Password, PrimarySession->Iv, DES_DECRYPT); desResult = DES_CBCUpdate(&PrimarySession->DesCbcContext, (UINT8 *)ndfsWinxpRequestHeader, cryptWinxpRequestMessage, sizeof(NDFS_WINXP_REQUEST_HEADER)); ASSERT(desResult == IDOK); } #endif // // Receive a pair of NDFS request header and data // while (1) { PNDFS_REQUEST_HEADER splitNdfsRequestHeader = &PrimarySession->Thread.SessionSlot[Mid].SplitNdfsRequestHeader; // // Receive NDFS request // tdiStatus = RecvMessage( PrimarySession->ConnectionFileObject, &PrimarySession->RecvNdasFcStatistics, NULL, (UINT8 *)splitNdfsRequestHeader, sizeof(NDFS_REQUEST_HEADER) ); if (tdiStatus != STATUS_SUCCESS) return tdiStatus; if (!(NTOHS(ndfsRequestHeader->Uid2) == PrimarySession->SessionContext.Uid && NTOHS(ndfsRequestHeader->Tid2) == PrimarySession->SessionContext.Tid)) { ASSERT( LFS_BUG ); return STATUS_UNSUCCESSFUL; } // // receive a part of data // if (ndfsRequestHeader->MessageSecurity == 0) { tdiStatus = RecvMessage( PrimarySession->ConnectionFileObject, &PrimarySession->RecvNdasFcStatistics, NULL, (UINT8 *)ndfsWinxpRequestHeader + NTOHL(ndfsRequestHeader->MessageSize4) - NTOHL(splitNdfsRequestHeader->MessageSize4), splitNdfsRequestHeader->Splitted ? PrimarySession->SessionContext.PrimaryMaxDataSize : (NTOHL(splitNdfsRequestHeader->MessageSize4) - sizeof(NDFS_REQUEST_HEADER)) ); if (tdiStatus != STATUS_SUCCESS) return tdiStatus; } #if 0 else { tdiStatus = RecvMessage( PrimarySession->ConnectionFileObject, cryptWinxpRequestMessage, splitNdfsRequestHeader->Splitted ? PrimarySession->SessionContext.PrimaryMaxDataSize : (splitNdfsRequestHeader->MessageSize - sizeof(NDFS_REQUEST_HEADER)), NULL ); if(tdiStatus != STATUS_SUCCESS) return tdiStatus; desResult = DES_CBCUpdate( &PrimarySession->DesCbcContext, (UINT8 *)ndfsWinxpRequestHeader + ndfsRequestHeader->MessageSize - splitNdfsRequestHeader->MessageSize, cryptWinxpRequestMessage, splitNdfsRequestHeader->Splitted ? PrimarySession->SessionContext.PrimaryMaxDataSize : (splitNdfsRequestHeader->MessageSize - sizeof(NDFS_REQUEST_HEADER)) ); ASSERT(desResult == IDOK); } #endif if (splitNdfsRequestHeader->Splitted) continue; PrimarySession->Thread.SessionSlot[Mid].NdfsWinxpRequestHeader = ndfsWinxpRequestHeader; return STATUS_SUCCESS; } }
NTSTATUS ReceiveNdfsWinxpMessage ( IN PPRIMARY_SESSION PrimarySession, IN _U16 Mid ) { PNDFS_REQUEST_HEADER ndfsRequestHeader = (PNDFS_REQUEST_HEADER)PrimarySession->Thread.SessionSlot[Mid].RequestMessageBuffer; PNDFS_WINXP_REQUEST_HEADER ndfsWinxpRequestHeader; _U8 *cryptWinxpRequestMessage; NTSTATUS tdiStatus; #if __NDAS_FAT_DES__ int desResult; #endif cryptWinxpRequestMessage = PrimarySession->Thread.SessionSlot[Mid].CryptWinxpMessageBuffer; //ASSERT(ndfsRequestHeader->Splitted == 0 && ndfsRequestHeader->MessageSecurity == 0); if (ndfsRequestHeader->Splitted == 0) { ASSERT( ndfsRequestHeader->MessageSize <= PrimarySession->Thread.SessionSlot[Mid].RequestMessageBufferLength ); ndfsWinxpRequestHeader = (PNDFS_WINXP_REQUEST_HEADER)(ndfsRequestHeader+1); if (ndfsRequestHeader->MessageSecurity == 0) { tdiStatus = RecvMessage( PrimarySession->ConnectionFileObject, (_U8 *)ndfsWinxpRequestHeader, ndfsRequestHeader->MessageSize - sizeof(NDFS_REQUEST_HEADER), NULL ); PrimarySession->Thread.SessionSlot[Mid].NdfsWinxpRequestHeader = ndfsWinxpRequestHeader; return tdiStatus; } ASSERT(ndfsRequestHeader->MessageSecurity == 1); tdiStatus = RecvMessage( PrimarySession->ConnectionFileObject, cryptWinxpRequestMessage, sizeof(NDFS_WINXP_REQUEST_HEADER), NULL ); if (tdiStatus != STATUS_SUCCESS) { return tdiStatus; } #if __NDAS_FAT_DES__ RtlZeroMemory(&PrimarySession->DesCbcContext, sizeof(PrimarySession->DesCbcContext)); RtlZeroMemory(PrimarySession->Iv, sizeof(PrimarySession->Iv)); //DES_CBCInit(&PrimarySession->DesCbcContext, PrimarySession->NetdiskPartition->NetdiskPartitionInformation.NetdiskInformation.Password, PrimarySession->Iv, DES_DECRYPT); DES_CBCInit(&PrimarySession->DesCbcContext, PrimarySession->NetdiskPartitionInformation.NetdiskInformation.Password, PrimarySession->Iv, DES_DECRYPT); desResult = DES_CBCUpdate(&PrimarySession->DesCbcContext, (_U8 *)ndfsWinxpRequestHeader, cryptWinxpRequestMessage, sizeof(NDFS_WINXP_REQUEST_HEADER)); ASSERT(desResult == IDOK); #endif if (ndfsRequestHeader->MessageSize - sizeof(NDFS_REQUEST_HEADER) - sizeof(NDFS_WINXP_REQUEST_HEADER)) { if (ndfsWinxpRequestHeader->IrpMajorFunction == IRP_MJ_WRITE && ndfsRequestHeader->RwDataSecurity == 0) { tdiStatus = RecvMessage( PrimarySession->ConnectionFileObject, (_U8 *)(ndfsWinxpRequestHeader+1), ndfsRequestHeader->MessageSize - sizeof(NDFS_REQUEST_HEADER) - sizeof(NDFS_WINXP_REQUEST_HEADER), NULL ); if (tdiStatus != STATUS_SUCCESS) { return tdiStatus; } } else { tdiStatus = RecvMessage( PrimarySession->ConnectionFileObject, cryptWinxpRequestMessage, ndfsRequestHeader->MessageSize - sizeof(NDFS_REQUEST_HEADER) - sizeof(NDFS_WINXP_REQUEST_HEADER), NULL ); if (tdiStatus != STATUS_SUCCESS) { return tdiStatus; } #if __NDAS_FAT_DES__ desResult = DES_CBCUpdate(&PrimarySession->DesCbcContext, (_U8 *)(ndfsWinxpRequestHeader+1), cryptWinxpRequestMessage, ndfsRequestHeader->MessageSize - sizeof(NDFS_REQUEST_HEADER) - sizeof(NDFS_WINXP_REQUEST_HEADER)); ASSERT(desResult == IDOK); #endif } } PrimarySession->Thread.SessionSlot[Mid].NdfsWinxpRequestHeader = ndfsWinxpRequestHeader; return STATUS_SUCCESS; } ASSERT( ndfsRequestHeader->Splitted == 1 ); // if (ndfsRequestHeader->MessageSize > (PrimarySession->RequestMessageBufferLength - sizeof(NDFS_REQUEST_HEADER) - sizeof(NDFS_WINXP_REQUEST_HEADER))) { PrimarySession->Thread.SessionSlot[Mid].ExtendWinxpRequestMessagePoolLength = ndfsRequestHeader->MessageSize - sizeof(NDFS_REQUEST_HEADER); PrimarySession->Thread.SessionSlot[Mid].ExtendWinxpRequestMessagePool = ExAllocatePoolWithTag( NonPagedPool, PrimarySession->Thread.SessionSlot[Mid].ExtendWinxpRequestMessagePoolLength, PRIMARY_SESSION_BUFFERE_TAG ); ASSERT(PrimarySession->Thread.SessionSlot[Mid].ExtendWinxpRequestMessagePool); if (PrimarySession->Thread.SessionSlot[Mid].ExtendWinxpRequestMessagePool == NULL) { DebugTrace2( 0, Dbg, ("ReceiveNdfsWinxpMessage: failed to allocate ExtendWinxpRequestMessagePool\n")); return STATUS_INSUFFICIENT_RESOURCES; } ndfsWinxpRequestHeader = (PNDFS_WINXP_REQUEST_HEADER)(PrimarySession->Thread.SessionSlot[Mid].ExtendWinxpRequestMessagePool); } // else // ndfsWinxpRequestHeader = (PNDFS_WINXP_REQUEST_HEADER)(ndfsRequestHeader+1); if (ndfsRequestHeader->MessageSecurity == 0) { tdiStatus = RecvMessage( PrimarySession->ConnectionFileObject, (_U8 *)ndfsWinxpRequestHeader, sizeof(NDFS_WINXP_REQUEST_HEADER), NULL ); if (tdiStatus != STATUS_SUCCESS) { return tdiStatus; } } else { tdiStatus = RecvMessage( PrimarySession->ConnectionFileObject, cryptWinxpRequestMessage, sizeof(NDFS_WINXP_REQUEST_HEADER), NULL ); if (tdiStatus != STATUS_SUCCESS) { return tdiStatus; } #if __NDAS_FAT_DES__ RtlZeroMemory(&PrimarySession->DesCbcContext, sizeof(PrimarySession->DesCbcContext)); RtlZeroMemory(PrimarySession->Iv, sizeof(PrimarySession->Iv)); //DES_CBCInit(&PrimarySession->DesCbcContext, PrimarySession->NetdiskPartition->NetdiskPartitionInformation.NetdiskInformation.Password, PrimarySession->Iv, DES_DECRYPT); DES_CBCInit(&PrimarySession->DesCbcContext, PrimarySession->NetdiskPartitionInformation.NetdiskInformation.Password, PrimarySession->Iv, DES_DECRYPT); desResult = DES_CBCUpdate(&PrimarySession->DesCbcContext, (_U8 *)ndfsWinxpRequestHeader, cryptWinxpRequestMessage, sizeof(NDFS_WINXP_REQUEST_HEADER)); ASSERT(desResult == IDOK); #endif } while(1) { PNDFS_REQUEST_HEADER splitNdfsRequestHeader = &PrimarySession->Thread.SessionSlot[Mid].SplitNdfsRequestHeader; tdiStatus = RecvMessage( PrimarySession->ConnectionFileObject, (_U8 *)splitNdfsRequestHeader, sizeof(NDFS_REQUEST_HEADER), NULL ); if (tdiStatus != STATUS_SUCCESS) return tdiStatus; if (!( PrimarySession->Thread.SessionState == SESSION_SETUP && ndfsRequestHeader->Uid == PrimarySession->SessionContext.Uid && ndfsRequestHeader->Tid == PrimarySession->SessionContext.Tid )) { ASSERT(NDASFAT_BUG); return STATUS_UNSUCCESSFUL; } if (ndfsRequestHeader->MessageSecurity == 0) { tdiStatus = RecvMessage( PrimarySession->ConnectionFileObject, (_U8 *)ndfsWinxpRequestHeader + ndfsRequestHeader->MessageSize - splitNdfsRequestHeader->MessageSize, splitNdfsRequestHeader->Splitted ? PrimarySession->SessionContext.PrimaryMaxDataSize : (splitNdfsRequestHeader->MessageSize - sizeof(NDFS_REQUEST_HEADER)), NULL ); if (tdiStatus != STATUS_SUCCESS) return tdiStatus; } else { tdiStatus = RecvMessage( PrimarySession->ConnectionFileObject, cryptWinxpRequestMessage, splitNdfsRequestHeader->Splitted ? PrimarySession->SessionContext.PrimaryMaxDataSize : (splitNdfsRequestHeader->MessageSize - sizeof(NDFS_REQUEST_HEADER)), NULL ); if (tdiStatus != STATUS_SUCCESS) return tdiStatus; #if __NDAS_FAT_DES__ desResult = DES_CBCUpdate( &PrimarySession->DesCbcContext, (_U8 *)ndfsWinxpRequestHeader + ndfsRequestHeader->MessageSize - splitNdfsRequestHeader->MessageSize, cryptWinxpRequestMessage, splitNdfsRequestHeader->Splitted ? PrimarySession->SessionContex.PrimaryMaxDataSize : (splitNdfsRequestHeader->MessageSize - sizeof(NDFS_REQUEST_HEADER)) ); ASSERT(desResult == IDOK); #endif } if (splitNdfsRequestHeader->Splitted) continue; PrimarySession->Thread.SessionSlot[Mid].NdfsWinxpRequestHeader = ndfsWinxpRequestHeader; return STATUS_SUCCESS; } }
NTSTATUS SendNdfsWinxpMessage ( IN PPRIMARY_SESSION PrimarySession, IN PNDFS_REPLY_HEADER NdfsReplyHeader, IN PNDFS_WINXP_REPLY_HEADER NdfsWinxpReplyHeader, IN _U32 ReplyDataSize, IN _U16 Mid ) { NTSTATUS tdiStatus; _U32 remaninigDataSize; //ASSERT(ReplyDataSize <= PrimarySession->SessionContext.SecondaryMaxDataSize && PrimarySession->MessageSecurity == 0); if (ReplyDataSize <= PrimarySession->SessionContext.SecondaryMaxDataSize) { #if __NDAS_FAT_DES__ int desResult; _U8 *cryptWinxpRequestMessage = PrimarySession->Thread.SessionSlot[Mid].CryptWinxpMessageBuffer; #endif RtlCopyMemory( NdfsReplyHeader->Protocol, NDFS_PROTOCOL, sizeof(NdfsReplyHeader->Protocol) ); NdfsReplyHeader->Status = NDFS_SUCCESS; NdfsReplyHeader->Flags = PrimarySession->SessionContext.Flags; NdfsReplyHeader->Uid = PrimarySession->SessionContext.Uid; NdfsReplyHeader->Tid = PrimarySession->SessionContext.Tid; NdfsReplyHeader->Mid = Mid; NdfsReplyHeader->MessageSize = sizeof(NDFS_REPLY_HEADER) + (PrimarySession->SessionContext.MessageSecurity ? ADD_ALIGN8(sizeof(NDFS_WINXP_REPLY_HEADER) + ReplyDataSize) : (sizeof(NDFS_WINXP_REPLY_HEADER) + ReplyDataSize)); ASSERT( NdfsReplyHeader->MessageSize <= PrimarySession->Thread.SessionSlot[Mid].ReplyMessageBufferLength ); tdiStatus = SendMessage( PrimarySession->ConnectionFileObject, (_U8 *)NdfsReplyHeader, sizeof(NDFS_REPLY_HEADER), NULL ); if (tdiStatus != STATUS_SUCCESS) { return tdiStatus; } if (PrimarySession->SessionContext.MessageSecurity == 0) { tdiStatus = SendMessage( PrimarySession->ConnectionFileObject, (_U8 *)NdfsWinxpReplyHeader, NdfsReplyHeader->MessageSize - sizeof(NDFS_REPLY_HEADER), NULL ); return tdiStatus; } #if __NDAS_FAT_DES__ if (NdfsWinxpReplyHeader->IrpMajorFunction == IRP_MJ_READ) DebugTrace2( 0, Dbg, ("DispatchRequest: PrimarySession->RwDataSecurity = %d\n", PrimarySession->RwDataSecurity) ); if (NdfsWinxpReplyHeader->IrpMajorFunction == IRP_MJ_READ && PrimarySession->RwDataSecurity == 0) { RtlCopyMemory(cryptWinxpRequestMessage, NdfsWinxpReplyHeader, sizeof(NDFS_WINXP_REPLY_HEADER)); RtlZeroMemory(&PrimarySession->DesCbcContext, sizeof(PrimarySession->DesCbcContext)); RtlZeroMemory(PrimarySession->Iv, sizeof(PrimarySession->Iv)); //DES_CBCInit(&PrimarySession->DesCbcContext, PrimarySession->NetdiskPartition->NetdiskPartitionInformation.NetdiskInformation.Password, PrimarySession->Iv, DES_ENCRYPT); DES_CBCInit(&PrimarySession->DesCbcContext, PrimarySession->NetdiskPartitionInformation.NetdiskInformation.Password, PrimarySession->Iv, DES_ENCRYPT); desResult = DES_CBCUpdate(&PrimarySession->DesCbcContext, (_U8 *)NdfsWinxpReplyHeader, cryptWinxpRequestMessage, sizeof(NDFS_WINXP_REPLY_HEADER)); ASSERT(desResult == IDOK); tdiStatus = SendMessage( PrimarySession->ConnectionFileObject, (_U8 *)NdfsWinxpReplyHeader, NdfsReplyHeader->MessageSize - sizeof(NDFS_REPLY_HEADER), NULL ); } else { RtlZeroMemory(&PrimarySession->DesCbcContext, sizeof(PrimarySession->DesCbcContext)); RtlZeroMemory(PrimarySession->Iv, sizeof(PrimarySession->Iv)); //DES_CBCInit(&PrimarySession->DesCbcContext, PrimarySession->NetdiskPartition->NetdiskPartitionInformation.NetdiskInformation.Password, PrimarySession->Iv, DES_ENCRYPT); DES_CBCInit(&PrimarySession->DesCbcContext, PrimarySession->NetdiskPartitionInformation.NetdiskInformation.Password, PrimarySession->Iv, DES_ENCRYPT); desResult = DES_CBCUpdate(&PrimarySession->DesCbcContext, cryptWinxpRequestMessage, (_U8 *)NdfsWinxpReplyHeader, NdfsReplyHeader->MessageSize-sizeof(NDFS_REPLY_HEADER)); ASSERT(desResult == IDOK); tdiStatus = SendMessage( PrimarySession->ConnectionFileObject, cryptWinxpRequestMessage, NdfsReplyHeader->MessageSize - sizeof(NDFS_REPLY_HEADER), NULL ); } return tdiStatus; #endif } ASSERT( (_U8 *)NdfsWinxpReplyHeader == PrimarySession->Thread.SessionSlot[Mid].ExtendWinxpReplyMessagePool ); ASSERT( ReplyDataSize > PrimarySession->SessionContext.SecondaryMaxDataSize ); RtlCopyMemory(NdfsReplyHeader->Protocol, NDFS_PROTOCOL, sizeof(NdfsReplyHeader->Protocol)); NdfsReplyHeader->Status = NDFS_SUCCESS; NdfsReplyHeader->Flags = PrimarySession->SessionContext.Flags; NdfsReplyHeader->Splitted = 1; NdfsReplyHeader->Uid = PrimarySession->SessionContext.Uid; NdfsReplyHeader->Tid = PrimarySession->SessionContext.Tid; NdfsReplyHeader->Mid = 0; NdfsReplyHeader->MessageSize = sizeof(NDFS_REPLY_HEADER) + (PrimarySession->SessionContext.MessageSecurity ? ADD_ALIGN8(sizeof(NDFS_WINXP_REPLY_HEADER) + ReplyDataSize) : (sizeof(NDFS_WINXP_REPLY_HEADER) + ReplyDataSize)); tdiStatus = SendMessage( PrimarySession->ConnectionFileObject, (_U8 *)NdfsReplyHeader, sizeof(NDFS_REPLY_HEADER), NULL ); if (tdiStatus != STATUS_SUCCESS) { return tdiStatus; } if (PrimarySession->SessionContext.MessageSecurity) { #if __NDAS_FAT_DES__ int desResult; _U8 *cryptWinxpRequestMessage = PrimarySession->Thread.SessionSlot[Mid].CryptWinxpMessageBuffer; RtlZeroMemory(&PrimarySession->DesCbcContext, sizeof(PrimarySession->DesCbcContext)); RtlZeroMemory(PrimarySession->Iv, sizeof(PrimarySession->Iv)); //DES_CBCInit(&PrimarySession->DesCbcContext, PrimarySession->NetdiskPartition->NetdiskPartitionInformation.NetdiskInformation.Password, PrimarySession->Iv, DES_ENCRYPT); DES_CBCInit(&PrimarySession->DesCbcContext, PrimarySession->NetdiskPartitionInformation.NetdiskInformation.Password, PrimarySession->Iv, DES_ENCRYPT); desResult = DES_CBCUpdate(&PrimarySession->DesCbcContext, cryptWinxpRequestMessage, (_U8 *)NdfsWinxpReplyHeader, sizeof(NDFS_WINXP_REPLY_HEADER)); ASSERT(desResult == IDOK); tdiStatus = SendMessage( PrimarySession->ConnectionFileObject, cryptWinxpRequestMessage, sizeof(NDFS_WINXP_REPLY_HEADER), NULL ); #endif } else { tdiStatus = SendMessage( PrimarySession->ConnectionFileObject, (_U8 *)NdfsWinxpReplyHeader, sizeof(NDFS_WINXP_REPLY_HEADER), NULL ); if (tdiStatus != STATUS_SUCCESS) { return tdiStatus; } } remaninigDataSize = ReplyDataSize; while(1) { RtlCopyMemory(NdfsReplyHeader->Protocol, NDFS_PROTOCOL, sizeof(NdfsReplyHeader->Protocol)); NdfsReplyHeader->Status = NDFS_SUCCESS; NdfsReplyHeader->Flags = PrimarySession->SessionContext.Flags; NdfsReplyHeader->Uid = PrimarySession->SessionContext.Uid; NdfsReplyHeader->Tid = PrimarySession->SessionContext.Tid; NdfsReplyHeader->Mid = 0; NdfsReplyHeader->MessageSize = sizeof(NDFS_REPLY_HEADER) + (PrimarySession->SessionContext.MessageSecurity ? ADD_ALIGN8(remaninigDataSize) : remaninigDataSize); if (remaninigDataSize > PrimarySession->SessionContext.SecondaryMaxDataSize) NdfsReplyHeader->Splitted = 1; tdiStatus = SendMessage( PrimarySession->ConnectionFileObject, (_U8 *)NdfsReplyHeader, sizeof(NDFS_REPLY_HEADER), NULL ); if (tdiStatus != STATUS_SUCCESS) { return tdiStatus; } if (PrimarySession->SessionContext.MessageSecurity) { #if __NDAS_FAT_DES__ int desResult; _U8 *cryptNdfsWinxpReplyHeader = PrimarySession->Thread.SessionSlot[Mid].CryptWinxpMessageBuffer; desResult = DES_CBCUpdate( &PrimarySession->DesCbcContext, cryptNdfsWinxpReplyHeader, (_U8 *)(NdfsWinxpReplyHeader+1) + (ReplyDataSize - remaninigDataSize), NdfsReplyHeader->Splitted ? PrimarySession->SessionContext.SecondaryMaxDataSize : (NdfsReplyHeader->MessageSize - sizeof(NDFS_REPLY_HEADER)) ); ASSERT(desResult == IDOK); tdiStatus = SendMessage( PrimarySession->ConnectionFileObject, cryptNdfsWinxpReplyHeader, NdfsReplyHeader->Splitted ? PrimarySession->SessionContext.SecondaryMaxDataSize : (NdfsReplyHeader->MessageSize - sizeof(NDFS_REPLY_HEADER)), NULL ); #endif } else { tdiStatus = SendMessage( PrimarySession->ConnectionFileObject, (_U8 *)(NdfsWinxpReplyHeader+1) + (ReplyDataSize - remaninigDataSize), NdfsReplyHeader->Splitted ? PrimarySession->SessionContext.SecondaryMaxDataSize : (NdfsReplyHeader->MessageSize - sizeof(NDFS_REPLY_HEADER)), NULL ); } if (tdiStatus != STATUS_SUCCESS) { return tdiStatus; } if (NdfsReplyHeader->Splitted) remaninigDataSize -= PrimarySession->SessionContext.SecondaryMaxDataSize; else return STATUS_SUCCESS; ASSERT( (_S32)remaninigDataSize > 0) ; } return STATUS_SUCCESS; }