7

Delphiアプリケーション内からカーネルネイティブAPIを呼び出すことは可能ですか?Likentzwsyscalls。

4

2 に答える 2

14

実際、DelphiからネイティブAPIを呼び出すことができます。

Delphiには、ネイティブAPIのヘッダー変換は付属していません。したがって、独自の翻訳を提供するか、既存の翻訳を使用する必要があります。例えば。NTAPIのJEDI翻訳。

于 2013-02-17T12:59:14.327 に答える
11

David Heffernanが言うように、ユーザーモードからネイティブAPIを使用することは完全に可能であり、したがってDelphiを使用することは完全に可能です。JediApilibの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;
于 2013-02-17T14:08:35.357 に答える