Управление временем существования драйвера WDF ACX
В этом разделе содержится сводка по управлению временем существования драйвера ACX WDF и надлежащей очистке памяти. Общие сведения о расширениях класса ACX см. в разделе "Общие сведения о расширениях аудиофайла ACX".
Примечание.
Заголовки и библиотеки ACX не включены в WDK 10.0.22621.2428 (выпущено 24 октября 2023 г.), но доступны в предыдущих версиях, а также последние (сборки серии 25000) предварительной версии WDK. Дополнительные сведения о предварительных версиях WDK см. в разделе "Установка предварительных версий пакета драйверов Windows (WDK)".
Инициализация и запуск WDF ACX
Правильная инициализация ACX, необходимо выполнить, чтобы обеспечить правильную очистку ресурсов ACX, WDF и памяти. Дополнительные сведения о основных этапах перечисления устройств, приведенных здесь, доступны в перечислении устройств ACX.
- Запись драйвера WDM
- Добавление устройства WDF
- Подготовка оборудования WDF
- Запись устройства WDF D0
- Процесс создания цепи ACX (контакты ACX и объекты Джеков связаны с каналом)
- Процесс создания потока ACX
Очистка объекта ACX WDF
В этом разделе описывается очистка объектов WDF ACX в этом порядке.
- Процесс закрытия потока 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
Когда драйвер выгружается, он должен освободить все оставшиеся ресурсы. Дополнительные сведения см. в разделе "Выпуск выделенных драйвером ресурсов".
Драйвер регистрирует функцию обратного вызова 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;
}
См. также
Последовательности обратных вызовов PnP и управления питанием