首页
社区
课程
招聘
[求助]IOCTL 通信的问题?
发表于: 2010-3-24 15:25 4923

[求助]IOCTL 通信的问题?

2010-3-24 15:25
4923
应用层和驱动层间通信。使用 IOCTL 的 “直接”方式通信的时候。获取控制码后,为什么获取MDL 的时候,好多次都是空啊?
    PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);
    ULONG controlCode = IrpSp->Parameters.DeviceIoControl.IoControlCode;    
    switch(controlCode)
    {
    case IOCTL_INPUT_EVENT:
        {
            pOutputBuffer = MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority);
            if (pOutputBuffer)
            {
                ;
            }
        }
    }

使用 Windbg 跟踪的时候发现,好多时候 pOutputBuffer 都为空。是什么原因?怎样避免这种情况出现呢?谢谢指教!

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 636
活跃值: (174)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
2
用MmGetMdlVirtualAddress试试
2010-3-24 16:46
0
雪    币: 75
活跃值: (723)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
是不是BOOL WINAPI DeviceIoControl(
  __in         HANDLE hDevice,
  __in         DWORD dwIoControlCode,
  __in_opt    LPVOID lpInBuffer,
  __in         DWORD nInBufferSize,
  __out_opt    LPVOID lpOutBuffer,
  __in         DWORD nOutBufferSize,
  __out_opt    LPDWORD lpBytesReturned,
  __inout_opt  LPOVERLAPPED lpOverlapped
的输出缓冲为null??
2010-3-24 16:51
0
雪    币: 247
活跃值: (187)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
是在上面的代码:
pOutputBuffer = MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority);
            if (pOutputBuffer)
执行后,pOutpBuffer 为空。
我还是先试下 MmGetMdlVirtualAddress ()看看。
谢谢了啊!
2010-3-25 12:37
0
雪    币: 75
活跃值: (723)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
5
我把我的意图说明白点,

用DeviceIoControl进行应用层和驱动层间的通信,如果调用DeviceIoControl时,设置输出缓冲为NULL。也就是此次通信并不需要从驱动层获得数据,系统又何必对输出缓冲再搞个mdl映射,直接pOutputBuffer = MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority) = NULL。

如果你说的情况是这样子的,那就没啥奇怪的。初学驱动。说错莫怪
2010-3-25 15:32
0
雪    币: 247
活跃值: (187)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
skypismire 谢谢你的关注。
你的意思是。我的应用层在调用 DeviceIoControl  的时候   
__out_opt    LPVOID lpOutBuffer,
__in         DWORD nOutBufferSize,
上面两个参数可能设置为空是吧!
但是,我分明分配到了足够的空间了再调用该函数的啊!我想该不是那得问题。

DDK 上已经有了相应的说法了。
NormalPagePriority indicates that the mapping request can fail if system is very low on resources. An example of this is a noncritical local file system request.
不过还是谢谢你们的帮助。
2010-3-26 09:29
0
雪    币: 636
活跃值: (174)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
7
你传出了多少东西?一般来说是不会system is very low on resources的,请检查驱动中有没有正确设置pIrp->IoStatus.Information。
2010-3-26 10:04
0
雪    币: 247
活跃值: (187)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
Irp->IoStatus.Information 的设置一般有什么要求呢?
在 IOCTL 通信的这个地方,一般应该设置为数据传输的字节数吧!如果是这个的话,我想我应该是没错的啊!还是有什么其他的要求?
2010-3-29 09:13
0
雪    币: 247
活跃值: (187)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
Irp->IoStatus.Information 的设置一般有什么要求呢?
在 IOCTL 通信的这个地方,一般应该设置为数据传输的字节数吧!如果是这个的话,应该是在数据传输完成后再设置的吧!我想我应该是没错的啊!还是有什么其他的要求?
2010-3-29 09:14
0
游客
登录 | 注册 方可回帖
返回
//