设备驱动程序库

时间:2014-01-21 06:29:57

标签: c++ visual-studio-2013 device-driver

我创建了一个库,用于映射到任何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生成驱动程序库或用户模式库,并在同一解决方案中同时使用这两种实现。

感谢。

2 个答案:

答案 0 :(得分:1)

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

  1. 包含头文件。
  2. ex)#include“ntddk.h”

    1. 或声明ZwQueryInformationProcess 前)
    2. NTSYSAPI NTSTATUS NTAPI ZwQueryInformationProcess(     IN HANDLE ProcessHandle,     在ULONG ProcessInformationClass中,     OUT PVOID ProcessInformation,     在ULONG ProcessInformationLength,     OUT PULONG ReturnLength OPTIONAL);

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

      2. 最后,你可以使用它。就是这样。

      3. 离)

        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,这可能会在一段时间后变得非常混乱。

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