Драйвер HD Audio
От: zand  
Дата: 31.10.13 06:58
Оценка:
Здравствуйте, уважаемые!

Пытаюсь написать драйвер для собственного аудио-адаптера, на котором установлен кодек HDAudio.
В общих чертах, нужен простой WaveRT драйвер с одним лишь wave out интерфейсом, но...

Процесс остановился в самом начале. Создал примитивный WDM "драйвер", где всего лишь три функции.

#pragma code_seg("PAGE")
NTSTATUS StartDevice(
    IN  PDEVICE_OBJECT  DeviceObject,   // Device object.
    IN  PIRP            Irp,            // IO request packet.
    IN  PRESOURCELIST   ResourceList    // List of hardware resources.
)
{
    PAGED_CODE ();

    ASSERT (DeviceObject);
    ASSERT (Irp);
    ASSERT (ResourceList);

    NTSTATUS ntStatus = STATUS_SUCCESS;
    DOUT (DBG_PRINT, ("[StartDevice] Resources count: %d"
        , ResourceList->NumberOfEntries()));

    return ntStatus;
}

#pragma warning(disable:28152)
#pragma code_seg("PAGE")
NTSTATUS AddDevice(IN PDRIVER_OBJECT   DriverObject, IN PDEVICE_OBJECT   PhysicalDeviceObject)
{
    PAGED_CODE ();
    DOUT (DBG_PRINT, ("[AddDevice]"));
    // Tell portcls (the class driver) to add the device.
    return PcAddAdapterDevice (DriverObject,
                               PhysicalDeviceObject,
                               (PCPFNSTARTDEVICE)StartDevice,
                               MAX_MINIPORTS,
                               0);
}

#pragma code_seg("INIT")
extern "C" DRIVER_INITIALIZE DriverEntry;
extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING  RegistryPathName)
{
    PAGED_CODE ();
    DOUT (DBG_PRINT, ("[DriverEntry]"));

    // Tell the class driver to initialize the driver.
    NTSTATUS RetValue = PcInitializeAdapterDriver (DriverObject,
                                          RegistryPathName,
                                          (PDRIVER_ADD_DEVICE)AddDevice);
    return RetValue;
}


Набросал к нему простенький INF-файл, в котором в качестве железяки указал аудио-устройство из VirtualBox.
Ну и попытался запустить. Запускается и появляется в списке устройств, однако, ResourceList->NumberOfEntries() == 0!
Вот, собственно, и всё! Дальнейшая разработка невозможна, т.к. без ресурсов я не могу получить доступ к регистрам шины и кодека.

Люди добрые, помогите кто сталкивался?! Почему такое может быть? Примеры рабочих (реальных) INF-файлов изрыл вдоль и поперек.
На их основе написал свой, который, на мой взгляд, должен быть достаточен для запуска — ан нет. Гугол молчит по теме, что не удивительно.
Не знаю даже в какую сторону начать копать. В общем, нужна помощь.

Спасибо!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.