shzhouxh
驱动牛犊
驱动牛犊
  • 注册日期2001-05-02
  • 最后登录2003-04-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1641回复:5

DeviceIoContol使用METHOD_OUT_DIRECT方式为什么会导致windows2000重启

楼主#
更多 发布于:2001-12-06 01:45
    我使用METHOD_OUT_DIRECT方式进行I/O操作,在用户模式下用VirtualAlloc分配了一块内存,指针名为Buffer(PVOID型),再将这个指针作为DeviceIoContol的OutBuffer参数传递给I/O管理器。在内核代码中,我使用MmGetSystemAddressForMdl()得到Buffer在系统空间的地址,然后在对这块内存的操作中,若只对一个字节写入,并不会出现问题,但是我若用一个循环,连续对这片内存写入,则导致Windows2000重启。为什么呀?!!!
Iamme
驱动小牛
驱动小牛
  • 注册日期2001-03-23
  • 最后登录2005-10-11
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2001-12-06 09:20
不得而知
但是据文档说MmGetSystemAddressForMdl()在2000中已经荒废了
Go,go ahead
James.Ji
驱动老牛
驱动老牛
  • 注册日期2001-09-17
  • 最后登录2006-05-16
  • 粉丝0
  • 关注0
  • 积分-9分
  • 威望-8点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2001-12-10 10:08
重起一般来说是存储区越界,你是否分配的空间太小了?
车到山前必有路。 虽然有些土,却是我最有感触的一句话。
blue
驱动大牛
驱动大牛
  • 注册日期2001-04-25
  • 最后登录2010-10-15
  • 粉丝0
  • 关注0
  • 积分55分
  • 威望12点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
地板#
发布于:2001-12-11 13:14
你是在哪里用循环的?在驱动中,在应用程序中?把相关代码帖出来。
最大可能就是内存越界了!
mydrive
驱动牛犊
驱动牛犊
  • 注册日期2001-06-21
  • 最后登录2004-05-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2001-12-12 17:10
MmGetSystemAddressForMdl()在2000中应该还能用。好好检查程序中的其它部分。在内核中使用存储器一定要小心。
sunwang
驱动牛犊
驱动牛犊
  • 注册日期2001-05-09
  • 最后登录2001-12-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2001-12-13 14:49
DeviceIoControl+BUFFER_OUT_DIRECT时,系统自动锁定用户态的虚拟内存对应的物理内存,并提供给内核驱动程序一个Mdl, 我们可以调用MmGetSystemAddressForMdl(Mdl)得到一个内核可以使用的虚拟内存地址。
看你的说明,应该是写的时候内存越界。
请检查irpSp->Parameters.DeviceIoControl.OutputBufferLength的大小。
^十万就结婚^
游客

返回顶部