hanzp
驱动牛犊
驱动牛犊
  • 注册日期2003-05-25
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1137回复:1

蓝屏求助:有关MDL

楼主#
更多 发布于:2003-07-25 16:20
我要用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方式有关吗?我是新手,许多东西都不懂,我在这个问题上已经困惑几天了
hanzp
驱动牛犊
驱动牛犊
  • 注册日期2003-05-25
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-07-28 10:23
没有人回答吗?
游客

返回顶部