Форум: "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.041 c