開啟、初始化和關閉 SD 記憶卡總線介面
安全數位 (SD) 設備驅動器必須開啟並初始化 SD 總線介面,以與其管理或主機控制器的裝置互動。 這需要對 SD 總線連結庫進行兩次呼叫:呼叫 SdBusOpenInterface,然後呼叫初始化 介面之總線驅動程式所提供的例程。 SdBusOpenInterface 會傳回例程的指標,這個例程會初始化 InterfaceReference 中SDBUS_INTERFACE_STANDARD 結構的成員。 設備驅動程式必須呼叫此初始化例程,以提供匯流排驅動程式一個指向中斷通知回呼例程的指標。 總線驅動程式會使用此回呼來通知設備驅動器硬體中斷。 如需初始化 SD 總線介面之例程的詳細資訊,請參閱 PSDBUS_INITIALIZE_INTERFACE_ROUTINE。 裝置驅動程式通常會從其 AddDevice 例程內開啟並初始化 SD 總線介面。
下列程式代碼範例說明開啟和初始化 SD 總線介面的呼叫順序:
status = SdBusOpenInterface (pDevExt->UnderlyingPDO,
&pDevExt->BusInterface,
sizeof(SDBUS_INTERFACE_STANDARD),
SDBUS_INTERFACE_VERSION);
if (NT_SUCCESS(status)) {
SDBUS_INTERFACE_PARAMETERS interfaceParameters = {0};
interfaceParameters.Size =
sizeof(SDBUS_INTERFACE_PARAMETERS);
interfaceParameters.TargetObject =
DeviceExtension->TargetObject;
interfaceParameters.DeviceGeneratesInterrupts = TRUE;
interfaceParameters.CallbackRoutine = pMyDriverCallback;
status = STATUS_UNSUCCESSFUL;
if (DeviceExtension->BusInterface.InitializeInterface) {
status = (pDevExt->BusInterface.InitializeInterface)
(pDevExt->BusInterface.Context, &interfaceParameters);
}
}
在此程式代碼範例中,設備驅動器會呼叫 SdBusOpenInterface 來開啟 介面,而總線驅動程式會將初始化例程的指標儲存在裝置延伸模組中(DeviceExtension->BusInterface.InitializeInterface)。 SdBusOpenInterface 傳回之後,驅動程式會從裝置擴充功能擷取此指標。 接下來,驅動程式會將一個指向自身中斷回呼例程的指標,pMyDriverCallback, 放入 SDBUS_INTERFACE_PARAMETERS 結構中,並將這個結構傳遞至初始化例程。
裝置驅動程式也必須擷取 SdBusOpenInterface 傳回的 SDBUS_INTERFACE_STANDARD 結構 Context 成員的內容資訊。 每當驅動程式呼叫 SD 總線介面例程時,它都必須傳入此內容數據。
關閉 SD 介面
若要關閉 SD 介面,驅動程式必須在 InterfaceDereference 中呼叫 SDBUS_INTERFACE_STANDARD 結構 成員中的例程來取值介面,這樣會釋放 SdBusOpenInterface 例程配置的所有資源。 收到下列任何 IRP 時,SD 裝置驅動器應該關閉所有開啟的 SD 介面:
下列程式代碼範例說明驅動程式如何取值 SD 記憶卡總線介面:
if (pDevExt->BusInterface.InterfaceDereference) {
(pDevExt->BusInterface.InterfaceDereference) (pDevExt->BusInterface.Context);
RtlZeroMemory(&pDevExt->BusInterface, sizeof(SDBUS_INTERFACE_STANDARD));
}
SdBusOpenInterface 呼叫會儲存SDBUS_INTERFACE_STANDARD結構中介面取值例程的指標。 不過,驅動程式應該先確認指標在嘗試呼叫例程之前,指標不是 NULL。