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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Стек legacy драйверов  (Прочитано 6943 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Scorp__)
Молодой специалист

ru
Offline Offline
Пол: Мужской

« : 12-01-2006 19:06 » 

Раз уж начал спрашивать про реестр в одном разделе продолжу и в другом.

Подскажите, пожалуйста, каким образом формируется стек драйверов в legacy модели. Подозреваю, что это должно быть записано где-то в реестре, откуда же еще Device Manager может взять информацию когда формирует IRP и соответственно стек для IRP. Но нигде не могу найти. Кажется, что хожу вокруг, а уцепиться не могу.

Спасибо за помощь.   
Записан

- А Вы сами-то верите в привидения?
- Конечно, нет, - ответил лектор и медленно растаял в воздухе.
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #1 : 23-01-2006 12:43 » 

Нигде особо это не хранится. Стек формируется тем что драйвера сами прицепляют свои объекты к лругим объектам. Вся логика такая же как и у WDM, за исключением того что в WDM сама система вызовет все зарегистрированные фильтры и драйверы которые создают FDO и вызовет у них AddDevice, а в случае с legasy просто загрузит драйвер который сам уже разберется что делать и к кому цепляться. Информация при формировании IRP никогда не берется из реестра.
Записан
Scorp__)
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 24-01-2006 08:45 » 

SlavaI, а как система определяет stacklocation'ы, которые присоединены к IRP? Просто если драйверу класса в системе, которую я исследую (и сопровождаю) приходит IRP, который надо обработать ниже, он делает IoGetNextIrpStackLocation, создает новый IRP и посылает его вниз с помощью IoCallDriver. А откуда stacklocation появился для нижнего драйвера непонятно Жаль
« Последнее редактирование: 20-12-2007 16:48 от Алексей1153++ » Записан

- А Вы сами-то верите в привидения?
- Конечно, нет, - ответил лектор и медленно растаял в воздухе.
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #3 : 24-01-2006 09:01 » 

По полю StackSize в _DEVICE_OBJECT

typedef struct DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT) _DEVICE_OBJECT {
    CSHORT Type;
    USHORT Size;
    LONG ReferenceCount;
    struct _DRIVER_OBJECT *DriverObject;
    struct _DEVICE_OBJECT *NextDevice;
    struct _DEVICE_OBJECT *AttachedDevice;
    struct _IRP *CurrentIrp;
    PIO_TIMER Timer;
    ULONG Flags;                                // See above:  DO_...
    ULONG Characteristics;                      // See ntioapi:  FILE_...
    PVPB Vpb;
    PVOID DeviceExtension;
    DEVICE_TYPE DeviceType;
    CCHAR StackSize;
    union {
        LIST_ENTRY ListEntry;
        WAIT_CONTEXT_BLOCK Wcb;
    } Queue;
    ULONG AlignmentRequirement;
    KDEVICE_QUEUE DeviceQueue;
    KDPC Dpc;

    //
    //  The following field is for exclusive use by the filesystem to keep
    //  track of the number of Fsp threads currently using the device
    //

    ULONG ActiveThreadCount;
    PSECURITY_DESCRIPTOR SecurityDescriptor;
    KEVENT DeviceLock;

    USHORT SectorSize;
    USHORT Spare1;

    struct _DEVOBJ_EXTENSION  *DeviceObjectExtension;
    PVOID  Reserved;
} DEVICE_OBJECT;

При IoGetNextIrpStackLocation не создается новый IRP - код то посмотри этой ф-ции.
Записан
Scorp__)
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 24-01-2006 13:16 » 

Я знаю что не создается новый IRP по IoGetNextIrpStackLocation. Это у меня он в функции драйвера создается потом. Я там запятую между прочим поставил Улыбаюсь Ладно тогда посмотрю, что там в IoCallDriver происходит на самом деле.
Записан

- А Вы сами-то верите в привидения?
- Конечно, нет, - ответил лектор и медленно растаял в воздухе.
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #5 : 25-01-2006 08:12 » 

В IoCallDriver ничего интересного кроме IoSetNextIrpStackLocation не происходит, все происходит при создании IRP.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines