Главная страница
    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.035 c
14-1100379959
PURGEN
2004-11-14 00:05
2004.11.28
Тупой вопрос


6-1095341263
netter
2004-09-16 17:27
2004.11.28
Подключение/отключение сетевого адаптера под WinXP или Win2000


1-1100604775
Rifo
2004-11-16 14:32
2004.11.28
Буфер обмена-как до него добраться?


3-1099366698
saliev
2004-11-02 06:38
2004.11.28
Кодировка кириллицы не распознаётся в Delphi и Access


6-1095347411
serg128
2004-09-16 19:10
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский