gpt4 book ai didi

c++ - DeviceIoControl 输出缓冲区为空

转载 作者:行者123 更新时间:2023-11-28 00:25:56 28 4
gpt4 key购买 nike

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

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

    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 文章中描述 Supporting 32-Bit I/O in Your 64-Bit Driver .

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

关于c++ - DeviceIoControl 输出缓冲区为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25111581/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com