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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Ошибка PAGE FAULT IN NONPAGED AREA - 0x00000050  (Прочитано 16978 раз)
0 Пользователей и 1 Гость смотрят эту тему.
sabbatazh
Помогающий

ua
Offline Offline

« : 31-03-2013 17:26 » 

Здравствуйте Уважаемые Знатоки!!!
Обнаружил у себя в драйвере ошибку, - при подключенном, или же потом отключенном, USB устройстве и попытке удаления, или перезагрузке, драйвера Вылетает "СИНИЙ ЭКРАН" - ошибка PAGE FAULT IN NONPAGED AREA!!! И это происходит только лишь под Windovs XP! Вот гадаю в какой момент возникает и где, или же при вызове IRP_MN_REMOVE_DEVICE, или DriverObject->DriverUnload = MDMAIUnload;!? Прошу Вашей помощи!!!
 IRP_MN_REMOVE_DEVICE содержит код:
Код:
//...
case IRP_MN_REMOVE_DEVICE:
KdPrint(("IRP_MN_REMOVE_DEVICE \n"));
ResetDevice(pExt);

Irp->IoStatus.Status = STATUS_SUCCESS;

status = ForwardAndWait(pExt,Irp);//MDMAIForwardIrpSynchronous(DeviceObject, Irp);

if(pExt->InterruptObject)
{
IoDisconnectInterrupt(pExt->InterruptObject);
pExt->InterruptObject = NULL;
KdPrint(("Delete InterruptObject"));
}

if(pExt->TargetDeviceObject)
{
IoDetachDevice(pExt->TargetDeviceObject);
KdPrint(("Delete TargetDeviceObject"));
}

IoDeleteSymbolicLink(&(UNICODE_STRING)pExt->ustrSymLinkName);

IoDeleteDevice(pExt->DeviceObject);

return CompleteRequest(Irp,status/*STATUS_SUCCESS*/,0);//MDMAIDefaultHandler(DeviceObject, Irp);//STATUS_SUCCESS;
//...
NTSTATUS ForwardAndWait(PMDMAI_DEVICE_EXTENSION pdx, PIRP Irp)
{// ForwardAndWait
PAGED_CODE();

KdPrint(("Before KeInitializeEvent\n"));
KEVENT event;
KeInitializeEvent(&event, NotificationEvent, FALSE);

IoCopyCurrentIrpStackLocationToNext(Irp);

KdPrint(("Before IoSetCompletionRoutine\n"));
IoSetCompletionRoutine(Irp, (PIO_COMPLETION_ROUTINE) OnRequestComplete,
(PVOID) &event, TRUE, TRUE, TRUE);

KdPrint(("Before IoCallDriver\n"));
IoCallDriver(pdx->TargetDeviceObject, Irp);
KdPrint(("Before KeWaitForSingleObject\n"));
KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL);

KdPrint(("Forward and Wait Complete STATUS = %d\n", Irp->IoStatus.Status));


return Irp->IoStatus.Status;
}// ForwardAndWait

NTSTATUS CompleteRequest(IN PIRP Irp, IN NTSTATUS status, IN ULONG_PTR info)
{ // CompleteRequest
KdPrint(("CompleteRequest\n"));
Irp->IoStatus.Status = status;
Irp->IoStatus.Information = info;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return status;
}
ну и код DriverUnload:
Код:
void MDMAIUnload(IN PDRIVER_OBJECT DriverObject)
{
PAGED_CODE();

PDEVICE_OBJECT pdoNextDeviceObj = DriverObject->DeviceObject;

    IoDeleteSymbolicLink(&usSymlinkName);

    // Delete all the device objects
    while(pdoNextDeviceObj)
    {
        PDEVICE_OBJECT pdoThisDeviceObj = pdoNextDeviceObj;
        pdoNextDeviceObj = pdoThisDeviceObj->NextDevice;
        IoDeleteDevice(pdoThisDeviceObj);
    }

DbgPrint("Goodbye from MDMAI!\n");
}
Огромное Спасибо!
Записан
izl3sa
Интересующийся

ru
Offline Offline

« Ответ #1 : 31-03-2013 20:04 » 

