Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Не все отображаются процессы под 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


Наверх

Титульная страница Поиск, карта сайта Написать письмо