Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.005 c
15-1254894885
MBo
2009-10-07 09:54
2009.12.06
Срединедельная задачка


8-1190053070
Дельфин
2007-09-17 22:17
2009.12.06
Несколько потоков звука в программе


15-1254491780
Unknown user
2009-10-02 17:56
2009.12.06
Чтение/запись PSD (Photoshop) формата


15-1255027446
Piter
2009-10-08 22:44
2009.12.06
Word не может открыть файл более 32 MB?


1-1228119004
parasolka
2008-12-01 11:10
2009.12.06
Передача параметров в Dll.





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