WDK:将 PVOID 转换为 PWCHAR(C 到 C++ 转换)

Posted

技术标签:

【中文标题】WDK:将 PVOID 转换为 PWCHAR(C 到 C++ 转换)【英文标题】:WDK: Casting PVOID to PWCHAR (C to C++ conversion) 【发布时间】:2017-07-22 11:24:45 【问题描述】:

我正在尝试使用 Windows 驱动程序并使用 Microsoft 的驱动程序代码示例(确切地说是 Minispy)。不幸的是,我对 C++ 非常陌生,尤其是驱动程序开发。

在将用户模式应用程序从 C 转换为 C++ 时(大部分部分现在运行良好),我遇到了一个有趣的转换:

CHAR buffer[1024];
PINSTANCE_FULL_INFORMATION data = (PINSTANCE_FULL_INFORMATION)buffer;

hResult = FilterVolumeInstanceFindFirst(VolumeName,
        InstanceFullInformation,
        data,
        sizeof(buffer) - sizeof(WCHAR),
        &bytesReturned,
        &volumeIterator);

PWCHAR filtername = PVOID(PUCHAR(data) + data->FilterNameBufferOffset);
filtername[data->FilterNameLength / sizeof(WCHAR)] = L'\0';

if (_wcsicmp(filtername, MINISPY_NAME) == 0)  ...

这部分代码提供编译器错误 C2440: Cannot convert from PVOID to PWCHAR:

filtername = PVOID(PUCHAR(data) + data->FilterNameBufferOffset);

代码在 C 中运行得非常好,但 C++ 不会将该 void 指针“数组”转换为 PWCHAR。

我已经尝试了几个小时,但我无法让它工作。有什么想法吗?

非常感谢!

供参考:

PINSTANCE_FULL_INFORMATION 结构:

https://msdn.microsoft.com/de-de/library/ff548185(v=vs.85).aspx

编译器错误C2440:

https://msdn.microsoft.com/en-us/library/sy5tsf8z.aspx

【问题讨论】:

当然PVOID不能赋值给c++中的PWCHAR变量。你需要直接投射PWCHAR filtername = (PWCHAR)(PUCHAR(data) + data->FilterNameBufferOffset); 或说(PWSTR)RtlOffsetToPointer(data, data->FilterNameBufferOffset) 【参考方案1】:

你只需要这个:

PWCHAR filtername = PWCHAR(PUCHAR(data) + data->FilterNameBufferOffset);

原因是 C 允许将 void* 隐式转换为任何内容,而在 C++ 中,void* 必须是显式的。

因此,这实际上是原始 C 代码中未被注意到的一个小错误:作者将PUCHAR 转换为PVOID,然后将其分配给PWCHAR。 C 编译器并不介意,因为可以隐式地将PVOID 转换为任何内容。 C++ 编译器确实介意,要求您进一步将PVOID 转换为PWCHAR。但是,首先不需要强制转换为PVOID:您可以将PUCHAR 强制转换为PWCHAR,而无需将中间转换为PVOID

【讨论】:

做到了。刚刚拯救了我的一天! :)

以上是关于WDK:将 PVOID 转换为 PWCHAR(C 到 C++ 转换)的主要内容,如果未能解决你的问题,请参考以下文章

无法在visual studio中的visual c ++下找到windows驱动程序选项(已安装WDK)

如何安装WDK并运行编译一个工程

如何安装WDK并运行编译一个工程

pvoid64 pvoid

关于 PVOID 的解释

WDK安装失败的问题