Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.11.28;
Скачать: [xml.tar.bz2];

Вниз

Не все отображаются процессы под Windows XP SP2   Найти похожие ветки 

 
Basket   (2004-10-18 14:36) [0]

Уважаемые мастера, помогите решить одну проблемку. Суть: Есть процедурка получающая список всех процессов, после установки второго сервиспака, почти половина процессов перестала показываться, хотя менеджеры процессов показывают все.

Привожу код:
///////////////////////////////////////////
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;

///////////////////////////////////////////////////////

Кто может, помогите. Зараннее благодарен.


 
Игорь Шевченко ©   (2004-10-18 14:42) [1]


> ff(5, @buf, 20480, 0);


Места мало выделяешь ?

Попробуй http://www.schevchenko.net.ru/SRC/QuerySystemInformation_60.zip


 
Дмитрий Ботвин   (2004-10-18 14:48) [2]

Или через WMI (класс Win32_Process) точно все процессы увидишь!!!


 
Basket   (2004-10-19 13:14) [3]

<<Или через WMI (класс Win32_Process) точно все процессы увидишь!!!

Подскажите, а где можно скачать WMI SDK для XP, а то я нигде не могу найти. Ессле можно киньте ссылочку.


 
Digitman ©   (2004-10-19 13:38) [4]

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;



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.11.28;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.056 c
3-1099388991
Tolya
2004-11-02 12:49
2004.11.28
Тип поля date и Memo


14-1100180350
iZEN
2004-11-11 16:39
2004.11.28
HiAsm: ваши впечатления.


6-1095338917
Stanislav
2004-09-16 16:48
2004.11.28
Indy Help, Demo


3-1098875412
Некто
2004-10-27 15:10
2004.11.28
патч к АДО


1-1100276038
Petia
2004-11-12 19:13
2004.11.28
Форма





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский