Re: Re: TDI-фильтр и ClientEventChainedReceive(Expedited)

Home Forums Discussions Support Portal TDI-фильтр и ClientEventChainedReceive(Expedited) Re: Re: TDI-фильтр и ClientEventChainedReceive(Expedited)

#6849

prus
Participant

Вот… Поправил немного:


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, то сохраняею данные.
Я правильно все понял?