Главная страница
    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.089 c
3-1098898641
AUS_r4nd0m
2004-10-27 21:37
2004.11.28
Экспорт таблиц из Excel в InterBase


6-1095366610
bl4ck_w1nd
2004-09-17 00:30
2004.11.28
AsyncPro 4.06 - апи ошибка


4-1097966900
mariner
2004-10-17 02:48
2004.11.28
Как открыть файл моим прилож.


1-1100336552
ceval
2004-11-13 12:02
2004.11.28
архивация файлов


1-1100159363
cvg
2004-11-11 10:49
2004.11.28
Как бороться с Access violation?





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