2014-01-21 165 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