Получение полного имени процесса в WinSeven

Тема в разделе "WASM.NT.KERNEL", создана пользователем spirom, 12 сен 2010.

  1. spirom

    spirom New Member

    Публикаций:
    0
    Регистрация:
    18 авг 2010
    Сообщения:
    24
    Здравствуйте!
    Пытаюсь получить полное имя процесса, пройдя по всем известной цепочке SectionObject->Segment->ControlArea->FileObject->FileName, и это работало, но в вин7 в SectionObject иногда лежит вообще невалидный указатель, а когда он валидный, то SectionObject->Segment невалиден. В итоге приходится брать короткое имя. Нет ли способа получить все-таки длинное? Заранее спасибо
     
  2. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Во-первых, начиная с Vista немного изменился формат Control Area. Вот так, если не ошибаюсь:

    Код (Text):
    1. typedef struct _CONTROL_AREA
    2. {
    3.     PVOID Segment;                  // type: SEGMENT
    4.     LIST_ENTRY DereferenceList;
    5.     ULONG Counters [5];
    6.     ULONG Flags;
    7.     PFILE_OBJECT FilePointer;
    8. }
    9. CONTROL_AREA, *PCONTROL_AREA;
    10.  
    11. typedef struct _CONTROL_AREA_VISTA
    12. {
    13.     PVOID Segment;                  // type: SEGMENT
    14.     LIST_ENTRY DereferenceList;
    15.     ULONG_PTR Counters [4];
    16.     ULONG Flags [2];
    17.     PFILE_OBJECT FilePointer;       // type: EX_FAST_REF
    18. }
    19. CONTROL_AREA_VISTA, *PCONTROL_AREA_VISTA;
    Во-вторых, значение FilePointer теперь нельзя просто взять как есть, т.к. там не совсем указатель, а т.н. "fast reference". Я вот такое использую для извлечения указателя:

    Код (Text):
    1. # ifdef _X86_
    2.   # define MAX_FAST_REFS 7
    3. # else
    4.   # define MAX_FAST_REFS 15
    5. # endif
    6.  
    7. PVOID
    8. PointerFromFastRef (
    9.  
    10.     PVOID pFastRefPointer)
    11.  
    12. {
    13.     //
    14.     // Check input parameters.
    15.     //
    16.  
    17.     if (! pFastRefPointer) return NULL;
    18.  
    19.     //
    20.     // Return basic pointer from fast reference.
    21.     //
    22.  
    23.     return (PVOID) (((ULONG_PTR) pFastRefPointer) & ~MAX_FAST_REFS);
    24. }
     
  3. spirom

    spirom New Member

    Публикаций:
    0
    Регистрация:
    18 авг 2010
    Сообщения:
    24
    Спасибо за ответ. Еще одно: SectionObject->Segment есть указатель на структуру SEGMENT как и ранее? Или все-таки на SEGMENT_OBJECT? И есть еще одна странность: MmIsAddressValid(pSectionObject) возвращает NULL в большинстве случаев.