Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.12.27;
Скачать: CL | DM;

Вниз

EPROCESS.ActiveProcessLinks с чем едят ?   Найти похожие ветки 

 
Riply ©   (2008-11-03 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 ©   (2008-11-04 09:33) [1]

> [0] Riply ©   (03.11.08 14:09)
Похоже, что они содержат указатели на ActiveProcessLinks - ы :)
Во всяком случае, если сместиться от ссылки
на ULONG_PTR(@EPROCESS) - ULONG_PTR(@EPROCESS.ActiveProcessLinks),
то получаем что-то осмысленное :)
Но список ID процессов, полученный таким образом несколько отличается от "стандартного"


 
brother ©   (2008-11-04 09:46) [2]

> Но список ID процессов, полученный таким образом несколько
> отличается от "стандартного"

можно на примере?


 
Riply ©   (2008-11-04 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 ©   (2008-11-05 03:48) [4]

ага...


 
Riply ©   (2008-11-05 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 ©   (2008-11-05 15:57) [6]


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

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

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

--
Regards, LVT.


 
Riply ©   (2008-11-05 17:45) [7]

> [6] Leonid Troyanovsky ©   (05.11.08 15:57)
> Может это ID потоков, а не процессов?

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

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


 
Leonid Troyanovsky ©   (2008-11-05 17:59) [8]


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

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

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

--
Regards, LVT.



Страницы: 1 вся ветка

Текущий архив: 2009.12.27;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.015 c
2-1257447516
Ivan
2009-11-05 21:58
2009.12.27
netsh с русскими символами


15-1256614569
Big Joe
2009-10-27 06:36
2009.12.27
Домен на национальном языке


15-1256592610
Юрий
2009-10-27 00:30
2009.12.27
С днем рождения ! 27 октября 2009 вторник


4-1225560998
POP
2008-11-01 20:36
2009.12.27
Добраться до PortName, через SetupAPI.


2-1257165542
Andrewtitoff
2009-11-02 15:39
2009.12.27
DBComboBox