Главная страница
    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.038 c
1-1100230216
rom
2004-11-12 06:30
2004.11.28
определение результата: string или integer.


6-1095754729
needhelp
2004-09-21 12:18
2004.11.28
encoding


9-1091008592
xdev
2004-07-28 13:56
2004.11.28
Движение объектов в OpenGL


11-1083127231
earl Grey
2004-04-28 08:40
2004.11.28
HeapMM, KOl и строки


1-1100505669
olookin
2004-11-15 11:01
2004.11.28
Breakpoint не работает.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский