C++ 设备驱动程序库
我制作了一个库,用于将任何PE格式的文件映射到内存地址,问题是我只使用了用户land,使用Visual Studio 2013和standar.lib格式。这是否意味着我的库不能在设备驱动程序中使用 例如,我有以下代码片段:C++ 设备驱动程序库,c++,visual-studio-2013,device-driver,C++,Visual Studio 2013,Device Driver,我制作了一个库,用于将任何PE格式的文件映射到内存地址,问题是我只使用了用户land,使用Visual Studio 2013和standar.lib格式。这是否意味着我的库不能在设备驱动程序中使用 例如,我有以下代码片段: HMODULE ntdllmod = LoadLibraryA("ntdll.dll"); if (ntdllmod) { ZwQueryInformationProcess func = (ZwQueryInformationPro
HMODULE ntdllmod = LoadLibraryA("ntdll.dll");
if (ntdllmod)
{
ZwQueryInformationProcess func = (ZwQueryInformationProcess)GetProcAddress(ntdllmod, "ZwQueryInformationProcess");
}
这在用户平台上运行良好,但在内核上我不需要调用GetProcAddress,我只需要直接调用ZwQueryInformationProcess,因为它是一个ntoskrnl导出。。。举个例子,我就不能这样做吗
#IF USER_LAND
HMODULE ntdllmod = LoadLibraryA("ntdll.dll");
if (ntdllmod)
{
ZwQueryInformationProcess func = (ZwQueryInformationProcess)GetProcAddress(ntdllmod, "ZwQueryInformationProcess");
}
#elif KERNEL_MODE
//Run my Kernel version code here.
如果这不可能,那么如何在VS2013中构建设备驱动程序库?(找不到选项)另外,任何关于如何链接驱动程序库的指南或参考资料都会有所帮助,假设它与普通库不同
编辑:我已经知道如何使用ZwQueryInformationProcess,问题是我是否可以使用预处理器指令#是否生成驱动程序库或用户模式库,并在同一解决方案中使用这两种实现。
谢谢。我将仅解释ZwQueryInformationProcess函数的情况。 ntoskrnl.exe已导出ZwQueryInformationProcess, 然后你就可以很容易地使用它了
#if
生成不同的代码。您可能需要定义自己的-D
或#define
来控制库是“内核”还是“用户模式”
通常最好将“非泛型函数”分成一个或几个模块(包括文件,例如“usermode stuff.c”和“kernel stuff.c”,分别作为项目源文件的一部分),其中声明了相同类型的函数供泛型使用。这避免了在整个代码中都有大量的#if KERNEL_MODE
,这可能会在一段时间后变得非常混乱
显然,这本身并不一定意味着你可以做你需要的所有事情,或者你的项目可以实现——你的问题中没有足够的细节来回答这个问题。驱动程序(内核模式)API不同于用户模式API。我还没有找到这个特定的函数,但是有许多用户模式函数要么不可用,要么通过驱动程序代码中的不同路径可用。这通常是因为Windows的开发人员觉得不需要(以那种形式)提供这种功能。如果您能准确地解释为什么需要在内核模式下加载PE,这可能会有所帮助-也许有另一种方法可以实现您想要的功能…感谢我已经知道,问题是我是否可以使用预处理器指令(#if)来使用WDM SDK中的内核导出函数,同时使用win32普通API。理论上,编译器应该根据预处理器指令创建库,并且将用于内核区或用户区,但我不知道这是否可行……这是否允许我在需要时使用预处理器指令生成驱动程序库和用户模式库?
ULONG GetProcessID(HANDLE ProcessHandle, PPEB* ppPeb )
{
NTSTATUS Status;
PROCESS_BASIC_INFORMATION ProcInfo;
Status = ZwQueryInformationProcess(ProcessHandle, ProcessBasicInformation, &ProcInfo, sizeof(ProcInfo), NULL);
if (STATUS_SUCCESS == ntStatus) {
if (ppPeb) {
*ppPeb = ProcInfo.PebBaseAddress;
}
return ProcInfo.UniqueProcessId;
}
return 0;
}