[英]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.