2013-02-17 9 views
6

Ist es möglich, die systemeigenen Kernel-APIs in einer Delphi-Anwendung aufzurufen? Wie nt und zw syscalls.Können wir Native Windows API von Delphi aufrufen?

+0

aber wir können nt nennen und zw syscalls in a usermode c/C++ Programm, sie sind nicht nur für Treiber – n1kita

+1

Formal können Sie einen Treiber in Delphi wie in c/C++ schreiben, gibt es keine Spracheinschränkungen. Das einzige praktische Problem ist, dass Delphi-Treiber-Frameworks nicht existieren. – kludg

+0

@Serg Ich bin mir nicht sicher, ob es in Delphi praktisch ist, einen Treiber zu schreiben. Wie verpacken Sie den Code? Treiber sind keine DLL- oder EXE-Dateien. –

Antwort

13

Sie können tatsächlich die native API von Delphi aufrufen.

Delphi wird nicht mit Header-Übersetzungen für die native API ausgeliefert. Sie müssen also Ihre eigenen angeben oder eine bereits vorhandene Übersetzung verwenden. Beispielsweise. die JEDI-Übersetzung der NT-API.

+6

Genau, Sie brauchen JwaNative.pas aus dem Jedi Apilib (+1) – Remko

9

Wie David Heffernan sagt, ist es durchaus möglich, die native API von usermode und damit Delphi zu verwenden. Sie benötigen die JwaNative-Einheit von Jedi Apilib. Hier

ist kleines Beispiel aufzuzählen Prozesse Native API: (TProcessList ist ein Nachkomme von TObjectList aber der relevante Teil ist der Aufruf 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

Sind Sie ein Autor von JwaNative? –

+0

@DavidHeffernan: Ich bin einer der Admins des Jedi Apilib Projekts ... – Remko

+0

Off-Topic: Ist es mir, oder ist es wirklich schwer, JEDI über Websearch zu finden? Wann immer ich es versuche, finde ich immer viele Links zu scheinbar vielen verschiedenen Seiten. Und gibt es viele verschiedene Projekte? Vielleicht verwirrt mich das. –

Verwandte Themen