Thomas,
First of all thank you for such an impressively fast reply.
To be honest I must admit (but I am sure that it's quite obvious

that I am a newbie in drivers' subject.
Your remarks gave me a lot to think. I've changed my code, added my own
packets and buffers pools, so that I can tell apart which packets are
mine and which are not (in PTSendComplete).
Moreover I implemented solution from NDISPROT example, so now I suspend
irp call and keep it with packet and after all I can complete it in
PTSendComplete.
Now it seems like it works fine for me.
In short, my code now looks like below (again I overlooked some extra
code):
filter.c:
NdisAcquireSpinLock(&(pFilterContext->PacketListSpinLock));
NdisAllocatePacket(&Status, &pNdisPacket, pAdapt->OutPacketPoolHandle
);
NdisAllocateBuffer(&Status, &pNdisBuffer, pAdapt->OutBufferPoolHandle,
ioBuffer, inputBufferLength );
NdisChainBufferAtFront(pNdisPacket, pNdisBuffer);
NdisReleaseSpinLock(&(pFilterContext->PacketListSpinLock));
NdisInterlockedIncrement( &pAdapt->RefCount );
IoMarkIrpPending(pIrp);
InsertTailList(&(pAdapt->OutPendedListHead),
&pIrp->Tail.Overlay.ListEntry);
IoSetCancelRoutine(pIrp, CancelOutIrp);
NPROT_IRP_FROM_SEND_PKT(pNdisPacket) = pIrp;
NdisSend(&Status, pAdapt->BindingHandle, pNdisPacket );
if (Status == NDIS_STATUS_PENDING){
NtStatus = STATUS_PENDING;
}
break;
protocol.c:
if (PoolHandle == pAdapt->OutPacketPoolHandle) {
PIRP pIrp;
PIO_STACK_LOCATION pIrpSp;
UINT nBufferCount;
PNDIS_BUFFER pCurrentBuffer;
UINT TotalPacketLength;
pIrp = NPROT_IRP_FROM_SEND_PKT(Packet);
NdisAcquireSpinLock(&pAdapt->Lock);
RemoveEntryList(&pIrp->Tail.Overlay.ListEntry);
NdisReleaseSpinLock(&pAdapt->Lock);
IoSetCancelRoutine(pIrp, NULL);
pIrpSp = IoGetCurrentIrpStackLocation(pIrp);
if (Status == NDIS_STATUS_SUCCESS) {
pIrp->IoStatus.Information = pIrpSp->Parameters.Write.Length;
pIrp->IoStatus.Status = STATUS_SUCCESS;
} else {
pIrp->IoStatus.Information = 0;
pIrp->IoStatus.Status = STATUS_UNSUCCESSFUL;
}
NdisQueryPacket( (PNDIS_PACKET )Packet, NULL, (PUINT)&nBufferCount,
&pCurrentBuffer, &TotalPacketLength );
// my packets always have only one buffer
if (pCurrentBuffer)
NdisFreeBuffer(pCurrentBuffer);
NdisFreePacket(Packet);
IoCompleteRequest(pIrp, IO_NO_INCREMENT);
NdisInterlockedDecrement( &pAdapt->RefCount );
}
Thanks again for Your help and I'll apreciate it if you have any
further comments.
Arek