>
[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Подскажите, пожалуйста, где я допускаю ошибки ?