функция обратного вызова IO_CSQ_ACQUIRE_LOCK (wdm.h)

Подпрограмма CsqAcquireLock используется системой для получения блокировки для реализованной драйвером и безопасной для отмены очереди IRP.

Синтаксис

IO_CSQ_ACQUIRE_LOCK IoCsqAcquireLock;

void IoCsqAcquireLock(
  [in]  PIO_CSQ Csq,
  [out] PKIRQL Irql
)
{...}

Параметры

[in] Csq

Указатель на структуру IO_CSQ для очереди IRP с безопасной отменой.

[out] Irql

Указатель на переменную, которую подпрограмма CsqAcquireLock может использовать для хранения текущего IRQL. Система передает сохраненное значение CsqReleaseLock при отпускании блокировки.

Возвращаемое значение

None

Remarks

Драйвер указывает подпрограмму CsqAcquireLock для очереди IRP с безопасной отменой при инициализации структуры IO_CSQ очереди. Драйвер указывает подпрограмму в качестве параметра CsqAcquireLockioCsqInitialize или IoCsqInitializeEx при инициализации IO_CSQ. Дополнительные сведения см. в разделе Отмена безопасных очередей IRP.

Система вызывает эту подпрограмму, чтобы получить блокировку очереди IRP драйвера перед попыткой вставки или удаления IRP из очереди. Система вызывает подпрограмму CsqReleaseLock , чтобы освободить блокировку.

Если драйвер использует спиновую блокировку для реализации блокировки очереди, он должен сохранить текущий IRQL для, когда он освобождает спиновую блокировку. Система передает указатель на переменную IRQL, которую драйвер может использовать для хранения текущего IRQL. Система передает сохраненное значение в качестве параметра Irqlв CsqReleaseLock при отпускании блокировки. В противном случае драйвер может игнорировать параметр Irql . Сведения о спин-блокировках см. в разделе Спин-блокировки.

Драйверы могут использовать любой механизм блокировки для блокировки очереди, например мьютексы. Дополнительные сведения о мьютексах см. в разделе Объекты мьютексов.

Примеры

Чтобы определить подпрограмму обратного вызова CsqAcquireLock , необходимо сначала предоставить объявление функции, определяющее тип определяемой процедуры обратного вызова. Windows предоставляет набор типов функций обратного вызова для драйверов. Объявление функции с помощью типов функций обратного вызова помогает анализу кода для драйверов, средству проверки статических драйверов (SDV) и другим средствам проверки находить ошибки, и это требование для написания драйверов для операционной системы Windows.

Например, чтобы определить подпрограмму обратного вызова CsqAcquireLock с именем MyCsqAcquireLock, используйте тип IO_CSQ_ACQUIRE_LOCK, как показано в следующем примере кода:

IO_CSQ_ACQUIRE_LOCK MyCsqAcquireLock;

Затем реализуйте процедуру обратного вызова следующим образом:

_Use_decl_annotations_
VOID 
 MyCsqAcquireLock(
    PIO_CSQ  Csq,
    PKIRQL  Irql
    )
  {
      // Function body
  }

Тип функции IO_CSQ_ACQUIRE_LOCK определен в файле заголовка Wdm.h. Чтобы более точно определить ошибки при запуске средств анализа кода, не забудьте добавить заметку _Use_decl_annotations_ в определение функции. Заметка _Use_decl_annotations_ гарантирует, что будут использоваться заметки, которые применяются к IO_CSQ_ACQUIRE_LOCK типу функции в файле заголовка. Дополнительные сведения о требованиях к объявлениям функций см. в статье Объявление функций с помощью типов ролей функций для драйверов WDM. Сведения о _Use_decl_annotations_см. в статье Поведение функции с заметками.

Требования

Требование Значение
Целевая платформа Персональный компьютер
Верхняя часть wdm.h (включая Wdm.h, Ntddk.h, Ntifs.h)
IRQL См. раздел "Примечания".

См. также раздел

CsqCompleteCanceledIrp

CsqInsertIrp

CsqInsertIrpEx

CsqPeekNextIrp

CsqReleaseLock

CsqRemoveIrp

IO_CSQ

IoCsqInitialize

IoCsqInitializeEx

IoCsqInsertIrp

IoCsqInsertIrpEx

IoCsqRemoveIrp

IoCsqRemoveNextIrp