Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> BSOD SYSTEM_SERVICE_EXCEPTION (3b), Драйвер падает при выключении 
:(
    Опции темы
rudolfninja
Дата 18.4.2017, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 341
Регистрация: 19.2.2013
Где: г. Минск

Репутация: 1
Всего: 6



Ребята, приветствую.
Сразу к сути проблемы: есть драйврер-фильтр ФС, который вывалвает БСОД на Windows10 при попытке перезагрузки или выключения ОС. На Win7 все работает ОК.
Анализируя дамп в WinDbg (с помощью !analyze -v), увидел следующее:
Код

SYSTEM_MANUFACTURER:  VMware, Inc.
VIRTUAL_MACHINE:  VMware
SYSTEM_PRODUCT_NAME:  VMware7,1
SYSTEM_VERSION:  None
BIOS_VENDOR:  VMware, Inc.
BIOS_VERSION:  VMW71.00V.0.B64.1507021939


Полагаю, что это значит, что ОС запущена на виртуалке, хотя заказчик говорит, что не важно где.
С помощью WinDbg я в дампе нашел место, где валится проблема. Вот стек вызовов:

Код

nt!KiPageFault+0x221
MYDRV!IsShadow+0xcd
MYDRV!ControlMount+0x38
MYDRV!Control+0x77
nt!IopMountVolume+0x2e5
nt!IopCheckVpbMounted+0x10a
nt!IopParseDevice+0xbc7
nt!ObpLookupObjectName+0x8b2
nt!ObOpenObjectByNameEx+0x1dd
nt!IopCreateFile+0x3d9
nt!NtOpenFile+0x58
nt!KiSystemServiceCopyEnd+0x13
0x00007ffc`5e2f6734


Вот что происходит в MYDRV-функция (ниже не весь код функций, а только та часть, котороя около указанных смещений).
MYDRV!Control:
Код

PIO_STACK_LOCATION irps = IoGetCurrentIrpStackLocation( Irp ); // Irp is IN 
parameter of the function
switch (irps->MinorFunction) {

        case IRP_MN_MOUNT_VOLUME:

            return ControlMount( DeviceObject, Irp );

Тут вызывается ControlMount. Вот что происходт внутри этой функции:
Код

PIO_STACK_LOCATION irps = IoGetCurrentIrpStackLocation( Irp );
PDEVICE_OBJECT storageStackDeviceObject;
BOOLEAN isShadowCopy;
storageStackDeviceObject = irps->Parameters.MountVolume.Vpb->RealDevice;
status = IsShadow( storageStackDeviceObject, &isShadowCopy);

В ControlMount получаем стек девайса и вызываем IsShadow:
Код

if (FILE_DEVICE_VIRTUAL_DISK != StorageStackDeviceObject->DeviceType)

До этой строчки в IsShadow StorageStackDeviceObject никак не меняется. И именно тут вылетает эксепшн (PageFault).
С помощью cmkd я выяснил, что находится в  MountVolume.Vpd->RealDevice:
Код

+0x000 MountVolume      : <unnamed-tag>
         +0x000 Vpb              : 0xffffa589`5eb42a90 _VPB
            +0x000 Type             : 0n0
            +0x002 Size             : 0n0
            +0x004 Flags            : 0
            +0x006 VolumeLabelLength : 0
            +0x008 DeviceObject     : (null) 
            +0x010 RealDevice       : 0x00000000`00008000 _DEVICE_OBJECT
            +0x018 SerialNumber     : 1
            +0x01c ReferenceCount   : 0xffffffff
            +0x020 VolumeLabel      : [32]  ""

Получается, что адрес RealDevice невалидный (более того, что-то мне подсказывает, что VPB-блок в целом невалидный), а я пытаюсь у него получить DeviceType. Отсюда и BSOD. 
На MSDN я нашел следующее:
Цитата

IrpSp->Parameters.MountVolume.Vpb
Pointer to the volume parameter block (VPB) for the volume to be mounted. File 
systems that support removable media might substitute a previously used VPB for 
the one passed in this parameter. On such file systems, after the volume is 
mounted, this pointer can no longer be assumed to be valid. File system filter 
drivers that filter these file systems should use this parameter as follows: 
Before sending the IRP down to lower-level drivers, the filter should save the 
value of IrpSp->Parameters.MountVolume.Vpb->RealDevice. After the volume is 
successfully mounted, the filter can use this pointer to the storage device 
object to obtain the correct VPB pointer.

Получается, что VPB, и конкретно RealDevice, устанавливается виндовым IOManager'ом. 

Собственно, вопросы:
1) Может ли быть причина в том, как написано на MSDN, указатель на блок параметров устройства портится и поэтому падает ошибка? Хотя дальше этот драйвер не отправляет IPR вниз по стеку драйверов. Но если проблема в этом, то почему на Win7 все окей?
2) Может ли быть причина в том, что драйвер собирается версией WDK (DDK) для Win7?
3) Какие еще есть мысли по поводу причины и диагностики?

Буду рад услышать ваше мнение по теме проблемы.
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1144 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.