2014-01-21 168 views
0

我做了一个映射到任何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

驱动程序(内核模式)API的是从用户模式API的不同。我没有看过这个特殊的功能,但也有许多用户模式的功能,这些功能要么不可用,或者通过在驱动程序代码不同的路线可用。这通常是因为Windows的开发人员认为不需要提供该功能(以该形式)。如果你准确地解释了为什么你需要在内核模式下加载一个PE - 也许有另一种方法来实现你正在寻找的东西...... –

+0

谢谢我已经知道,问题是如果我可以使用预处理器指令(#IF)使用WDM SDK的内核导出功能,并同时使用win32常规API。在理论上,编译器应该根据预处理器指令创建库,并且将用于内核土地或用户土地,但我不知道这是否可能... – ffenix

回答

0

是的,你可以使用#if在必要时产生不同的代码。您可能必须定义自己的-D#define以控制库是“内核”还是“用户模式”。

通常最好将“非通用函数”分解为一个或几个模块(包括文件,分别称为“usermode-stuff.c”和“kernel-stuff.c”)作为项目源文件的一部分),其中声明相同类型的函数用于通用。这避免了各地的代码,它可以得到一段时间后相当混乱的#if KERNEL_MODE一个庞大的数字。

显然,这本身并不一定意味着你可以做所有你需要的事情,或者你的项目可以实现 - 你的问题没有足够的细节来回答这个问题。

1

我只会解释一下ZwQueryInformationProcess函数的情况。 ZwQueryInformationProcess已经由ntoskrnl.exe, 导出,然后您可以轻松使用它。

  1. 包括头文件。

EX)的#include “NTDDK.H”

  1. 或声明ZwQueryInformationProcess EX)

NTSYSAPI NTSTATUS NTAPI ZwQueryInformationProcess( 手柄ProcessHandle, IN ULONG ProcessInformationClass, OUT PVOID ProcessInformation, IN ULONG ProcessInformationLength, OUT PULONG ReturnLength OPTIO NAL);

  1. 在源文件中添加ntoskrnl.lib。

  2. 终于,你可以使用它。而已。

前)

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; 
} 
+0

这是否允许我使用预处理器指令来生成驱动程序库和用户模式图书馆何时需要? – ffenix