我们可以从Delphi调用本机Windows API吗?

我们可以从Delphi调用本机Windows API吗?,windows,delphi,winapi,delphi-7,system-calls,Windows,Delphi,Winapi,Delphi 7,System Calls,是否可以从Delphi应用程序中调用内核本机API?像nt和zwsyscalls。您确实可以从Delphi调用本机API Delphi不附带本机API的标题翻译。因此,您需要提供自己的,或使用预先存在的翻译。例如NT API的绝地翻译。正如David Heffernan所说,完全可以从usermode使用本机API,从而使用Delphi。您将需要来自的JwaNative单元 下面是使用本机API枚举进程的小示例: (TProcessList是TObjectList的后代,但相关部分是对NtQue

是否可以从Delphi应用程序中调用内核本机API?像
nt
zw
syscalls。

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


Delphi不附带本机API的标题翻译。因此,您需要提供自己的,或使用预先存在的翻译。例如NT API的绝地翻译。

正如David Heffernan所说,完全可以从usermode使用本机API,从而使用Delphi。您将需要来自的JwaNative单元

下面是使用本机API枚举进程的小示例: (TProcessList是TObjectList的后代,但相关部分是对NtQuerySystemInformation的调用)


但是我们可以在usermode c/c++程序中调用nt和zw系统调用,它们不仅适用于驱动程序。正式地说,您可以像在c/c++中一样在Delphi中编写驱动程序,没有语言限制。唯一的实际问题是delphi驱动程序框架不存在。@Serg我不确定在delphi中编写驱动程序是否实用。你如何把代码打包?驱动程序不是DLL或EXE文件。re Delphi驱动程序:没错,你需要绝地Apilib(+1)中的JwaNative.pas。你是JwaNative的作者吗?离题:是我,还是通过websearch很难找到绝地。每当我尝试的时候,我总是能找到很多不同网站的链接。有很多不同的项目吗?也许这就是让我困惑的地方。@Remko我相信我能翻译一些C标题。听起来很有趣。我非常想参与的绝地项目是
JclExprEval
,主要是因为我在使用它,发现了一些bug,并提出了一些增强建议。我已经在绝地bug追踪器上报告过了,但我怀疑代码中没有活跃的维护者。我怎么能参与进来?@Tom你是说演示?也许你的网络搜索能力很弱。。。实际上那里有很多样品。但这是真的,绝地武士真是一团糟。它非常分散,很难找到所需的信息。这在博尔兰时代并不是很好,但至少在当时它不那么零碎。在绝地武士身上,我们过去也看到了很多想法,但很少愿意投入自己的时间和精力。当然,我是根据大约15年前的经验说的,所以它可能不能代表今天的情况。@Tom:我知道,这意味着我5年来没有接触过德尔福。我只是想让您看到示例代码会很好,您或未来的访问者可能会从中受益。
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;