Читал похожие темы на форуме, но ничего полезного для себя не извлек. Драйвер прекрасно загружается и выгружается, БСОДит при попытке открыть его устройство из другой программы. Происходит обращение к подкачиваемой памяти при слишком высоком IRQL, но странно то, что делает это не мой код. Медитация над крэш дампом мне ничего не прояснила Код (Text): .386 .model flat, stdcall option casemap:none ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ; В К Л Ю Ч А Е М Ы Е Ф А Й Л Ы ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: include Driver.inc ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ; К О Д ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: .code ;---------------------------------------------------------------------------------------------------- ;DriverEntry Главная точка входа в драйвер ;pDriverObject Указатель на объект драйвер ;pusRegistryPath Раздел реестра (driver service key) в UNICODE ;Return Value NTSTATUS_xxx ;---------------------------------------------------------------------------------------------------- DriverEntry proc uses ebx pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING LOCAL Status:NTSTATUS LOCAL pDeviceObject:PDEVICE_OBJECT LOCAL usDeviceName:UNICODE_STRING LOCAL pDeviceExtension:PDRIVER_DEVICE_EXTENSION IFDEF DBG DbgTrap ; Отладочное прерывание ENDIF assume eax:PDRIVER_OBJECT ; ; mov eax, pDriverObject ; Регистрация функций: mov [eax].DriverUnload, offset UnloadRoutine ; Выгрузка драйвера mov [eax].MajorFunction[IRP_MJ_DEVICE_CONTROL], offset DeviceControlRoutine ; Обработчик IRP_MJ_DEVICE_CONTROL mov [eax].MajorFunction[IRP_MJ_CREATE], offset CREATE_IrpHandler ; Обработчик IRP_MJ_CREATE mov [eax].MajorFunction[IRP_MJ_CLOSE], offset CLOSE_IrpHandler ; Обработчик IRP_MJ_CLOSE mov [eax].MajorFunction[IRP_MJ_READ], offset RW_IrpHandler ; Обработчик IRP_MJ_READ mov [eax].MajorFunction[IRP_MJ_WRITE], offset RW_IrpHandler ; Обработчик IRP_MJ_WRITE fnc RtlInitUnicodeString, addr usDeviceName, $CTW0("\\Device\\MyDDevice") .IF rv(IoCreateDevice, pDriverObject, SIZEOF DRIVER_DEVICE_EXTENSION,addr usDeviceName, FILE_DEVICE_UNKNOWN,0, FALSE, addr pDeviceObject) != STATUS_SUCCESS mov eax, STATUS_ERROR jmp @f .ENDIF mov eax, pDeviceObject ; mov ebx, (DEVICE_OBJECT PTR [eax]).DeviceExtension ; pDeviceExtension = pDeviceObject->DeviceExtension mov pDeviceExtension, ebx ; pDeviceExtension->pDeviceObject = pDeviceObject mov (DRIVER_DEVICE_EXTENSION PTR [ebx]).pDeviceObject, eax ; lea eax, (DRIVER_DEVICE_EXTENSION PTR [ebx]).usSymLinkName ; fnc RtlInitUnicodeString, eax, $CTW0("\\??\\MyDevice") ; RtlRtlInitUnicodeString(pDeviceExtension,"\\??\\MyDevice") mov ebx, pDeviceExtension lea ebx, (DRIVER_DEVICE_EXTENSION PTR [ebx]).usSymLinkName ; IF IoCreateSymbolicLink( .IF rv(IoCreateSymbolicLink, ebx, addr usDeviceName) != STATUS_SUCCESS ; &pDeviceExtension->usSymLinkName, mov eax, STATUS_ERROR ; &usDeviceName) != success jmp @f ; .ENDIF ; RETURN ERROR mov eax, STATUS_SUCCESS @@: ret DriverEntry endp ;--------------------------------------------------------------------------------------------------- ;UnloadRoutine Функция выгрузки драйвера ;pDriverObject Указатель на объект драйвер ;Return Value NTSTATUS_xxx ;--------------------------------------------------------------------------------------------------- UnloadRoutine proc pDriverObject:PDRIVER_OBJECT LOCAL pDeviceExtension:PTR DRIVER_DEVICE_EXTENSION IFDEF DBG DbgTrap ; Отладочное прерывание ENDIF mov eax, pDriverObject mov eax, (DRIVER_OBJECT PTR [eax]).DeviceObject mov eax, (DEVICE_OBJECT PTR [eax]).DeviceExtension mov pDeviceExtension, eax mov eax, pDeviceExtension ; assume eax:PTR DRIVER_DEVICE_EXTENSION ; IoDeleteSymbolLink( lea eax, [eax].usSymLinkName ; pDriverObject->DeviceExtension->usSymLinkName) fnc IoDeleteSymbolicLink, eax ; mov eax, pDeviceExtension ; assume eax:PTR DRIVER_DEVICE_EXTENSION ; IoDeleteDevice( mov eax, [eax].pDeviceObject ; pDriverObject->DeviceExtension->pDeviceObject) fnc IoDeleteDevice, eax ; mov eax, STATUS_SUCCESS ret UnloadRoutine endp ;---------------------------------------------------------------------------------------------------- ;DeviceControlRoutine Обработчик IRP_MJ_DEVICE_CONTROL запросов ;pDeviceObject Указатель на объект устройство ;pIrp Указатель на объект IRP полученного запроса ;Return Value NTSTATUS_xxx ;---------------------------------------------------------------------------------------------------- DeviceControlRoutine proc pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP LOCAL IoControlCode:ULONG LOCAL IrpStack:PIO_STACK_LOCATION IFDEF DBG DbgTrap ; Отладочное прерывание ENDIF IoGetCurrentIrpStackLocation pIrp ; mov IrpStack, eax ; IrpStack = IoGetCurrentIrpStackLocation(pIrp) assume eax:PIO_STACK_LOCATION ; push [eax].Parameters.DeviceIoControl.IoControlCode ; pop IoControlCode ; IoControlCode = current IOCTL code .IF IoControlCode == IOCTL_CRASH_SYSTEM xor eax, eax mov eax, dword ptr [eax] ; Crash!!! .ENDIF invoke CompleteIrp, pIrp, STATUS_SUCCESS, 0 mov eax, STATUS_SUCCESS ret DeviceControlRoutine endp ;------------------------------------------------------------------------------------------------- ;CREATE_IrpHandler Обработчик запроса IRP_MJ_CREATE ;pDeviceObject Указатель на открытое устройство ;pIrp Указатель на пришедший IRP ;Return Value NTSTATUS_xxx ;------------------------------------------------------------------------------------------------- CREATE_IrpHandler proc pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP IFDEF DBG DbgTrap ; Отладочное прерывание ENDIF invoke CompleteIrp, pIrp, STATUS_SUCCESS, 0 ret STATUS_SUCCESS CREATE_IrpHandler endp ;------------------------------------------------------------------------------------------------- ;CLOSE_IrpHandler Обработчик запроса IRP_MJ_CLOSE ;pDeviceObject Указатель на закрываемое устройство ;pIrp Указатель на пришедший IRP ;Return Value NTSTATUS_xxx ;------------------------------------------------------------------------------------------------- CLOSE_IrpHandler proc pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP IFDEF DBG DbgTrap ; Отладочное прерывание ENDIF invoke CompleteIrp, pIrp, STATUS_SUCCESS, 0 ret STATUS_SUCCESS CLOSE_IrpHandler endp ;----------------------------------------------------------------------------------------------------- ;RW_IrpHandler Обработчик запросов IRP_MJ_READ/IRP_MJ_WRITE ;pDeviceObject Указатель на используемое устройство ;pIrp Указатель на пришедший IRP ;Return Value NTSTATUS_xxx ;----------------------------------------------------------------------------------------------------- RW_IrpHandler proc pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP IFDEF DBG DbgTrap ENDIF invoke CompleteIrp, pIrp, STATUS_SUCCESS, 0 ret RW_IrpHandler endp ;-------------------------------------------------------------------------------------------------- ;CompleteIrp Функция завершение Irp запросов ;pIrp Указатель на завершаемый Irp ;NTStatus Статус завершения ;ulInfo Доп. информация о запросе(обычно длина переданных/полученных данных) ;Return Value NTStatus ;-------------------------------------------------------------------------------------------------- CompleteIrp proc pIrp:PIRP, NTStatus:NTSTATUS, ulInfo:ULONG IFDEF DBG DbgTrap ; Отладочное прерывание ENDIF assume eax:PIRP ; mov eax, pIrp ; push NTStatus ; pIrp->IoStatus.Status = NTStatus pop [eax].IoStatus.Status ; pIrp->IoStatus.Information = ulInfo push ulInfo ; pop [eax].IoStatus.Information ; mov ecx, pIrp ; mov edx, IO_NO_INCREMENT ; FASTCALL call IofCompleteRequest ; mov eax, NTStatus ret CompleteIrp endp end DriverEntry При открытии устройства должен был выполниться CREATE_IrpHandler, но отладчик не всплывает, то есть бсодит до передачи управление драйверу. Сурсы( кода почти нет, все закомментировано) и минидамп в аттаче.
Sholar Посмотрел быстро крешдамп... Странно конечно. Оке, такой вопрос. У вас Syser установлен? Смотрел, в модулях он есть. Попробуйте без него.
Хмм, как это? Драйвер запускался на виртуалке под VMWare, ntoskrnl оттуда же. Дамп, разумеется, тоже.
Sholar Имя модуля то, но адреса в дампе не соответствуют ему(ссылки валидны, но все они указывают абы куда, на середины инструкций, что не возможно).
Странно, тут http://pastebin.com/NCMeHphH дамп норм, хотя почему модуль уже другой не понятно. Тоесть дров дёргается(IopfCallDriver()), но бьётся SFC, обычно из за не корректной очистки стека или кривых локалей. Впрочем не удивительно: Код (Text): CREATE_IrpHandler proc pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP IFDEF DBG DbgTrap ; Отладочное прерывание ENDIF invoke CompleteIrp, pIrp, STATUS_SUCCESS, 0 ret STATUS_SUCCESS CREATE_IrpHandler endp Это асм, а не си =)
Так, в общем драйвер кривой. Очень много всего надо изменять. Курите мат часть. А так на вскидку: Код (Text): mov [eax].MajorFunction[IRP_MJ_CREATE*(sizeof PVOID)], offset CREATE_IrpHandler mov [eax].MajorFunction[IRP_MJ_CLOSE*(sizeof PVOID)], offset CLOSE_IrpHandler mov [eax].MajorFunction[IRP_MJ_DEVICE_CONTROL*(sizeof PVOID)], offset DeviceControlRoutine mov [eax].MajorFunction[IRP_MJ_READ*(sizeof PVOID)], offset RW_IrpHandler mov [eax].MajorFunction[IRP_MJ_WRITE*(sizeof PVOID)], offset RW_IrpHandler Так же не правильно обрабатывается завершение IRP (не вижу у вас IoGetCurrentIrpStackLocation и вообще код неправильный) . В общем изучайте.
Да, действительно, привычка Исправил это и тот кошмар со стеком, заработало. Ни у Four-F ни у Солдатова при завершении IRP не заметил IoGetCurrentIrpStackLocation. LightMoon,TermoSINteZ Огромное вам спасибо.