Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.02.12;
Скачать: CL | DM;

Вниз

Вопрос по 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 вся ветка

Текущий архив: 2006.02.12;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.053 c
15-1137610651
Suicidical
2006-01-18 21:57
2006.02.12
Мастера дайте совет :)


2-1138286031
Neo Trinitron
2006-01-26 17:33
2006.02.12
TDBGridEh. TDBLookupComboBox в гриде. Как сделать?


6-1131038808
KindDog
2005-11-03 20:26
2006.02.12
Indy TIdCmdTCPClient подвисает на SendCmd


15-1137823185
begin...end
2006-01-21 08:59
2006.02.12
С Днём рождения! 21 января


15-1138016916
Pazitron_Brain
2006-01-23 14:48
2006.02.12
Оцените творчество моего брата.