Во-первых вы неправильно обрабатываете IRP_MN_REMOVE_DEVICE, сначала нужно самому все действия произвести, а потом уже пересылать ниже.
Во-вторых PnP драйвера, в том числе фильтры, все удаление производят в обработчике remove irp, а у вас unload производит работу, которую нужно делать там.
И в третьих, по вашему коду ничего точно сказать нельзя (что за device objects в экстеншене например? походу это некий фильтр, бредово сделанный, зачем вы заставляете нас гадать, если вам нужна помощь?), поставьте отладчик, подключите символы и сбросьте вывод !analyze -v сюда после падения в бсод.

ну и еще по коду:
Записан
sabbatazh
Помогающий

ua
Offline Offline

« Ответ #2 : 01-04-2013 06:58 » 

Во-первых вы неправильно обрабатываете IRP_MN_REMOVE_DEVICE, сначала нужно самому все действия произвести, а потом уже пересылать ниже.
Во-вторых PnP драйвера, в том числе фильтры, все удаление производят в обработчике remove irp, а у вас unload производит работу, которую нужно делать там.
И в третьих, по вашему коду ничего точно сказать нельзя (что за device objects в экстеншене например? походу это некий фильтр, бредово сделанный, зачем вы заставляете нас гадать, если вам нужна помощь?), поставьте отладчик, подключите символы и сбросьте вывод !analyze -v сюда после падения в бсод.

ну и еще по коду:
Спасибо!
Драйвер для PCI-карты...
А можно подробнее по пунктам?!
« Последнее редактирование: 01-04-2013 07:05 от sabbatazh » Записан
izl3sa
Интересующийся

ru
Offline Offline

« Ответ #3 : 01-04-2013 08:42 » 

подключите отладчик и дайте полный код. Скорее всего проблема в неправильно последовательности обработки remove, как я уже сказал. Еще нет защиты от выгрузки (remove lock), но гадать мне не хочется, отладчик покажет на чем падение.
Записан
sabbatazh
Помогающий

ua
Offline Offline

« Ответ #4 : 01-04-2013 14:27 » 

подключите отладчик и дайте полный код. Скорее всего проблема в неправильно последовательности обработки remove, как я уже сказал. Еще нет защиты от выгрузки (remove lock), но гадать мне не хочется, отладчик покажет на чем падение.
Полный код чего?! Подключен Dbgview, он не отловит такое... ну и пользуюсь BlueScreenView в нем DumpChk подключен... и чет не отлавливаю когда происходит сбой, но точно в момент удаления драйвер PCI и подключенном USB-flesh!
Последовательность remove соблюдена верно, защита от выгрузки здесь не причем (Programming the Microsoft® Windows® Driver Model
 Авторы: Walter Oney)... Для начала посмотрел дамп и выудил от туда, что ошибка возникает в hal.dll (Hardware Abstraction Layer DLL)! порылся в инете и нашел, что может быть виноваты начиная от http://bsodxp.narod.ru/0x00000050_3.htm и заканчивая ошибками памяти и винта! Я запутался!
« Последнее редактирование: 01-04-2013 14:32 от sabbatazh » Записан
Ochkarik
Модератор

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

« Ответ #5 : 01-04-2013 15:00 » 

свойства мой компьютер. дополнительно. загрузка и восстановление - параметры.  "дамп памяти ядра".
после перезагрузки открыть дамп отладчиком. далее  !analyze -v.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
sabbatazh
Помогающий

ua
Offline Offline

« Ответ #6 : 01-04-2013 19:07 » 

В итоге получил:
PAGE_FAULT_IN_NONPAGED_AREA (50)
Invalid system memory was referenced.  This cannot be protected by try-except,
it must be protected by a Probe.  Typically the address is just plain bad or it
is pointing at freed memory.
Arguments:
Arg1: f78de6c0, memory referenced.
Arg2: 00000000, value 0 = read operation, 1 = write operation.
Arg3: 8056cc1c, If non-zero, the instruction address which referenced the bad memory
   address.
Arg4: 00000003, (reserved)

Debugging Details:
------------------


Could not read faulting driver name

READ_ADDRESS:  f78de6c0

