Здравствуйте! Пытаюсь получить полное имя процесса, пройдя по всем известной цепочке SectionObject->Segment->ControlArea->FileObject->FileName, и это работало, но в вин7 в SectionObject иногда лежит вообще невалидный указатель, а когда он валидный, то SectionObject->Segment невалиден. В итоге приходится брать короткое имя. Нет ли способа получить все-таки длинное? Заранее спасибо
Во-первых, начиная с Vista немного изменился формат Control Area. Вот так, если не ошибаюсь: Код (Text): typedef struct _CONTROL_AREA { PVOID Segment; // type: SEGMENT LIST_ENTRY DereferenceList; ULONG Counters [5]; ULONG Flags; PFILE_OBJECT FilePointer; } CONTROL_AREA, *PCONTROL_AREA; typedef struct _CONTROL_AREA_VISTA { PVOID Segment; // type: SEGMENT LIST_ENTRY DereferenceList; ULONG_PTR Counters [4]; ULONG Flags [2]; PFILE_OBJECT FilePointer; // type: EX_FAST_REF } CONTROL_AREA_VISTA, *PCONTROL_AREA_VISTA; Во-вторых, значение FilePointer теперь нельзя просто взять как есть, т.к. там не совсем указатель, а т.н. "fast reference". Я вот такое использую для извлечения указателя: Код (Text): # ifdef _X86_ # define MAX_FAST_REFS 7 # else # define MAX_FAST_REFS 15 # endif PVOID PointerFromFastRef ( PVOID pFastRefPointer) { // // Check input parameters. // if (! pFastRefPointer) return NULL; // // Return basic pointer from fast reference. // return (PVOID) (((ULONG_PTR) pFastRefPointer) & ~MAX_FAST_REFS); }
Спасибо за ответ. Еще одно: SectionObject->Segment есть указатель на структуру SEGMENT как и ранее? Или все-таки на SEGMENT_OBJECT? И есть еще одна странность: MmIsAddressValid(pSectionObject) возвращает NULL в большинстве случаев.