Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом разделе содержится сводка по управлению временем существования драйвера 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;
}
См. также
последовательности вызовов PnP и управления питанием
Общие сведения о расширениях аудиоклассов ACX