Вот, код. | Код | unit Unit2;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm2 = class(TForm) btn1: TButton; procedure btn1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form2: TForm2;
function ZwQuerySystemInformation(ASystemInformationClass: Cardinal; ASystemInformation: Pointer; ASystemInformationLength: Cardinal; AReturnLength: PCardinal): Cardinal; stdcall; external 'ntdll.dll';
implementation
{$R *.dfm}
const NT_STATUS_SUCCESS = $00000000; NT_STATUS_ACCESS_DENIED = $C0000022; NT_STATUS_INFO_LENGTH_MISMATCH = $C0000004;
SYSTEMPROCESSESANDTHREADSINFORMATION = 5;
type PSYSTEM_THREADS = ^SYSTEM_THREADS; SYSTEM_THREADS = packed record KernelTime: LARGE_INTEGER; UserTime: LARGE_INTEGER; CreateTime: LARGE_INTEGER; WaitTime: ULONG; StartAddress: Pointer; UniqueProcess: DWORD; UniqueThread: DWORD; Priority: Integer; BasePriority: Integer; ContextSwitchCount: ULONG; State: Longint; WaitReason: Longint; end;
PSYSTEM_PROCESS_INFORMATION = ^SYSTEM_PROCESS_INFORMATION; SYSTEM_PROCESS_INFORMATION = packed record NextOffset: ULONG; ThreadCount: ULONG; Reserved1: array [0..5] of ULONG; CreateTime: FILETIME; UserTime: FILETIME; KernelTime: FILETIME; ModuleNameLength: WORD; ModuleNameMaxLength: WORD; ModuleName: PWideChar; BasePriority: ULONG; ProcessID: ULONG; InheritedFromUniqueProcessID: ULONG; HandleCount: ULONG; Reserved2 : array[0..1] of ULONG; PeakVirtualSize : ULONG; VirtualSize : ULONG; PageFaultCount : ULONG; PeakWorkingSetSize : ULONG; WorkingSetSize : ULONG; QuotaPeakPagedPoolUsage : ULONG; QuotaPagedPoolUsage : ULONG; QuotaPeakNonPagedPoolUsage : ULONG; QuotaNonPagedPoolUsage : ULONG; PageFileUsage : ULONG; PeakPageFileUsage : ULONG; PrivatePageCount : ULONG; ReadOperationCount : LARGE_INTEGER; WriteOperationCount : LARGE_INTEGER; OtherOperationCount : LARGE_INTEGER; ReadTransferCount : LARGE_INTEGER; WriteTransferCount : LARGE_INTEGER; OtherTransferCount : LARGE_INTEGER; ThreadInfo: array [0..0] of SYSTEM_THREADS; end;
function GetNativeProcessInfo(APID: DWORD): SYSTEM_PROCESS_INFORMATION; var pSI, pSITemp: PSYSTEM_PROCESS_INFORMATION; hProcess: DWORD; dwSize: DWORD; begin ZeroMemory(@Result, SizeOF(SYSTEM_PROCESS_INFORMATION)); if APID = 0 then Exit;
dwSize := 0; if ZwQuerySystemInformation(SYSTEMPROCESSESANDTHREADSINFORMATION, nil, 0, @dwSize) <> NT_STATUS_INFO_LENGTH_MISMATCH then Exit; (* Get Size *)
pSI := VirtualAlloc(nil, dwSize, MEM_COMMIT or MEM_RESERVE, PAGE_READWRITE); if Assigned(pSI) then try if ZwQuerySystemInformation(SYSTEMPROCESSESANDTHREADSINFORMATION, pSI, dwSize, @dwSize) = NT_STATUS_SUCCESS then begin pSITemp := pSI; repeat if pSITemp^.ProcessID = APID then begin MoveMemory(@Result, pSITemp, SizeOF(SYSTEM_PROCESS_INFORMATION)); Break; end;
pSITemp := Pointer(DWORD(pSITemp) + pSITemp^.NextOffset); until pSITemp^.NextOffset = 0; end;
finally VirtualFree(pSI, 0, MEM_RELEASE); end; end;
procedure TForm2.btn1Click(Sender: TObject); var lInfo: SYSTEM_PROCESS_INFORMATION; begin lInfo := GetNativeProcessInfo(GetCurrentProcessId); // lInfo := GetNativeProcessInfo(2212);
ShowMessage(IntToStr(lInfo.BasePriority)); end;
end.
|
Не могу понять почему функция GetNativeProcessInfo для любого процесса инфу возвращает, а для текущего нет. Текущий процесс просто даже не попадает в перебор по SystemInformation. Пожалуйста, ткните носом где я неправ.
--------------------
(* Honesta mors turpi vita potior *)
|