7

是否可以从 Delphi 应用程序中调用内核原生 API?喜欢ntzw系统调用。

4

2 回答 2

14

您确实可以从 Delphi 调用本机 API。

Delphi 不附带原生 API 的标头翻译。因此,您需要提供自己的翻译,或使用预先存在的翻译。例如。NT API 的 JEDI 翻译。

于 2013-02-17T12:59:14.327 回答
11

正如 David Heffernan 所说,完全可以从用户模式使用 Native API,从而使用 Delphi。您将需要Jedi Apilib的 JwaNative 单元。

这是使用 Native 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;
于 2013-02-17T14:08:35.357 回答