2013-02-17 67 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

相关问题