Форум: "WinAPI";
Текущий архив: 2009.12.27;
Скачать: [xml.tar.bz2];
Вниз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 вся ветка
Форум: "WinAPI";
Текущий архив: 2009.12.27;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.007 c