繁体   English   中英

DeviceIoControl输出缓冲区为空

[英]DeviceIoControl output buffer is empty

我试图将一些数据从内核驱动程序传递到用户应用程序。

我在驱动程序和应用程序共享的头文件中定义了结构:

    typedef struct _CallBack
{
    HANDLE  hParId;
    HANDLE  hProId;
    BOOLEAN bCreate;
}CB_INFO, *PCB_INFO;

在驱动程序中,我有一个switch语句

case IOCTL_CODE:    
if (outputBufferLength >= sizeof(PCB_INFO))
    {
           callback->hParId = deviceExtension->hParId;
           callback->hProId = deviceExtension->hProId;
           callback->bCreate = deviceExtension->bCreate;

           Irp->IoStatus.Information = outputBufferLength;

           Status = STATUS_SUCCESS;
    }

我尝试使用DbgPrint调试代码,if语句没有任何问题,因为outputBufferLength为12,PCB_INFO为8。

至于我的应用程序中的DeviceIoControl代码:

    DeviceIoControl(
                driver,
                IOCTL_CODE,
                0,
                0,
                &callback,
                sizeof(callback),
                &bytesReturn,
                NULL);

我检查了bytesReturn,它不返回0,它返回12。

其他信息:我正在使用64位Windows 7。

我真的不知道出什么问题了,真的很感谢任何形式的帮助。 如果您需要更多详细信息,我很乐意提供更多代码。 可能与我在64位平台上编写驱动程序有关,还是我的代码有问题?

提前致谢!

首先,PCB_INFO是指针类型,因此sizeof(PCB_INFO)是指针的大小,而不是您指向的缓冲区的大小。 请改用sizeof(CB_INFO)sizeof(*PCB_INFO) 问题中显示的代码实际上是在缓冲区末尾编写的,因此结果是不可预测的。

其次,您的结构包括两个HANDLE类型的元素,它们在32位和64位体系结构中大小不同。 在大多数情况下,Windows自动负责在32位和64位结构之间进行转换(“转换”),但是对于I / O控制代码,这是驱动程序的责任。 DDK文章在您的64位驱动程序中支持32位I / O中对此进行了描述。

另外,您可以将应用程序设为64位,或更改结构,使其仅使用大小不变的元素。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM