设备驱动程序的库



我制作了一个库来映射到存储地址任何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导出,然后您可以轻松使用它。

  1. 包括标头文件。

ex)#include" ntddk.h"

  1. 或声明ZwqueryInformationProcess例如)

ntsysapi ntstatus ntapi zwqueryInformationProcess( 在处理过程中, 在ulong ProcessInformationClass中, 淘汰pvoid ProcessInformation, 在ulong processInformationLength中, out pulong返回长度可选);

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新