FAULTING_IP:
nt!ObpCaptureObjectName+c6
8056cc1c f3a5            rep movs dword ptr es:[edi],dword ptr [esi]

MM_INTERNAL_CODE:  3

CUSTOMER_CRASH_COUNT:  2

DEFAULT_BUCKET_ID:  DRIVER_FAULT

BUGCHECK_STR:  0x50

PROCESS_NAME:  System

LOCK_ADDRESS:  805614e0 -- (!locks 805614e0)

Resource @ nt!PiEngineLock (0x805614e0)    Available

WARNING: SystemResourcesList->Flink chain invalid. Resource may be corrupted, or already deleted.


WARNING: SystemResourcesList->Blink chain invalid. Resource may be corrupted, or already deleted.

1 total locks

PNP_TRIAGE:
   Lock address  : 0x805614e0
   Thread Count  : 0
   Thread address: 0x00000000
   Thread wait   : 0x0

LAST_CONTROL_TRANSFER:  from 8056ccfd to 8056cc1c

STACK_TEXT: 
f78e29c8 8056ccfd 00000000 f78e2b88 f78e2a4c nt!ObpCaptureObjectName+0xc6
f78e2a1c 805702d2 8a1d61e0 00000000 00000000 nt!ObpCaptureObjectCreateInformation+0x135
f78e2a60 8058a093 f78e2b58 8a1d61e0 00000000 nt!ObOpenObjectByName+0x62
f78e2ab8 804dd99f f78e2b78 00010000 f78e2b58 nt!NtOpenSymbolicLinkObject+0x73
f78e2ab8 804e3c7f f78e2b78 00010000 f78e2b58 nt!KiFastCallEntry+0xfc
f78e2b3c 805d202e f78e2b78 00010000 f78e2b58 nt!ZwOpenSymbolicLinkObject+0x11
f78e2b70 b8795db1 f78e2b88 00000002 00000001 nt!IoDeleteSymbolicLink+0x3c
WARNING: Stack unwind information not available. Following frames may be wrong.
f78e2ba4 804e13d9 8a0806b0 891c2218 f78e2c30 MDMAI+0x5db1
f78e2bb4 8059716a 8a0a8808 8a0a8808 00000002 nt!IopfCallDriver+0x31
f78e2be0 805a7a4e 8a0806b0 f78e2c0c 00000000 nt!IopSynchronousCall+0xb7
f78e2c34 80508218 8a0a8808 00000002 00000000 nt!IopRemoveDevice+0x93
f78e2c5c 805a8998 e120b4f0 00000015 e2a76648 nt!IopRemoveLockedDeviceNode+0x160
f78e2c74 805a7d24 8a0a8568 00000002 e2a76648 nt!IopDeleteLockedDeviceNode+0x34
f78e2ca8 805f80e8 8a0a8808 02a76648 00000002 nt!IopDeleteLockedDeviceNodes+0x3f
f78e2d3c 805a8081 f78e2d78 80701974 e2bed3c0 nt!PiProcessQueryRemoveAndEject+0x76b
f78e2d58 8059b658 f78e2d78 89087448 8056a5fc nt!PiProcessTargetDeviceEvent+0x2a
f78e2d7c 804e23b5 89087448 00000000 8a1ae020 nt!PiWalkDeviceList+0x10f
f78e2dac 80575723 89087448 00000000 00000000 nt!ExpWorkerThread+0xef
f78e2ddc 804ec6d9 804e22f1 00000001 00000000 nt!PspSystemThreadStartup+0x34
00000000 00000000 00000000 00000000 00000000 nt!KiThreadStartup+0x16


STACK_COMMAND:  kb

FOLLOWUP_IP:
MDMAI+5db1
b8795db1 ??              Не понял

SYMBOL_STACK_INDEX:  7

SYMBOL_NAME:  MDMAI+5db1

FOLLOWUP_NAME:  MachineOwner

MODULE_NAME: MDMAI

IMAGE_NAME:  MDMAI.sys

DEBUG_FLR_IMAGE_TIMESTAMP:  515872a7

FAILURE_BUCKET_ID:  0x50_MDMAI+5db1

