Есть такой код.. драйвер USB для устройства.. 2 дня не могу понять почему драйвер выдает мне BSOD на функции IoAttachDeviceToDeviceStack! Путем комментов и запусков понял что там вылетает...
#pragma PAGEDCODE
NTSTATUS USBAddDevice(IN PDRIVER_OBJECT pDriverObject, IN PDEVICE_OBJECT pPhysicalDO)
{
// PAGED_CODE(); // что с комментами что без - без толку
NTSTATUS status;
PDEVICE_OBJECT pDeviceObject;
PDEVICE_OBJECT lowerPDO;
status = IoCreateDevice(pDriverObject,
sizeof(DEVICE_EXTENSION),
NULL,//&uDevName
FILE_DEVICE_UNKNOWN, // or FILE_DEVICE_BUS_EXTENDER??
FILE_AUTOGENERATED_DEVICE_NAME, FALSE, &pDeviceObject);
if(!NT_SUCCESS(status))
{
#if DBG
DbgPrint("=USB= ERROR!!! Fail to Create Device with STATUS=0x%X",status);
#endif
return status;
}
// Take device extension
PDEVICE_EXTENSION pDEx = (PDEVICE_EXTENSION) pDeviceObject->DeviceExtension;
#if DBG
DbgPrint("=USB= IoCreateDevice() --> Created DeviceObject=0x%x\n",pDeviceObject);
DbgPrint("=USB= Attaching to Driver Stack\n");
#endif
pDEx->DeviceObject = pDeviceObject;
pDEx->Pdo = pPhysicalDO;
pDeviceObject->Flags |= DO_DIRECT_IO;
pDEx->LowerDeviceObject = IoAttachDeviceToDeviceStack(pDeviceObject,pPhysicalDO);
// Здесь BSOD if(!pDEx->LowerDeviceObject)
{
IoDeleteDevice(pDeviceObject);
return STATUS_NO_SUCH_DEVICE;
}
status = IoRegisterDeviceInterface(pDEx->Pdo,
&GUID_USB,
NULL,
&pDEx->InterfaceName);
if(!NT_SUCCESS(status))
{
IoDetachDevice(pDEx->LowerDeviceObject);
IoDeleteDevice(pDeviceObject);
return status;
}
pDriverObject->Flags |= DO_POWER_PAGABLE;
pDriverObject->Flags &= ~DO_DEVICE_INITIALIZING;
return STATUS_SUCCESS;
}
P.S. выдает PAGE_FAULT_IN_NONPAGED_AREA
и код (хотя в DDK написаны примеры избавления от ошибок они не помогают)
STOP: 0x0000050 (0xBF7F0020,0x00000001,0x80529CED,0x00000002)
Понять не могу чего он оттуда вылетает! Помоему в AddDevice USB драйверов
нет чегото сверхестесственного.. но видимо я чего то не понимаю!
Помогите плиз!
Здравствуйте, theTrueMayhem, Вы писали:
TM>Есть такой код.. драйвер USB для устройства.. 2 дня не могу понять почему драйвер выдает мне BSOD на функции IoAttachDeviceToDeviceStack! Путем комментов и запусков понял что там вылетает...
TM>P.S. выдает PAGE_FAULT_IN_NONPAGED_AREA TM>и код (хотя в DDK написаны примеры избавления от ошибок они не помогают) TM>STOP: 0x0000050 (0xBF7F0020,0x00000001,0x80529CED,0x00000002) TM>Понять не могу чего он оттуда вылетает! Помоему в AddDevice USB драйверов TM>нет чегото сверхестесственного.. но видимо я чего то не понимаю! TM>Помогите плиз!
Не буду ни чего коментировать попробуй вот этот код, сам поймешь надеюсь ))))
OGL>Не буду ни чего коментировать попробуй вот этот код, сам поймешь надеюсь ))))
Спасибо! Да тут все понятно только у меня один вопрос! У USB драйверов в DDK сэмплах почему то отсутствует SymbolicName и вместо этого запускается IoRegisterDeviceInterface — то есть две взаимоисключающие функции.. я воспользовался вторым методом.. все сбрыкнулось почему интересно? И в DDK чот еще написано мол для WDM и PnP драйверов нельзя использовать SymbolicName.. почему? я ведь видел что их часто юзают!
TM>Спасибо! Да тут все понятно только у меня один вопрос! У USB драйверов в DDK сэмплах почему то отсутствует SymbolicName и вместо этого запускается IoRegisterDeviceInterface — то есть две взаимоисключающие функции..
Никакие они не "взаимоисключающие". Можно иметь несколько симлинков на объект (интерфейс — тот же симлинк в принципе). TM>я воспользовался вторым методом.. все сбрыкнулось почему интересно? И в DDK чот еще написано мол для WDM и PnP драйверов нельзя использовать SymbolicName.. почему? я ведь видел что их часто юзают!
Можно и обычный симлинк создать, никто не запрещает. Только тогда вам нужно будет самому отслеживать их уникальность если устройств >1. Интерфейсы позволяют Вам об этом не задумываться, кроме того единожды зарегистрированный интерфейс живет в системе постоянно, что позволяет обойтись без его повторной регистрации (хм.. это не преимущество, а скорее особенность, которой мало кто пользуется. По имени интерфейса можно однозначно определить устройство, которое он олицетворяет, легко менять состояние интерфейса (создавать/удалять симлинк). Не стоит также забывать о стандартных интерфейсах. Если вы ваяете что-нибудь "общественно полезное" то от Вас будут ожидать именно интерфейс, а не невнятный симлинк.
Здравствуйте, theTrueMayhem, Вы писали:
OGL>>Не буду ни чего коментировать попробуй вот этот код, сам поймешь надеюсь ))))
TM>А вот забыл — USB_TYPE TM>Что оно (в #define) значит? )) TM>будут проблемы если поставить TM>FILE_DEVICE_UNKNOWN TM>или TM>FILE_DEVICE_BUS_EXTENDER??
У меня
#define USB_TYPE 40001
Дело в том что если ты определишь устройство как FILE_DEVICE_BUS_EXTENDER, то от тебя потребуют стандартный интерфейс такого устройства, если конечно с ним будут общаться какие то приложения системные (допустим FILE_DEVICE_CD_ROM должен обеспечивать работу с СД). Я чтобы не заморачиваться сделал свой тип устройства user-defined вот и все. Чтобы обратиться к драйверу из приложения и нужена эта константа. В общем есть такой макрос CTL_CODE, посмотри его все поймешь.