Поделиться через


Управление временем существования драйвера WDF ACX

В этом разделе содержится сводка по управлению временем существования драйвера ACX WDF и надлежащей очистке памяти. Общие сведения об ACX см. в расширениях аудиоклассов ACX.

Инициализация и запуск WDF ACX

Для правильной очистки ресурсов ACX, WDF и памяти требуется корректная инициализация ACX. Дополнительные сведения о основных этапах перечисления устройств, приведенных здесь, доступны в перечислении устройств ACX.

  • Точка входа драйвера WDM
  • Добавление устройства WDF
  • Подготовка оборудования WDF
  • Вход в состояние D0 устройства WDF
  • Процесс создания цепи ACX (объекты Пинов и Джеки связаны с цепью)
  • Процесс создания потока ACX

Очистка объекта ACX WDF

В этом разделе описывается очистка объектов ACX WDF в указанном порядке.

  • Процесс закрытия потока ACX
  • Процесс удаления схемы ACX
  • Оборудование выпуска устройства WDF
  • Выгрузка драйвера WDF

Существует несколько допустимых подходов к созданию и очистке объектов WDF и ACX, в этом разделе рассматриваются некоторые ключевые элементы управления временем существования объектов ACX/WDF.

События и уничтожение объектов PnP Power

События PnP Power могут привести к созданию и уничтожению объектов. Дополнительные сведения о событиях питания PnP см. в разделе управление питанием ACX и последовательности обратного вызова WDF PnP и управления питанием.

Управление временем существования ссылок на объекты WDF

WDF использует счетчики ссылок для отслеживания времени существования объектов. Может оказаться уместным разыменовать ссылки на объекты в функции обратного вызова для очистки. Фреймворк вызывает эту функцию обратного вызова очистки, чтобы драйвер мог вызывать WdfObjectDereference, если он ранее вызвал WdfObjectReference для объекта, который удаляется. Дополнительные сведения см. в разделе WdfObjectReference и WdfObjectDereference.

Рекомендации по разработке драйверов Surface Team

Описание распространенных ошибок, сделанных в коде драйвера с управлением памятью и временем существования объектов, см. в этих разделах в рекомендациях по разработке драйверов Surface Team.

Процесс закрытия потока ACX

Когда клиент закрывает поток, драйвер должен работать, чтобы закрыть и очистить ресурсы, связанные с потоком. Дополнительные сведения см. в статье ACX Streaming — процесс закрытия потока. Важно, чтобы драйвер не очищал ресурсы, поддерживающие поток, и процесс очистки учитывал влияние на клиента.

Процесс удаления схемы ACX

ACX может создавать динамический канал по запросу. Для этого драйвер выделяет структуру WDFDEVICE_INIT путем вызова WdfPdoInitAllocate. Затем драйвер указывает, какие именно обратные вызовы PnP/power он хочет получить, и создаёт устройство. Драйвер вызывает AcxDeviceRemoveCircuitDevice , чтобы удалить звуковое устройство из списка устройств.

Дополнительные сведения см. в статье динамическое удаление канала ACX в каналах ACX.

Оборудование выпуска устройства WDF

Функция обратного вызова EVT_WDF_DEVICE_RELEASE_HARDWARE используется в функции обратного вызова событий EvtDeviceReleaseHardware драйвера для выполнения операций, необходимых при отсутствии доступа к устройству.

Очистка контекста устройства WDF

Этот код из примера AudioCodec показывает использование структуры WDF_OBJECT_ATTRIBUTES для задания evtCleanupCallback.

    WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&attributes, CODEC_DEVICE_CONTEXT);
    attributes.EvtCleanupCallback = Codec_EvtDeviceContextCleanup;

В этом примере обратный вызов с помощью WdfDevice очищает контекст устройства.

VOID
Codec_EvtDeviceContextCleanup(
    _In_ WDFOBJECT      WdfDevice
)

{
    WDFDEVICE               device;
    PCODEC_DEVICE_CONTEXT   devCtx;

    device = (WDFDEVICE)WdfDevice;
    devCtx = GetCodecDeviceContext(device);
    ASSERT(devCtx != nullptr);

    if (devCtx->Capture)
    {
        CodecC_CircuitCleanup(devCtx->Capture);
    }
}

Выгрузка драйвера WDF

Когда драйвер выгружается, он должен освободить все оставшиеся ресурсы. Дополнительные сведения см. в разделе Выпуск ресурсов Driver-Allocated.

Драйвер регистрирует функцию обратного вызова EvtDriverUnload при вызове WdfDriverCreate. Функция обратного вызова EvtDriverUnload должна освободить все системные ресурсы общего назначения, не привязанные к устройству, выделенные подпрограммой DriverEntry драйвера. Дополнительные сведения см. в разделе функции обратного вызова EVT_WDF_DRIVER_UNLOAD.

Этот код из примера AudioCodec показывает структуру обратного вызова выгрузки драйвера.

EVT_WDF_DRIVER_UNLOAD               AudioCodecDriverUnload;

void AudioCodecDriverUnload(
    _In_ WDFDRIVER Driver
)
{
    PAGED_CODE();

    if (!Driver)
    {
        ASSERT(FALSE);
        return;
    }

    WPP_CLEANUP(WdfDriverWdmGetDriverObject(Driver));

// Here is where you would cleanup any allocated resources associated with the driver.

    return;
}

См. также

Перечисление устройств ACX

Управление питанием ACX

последовательности вызовов PnP и управления питанием

Сводка объектов ACX

Общие сведения о расширениях аудиоклассов ACX

Справочная документация по ACX