![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не все отображаются процессы под Windows XP SP2
Basket © (2004-10-18 14:36:00)Уважаемые мастера, помогите решить одну проблемку. Суть: Есть процедурка получающая список всех процессов, после установки второго сервиспака, почти половина процессов перестала показываться, хотя менеджеры процессов показывают все.
Привожу код:
///////////////////////////////////////////
Procedure TForm1.ListProcessesNT;
var
pInfo: PProcessInfo;
buf: Array[1..20480] Of Char;
ff: tFuncNtQsI;
ModuleName: array [0..300] of Char;
cb: DWORD;
hMod: HMODULE;
hProcess, hIcon,h: THandle;
buffer, buffer1: array [0..255] of char;
i:integer;
lpSystemTime, lpSystemTime1 : TSystemTime;
lpCreationTime,lpExitTime,lpKernelTime,lpUserTime : TFileTime;
Dat,btime:TDateTime;
ndays: double;
ticks: LongInt;
Cur : DWORD;
SeDebugNameValue:Int64;
tkp:TOKEN_PRIVILEGES;
ReturnLength:Cardinal;
hToken:THandle;
Begin
try
GetSystemDirectory(buffer, SizeOf(buffer));
GetWindowsDirectory(buffer1, SizeOf(buffer1));
ListView1.Items.BeginUpdate;
ListView1.Items.Clear;
if not OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES
or TOKEN_QUERY, hToken) then exit;
if not LookupPrivilegeValue(nil, 'SeDebugPrivilege', SeDebugNameValue) then
begin
CloseHandle(hToken);
exit;
end;
tkp.PrivilegeCount:= 1;
tkp.Privileges[0].Luid := SeDebugNameValue;
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken,false,tkp,SizeOf(tkp),tkp,ReturnLength);
h := LoadLibrary('NTDLL.DLL');
If h > 0 Then
Begin
@ff := GetProcAddress(h, 'NtQuerySystemInformation');
If @ff <> Nil Then
Begin
ff(5, @buf, 20480, 0);
cur:=1;
pInfo := Addr(Buf[1]);;
Repeat
Cur := Cur + PInfo.dwOffset;
PInfo := Addr(Buf[Cur]);
hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,
False, pInfo^.dwProcessID);
with ListView1.Items.Add do
begin
EnumProcessModules(hProcess, @hMod, SizeOf(hMod), cb);
GetModuleFilenameExA(hProcess, hMod, ModuleName, SizeOf(ModuleName));
hIcon:= ExtractIcon(hInstance, ModuleName, 0);
if hIcon = 0 then
hIcon:= ExtractIcon(hInstance, PChar(ExtractFileName(ModuleName)), 0);
if hIcon = 0 then
hIcon := LoadIcon(0, IDI_APPLICATION);
ImageIndex:= ImageList_AddIcon(ImageList1.Handle, hIcon);
Caption:=pInfo^.pszProcessName;
SubItems.Add(Format('$%x',[pInfo^.dwProcessID]));
case pInfo^.dwBasePriority of
4: SubItems.Add(Format('Низкий', [pInfo^.dwBasePriority]));
5: SubItems.Add(Format('Низкий', [pInfo^.dwBasePriority]));
6: SubItems.Add(Format('Ниже нормального', [pInfo^.dwBasePriority]));
7: SubItems.Add(Format('Ниже нормального', [pInfo^.dwBasePriority]));
8: SubItems.Add(Format('Нормальный', [pInfo^.dwBasePriority]));
9: SubItems.Add(Format('Нормальный', [pInfo^.dwBasePriority]));
10: SubItems.Add(Format('Выше нормального', [pInfo^.dwBasePriority]));
11: SubItems.Add(Format('Выше нормального', [pInfo^.dwBasePriority]));
12: SubItems.Add(Format('Выше нормального', [pInfo^.dwBasePriority]));
13: SubItems.Add(Format('Высокий', [pInfo^.dwBasePriority]));
14: SubItems.Add(Format('Высокий', [pInfo^.dwBasePriority]));
15: SubItems.Add(Format('Высокий', [pInfo^.dwBasePriority]));
16: SubItems.Add(Format('Высокий', [pInfo^.dwBasePriority]));
17: SubItems.Add(Format('Высокий', [pInfo^.dwBasePriority]));
18: SubItems.Add(Format('Высокий', [pInfo^.dwBasePriority]));
19: SubItems.Add(Format('Высокий', [pInfo^.dwBasePriority]));
20: SubItems.Add(Format('Высокий', [pInfo^.dwBasePriority]));
21: SubItems.Add(Format('Высокий', [pInfo^.dwBasePriority]));
22: SubItems.Add(Format('Высокий', [pInfo^.dwBasePriority]));
23: SubItems.Add(Format('Высокий', [pInfo^.dwBasePriority]));
24: SubItems.Add(Format('Реального времени', [pInfo^.dwBasePriority]));
else SubItems.Add(' ');
end;
SubItems.Add(Format('$%x',[pInfo^.dwParentProcessID]));
GetProcessTimes(hProcess, lpCreationTime, lpExitTime, lpKernelTime, lpUserTime);
GetSystemTime(lpSystemTime);
FileTimeToSystemTime(lpCreationTime, lpSystemTime);
SystemTimeToTzSpecificLocalTime(nil, lpSystemTime, lpSystemTime1);
Dat:=SystemTimeToDateTime(lpSystemTime1);
SubItems.Add(FormatDateTime('dd-mm, hh:mm:ss', Dat));
SubItems.Add(IntToStr(pInfo^.dwWorkingSet div 1024)+' Кб');
SubItems.Add(ModuleName);
SubItems.Add(Format('%d', [pInfo^.dwBasePriority]));
end;
ListView1.Items.EndUpdate;
Until pInfo^.dwOffset = 0;
End;
FreeLibrary(h);
CloseHandle(hProcess);
tkp.Privileges[0].Attributes := 0;
AdjustTokenPrivileges(hToken, FALSE, tkp, SizeOf(tkp), tkp, ReturnLength);
End;
ListView1.AlphaSort;
StatusBar1.Panels[0].Text:='Процессов: '+IntToStr(ListView1.Items.Count);
except
end;
end;
///////////////////////////////////////////////////////
Кто может, помогите. Зараннее благодарен.
Digitman (2004-10-19 13:38:00) [1]
type
TUnicodeString = packed record
Length, MaximumLength: Word;
Buffer: PWideChar;
end;
PSystemProcessInformation = ^TSystemProcessInformation;
TSystemProcessInformation = packed record
dNext: DWord;
dThreadCount: DWord;
dReserved01, dReserved02, dReserved03, dReserved04, dReserved05, dReserved06: DWord;
qCreateTime, qUserTime, qKernelTime: Int64;
usName: TUnicodeString;
BasePriority: DWord;
dUniqueProcessId: DWord;
dInheritedFromUniqueProcessId: DWord;
dHandleCount: DWord;
dReserved07: DWord;
dReserved08: DWord;
VmCounters: array[0..10] of DWord;
dCommitCharge: DWord;
end;
TEnumProcessFunc = function(ProcessId: DWord; ProcessName: String): Boolean;
function NtQuerySystemInformation(sic: DWord; Buffer: Pointer; BufSize: DWord; var BytesReturned: DWord): DWord; stdcall; external 'ntdll.dll';
..
function EnumProcesses(EnumProcessFunc: TEnumProcessFunc): Boolean;
var
p, Buf: PSystemProcessInformation;
BufSize: DWord;
TableSize: DWord;
begin
Result := Assigned(@EnumProcessFunc);
if not Result then Exit;
BufSize := $10000;
GetMem(Buf, BufSize);
try
while NtQuerySystemInformation(5, Buf, BufSize, TableSize) <> 0 do
begin
Inc(BufSize, $10000);
ReallocMem(Buf, BufSize);
end;
p := Buf;
while EnumProcessFunc(Buf.dUniqueProcessId, Buf.usName.Buffer) do
begin
if Buf.dNext = 0 then Break;
Inc(Integer(Buf), Buf.dNext);
end;
finally
FreeMem(p);
end;
end;
Basket (2004-10-19 13:14:00) [2]<<Или через WMI (класс Win32_Process) точно все процессы увидишь!!!
Подскажите, а где можно скачать WMI SDK для XP, а то я нигде не могу найти. Ессле можно киньте ссылочку.
Дмитрий Ботвин (2004-10-18 14:48:00) [3]Или через WMI (класс Win32_Process) точно все процессы увидишь!!!
Игорь Шевченко (2004-10-18 14:42:00) [4]
> ff(5, @buf, 20480, 0);
Места мало выделяешь ?
Попробуй http://www.schevchenko.net.ru/SRC/QuerySystemInformation_60.zip