IoAttachDeviceToDeviceStack & BSOD
От: theTrueMayhem Россия  
Дата: 09.11.05 17:51
Оценка:
Есть такой код.. драйвер 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 драйверов
нет чегото сверхестесственного.. но видимо я чего то не понимаю!
Помогите плиз!
Re: IoAttachDeviceToDeviceStack & BSOD
От: OpenGL  
Дата: 10.11.05 03:48
Оценка:
Здравствуйте, 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>Помогите плиз!

Не буду ни чего коментировать попробуй вот этот код, сам поймешь надеюсь ))))



NTSTATUS    USB_AddDevice(    IN PDRIVER_OBJECT DriverObject,
                                IN PDEVICE_OBJECT PhysicalDeviceObject)
{
    NTSTATUS            Status = STATUS_SUCCESS;
    PLOCAL_DEVICE_INFO    pLDI;
    PDEVICE_OBJECT        fdo = NULL;
    UNICODE_STRING        NtDeviceName;
    UNICODE_STRING        Win32DeviceName;

    RtlInitUnicodeString(&NtDeviceName, USB_DEVICE_NAME);
    RtlInitUnicodeString(&Win32DeviceName, USB_DOS_DEVICE_NAME);

    Status = IoCreateDevice(
        DriverObject,                   // our driver object
        sizeof(LOCAL_DEVICE_INFO),      // extension size for us
        &NtDeviceName,                  // name for this device
        USB_TYPE,
        0,                              // device characteristics
        FALSE,                          // Not exclusive
        &fdo);                          // Our device object

    if(!NT_SUCCESS(Status))
        return Status;

    Status = IoCreateSymbolicLink(&Win32DeviceName, &NtDeviceName);
    if(!NT_SUCCESS(Status))
    {
        IoDeleteDevice(fdo);
        return Status;
    }

    pLDI = (PLOCAL_DEVICE_INFO) fdo->DeviceExtension;
    pLDI->PhisicalDeviceObject = PhysicalDeviceObject;
    pLDI->NtDeviceName = NtDeviceName;
    pLDI->Win32DeviceName = Win32DeviceName;

    fdo->Flags |= DO_DIRECT_IO;
    fdo->Flags |= DO_POWER_PAGABLE;
    fdo->Flags &= ~DO_DEVICE_INITIALIZING;

    pLDI->DeviceObject = fdo;
    pLDI->Removed = FALSE;
    pLDI->Started = FALSE;
    pLDI->NextLowerDriver = IoAttachDeviceToDeviceStack(fdo, PhysicalDeviceObject);
    if (NULL == pLDI->NextLowerDriver)
    {
        IoDeleteSymbolicLink(&Win32DeviceName);
        IoDeleteDevice(fdo);
        return STATUS_NO_SUCH_DEVICE;
    }

    IoInitializeRemoveLock (&pLDI->RemoveLock , USB_TAG, 1, 5);

    return Status;
}
Re[2]: IoAttachDeviceToDeviceStack & BSOD
От: theTrueMayhem Россия  
Дата: 10.11.05 14:44
Оценка:
OGL>Не буду ни чего коментировать попробуй вот этот код, сам поймешь надеюсь ))))


Спасибо! Да тут все понятно только у меня один вопрос! У USB драйверов в DDK сэмплах почему то отсутствует SymbolicName и вместо этого запускается IoRegisterDeviceInterface — то есть две взаимоисключающие функции.. я воспользовался вторым методом.. все сбрыкнулось почему интересно? И в DDK чот еще написано мол для WDM и PnP драйверов нельзя использовать SymbolicName.. почему? я ведь видел что их часто юзают!
Re[2]: IoAttachDeviceToDeviceStack & BSOD
От: theTrueMayhem Россия  
Дата: 10.11.05 14:54
Оценка:
OGL>Не буду ни чего коментировать попробуй вот этот код, сам поймешь надеюсь ))))

А вот забыл — USB_TYPE
Что оно (в #define) значит? ))
будут проблемы если поставить
FILE_DEVICE_UNKNOWN
или
FILE_DEVICE_BUS_EXTENDER??
Re[3]: IoAttachDeviceToDeviceStack & BSOD
От: straightener Россия  
Дата: 10.11.05 16:00
Оценка: 7 (1)
Здравствуйте, theTrueMayhem, Вы писали:



TM>Спасибо! Да тут все понятно только у меня один вопрос! У USB драйверов в DDK сэмплах почему то отсутствует SymbolicName и вместо этого запускается IoRegisterDeviceInterface — то есть две взаимоисключающие функции..

Никакие они не "взаимоисключающие". Можно иметь несколько симлинков на объект (интерфейс — тот же симлинк в принципе).
TM>я воспользовался вторым методом.. все сбрыкнулось почему интересно? И в DDK чот еще написано мол для WDM и PnP драйверов нельзя использовать SymbolicName.. почему? я ведь видел что их часто юзают!
Можно и обычный симлинк создать, никто не запрещает. Только тогда вам нужно будет самому отслеживать их уникальность если устройств >1. Интерфейсы позволяют Вам об этом не задумываться, кроме того единожды зарегистрированный интерфейс живет в системе постоянно, что позволяет обойтись без его повторной регистрации (хм.. это не преимущество, а скорее особенность, которой мало кто пользуется. По имени интерфейса можно однозначно определить устройство, которое он олицетворяет, легко менять состояние интерфейса (создавать/удалять симлинк). Не стоит также забывать о стандартных интерфейсах. Если вы ваяете что-нибудь "общественно полезное" то от Вас будут ожидать именно интерфейс, а не невнятный симлинк.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[3]: IoAttachDeviceToDeviceStack & BSOD
От: OpenGL  
Дата: 11.11.05 03:09
Оценка:
Здравствуйте, 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, посмотри его все поймешь.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.