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

高分救急:IoFreeMdl出错,现在连操作系统都进不了了,怎么办

楼主#
更多 发布于:2003-07-23 20:07
我只是把我的代码中添加了IoFreeMdl()而已,怎么会这样子的呢?
我代码中使用了MDL,我通过IoAllocateMdl创建了一个MDL,然后对它MmProbeAndLockPages().本来我是没有释放我的MDL的,运行时也没有出错,但当我添加了IoFreeMdl后,运行时就出现蓝屏,然后我就重起调试,重复了几次后就再也进不去了。
是IoFreeMdl的问题吗?可是我觉得是应该调用的啊

系统是WIN2000,现象是当WIN2000载入到最后是,跳出蓝屏,错误是
STOP:0x00000051
REGISTRY_ERROR
我试图从安全模式进入,一样的结果,该怎么办?重装系统吗?太耗时间了,而且到时候说不定再出现这样的状况,还是没用。

大家帮忙啊,分数可以再加的
gjltce
驱动小牛
驱动小牛
  • 注册日期2003-07-05
  • 最后登录2011-12-10
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望59点
  • 贡献值0点
  • 好评度25点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-07-24 10:50
1.先把相应的设备拆下,看能否启动。
2.选择最近的一次启动设置试试。
ysr
ysr
驱动牛犊
驱动牛犊
  • 注册日期2001-05-11
  • 最后登录2015-01-29
  • 粉丝0
  • 关注0
  • 积分79分
  • 威望48点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-07-24 16:15
释放前有没有调用MmUnlockPages?
试试软盘启动,把你那个DRIVER删除掉再重起。
hanzp
驱动牛犊
驱动牛犊
  • 注册日期2003-05-25
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-07-24 16:41
释放前有没有调用MmUnlockPages?
试试软盘启动,把你那个DRIVER删除掉再重起。


调用了,我的程序是想在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;
}

MmProbeAndLockPages(
pMdl,
KernelMode,
IoModifyAccess
);

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);
注释掉的话就没什么问题,但是肯定应该释放的呀
grant
驱动老牛
驱动老牛
  • 注册日期2001-05-14
  • 最后登录2007-04-13
  • 粉丝0
  • 关注0
  • 积分350分
  • 威望35点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-07-25 08:51
MmUnlockPages(pMdl) 与 IoFreeMdl(pMdl)之间加延时试试看。
另外,把系统重装后做个ghost放在后面的分区。调驱动时把系统搞当掉是经常的事。
助人乃快乐之本 有人给分就更快乐了 :-)
hanzp
驱动牛犊
驱动牛犊
  • 注册日期2003-05-25
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-07-25 16:09
我已经重装系统了,也做了GHOST,
现在的问题是我那IoFreeMdl()上,我决定另开一贴,希望大家支持
god4mir2
驱动牛犊
驱动牛犊
  • 注册日期2010-07-07
  • 最后登录2011-07-08
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望111点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2011-05-17 11:00
我查了半天,貌似是不用释放的,好多代码里都这样,可能与TdiBuildInternalDeviceControlIrp申请的irp一样,自动释放
god4mir2
驱动牛犊
驱动牛犊
  • 注册日期2010-07-07
  • 最后登录2011-07-08
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望111点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2011-05-17 11:00
这都是03年的帖子了。
游客

返回顶部