我制作了一个库来映射到存储地址任何PE格式文件中,问题是我只使用visual Studio 2013带有标准.lib格式的visual Studio。这是否意味着我的库不能在设备驱动程序中使用?
例如,我有以下片段:
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生成驱动程序库或用户模式库,并且在同一解决方案中都具有两个实现。>> >
谢谢。
我只能解释zwqueryInformationProcess函数的情况。ZwqueryInformationProcess已经由Ntoskrnl.exe导出,然后您可以轻松使用它。
- 包括标头文件。
ex)#include" ntddk.h"
- 或声明ZwqueryInformationProcess例如)
ntsysapi ntstatus ntapi zwqueryInformationProcess( 在处理过程中, 在ulong ProcessInformationClass中, 淘汰pvoid ProcessInformation, 在ulong processInformationLength中, out pulong返回长度可选);
-
在源文件中添加ntoskrnl.lib。
-
最后,您可以使用它。就是这样。
ex)
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;
}
是的,您可以在必要时使用#if
生成不同的代码。您可能必须定义自己的-D
或#define
,以控制库是"内核"还是"用户模式"。
通常最好将"无通用函数"分为一个或几个模块(包括文件,分别为" usermode-stuff.c"one_answers" kernel-stuff.c",项目源文件的一部分),其中声明相同类型的函数以供通用使用。这避免了整个代码上都有大量的#if KERNEL_MODE
,这可能会在一段时间后变得凌乱。
显然,这本身并不一定意味着您可以做所有需要的事情,或者您的项目可以实现 - 您的问题中没有足够的详细信息来回答。