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

WDK: Casting PVOID to PWCHAR (C to C++ conversion)

我正在试验 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'[=10=]';

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

这部分代码传递了编译器错误 C2440:无法从 PVOID 转换为 PWCHAR:

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

该代码在 C 中运行得非常好,但 C++ 不会将空指针 "array" 转换为 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

你只需要这个:

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

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

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