能力值:
( LV2,RANK:10 )
2 楼
以下内容为TDI_EVENT_RECEIVE事件的回调函数,他会导致经常的蓝屏因为我还不会驱动的调试,这让我束手无策啊。
NTSTATUS TdiFilterRecvEventHandler(
IN PVOID TdiEventContext,
IN CONNECTION_CONTEXT ConnectionContext,
IN ULONG ReceiveFlags,
IN ULONG BytesIndicated,
IN ULONG BytesAvailable,
OUT ULONG *BytesTaken,
IN PVOID Tsdu,
OUT PIRP *IoRequestPacket)
{
PIRP irp;
PVOID buf;
ULONG mdl_length;
PVOID kernel_address;
NTSTATUS ntStatus;
PIO_STACK_LOCATION irps;
PTDI_EVENT_HANDLER_WRAP pEventHandlerWrap;
KdPrint(("[tdi_fw] Recv Event Handler\n"));
pEventHandlerWrap = (PTDI_EVENT_HANDLER_WRAP)TdiEventContext;
ntStatus = ((PTDI_IND_RECEIVE)pEventHandlerWrap->pOrgEventHandler)(
pEventHandlerWrap->pOrgEventContext,
ConnectionContext,
ReceiveFlags,
BytesIndicated,
BytesAvailable,
BytesTaken,
Tsdu,
IoRequestPacket
);
// 以下代码屏蔽掉,就不会蓝屏
if ((*BytesTaken != 0) && (*IoRequestPacket != NULL)) {
irp = *IoRequestPacket;
irps = IoGetCurrentIrpStackLocation(irp);
mdl_length = MmGetMdlByteCount(irp->MdlAddress);
kernel_address = MmGetSystemAddressForMdlSafe(irp->MdlAddress, NormalPagePriority);
buf = ExAllocatePool(NonPagedPool, (mdl_length / 4 + 1) * 4);
RtlCopyMemory(buf, kernel_address, mdl_length);
*((char*)buf + mdl_length) = 0;
KdPrint(("%s\n", (char*)buf));
ExFreePool(buf);
KdPrint(("[tdi_fw] Recv End\n"));
} return ntStatus;
}
能力值:
( LV2,RANK:10 )
3 楼
IN PVOID Tsdu 数据
能力值:
( LV2,RANK:10 )
4 楼
这个Tsdu的含义是什么,在网上一直没找到,而且我打印这个数据,就蓝屏。
我是按下面得方法打印的。
KdPrint(("%s\n"), (char*)Tsdu);