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