2013-02-17 69 views
6

是否可以在Delphi應用程序中調用內核Native API?像ntzw系統調用。我們可以從Delphi調用Native Windows API嗎?

+0

但我們可以NT打電話的ZW系統調用usermode c/C++程序,它們不僅適用於驅動程序 – n1kita 2013-02-17 12:33:17

+1

正式的,你可以像在c/C++中一樣在Delphi中編寫驅動程序,沒有語言限制。唯一的實際問題是delphi驅動框架不存在。 – kludg 2013-02-17 13:01:26

+0

@Serg我不確定在Delphi中編寫驅動程序是否實用。你如何打包代碼?驅動程序不是DLL或EXE文件。 – 2013-02-17 13:07:12

回答

13

你確實可以從Delphi調用本地API。

Delphi不附帶本地API的標題翻譯。所以你需要提供你自己的,或使用預先存在的翻譯。例如。 NT API的JEDI翻譯。

+6

的確,您需要Jedi Apilib的JwaNative.pas(+1) – Remko 2013-02-17 13:26:13

9

正如David Heffernan所說,從usermode和Delphi使用Native API是完全可能的。您將需要Jedi Apilib的JwaNative設備。

下面是小例子使用原生API來枚舉進程: (TProcessList是TObjectList的後裔,但相關的部分是調用NtQuerySystemInformation)

function EnumProcesses: TProcessList; 
var 
    Current: PSystemProcesses; 
    SystemProcesses : PSystemProcesses; 
    dwSize: DWORD; 
    nts: NTSTATUS; 
begin 
    Result := TProcessList.Create; 

    dwSize := 200000; 
    SystemProcesses := AllocMem(dwSize); 

    nts := NtQuerySystemInformation(SystemProcessesAndThreadsInformation, 
     SystemProcesses, dwSize, @dwSize); 

    while nts = STATUS_INFO_LENGTH_MISMATCH do 
    begin 
    ReAllocMem(SystemProcesses, dwSize); 
    nts := NtQuerySystemInformation(SystemProcessesAndThreadsInformation, 
     SystemProcesses, dwSize, @dwSize); 
    end; 

    if nts = STATUS_SUCCESS then 
    begin 
    Current := SystemProcesses; 
    while True do 
    begin 
     Result.Add(TProcess.Create(Current^)); 
     if Current^.NextEntryDelta = 0 then 
     Break; 

     Current := PSYSTEM_PROCESSES(DWORD_PTR(Current) + Current^.NextEntryDelta); 
    end; 
    end; 

    FreeMem(SystemProcesses); 
end; 
+0

您是JwaNative的作者嗎? – 2013-02-17 15:10:47

+0

@DavidHeffernan:我是Jedi Apilib項目的管理員之一...... – Remko 2013-02-17 15:15:40

+0

題外話:是我嗎,還是真的很難通過網絡搜索找到JEDI。每當我嘗試時,我總能找到大量不同網站的鏈接。有很多不同的項目嗎?也許這就是讓我困惑的原因。 – 2013-02-17 15:17:29

相關問題