Форум: "WinAPI";
Текущий архив: 2009.12.06;
Скачать: [xml.tar.bz2];
ВнизNtQuerySystemInformation Найти похожие ветки
← →
Игорь © (2008-10-13 13:49) [0]Привет, дайте примерчик попроще для получения списка процессов в Windows 2000 с помощью
NtQuerySystemInformation
, нашел пример Игоря Шевченко но для меня сложноват, мне нужен только список процессов с ID
Спасибо
← →
Сергей М. © (2008-10-13 13:54) [1]А чем функциональность PSAPI не устроила ?
Тот же результат достижим , и ощутимо проще ..
← →
Vlad Oshin © (2008-10-13 14:26) [2]или еще так
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;
← →
Игорь © (2008-10-13 14:42) [3]Блин ну причем здесь
CreateToolhelp32Snapshot
то, мне нужнаNtQuerySystemInformation
← →
Сергей М. © (2008-10-13 14:52) [4]
> Игорь © (13.10.08 14:42) [3]
Вот тут страдалец типа тебя
http://programmersforum.ru/showthread.php?p=85515
тоже нашел код)
← →
Игорь © (2008-10-13 16:00) [5]
> Сергей М. © (13.10.08 14:52) [4]
С чего ты взял что я страдалец?
Это код не работает в Windows 2000
← →
Сергей М. © (2008-10-13 16:07) [6]
> Игорь © (13.10.08 16:00) [5]
> С чего ты взял что я
Ну не я же)
Код-то тебе не понятен)
> Это код не работает в Windows 2000
>
Что, вот прямо так и говорит "не работаю в Windows 2000" ?
← →
Rouse_ © (2008-10-13 16:19) [7]
> Это код не работает в Windows 2000
Обоснуй...
← →
Игорь © (2008-10-14 11:01) [8]
> 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");
← →
Riply © (2008-10-14 11:14) [9]> [8] Игорь © (14.10.08 11:01)
> получаеться вот что
Не увидела обоснования, о котором тебя спрашивали.
Не понятно, что за код ты приводишь и зачем. Он работающий или нет ?
В любом случае по нему (коду), навскидку, есть пара замечаний:
1. между двумя вызовами NtQuerySystemInformation многое может измениться.
результатом может оказаться то, что памяти не хватит.
2. при удачном вызове NtQuerySystemInformation не обязана возвращать 0
← →
Rouse_ © (2008-10-14 11:22) [10]Приведенный тобой код, это куций обрезок моего примера, расположенного по ссылке: http://rouse.drkb.ru/winapi.php#taskmon
Сам пример я проверял и на 2000 и на ХР и на 2003-ем, все нормально работало... Единственное НО!!! Я не проверял работу данного кода под ограниченной учетной записью... Под обычной админской записью все работает как и должно...
← →
Rouse_ © (2008-10-14 11:27) [11]
> между двумя вызовами NtQuerySystemInformation многое может
> измениться.
> результатом может оказаться то, что памяти не хватит.
Ничего страшного, функция заполнит буффер только той информацией, окторая в него влезет.
> при удачном вызове NtQuerySystemInformation не обязана возвращать 0
???
← →
Riply © (2008-10-14 11:44) [12]> [11] Rouse_ © (14.10.08 11:27)
> Ничего страшного, функция заполнит буффер только той информацией, окторая в него влезет.
Ну и мы получим не все процессы, которые есть. Троян, как раз и спячется :)
> при удачном вызове NtQuerySystemInformation не обязана возвращать 0
> ???
Ну ведь у нее результат NTSTATUS - знаковый.
Он может быть больше нуля (STATUS_SEVERITY_INFORMATIONAL) в случае успеха,
если при этом возвращается дополнительная информация.
← →
Riply © (2008-10-14 11:49) [13]> [12] Riply © (14.10.08 11:44)
> Он может быть больше нуля (STATUS_SEVERITY_INFORMATIONAL) в случае успеха,
Имеется ввиду не возврат значения STATUS_SEVERITY_INFORMATIONAL, а возврат
"ошибки", у которой severity code равен STATUS_SEVERITY_INFORMATIONAL.
← →
Сергей М. © (2008-10-14 12:30) [14]
> Игорь © (14.10.08 11:01) [8]
Так не бывает - запросил 0, получил тоже 0, да еще и с отлупом "несоответствие длины инф-ции" ..
Что-то здесь нечисто ..
← →
Rouse_ © (2008-10-14 13:50) [15]
> Ну и мы получим не все процессы, которые есть. Троян, как
> раз и спячется :)
Троян и так спрячется, ну например изъяв себя из списка правкой NextOffset :)
> Имеется ввиду не возврат значения STATUS_SEVERITY_INFORMATIONAL,
> а возврат
> "ошибки", у которой severity code равен STATUS_SEVERITY_INFORMATIONAL.
MSDN четко кажет по этому поводу:
Returns an NTSTATUS success or error code.
А success равен нулю, все остальное от лукавого :)
← →
Rouse_ © (2008-10-14 13:56) [16]Кстати, вообще перечень кодов возврата данной функции таков:
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.
← →
Riply © (2008-10-14 14:10) [17]> [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 :)
← →
Riply © (2008-10-14 14:14) [18]> [16] Rouse_ © (14.10.08 13:56)
> Кстати, вообще перечень кодов возврата данной функции таков:
А это откуда ?
← →
Rouse_ © (2008-10-14 14:15) [19]
> + к этому, не забываем о STATUS_PENDING :)
Эммнь... список всех возможных кодов возврата данной функции я тебе привел :)
← →
Rouse_ © (2008-10-14 14:15) [20]
> А это откуда ?
W2K sources ;)
← →
Riply © (2008-10-14 14:27) [21]> [20] Rouse_ © (14.10.08 14:15)
> W2K sources ;)
Это уже серьезней :) У меня их, к сожалению, нет.
Там так и говорится, что это все возможные коды,
или что это возможные коды ?
Или ты просто посмотрел реализацию самой NtQuerySystemInformation ?
← →
Rouse_ © (2008-10-14 14:41) [22]
> Там так и говорится, что это все возможные коды
Да
> Или ты просто посмотрел реализацию самой NtQuerySystemInformation ?
Да, только там на SystemPathInformation, SystemCallTimeInformation возвращает еще STATUS_NOT_IMPLEMENTED
на SystemSessionProcessInformation может вернуть STATUS_DATATYPE_MISALIGNMENT
на SystemCrashDumpInformation может вернуть STATUS_ACCESS_DENIED
Но эти флаги не документированы, так что...
← →
Riply © (2008-10-14 15:14) [23]> [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))
{
DPRINT(FAILED_WITH_STATUS, "NtQuerySystemInformation", nErrCode);
return nErrCode;
}
Я понимаю, что в при сравнении с W2K sources, они проигрывают, но это повод задуматься,
т.к. у них все же пример использования.
Я еще покапаюсь. Может получится найти подтверждение или опровержение.
← →
Rouse_ © (2008-10-14 15:47) [24]
> но это повод задуматься,
Эмм... понимаешь, я как-бы не говорю что жесткая проверка с нулем есть правильно, макрос NT_SUCCESS стандарт де-факто, но в данном случае он просто избыточен и поэтому проверка на 0 вполне оправдывает себя :)
← →
Игорь Шевченко © (2008-10-15 00:42) [25]Эта...народ, вы учтите, что с момента непатченного W2k чьи обрезанные исходники гуляют по белу свету, прошло довольно много времени и в NtQuery/SetSystemInformation добавлено много новых информационных кодов (ну и статусов вероятно тоже)
← →
Riply © (2008-10-15 06:23) [26]Offtop
А эти W2k - они большие по объему ?
Offtop
← →
Rouse_ © (2008-10-15 09:38) [27]
> А эти W2k - они большие по объему ?
200Мб в архиве
← →
slow!alfamoon!com (2008-10-16 12:46) [28]wrk есть, как я уже говорил - это сурсы ядра 2k3sp1
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2009.12.06;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.004 c