BUCKET_ID:  0x50_MDMAI+5db1

Followup: MachineOwner
Записан
izl3sa
Интересующийся

ru
Offline Offline

« Ответ #7 : 01-04-2013 21:34 » 

Символы своего драйвера подключить ещё надо. (в File->Symbol path после символов ms ещё путь до своего pdb вставьте). А пока какой тип у pExt->ustrSymLinkName, usSymlinkName и покажите код где они инициализируются и если есть изменяються ?
Записан
sabbatazh
Помогающий

ua
Offline Offline

« Ответ #8 : 02-04-2013 09:10 » 

Ochkarik, Вы как всегда мне помогли, Спасибо! izl3sa,  Вам спасибо показали направления поиска! Вопрос решен!!! pExt->ustrSymLinkName - не верно производил переприсвоение!!! ушел от промежуточных переменных и оставил одну usSymlinkName!
Код:
KdPrint(("IRP_MN_REMOVE_DEVICE \n"));
ResetDevice(pExt);
Irp->IoStatus.Status = STATUS_SUCCESS;

status = ForwardAndWait(pExt,Irp);//MDMAIForwardIrpSynchronous(DeviceObject, Irp);

RtlFreeUnicodeString(&usDeviceName);

if (pExt->gotmemory01)
{
KdPrint((DRIVERNAME " — Unable to map data memory block %Xh, length %X\n", pExt->MemBar1, pExt->nMem1));
MmUnmapIoSpace(pExt->MemBar1, pExt->nMem1);
pExt->MemBar1 = NULL;
}else
{
KdPrint((DRIVERNAME " — Unable to map data memory block %Xh, length %X\n",pExt->MemBar0, pExt->nMem0));
MmUnmapIoSpace(pExt->MemBar0, pExt->nMem0);
pExt->MemBar0 = NULL;
}

if(pExt->InterruptObject)
{
IoDisconnectInterrupt(pExt->InterruptObject);
pExt->InterruptObject = NULL;
KdPrint(("Delete InterruptObject"));
}

if(pExt->TargetDeviceObject)
{
IoDetachDevice(pExt->TargetDeviceObject);
KdPrint(("Delete TargetDeviceObject"));
}

IoDeleteDevice(pExt->DeviceObject);

return CompleteRequest(Irp,status,0);//MDMAIDefaultHandler(DeviceObject, Irp);//STATUS_SUCCESS;
и
Код:
void MDMAIUnload(IN PDRIVER_OBJECT DriverObject)
{
PAGED_CODE();

PDEVICE_OBJECT pdoNextDeviceObj = DriverObject->DeviceObject;

    IoDeleteSymbolicLink(&usSymlinkName);

    // Delete all the device objects
    while(pdoNextDeviceObj)
    {
        PDEVICE_OBJECT pdoThisDeviceObj = pdoNextDeviceObj;
        pdoNextDeviceObj = pdoThisDeviceObj->NextDevice;
        IoDeleteDevice(pdoThisDeviceObj);
    }

KdPrint(("Goodbye from MDMAI!\n"));
}
еще раз спасибо!
« Последнее редактирование: 02-04-2013 10:29 от sabbatazh » Записан
izl3sa
Интересующийся

ru
Offline Offline

« Ответ #9 : 02-04-2013 10:25 » 

sabbatazh, я вам очень советую настроить отладочную среду и отлаживать драйвер на другом компе например через fireware (или есть win8 то и через сеть). Поверьте у вас получиться намного быстрее находить подобные ошибки в отладчике и в дампах, чем у нас по звездам определять направление ^____^ мне честно не влом, но вам же лучше будет
Записан
sabbatazh
Помогающий

ua
Offline Offline

« Ответ #10 : 02-04-2013 10:30 » new

sabbatazh, я вам очень советую настроить отладочную среду и отлаживать драйвер на другом компе например через fireware (или есть win8 то и через сеть). Поверьте у вас получиться намного быстрее находить подобные ошибки в отладчике и в дампах, чем у нас по звездам определять направление ^____^ мне честно не влом, но вам же лучше будет
Да, конечно сделаю настройку! УЖЕ ЗАНЯЛСЯ! Спасибо!
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines