IO_CSQ_ACQUIRE_LOCK回呼函式 (wdm.h)

CsqAcquireLock 例程是由系統用來取得驅動程序實作、取消安全 IRP 佇列的鎖定。

語法

C++
IO_CSQ_ACQUIRE_LOCK IoCsqAcquireLock;

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

參數

[in] Csq

適用於取消安全 IRP 佇列之 IO_CSQ 結構的指標。

[out] Irql

CsqAcquireLock 例程可用來儲存目前 IRQL 的變數指標。 當系統釋放鎖定時,系統會 CsqReleaseLock 傳遞預存值。

傳回值

沒有

言論

驅動程式會指定 CsqAcquireLock 例程,以在初始化佇列的 IO_CSQ 結構時,為安全的 IRP 佇列指定例程。 驅動程式會將例程指定為 IoCsqInitializeCsqAcquireLock 參數,或在初始化 IO_CSQIoCsqInitializeEx 。 如需詳細資訊,請參閱 Cancel-Safe IRP 佇列。

系統會呼叫此例程,以取得驅動程式 IRP 佇列的鎖定,然後再嘗試從佇列插入或移除 IRP。 系統會呼叫 CsqReleaseLock 例程來釋放鎖定。

如果驅動程式使用微調鎖定來實作佇列的鎖定,則必須在釋放微調鎖定時儲存目前的 IRQL。 系統會將指標傳遞給驅動程式可用來儲存目前 IRQL 的 IRQL 變數。 系統會在釋放鎖定時,將預存值當做 Irql 參數傳遞至 CsqReleaseLock。 否則,驅動程式可以忽略 Irql 參數。 如需微調鎖定的相關信息,請參閱 微調鎖定

驅動程式可以使用任何鎖定機制來鎖定佇列,例如 Mutex。 如需 mutex 的詳細資訊,請參閱 Mutex Objects

例子

若要定義 CsqAcquireLock 回呼例程,您必須先提供函式宣告,以識別您要定義的回呼例程類型。 Windows 提供一組驅動程式的回呼函式類型。 使用回呼函式類型宣告函式有助於 驅動程式的程式代碼分析靜態驅動程式驗證器 (SDV)和其他驗證工具尋找錯誤,而且是撰寫 Windows作系統驅動程式的需求。

例如,若要定義名為 MyCsqAcquireLockCsqAcquireLock 回呼例程,請使用 IO_CSQ_ACQUIRE_LOCK 類型,如下列程式代碼範例所示:

C++
IO_CSQ_ACQUIRE_LOCK MyCsqAcquireLock;

然後,實作回呼例程,如下所示:

C++
_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