Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Путь к файлу драйвера  (Прочитано 7368 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
Ars
Гость
« : 18-12-2003 10:31 » new

Вот какой вопрос:  драйверу (в NT)  необходимо узнать полный путь к  собственному файлу (образу на диске). Кроме как посмотреть этот путь в соотв. ключе реестра (HKLM/.../Services), я способов не нашёл. Может есть более корректные?
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #1 : 18-12-2003 14:36 » 

Пока приходит в голову такая штука- получить SECTION_OBJECT(объект секция) например кода драйвера, далее по нему выйти на FILE_OBJECT, а уже потом раскрутить этот FILE_OBJECT. Но тут возникают трудности.
1) Как получить SECTION_OBJECT? Например handle на него легко получить при помощи MmLockPagableCodeSection(надеюсь что она возвращает handle объекта секции), а потом обратно все востановить, но это как-то зверски. В DRIVER_OBJECT есть указатель с именем DriverSection, но я не уверен что это действительно указаетль, а может handle, попытки выяснить это при помощи дебагера ничего не дали- это не похоже ни на указатель ни на handle. В принципе можно посмотреть на дизассемблерный листинг ядра и сделать получение SECTION_OBJECT как там- там какой-то список секций поддерживается.
2) Второй вопрос- а какова связь между файлом на диске и загруженным драйвером(то есть имеет ли смысл копать полученный FILE_OBJECT), например загрузив драйвер, соотвествующий ему файл можно удалить, то есть файл не заблокирован, а соотвественно смысла большого не имеет. Вот тут вопрос- а где же хранятся PAGEABLE секции драйвера, исполняемые файлы как известно не сбрасываются в страничный файл, так как их код всегда доступен из файла на диске, а вот для драйвера это похоже не так, вероятно его код находится в страничном файле.
3) Ну и наконец- структура объекта секции не документирована, но вот у меня есть ее определение(взято с www.ntndis.com до падения там форума)
Код:
struct _SECTION_OBJECT 
{
    void* StartingVa;
    void* EndingVa;
    void* Parent;
    void* LeftChild;
    void* RightChild;
    struct _SEGMENT_OBJECT* Segment;
};
struct _SEGMENT_OBJECT
{
    void* BaseAddress;
    DWORD TotalNumberOfPtes;
    struct _LARGE_INTEGER SizeOfSegment;
    DWORD NonExtendedPtes;
    DWORD ImageCommitment;
    struct _CONTROL_AREA* ControlArea;
    struct _SUBSECTION* Subsection;
    struct _LARGE_CONTROL_AREA* LargeControlArea;
    struct _MMSECTION_FLAGS* MmSectionFlags;
    struct _MMSUBSECTION_FLAGS* MmSubSectionFlags;
};

struct _CONTROL_AREA
{
    struct _SEGMENT* Segment;
    struct _LIST_ENTRY DereferenceList;
    DWORD NumberOfSectionReferences;
    DWORD NumberOfPfnReferences;
    DWORD NumberOfMappedViews;
    WORD NumberOfSubsections;
    WORD FlushInProgressCount;
    DWORD NumberOfUserReferences;
    struct UnnamedStruct_7ECCD8 u;
    struct _FILE_OBJECT* FilePointer;
    struct _EVENT_COUNTER* WaitingForDeletion;
    WORD ModifiedWriteCount;
    WORD NumberOfSystemCacheViews;
};

//
// yoi aeaeii union e aai ii?ii caiaieou ia DWORD
//
struct UnnamedStruct_7ECCD8
{
    DWORD LongFlags;
    struct _MMSECTION_FLAGS Flags;
};

struct _MMSECTION_FLAGS
{
    unsigned BeingDeleted;
    unsigned BeingCreated;
    unsigned BeingPurged;
    unsigned NoModifiedWriting;
    unsigned FailAllIo;
    unsigned Image;
    unsigned Based;
    unsigned File;
    unsigned Networked;
    unsigned NoCache;
    unsigned PhysicalMemory;
    unsigned CopyOnWrite;
    unsigned Reserve;
    unsigned Commit;
    unsigned FloppyMedia;
    unsigned WasPurged;
    unsigned UserReference;
    unsigned GlobalMemory;
    unsigned DeleteOnClose;
    unsigned FilePointerNull;
    unsigned DebugSymbolsLoaded;
    unsigned SetMappedFileIoComplete;
    unsigned CollidedFlush;
    unsigned NoChange;
    unsigned HadUserReference;
    unsigned ImageMappedInSystemSpace;
    unsigned UserWritable;
    unsigned Accessed;
    unsigned GlobalOnlyPerSession;
    unsigned Rom;
    unsigned filler;
};

и второй вариант(откуда взял- не помню)
Код:
struct _SECTION_OBJECT 
{
    void* StartingVa;
    void* EndingVa;
    void* Parent;
    void* LeftChild;
    void* RightChild;
    struct _SEGMENT_OBJECT* Segment;
};

struct _SEGMENT_OBJECT
{
    void* BaseAddress;
    DWORD TotalNumberOfPtes;
    struct _LARGE_INTEGER SizeOfSegment;
    DWORD NonExtendedPtes;
    DWORD ImageCommitment;
    struct _CONTROL_AREA* ControlArea;
    struct _SUBSECTION* Subsection;
    struct _LARGE_CONTROL_AREA* LargeControlArea;
    struct _MMSECTION_FLAGS* MmSectionFlags;
    struct _MMSUBSECTION_FLAGS* MmSubSectionFlags;
};

struct _CONTROL_AREA
{
    struct _SEGMENT* Segment;
    struct _LIST_ENTRY DereferenceList;
    DWORD NumberOfSectionReferences;
    DWORD NumberOfPfnReferences;
    DWORD NumberOfMappedViews;
    WORD NumberOfSubsections;
    WORD FlushInProgressCount;
    DWORD NumberOfUserReferences;
    struct UnnamedStruct_7ECCD8 u;
    struct _FILE_OBJECT* FilePointer;
    struct _EVENT_COUNTER* WaitingForDeletion;
    WORD ModifiedWriteCount;
    WORD NumberOfSystemCacheViews;
};
« Последнее редактирование: 10-12-2007 16:17 от Алексей1153++ » Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #2 : 19-12-2003 08:25 » 

Я тут еще поковырялся немного- похоже в  DRIVER_OBJECT в поле DriverSection все таки что-то дельное находится, например в процедуре  IopDeleteDriver, которая удаляет объект DRIVER_OBJECT есть такой код(в esi указатель на DRIVER_OBJECT)
Код:
               mov     eax, [esi+14h]
               test    eax, eax
               jz      short loc_4932FD
               push    eax
               call    _MmUnloadSystemImage@4

что говорит о том что по смещению 0x14 содержится HANDLE объекта секция.
« Последнее редактирование: 10-12-2007 16:19 от Алексей1153++ » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines