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

标签 c++ winapi wdk

我正在试验 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:无法从 PVOID 转换为 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

最佳答案

您所需要的就是这个:

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

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

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

关于c++ - WDK:将 PVOID 转换为 PWCHAR(C 到 C++ 转换),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45253988/

相关文章:

c++ - Linux x64 堆栈在信号处理程序中展开,以修改返回地址

C++:获取 std::bind 产生的参数

c++ - 如何检测悬停在静态 Win32 控件上?

windows - 在 Windows 中向 SCSI 设备发送特定的 SCSI 命令

c++ - 在使用 NT DDK 构建的用户模式程序中包含 C++ header

c++ - 如何创建计算驱动程序?

c - 如何编译程序员德沃夏克?

c++ - 以非顺序顺序在 vector 中分配值

c# - 导出 c++ 函数并在 c# System.AccessViolationException 处使用函数

windows - 是否可以使用不同的凭据读取/写入远程机器的注册表?