Конференция "WinAPI" » EPROCESS.ActiveProcessLinks с чем едят ?
 
  • Riply © (03.11.08 14:09) [0]
    Здравствуйте !
    Ссылки на какой тип объекта содержит ActiveProcessLinks: LIST_ENTRY из EPROCESS ?
    Если попробовать пробежаться по ним, примерно, таким образом:
    ProcessHead := @PsGetCurrentProcess.ActiveProcessLinks;
    Process := ProcessHead.Flink;
    while Process <> ProcessHead do
    begin
     inc(Result);
     Process := Process.Flink;
    end;


    то мы получаем количество ссылок равное кол-ву процессов в системе.
    Предположение, что ActiveProcessLinks содержит PEPROCESS`ы
    не подтверждается (во всяком случае у меня) - UniqueProcessID равны нулю.
    Что же они такое содержат ?
  • Riply © (04.11.08 09:33) [1]
    > [0] Riply ©   (03.11.08 14:09)
    Похоже, что они содержат указатели на ActiveProcessLinks - ы :)
    Во всяком случае, если сместиться от ссылки
    на ULONG_PTR(@EPROCESS) - ULONG_PTR(@EPROCESS.ActiveProcessLinks),
    то получаем что-то осмысленное :)
    Но список ID процессов, полученный таким образом несколько отличается от "стандартного"
  • brother © (04.11.08 09:46) [2]
    > Но список ID процессов, полученный таким образом несколько
    > отличается от "стандартного"

    можно на примере?
  • Riply © (04.11.08 12:15) [3]
    > [2] brother ©   (04.11.08 09:46)
    > можно на примере?

    Дык тут нечего показывать.
    Я как тот чукча: что вижу, то и пою :)
    function ScanActiveProcessLinks(const pEProc: PEPROCESS; var ProcCount: ULONG): NTSTATUS;
    const // ULONG_PTR(@EPROCESS.ActiveProcessLinks) - ULONG_PTR(@EPROCESS)
    OffsetToProcLinks = 136;
    var
    CurrentEntry, ListHead: PLIST_ENTRY;
    pProcess: PEPROCESS;
    begin
    Result := STATUS_SUCCESS;
    ProcCount := 0;
    if pEProc = nil
     then ListHead := @PsGetCurrentProcess.ActiveProcessLinks
     else ListHead := @pEProc.ActiveProcessLinks;
    CurrentEntry := ListHead.Flink;
    while CurrentEntry <> ListHead do
     begin
      pProcess := PEPROCESS(ULONG_PTR(CurrentEntry) - OffsetToProcLinks);
      inc(ProcCount);
      DrvLog_WriteMessW('ScanActiveProcessLinks', 'UniqueProcessId', Result,
                         ULONG_PTR(pProcess.UniqueProcessId), ProcCount);
      CurrentEntry := CurrentEntry.Flink;
     end;
    end;


    Только так бегать нельзя :)
    Необходимо лочить ActiveProcessLinks. Пока не разобралась,
    как можно (и можно ли) залочить весь список.
    Если не найду такого варианта, буду пробовать лочить поодиночке :)
  • brother © (05.11.08 03:48) [4]
    ага...
  • Riply © (05.11.08 04:38) [5]
    > [1] Riply ©   (04.11.08 09:33)
    > Но список ID процессов, полученный таким образом несколько отличается от "стандартного"

    Что-то я совсем запуталась.
    Либо у меня серьезные пробелы в плане работы с указателями, либо лыжи не едут :)
    Пробую пробегаться по ActiveProcessLinks примерно так:
    CurrentEntry := PsActiveProcessHead.Flink;
    while CurrentEntry <> PsActiveProcessHead do
    begin
     pProcess := PEPROCESS(ULONG_PTR(CurrentEntry) - OffsetToProcLinks);
     Result := Ps_ObQueryNameString(pProcess, @ObjNameInfo, nil);
     if NT_SUCCESS(Result)
      then DrvLog_WriteMessU('ScanLinks', @POBJECT_NAME_INFORMATION(ObjNameInfo.Buffer).Name, Result,                            ULONG_PTR(pProcess.UniqueProcessId), ProcCount)
      else DrvLog_WriteMessW('ScanLinks', 'pProcess', Result, ULONG_PTR(pProcess.UniqueProcessId), ProcCount);
     CurrentEntry := CurrentEntry.Flink;
     inc(ProcCount);
    end;



    Где получение имени процесса (Ps_ObQueryNameString) выглядит следующим образом:

    function ObQueryNameStringMem(const pObject: PVOID; const pObjNameInfo: PMEM_BLOCK): NTSTATUS; stdcall;
    var
    ReturnLength: ULONG;
    begin
    ReturnLength := 0;
    Result := ObQueryNameString(pObject, pObjNameInfo.Buffer, pObjNameInfo.MaximumLength, @ReturnLength);
    if (Result = STATUS_INFO_LENGTH_MISMATCH) or (Result = STATUS_BUFFER_OVERFLOW) then
     if ReturnLength > pObjNameInfo.MaximumLength then
      begin
       Result := BMem_ReallocMem(pObjNameInfo, ROUND_UP64(ReturnLength));
       if NT_SUCCESS(Result)
        then Result := ObQueryNameString(pObject, pObjNameInfo.Buffer, pObjNameInfo.MaximumLength, @ReturnLength);
      end
     else Result := STATUS_SH_DBG_IMPOSSIBLE;
    if NT_SUCCESS(Result) then Result := ShMem_SetUsedLength(pObjNameInfo, ReturnLength);
    end;



    Ну и ее (ObQueryNameStringMem) вызов:
    function Ps_ObQueryNameString(const pEProc: PEPROCESS; const pObjNameInfo: PMEM_BLOCK): NTSTATUS; stdcall;
    var
    NullLevel: ULONG;
    begin
    pObjNameInfo.Length := 0;
    Result := STATUS_INVALID_LEVEL;
    if pEProc.SectionObject <> nil then
     if pEProc.SectionObject.Segment <> nil then
      if pEProc.SectionObject.Segment.ControlArea <> nil then
       if pEProc.SectionObject.Segment.ControlArea.FilePointer <> nil then
        begin
         Result := ObQueryNameStringMem(pEProc.SectionObject.Segment.ControlArea.FilePointer, pObjNameInfo);



    Привожу "поскипанный" лог описанной выше пробежки.
    Все дело в том, что UniqueProcessId, полученные таким образом не совпадают
    с ProcessId, полученными "стандартным" способом (я дописала их в таблицу после "--->").
    Закономерности в отличиях не нашла.
    pProcess   $c0000148 4 0
    \Device\HarddiskVolume1\WINDOWS\system32\smss.exe   $0 424 1      --->  420
    \Device\HarddiskVolume1\WINDOWS\system32\csrss.exe   $0 480 2   --->  476
    \Device\HarddiskVolume1\WINDOWS\system32\winlogon.exe   $0 504 3  --->  500
    \Device\HarddiskVolume1\WINDOWS\system32\services.exe   $0 548 4  --->  544
    \Device\HarddiskVolume1\WINDOWS\system32\lsass.exe   $0 568 5   --->  556
    \Device\HarddiskVolume1\WINDOWS\system32\svchost.exe   $0 732 6   --->  720
    \Device\HarddiskVolume1\WINDOWS\system32\svchost.exe   $0 780 7   --->  768
    \Device\HarddiskVolume1\WINDOWS\system32\svchost.exe   $0 848 8   --->  836
    \Device\HarddiskVolume1\WINDOWS\system32\svchost.exe   $0 960 9   --->  960
    \Device\HarddiskVolume1\WINDOWS\system32\svchost.exe   $0 1020 10 ---> 1012
    \Device\HarddiskVolume1\Program Files\Alwil Software\Avast4\aswUpdSv.exe   $0 1112 11 ---> 1100
    \Device\HarddiskVolume1\Program Files\Alwil Software\Avast4\ashServ.exe   $0 1160 12 ---> 1148
    \Device\HarddiskVolume1\Program Files\Common Files\Microsoft Shared\VS7Debug\mdm.exe   $0 1580 13  ---> 1568
    \Device\HarddiskVolume1\Program Files\Alwil Software\Avast4\ashMaiSv.exe   $0 1792 14 ---> 1792
    \Device\HarddiskVolume1\Program Files\Alwil Software\Avast4\ashWebSv.exe   $0 1808 15 ---> 1816
    \Device\HarddiskVolume1\WINDOWS\system32\alg.exe   $0 244 16        --->  224
    \Device\HarddiskVolume1\WINDOWS\explorer.exe   $0 904 17            --->  816
    \Device\HarddiskVolume1\Program Files\ABBYY Lingvo 11 Six Languages\LvAgent.exe   $0 1636 18       ---> 1656
    \Device\HarddiskVolume1\PROGRA~1\ALWILS~1\Avast4\ashDisp.exe   $0 1648 19               ---> 1784
    \Device\HarddiskVolume1\WINDOWS\system32\ctfmon.exe   $0 1720 20    ---> 1472  
    \Device\HarddiskVolume1\WINDOWS\system32\wuauclt.exe   $0 300 21
    \Device\HarddiskVolume3\Contrivance\Pascal\Delphi\Realize\Sh_Checker\Sh_Checker. exe   $0 3980 22   ---> 1328
    \Device\HarddiskVolume3\Tools\DbgView\Dbgview.exe   $0 1016 23


    Подскажите, пожалуйста, где я допускаю ошибки ?
  • Leonid Troyanovsky © (05.11.08 15:57) [6]

    > Riply ©   (05.11.08 04:38) [5]

    > Все дело в том, что UniqueProcessId, полученные таким образом
    > не совпадают
    > с ProcessId, полученными "стандартным" способом (я дописала
    > их в таблицу после "--->").

    Может это ID потоков, а не процессов?

    --
    Regards, LVT.
  • Riply © (05.11.08 17:45) [7]
    > [6] Leonid Troyanovsky ©   (05.11.08 15:57)
    > Может это ID потоков, а не процессов?

    Ну.. почти... :)

    Нашла я ошибку.
    Сейчас... Надо набраться храбрости... Ста грамм ни у кого нет ? :)
    Знаю, что буду посмешищем для всего форума, но, видимо, заслужила.
    Процесс разработки выглядит так:
    Работаю (пишу код, компилирую, и т.д. и т.п. ) я на одном компьютере.
    Когда мне кажется, что все в порядке, запускаю драйвер удаленно (на другой машине).
    Получаю лог всех его выкрутасов и начинаю его (лог) изучать,
    сравнивать реальные результаты с ожидаемыми и все такое.
    Дальше продолжать или пожалеете ? :)
    Я сравнивала ID процессов разных машин :)
    Вот такие дела... "Спутала с прямым углом" :)
    В свое оправдание могу сказать следующее:
    При работе складывается полное ощущение, что все происходит на одном компьютере.
    (Ко второму я подхожу то только раз в день, чтобы нажать кнопку включения :))
  • Leonid Troyanovsky © (05.11.08 17:59) [8]

    > Riply ©   (05.11.08 17:45) [7]

    > При работе складывается полное ощущение, что все происходит
    > на одном компьютере.

    Не переживай, подобное - не редкость.

    --
    Regards, LVT.
 
Конференция "WinAPI" » EPROCESS.ActiveProcessLinks с чем едят ?
Есть новые Нет новых   [134435   +33][b:0][p:0.002]