- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在试验 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++ 不会将空指针“数组”转换为 PWCHAR。
我现在试了几个小时,我无法让它工作。有什么想法吗?
非常感谢!
供引用:
PINSTANCE_FULL_INFORMATION 结构:
https://msdn.microsoft.com/de-de/library/ff548185(v=vs.85).aspx
编译器错误C2440:
最佳答案
你只需要这个:
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 代码中定义一个 double 据类型变量,该变量将在 Windows 内核中使用。代码可以编译,但在链接时出错。我尝试在源文件中使用 libcntpr.lib 并在代码中定义 __f
我正在尝试在 C 代码中定义一个 double 据类型变量,该变量将在 Windows 内核中使用。代码可以编译,但在链接时出错。我尝试在源文件中使用 libcntpr.lib 并在代码中定义 __f
我正在编译一个出现错误的程序,因为 winnt.h 和 ntstatus.h 都包含在 WDK 中。我用预处理编译成一个文件,发现了这个: #line 1 "C:\\Program Files (x8
我正在使用 native 子系统构建代码,但我遇到了 operator new 和 delete 的问题。我想使用 WDK new 和 delete 但出现以下错误: : error LNK2019:
我在“ native 子系统”的 wdk 中构建一个简单的代码我有一个重载 new 和 delete 运算符的库这是代码: #include #define HEAP_ZERO_MEM
我对使用 WDK 和 Visual Studio 的驱动程序还比较陌生。 当我在 Debug模式下编译项目时,我没有收到任何警告或错误,并且项目可以正常编译和运行。但是,当我在 Release模式下编
如何将汇编文件编译并链接到驱动程序构建中。 澄清一点 源文件: TARGETTYPE=DRIVER DRIVERTYPE=WDM TARGETPATH=obj TARGETNAME=bla INCLU
我对驱动程序开发还很陌生,但我目前在主机和目标计算机上都使用最新版本的 Visual Studio 和 Windows 10。我正在尝试为我的目标计算机设置配置,以便我可以测试我制作的驱动程序!但是,
我正在尝试设置自动驱动程序部署和调试,以测试来自 Visual Studio 2013 的 win 8.1 驱动程序。 主机:赢7VS2013 目标机器:赢8.1 我的主机设置了 2 个网卡,1 个连
我正在使用 Windows Driver Kit (WinDDK 6001.18001) 来构建我的用户空间应用程序,而不是 Visual Studio 2005。我采用这种方法是因为我们还必须构建驱
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
我正在尝试使用 WDK 构建环境构建 C++ 文件,并尝试在 DebugView 工具中查看输出。所以,当我尝试 windows 方法 OutputDebugString(L"Inside the m
我需要从 WDK 示例中调用 DbgPrint 或 KdPrint 函数 src\print\monitors\localmon 请帮忙指点 我刚刚添加 #include 在 localmon.c 文
我在启动内核模式驱动程序时遇到了一个烦人的错误。目前我正在使用一项服务来“按需”启动驱动程序。驱动程序已加载但立即失败并出现蓝屏。 驱动的代码很简单: #include NTSTATUS Drive
我昨天为我的 Visual Studio 2015 Enterprise 安装了 WDK 10。今天尝试做一个项目,但是首先找不到包含目录,所以我手动添加了它(C:\Program Files (x8
我正在 Windows Filtering Platform 中开发驱动程序,我需要另一个进程的进程 ID 来执行我需要执行的操作。我只知道该进程的文件名(name.exe)。 在 win32 中,我
我正在使用 WDK 的 Build 实用程序构建打印机驱动程序。我需要关闭“将警告视为错误”。它在 Visual Studio 项目文件中被关闭,但这显然不会影响 Build。 有谁知道如何做到这一点
我正在尝试从 Github ( https://github.com/Microsoft/Windows-driver-samples/tree/97cf8edcaddff4fdbc5cc48d56b
我正在编译一个普通的 C++ 文件Temp.cpp: #include int main() { std::wstring s; } 使用命令行: cl.exe /MD /Iinc\api\crt\
我一直在使用 WDK 10,并将 rpcrt4.lib 添加到链接器中。我的驱动程序已成功构建。当我尝试使用命令 net start mydriver 运行驱动程序时。我收到系统错误 2 消息。我尝试
我是一名优秀的程序员,十分优秀!