Конференция "WinAPI" » NtQuerySystemInformation [D7]
 
  • Игорь © (13.10.08 13:49) [0]
    Привет, дайте примерчик попроще для получения списка процессов в Windows 2000 с помощью
    NtQuerySystemInformation

    , нашел пример Игоря Шевченко но для меня сложноват, мне нужен только список процессов с ID

    Спасибо
  • Сергей М. © (13.10.08 13:54) [1]
    А чем функциональность PSAPI не устроила ?
    Тот же результат достижим , и ощутимо проще ..
  • Vlad Oshin © (13.10.08 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;
  • Игорь © (13.10.08 14:42) [3]
    Блин ну причем здесь
    CreateToolhelp32Snapshot

    то, мне нужна
    NtQuerySystemInformation

  • Сергей М. © (13.10.08 14:52) [4]

    > Игорь ©   (13.10.08 14:42) [3]


    Вот тут страдалец типа тебя

    http://programmersforum.ru/showthread.php?p=85515

    тоже нашел код)
  • Игорь © (13.10.08 16:00) [5]

    > Сергей М. ©   (13.10.08 14:52) [4]


    С чего ты взял что я страдалец?

    Это код не работает в Windows 2000
  • Сергей М. © (13.10.08 16:07) [6]

    > Игорь ©   (13.10.08 16:00) [5]


    > С чего ты взял что я


    Ну не я же)
    Код-то тебе не понятен)


    > Это код не работает в Windows 2000
    >


    Что, вот прямо так и говорит "не работаю в Windows 2000" ?
  • Rouse_ © (13.10.08 16:19) [7]

    > Это код не работает в Windows 2000

    Обоснуй...
  • Игорь © (14.10.08 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 © (14.10.08 11:14) [9]
    > [8] Игорь ©   (14.10.08 11:01)

    > получаеться вот что

    Не увидела обоснования, о котором тебя спрашивали.
    Не понятно, что за код ты приводишь и зачем. Он работающий или нет ?

    В любом случае по нему (коду), навскидку, есть пара замечаний:
    1. между двумя вызовами NtQuerySystemInformation многое может измениться.
      результатом может оказаться то, что памяти не хватит.
    2. при удачном вызове NtQuerySystemInformation не обязана возвращать 0
  • Rouse_ © (14.10.08 11:22) [10]
    Приведенный тобой код, это куций обрезок моего примера, расположенного по ссылке: http://rouse.drkb.ru/winapi.php#taskmon
    Сам пример я проверял и на 2000 и на ХР и на 2003-ем, все нормально работало... Единственное НО!!! Я не проверял работу данного кода под ограниченной учетной записью... Под обычной админской записью все работает как и должно...
  • Rouse_ © (14.10.08 11:27) [11]

    > между двумя вызовами NtQuerySystemInformation многое может
    > измениться.
    >   результатом может оказаться то, что памяти не хватит.

    Ничего страшного, функция заполнит буффер только той информацией, окторая в него влезет.

    > при удачном вызове NtQuerySystemInformation не обязана возвращать 0

    ???
  • Riply © (14.10.08 11:44) [12]
    > [11] Rouse_ ©   (14.10.08 11:27)
    > Ничего страшного, функция заполнит буффер только той информацией, окторая в него влезет.

    Ну и мы получим не все процессы, которые есть. Троян, как раз и спячется :)

    > при удачном вызове NtQuerySystemInformation не обязана возвращать 0
    > ???

    Ну ведь у нее результат NTSTATUS - знаковый.
    Он может быть больше нуля (STATUS_SEVERITY_INFORMATIONAL) в случае успеха,
    если при этом возвращается дополнительная информация.
  • Riply © (14.10.08 11:49) [13]
    > [12] Riply ©   (14.10.08 11:44)
    > Он может быть больше нуля (STATUS_SEVERITY_INFORMATIONAL) в случае успеха,

    Имеется ввиду не возврат значения STATUS_SEVERITY_INFORMATIONAL, а возврат
    "ошибки", у которой severity code равен STATUS_SEVERITY_INFORMATIONAL.
  • Сергей М. © (14.10.08 12:30) [14]

    > Игорь ©   (14.10.08 11:01) [8]


    Так не бывает - запросил 0, получил тоже 0, да еще и с отлупом "несоответствие длины инф-ции" ..

    Что-то здесь нечисто ..
  • Rouse_ © (14.10.08 13:50) [15]

    > Ну и мы получим не все процессы, которые есть. Троян, как
    > раз и спячется :)

    Троян и так спрячется, ну например изъяв себя из списка правкой NextOffset :)


    > Имеется ввиду не возврат значения STATUS_SEVERITY_INFORMATIONAL,
    >  а возврат
    > "ошибки", у которой severity code равен STATUS_SEVERITY_INFORMATIONAL.

    MSDN четко кажет по этому поводу:
    Returns an NTSTATUS success or error code.

    А success равен нулю, все остальное от лукавого :)
  • Rouse_ © (14.10.08 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 © (14.10.08 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 © (14.10.08 14:14) [18]
    > [16] Rouse_ ©   (14.10.08 13:56)
    > Кстати, вообще перечень кодов возврата данной функции таков:

    А это откуда ?
  • Rouse_ © (14.10.08 14:15) [19]

    > + к этому, не забываем о STATUS_PENDING :)

    Эммнь... список всех возможных кодов возврата данной функции я тебе привел :)
 
Конференция "WinAPI" » NtQuerySystemInformation [D7]
Есть новые Нет новых   [134435   +33][b:0][p:0.004]