Forum Replies Created
Viewing 2 posts - 1 through 2 (of 2 total)
-
AuthorPosts
-
Вот… Поправил немного:
NTSTATUS NewClientEventChainedReceive(
IN PVOID TdiEventContext,
IN CONNECTION_CONTEXT ConnectionContext,
IN ULONG ReceiveFlags,
IN ULONG ReceiveLength,
IN ULONG StartingOffset,
IN PMDL Tsdu,
IN PVOID TsduDescriptor
)
{
BOOLEAN bReceiveFlag = FALSE;
KIRQL oldIrql;
NTSTATUS ntStatus;
ULONG ulTcpDataType = 0;
PUCHAR puchData = NULL;
PUCHAR puchMdlData = NULL;
PCLIENT_EVENT_CONTEXT_INFO pClientEventContextInfo;
CLIENTEVENTCHAINEDRECEIVE RealClientEventChainedReceive;
/*__asm int 3*/
KeAcquireSpinLock(&g_ClientEventReceiveSpinLock, &oldIrql);
pClientEventContextInfo = (PCLIENT_EVENT_CONTEXT_INFO)TdiEventContext;
RealClientEventChainedReceive = (CLIENTEVENTCHAINEDRECEIVE)pClientEventContextInfo->EventRealHandler;
KeReleaseSpinLock(&g_ClientEventReceiveSpinLock, oldIrql);
do {
if( Tsdu == NULL || ReceiveLength == 0 )
break;
puchMdlData = (PUCHAR)MmGetSystemAddressForMdlSafe(Tsdu, LowPagePriority);
if( puchMdlData == NULL )
break;
puchData = (PUCHAR)ExAllocatePool(NonPagedPool, ReceiveLength);
if( puchData == NULL )
break;
RtlZeroMemory(puchData, ReceiveLength);
RtlCopyMemory(puchData, puchMdlData, ReceiveLength);
...
...
bReceiveFlag = TRUE;
} while( FALSE );
ntStatus = RealClientEventChainedReceive(pClientEventContextInfo->EventRealContext,
ConnectionContext,
ReceiveFlags,
ReceiveLength,
StartingOffset,
Tsdu,
TsduDescriptor);
TCPMODULE_KDPRINT(("In NewClientEventChainedReceive [RealClientEventChainedReceive]: ReceiveLength=%lu ntStatus=0x%08Xn", ReceiveLength, ntStatus));
if( bReceiveFlag ) {
if( ntStatus == STATUS_SUCCESS || ntStatus == STATUS_PENDING ) {
// Сохраняем данные для дальнейшего использования
}
else {
// Если статус STATUS_DATA_NOT_ACCEPTED, то чистим ранее выделенные ресурсы
}
}
return ntStatus;
}
т.е. в puchData у меня будет копия принятых данных. В случае, если реальный нотификатор вернет STATUS_DATA_NOT_ACCEPTED, то клиенту данные не нужны и я очищаю память… Если же реальный нотификатор вернет STATUS_SUCCESS или STATUS_PENDING, то сохраняею данные.
Я правильно все понял?Большое спасибо!
-
AuthorPosts
Viewing 2 posts - 1 through 2 (of 2 total)