我创建了一个库,用于映射到任何PE格式文件的内存地址,事情是我只使用用户登陆,使用带有标准.lib格式的Visual Studio 2013。这是否意味着我的库无法在设备驱动程序中使用?
例如,我有以下代码段:
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,问题是我是否可以使用预处理器指令#IF生成驱动程序库或用户模式库,并在同一解决方案中同时使用这两种实现。
感谢。
答案 0 :(得分:1)
我只会解释ZwQueryInformationProcess函数的情况。 ZwQueryInformationProcess已由ntoskrnl.exe导出, 然后你可以轻松使用它。
ex)#include“ntddk.h”
NTSYSAPI NTSTATUS NTAPI ZwQueryInformationProcess( IN HANDLE ProcessHandle, 在ULONG ProcessInformationClass中, OUT PVOID ProcessInformation, 在ULONG ProcessInformationLength, OUT PULONG ReturnLength OPTIONAL);
在源文件中添加ntoskrnl.lib。
最后,你可以使用它。就是这样。
离)
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;
}
答案 1 :(得分:0)
是的,您可以使用#if
在必要时生成不同的代码。您可能需要定义自己的-D
或#define
来控制库是“内核”还是“用户模式”。
通常最好将“非通用的功能”分成一个或几个模块(并包括文件,分别说“usermode-stuff.c”和“kernel-stuff.c”)部分项目源文件),其中声明了相同类型的函数用于通用。这样可以避免在整个代码中出现大量#if KERNEL_MODE
,这可能会在一段时间后变得非常混乱。
显然,这本身并不一定意味着你可以做你需要的所有事情,或者你的项目可以实现 - 你的问题中没有足够的细节来回答这个问题。