-
Привет, дайте примерчик попроще для получения списка процессов в Windows 2000 с помощью NtQuerySystemInformation , нашел пример Игоря Шевченко но для меня сложноват, мне нужен только список процессов с ID Спасибо
-
А чем функциональность PSAPI не устроила ? Тот же результат достижим , и ощутимо проще ..
-
или еще так
uses tlhelp32;
procedure TForm2.Button2Click(Sender: TObject); var hSnapshoot: THandle; pe32: TProcessEntry32; begin hSnapshoot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hSnapshoot <> -1) then begin pe32.dwSize := SizeOf(TProcessEntry32); if (Process32First(hSnapshoot, pe32)) then repeat memo1.Lines.Add(format(' %10d, %5d: %s', [pe32.th32ProcessID, pe32.cntThreads, pe32.szExeFile])); until not Process32Next(hSnapshoot, pe32); CloseHandle (hSnapshoot); end; end;
-
Блин ну причем здесь CreateToolhelp32Snapshot то, мне нужна NtQuerySystemInformation
-
-
> Сергей М. © (13.10.08 14:52) [4]
С чего ты взял что я страдалец?
Это код не работает в Windows 2000
-
> Игорь © (13.10.08 16:00) [5]
> С чего ты взял что я
Ну не я же) Код-то тебе не понятен)
> Это код не работает в Windows 2000 >
Что, вот прямо так и говорит "не работаю в Windows 2000" ?
-
> Это код не работает в Windows 2000
Обоснуй...
-
> Rouse_ © (13.10.08 16:19) [7]
Ну вот применительно к этому коду http://programmersforum.ru/showthread.php?p=85515 получаеться вот что var
SystemInformation, SystemInformationIterator: PSYSTEM_PROCESS_INFORMATION;
ReturnLength: DWORD;
ModuleName: String;
begin
ReturnLength := 0;
if NtQuerySystemInformation(
SystemProcessesAndThreadsInformation,
nil, 0, ReturnLength) <> STATUS_INFO_LENGTH_MISMATCH then Exit;
if ReturnLength > 0 then
begin
GetMem(SystemInformation, ReturnLength);
try
if NtQuerySystemInformation(SystemProcessesAndThreadsInformation,
SystemInformation, ReturnLength, ReturnLength) = 0 then
begin
SystemInformationIterator := SystemInformation;
repeat
if SystemInformationIterator^.ModuleName = nil then
ModuleName := 'System Idle Process'
else
ModuleName := SystemInformationIterator^.ModuleName;
Form1.ListBox1.Items.Add(ModuleName);
SystemInformationIterator :=
Pointer(DWORD(SystemInformationIterator) +
SystemInformationIterator^.NextOffset);
until SystemInformationIterator^.NextOffset = 0;
end;
finally
FreeMem(SystemInformation);
end;
end else
ShowMessage('NO');
-
> [8] Игорь © (14.10.08 11:01)
> получаеться вот что
Не увидела обоснования, о котором тебя спрашивали. Не понятно, что за код ты приводишь и зачем. Он работающий или нет ?
В любом случае по нему (коду), навскидку, есть пара замечаний: 1. между двумя вызовами NtQuerySystemInformation многое может измениться. результатом может оказаться то, что памяти не хватит. 2. при удачном вызове NtQuerySystemInformation не обязана возвращать 0
-
Приведенный тобой код, это куций обрезок моего примера, расположенного по ссылке: http://rouse.drkb.ru/winapi.php#taskmonСам пример я проверял и на 2000 и на ХР и на 2003-ем, все нормально работало... Единственное НО!!! Я не проверял работу данного кода под ограниченной учетной записью... Под обычной админской записью все работает как и должно...
-
> между двумя вызовами NtQuerySystemInformation многое может > измениться. > результатом может оказаться то, что памяти не хватит.
Ничего страшного, функция заполнит буффер только той информацией, окторая в него влезет.
> при удачном вызове NtQuerySystemInformation не обязана возвращать 0
???
-
> [11] Rouse_ © (14.10.08 11:27) > Ничего страшного, функция заполнит буффер только той информацией, окторая в него влезет.
Ну и мы получим не все процессы, которые есть. Троян, как раз и спячется :)
> при удачном вызове NtQuerySystemInformation не обязана возвращать 0 > ???
Ну ведь у нее результат NTSTATUS - знаковый. Он может быть больше нуля (STATUS_SEVERITY_INFORMATIONAL) в случае успеха, если при этом возвращается дополнительная информация.
-
> [12] Riply © (14.10.08 11:44) > Он может быть больше нуля (STATUS_SEVERITY_INFORMATIONAL) в случае успеха,
Имеется ввиду не возврат значения STATUS_SEVERITY_INFORMATIONAL, а возврат "ошибки", у которой severity code равен STATUS_SEVERITY_INFORMATIONAL.
-
> Игорь © (14.10.08 11:01) [8]
Так не бывает - запросил 0, получил тоже 0, да еще и с отлупом "несоответствие длины инф-ции" ..
Что-то здесь нечисто ..
-
> Ну и мы получим не все процессы, которые есть. Троян, как > раз и спячется :)
Троян и так спрячется, ну например изъяв себя из списка правкой NextOffset :)
> Имеется ввиду не возврат значения STATUS_SEVERITY_INFORMATIONAL, > а возврат > "ошибки", у которой severity code равен STATUS_SEVERITY_INFORMATIONAL.
MSDN четко кажет по этому поводу: Returns an NTSTATUS success or error code.
А success равен нулю, все остальное от лукавого :)
-
Кстати, вообще перечень кодов возврата данной функции таков:
Return Value:
Returns one of the following status codes:
STATUS_SUCCESS - normal, successful completion.
STATUS_INVALID_INFO_CLASS - The SystemInformationClass parameter
did not specify a valid value.
STATUS_INFO_LENGTH_MISMATCH - The value of the SystemInformationLength
parameter did not match the length required for the information
class requested by the SystemInformationClass parameter.
STATUS_ACCESS_VIOLATION - Either the SystemInformation buffer pointer
or the ReturnLength pointer value specified an invalid address.
STATUS_WORKING_SET_QUOTA - The process does not have sufficient
working set to lock the specified output structure in memory.
STATUS_INSUFFICIENT_RESOURCES - Insufficient system resources exist
for this request to complete.
-
> [15] Rouse_ © (14.10.08 13:50)
> А success равен нулю, все остальное от лукавого :)
Неа. success - это не STATUS_SUCCESS, а NTSTATUS success, т.е. больше или равно нулю.
Вот перевод С-ишного дефайна: function NT_SUCCESS(const Status: NTSTATUS): Boolean; begin Result := Status >= 0; end;
Разумеется, это мое IMHO, но оно подтверждается, исходниками (заслуживающими доверия (например, линуксоиды)), просмотренными Вашей покорной слугой. Очень в редких случаях Status проверяется на строгое равенство STATUS_SUCCESS (обычно, когда надо вручную установить Win32LastError), во всех остальных идет проверка NT_SUCCESS. + к этому, не забываем о STATUS_PENDING :)
-
> [16] Rouse_ © (14.10.08 13:56) > Кстати, вообще перечень кодов возврата данной функции таков:
А это откуда ?
-
> + к этому, не забываем о STATUS_PENDING :)
Эммнь... список всех возможных кодов возврата данной функции я тебе привел :)
-
> А это откуда ?
W2K sources ;)
-
> [20] Rouse_ © (14.10.08 14:15) > W2K sources ;)
Это уже серьезней :) У меня их, к сожалению, нет. Там так и говорится, что это все возможные коды, или что это возможные коды ? Или ты просто посмотрел реализацию самой NtQuerySystemInformation ?
-
> Там так и говорится, что это все возможные коды
Да
> Или ты просто посмотрел реализацию самой NtQuerySystemInformation ?
Да, только там на SystemPathInformation, SystemCallTimeInformation возвращает еще STATUS_NOT_IMPLEMENTED
на SystemSessionProcessInformation может вернуть STATUS_DATATYPE_MISALIGNMENT
на SystemCrashDumpInformation может вернуть STATUS_ACCESS_DENIED
Но эти флаги не документированы, так что...
-
> [22] Rouse_ © (14.10.08 14:41) Я тоже чуть поискала. Пока результаты такие: ReactOS-овцы при некоторых INFO классах проверяют на строгое равенство (видела два примера), в остальных случаях на NT_SUCCESS. В том числе и для нашего Инфо-класса: nErrCode = NtQuerySystemInformation
(
SystemProcessesAndThreadsInformation,
pInfoBuffer,
nSize,
NULL
);
/* double the buffer size */
nSize += nSize;
}
/* repeat until the buffer is big enough */
while(nErrCode == STATUS_INFO_LENGTH_MISMATCH);
/* failure */
if(!NT_SUCCESS(nErrCode))
Я понимаю, что в при сравнении с W2K sources, они проигрывают, но это повод задуматься, т.к. у них все же пример использования. Я еще покапаюсь. Может получится найти подтверждение или опровержение.
-
> но это повод задуматься,
Эмм... понимаешь, я как-бы не говорю что жесткая проверка с нулем есть правильно, макрос NT_SUCCESS стандарт де-факто, но в данном случае он просто избыточен и поэтому проверка на 0 вполне оправдывает себя :)
-
Эта...народ, вы учтите, что с момента непатченного W2k чьи обрезанные исходники гуляют по белу свету, прошло довольно много времени и в NtQuery/SetSystemInformation добавлено много новых информационных кодов (ну и статусов вероятно тоже)
-
Offtop А эти W2k - они большие по объему ? Offtop
-
> А эти W2k - они большие по объему ?
200Мб в архиве
-
wrk есть, как я уже говорил - это сурсы ядра 2k3sp1
|