Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
2-1257545435
Igorishe
2009-11-07 01:10
2009.12.27
передача метода


15-1256481374
berlios
2009-10-25 17:36
2009.12.27
Треугольник


1-1231370009
Danco
2009-01-08 02:13
2009.12.27
Как использовать таймер без формы?


3-1232343690
pavel_guzhanov
2009-01-19 08:41
2009.12.27
Можно ли проиндексировать поле в представлении?


3-1232350553
Альф
2009-01-19 10:35
2009.12.27
Как отключить кеш в IB5.6 или что это было ?





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