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

Вниз

Вопрос по NtQuerySystemInformation   Найти похожие ветки 

 
zaN0za ©   (2005-11-28 15:29) [0]

Доброго времени суток, уважаемые мастера. Пытаюсь получить ID процесса по его имени
через NtQuerySystemInformation. Написал следующий код, но он выдает ошибку :(
подскажите пожалуйста, что я делаю неправильно.


function zaGetPIDbyName(lpProcName: PChar): DWORD;
var
 Info   : PSYSTEM_PROCESSES;
 dwBuff : PCardinal;
begin
 Result := 0;
 dwBuff := nil;
 Info := nil;
 
 NtQuerySystemInformation(SystemProcessesAndThreadsInformation,
                          Info,
                          SizeOf(PSYSTEM_PROCESSES),
                          dwBuff);

 while (Info^.NextEntryDelta > 0) do
   begin
     if lstrcmpi(Info^.ProcessName.Buffer, lpProcName) = 0 then
       begin
         Result := Info^.ProcessId;
         Exit;
       end;
     Info := Pointer(DWORD(Info) + Info^.NextEntryDelta);
   end;
end;


Спасибо за внимение.


 
BiN ©   (2005-11-28 15:33) [1]

NtQuerySystemInformation - функция.


 
Игорь Шевченко ©   (2005-11-28 17:33) [2]


>  Info := nil;
>  
>  NtQuerySystemInformation(SystemProcessesAndThreadsInformation,
>
>                           Info,
>                           SizeOf(PSYSTEM_PROCESSES),
>                           dwBuff);


NtQuerySystemInformation не выделяет буфер. Его обязана выделять вызывающая функция.

Советую посмотреть
http://www.schevchenko.net.ru/SRC/QuerySystemInformation_60.zip


 
zaN0za ©   (2005-11-29 16:59) [3]

> Игорь Шевченко ©   (28.11.05 17:33) [2]
Спасибо за исходник. Было интересно.

попробовал сделать так:

добавил функцию


function GetProcessTable: Pointer;
var
 dwSize  : DWORD;
 Buff    : Pointer;
 nt_stat : NTStatus;
begin
 Result := nil;
 dwSize := $4000;
 repeat
   Buff := VirtualAlloc(nil, dwSize, MEM_COMMIT or MEM_RESERVE, PAGE_READWRITE);
   if Buff = nil then Exit;

   nt_stat := ZwQuerySystemInformation(SystemProcessesAndThreadsInformation,
                                      Buff, dwSize, nil);
   if nt_stat = STATUS_INFO_LENGTH_MISMATCH then
     begin
       VirtualFree(Buff, 0, MEM_RELEASE);
       dwSize := dwSize * 2;
     end;
 until nt_stat <> STATUS_INFO_LENGTH_MISMATCH;

 if nt_stat = STATUS_SUCCESS then
   Result := Buff
 else
   VirtualFree(Buff, 0, MEM_RELEASE);
end;


когда тестировал, сделал для примера чтобы названия всех процессов показывались MessageBox"ом.
пример:


procedure zaGetPIDbyName;
var
 zaPTable : PSYSTEM_PROCESSES;
begin
 Result := 0;
 zaPTable := GetProcessTable;
 if zaPTable <> nil then
   begin
     while(zaPTable^.NextEntryDelta > 0) do
       begin
         zaPTable := pointer(dword(zaPTable) + zaPTable^.NextEntryDelta);
         messagebox(0,PChar(zaPTable.ProcessName.Buffer),0,0);
       end;
   end;
end;


все бы было хорошо, но почему-то для каждого процесса показывается только первая буква его имени.
почему так происходит? подскажите пожалуйста, очень хочется разобраться.

заранее благодарен.


 
Игорь Шевченко ©   (2005-11-29 17:25) [4]


>  но почему-то для каждого процесса показывается только первая
> буква его имени.
> почему так происходит?


Потому что Unicode ? Я угадал и мне положен приз ? Ты читай исходники-то, там все-все написано, даже как имена процессов показывать.


 
zaN0za ©   (2005-11-30 05:48) [5]

> Игорь Шевченко ©   (29.11.05 17:25) [4]
спасибо, сам не знаю, куда я смотрел.

а существует ли способ Unicode -> PChar без использования функции WideCharLenToString?


 
Джо ©   (2005-11-30 06:43) [6]


>  [5] zaN0za ©   (30.11.05 05:48)
> ...без использования функции WideCharLenToString?

А чем она плоха?


 
zaN0za ©   (2005-11-30 20:34) [7]

с преобразованием разобрался. все работает. поступил так:


function zaPWideCharToPChar(szUStr: PWideChar; dwSize: DWORD): PChar;
var
 zaBuffer : array [0..255] of Char;
 zaResult : array [0..255] of Char;
 i        : byte;
begin
 CopyMemory(@zaBuffer, szUStr, dwSize);
 for i:=0 to dwSize div 2 do
   zaResult[i] := zaBuffer[i*2];
 zaResult[i-1] := #0;
 Result := @zaResult[0];
end;


у меня следующий вопрос: что из себя представляет тип WideChar (какова структура)?



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

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

Наверх




Память: 0.47 MB
Время: 0.042 c
1-1137400279
Kolya
2006-01-16 11:31
2006.02.12
DragDrop в ListView


2-1138293587
только начал...
2006-01-26 19:39
2006.02.12
Совсем тупые вопросы по взаимодействию с БД в Делфи


2-1138003499
mozgan
2006-01-23 11:04
2006.02.12
"Размножение" компонента Image1


2-1138219426
veb
2006-01-25 23:03
2006.02.12
Прервать цикл


1-1137267073
veb
2006-01-14 22:31
2006.02.12
Потеря кодировки!





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