阅读:1137回复:1
蓝屏求助:有关MDL
我要用TDI实现数据的发送和接收,发送代码如下:
NTSTATUS TdiSend( IN PFILE_OBJECT pEndPointObject, IN PVOID pBuffer, IN ULONG Length ) { PDEVICE_OBJECT pDeviceObject; KEVENT Event; IO_STATUS_BLOCK IoStatus; PIRP pIrp; PMDL pMdl; NTSTATUS status; dprintf(\"Sending...\\n\"); pDeviceObject = IoGetRelatedDeviceObject(pEndPointObject); KeInitializeEvent(&Event, NotificationEvent, FALSE); pIrp = TdiBuildInternalDeviceControlIrp( TDI_SEND, pDeviceObject, pEndPointObject, &Event, &IoStatus ); if( NULL == pIrp ) { dprintf(\"TdiSend():Insufficient Resources\\n\"); return STATUS_INSUFFICIENT_RESOURCES; } pMdl = IoAllocateMdl( pBuffer, Length, FALSE, FALSE, pIrp ); if( NULL == pMdl ) { dprintf(\"TdiSend():Fail to allocate the mdl\"); return STATUS_INSUFFICIENT_RESOURCES; } _try { MmProbeAndLockPages( pMdl, KernelMode, IoModifyAccess ); } _except( EXCEPTION_EXECUTE_HANDLER ) { IoFreeMdl( pMdl ); pMdl = NULL; return STATUS_INSUFFICIENT_RESOURCES; } TdiBuildSend( pIrp, pDeviceObject, pEndPointObject, NULL, NULL, pMdl, 0, Length ); status = IoCallDriver(pDeviceObject, pIrp); if( STATUS_PENDING == status ) { dprintf(\"Waiting to send\"); status = KeWaitForSingleObject(&Event, UserRequest, KernelMode, FALSE, 0); } if( !NT_SUCCESS(status) ) { dprintf(\"Fail to Send\\n\"); return status; } if( !NT_SUCCESS(IoStatus.Status) ) { dprintf(\"Fail to Send\\n\"); return IoStatus.Status; } dprintf(\"Success to Send %u bytes\\n\", IoStatus.Information); MmUnlockPages(pMdl); IoFreeMdl(pMdl); return IoStatus.Status; } 问题是我这代码执行时,运行一次没有问题,如果调用两次就有出现蓝屏了,我测试出来好象是 IoFreeMdl(pMdl); 的问题,因为当我把这行代码注释掉就没有问题了,可是肯定需要释放的呀,这是怎么回事呢? 这与驱动的I/O方式有关吗?我是新手,许多东西都不懂,我在这个问题上已经困惑几天了 |
|
沙发#
发布于:2003-07-28 10:23
没有人回答吗?
|
|