共用方式為


開啟、初始化和關閉 SD 記憶卡匯流排界面

安全數位 (SD) 設備磁碟機必須開啟並初始化 SD 匯流排界面,才能與其管理或主機控制器的裝置互動。 這需要兩次對 SD 匯流排程式庫的呼叫:呼叫 SdBusOpenInterface ,後面接著呼叫初始化介面的匯流排驅動程式所提供的常式。 SdBusOpenInterface會傳回常式的指標,這個常式會在SDBUS_INTERFACE_STANDARD結構的InterfaceReference成員中初始化介面。 設備磁碟機必須呼叫此初始化常式,以提供匯流排驅動程式指標給中斷通知回呼常式。 匯流排驅動程式會使用此回呼來通知設備磁碟機硬體中斷。 如需初始化 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 來開啟介面,而匯流排驅動程式會將初始化常式的指標儲存在 device extension (DeviceExtension-BusInterface.InitializeInterface >) 。 在 SdBusOpenInterface傳回之後,驅動程式會從裝置擴充功能擷取此指標。 接下來,驅動程式會將指標放在自己的中斷回呼常式 pMyDriverCallback SDBUS_INTERFACE_PARAMETERS結構中 ,並將這個結構傳遞至初始化常式。

設備磁碟機也必須擷取 SdBusOpenInterface 在SDBUS_INTERFACE_STANDARD結構 的內容 成員中傳回的內容資訊。 每當驅動程式呼叫 SD 匯流排界面常式時,都必須傳入此內容資料。

關閉 SD 介面

若要關閉 SD 介面,驅動程式必須在 SDBUS_INTERFACE_STANDARD 結構的 InterfaceDereference 成員中呼叫常式來取值介面,以釋放 SdBusOpenInterface 常式所配置的所有資源。 收到下列任一 IRP 時,SD 設備磁碟機應該關閉所有開啟的 SD 介面:

IRP_MN_QUERY_REMOVE_DEVICE

IRP_MN_REMOVE_DEVICE

IRP_MN_SURPRISE_REMOVAL

下列程式碼範例說明驅動程式如何取值 SD 記憶卡匯流排界面:

if (pDevExt->BusInterface.InterfaceDereference) {
    (pDevExt->BusInterface.InterfaceDereference) (pDevExt->BusInterface.Context);
    RtlZeroMemory(&pDevExt->BusInterface, sizeof(SDBUS_INTERFACE_STANDARD));
}

SdBusOpenInterface呼叫會將介面取值常式的指標儲存在SDBUS_INTERFACE_STANDARD結構中。 不過,驅動程式應該先確認指標不是 Null ,然後再嘗試呼叫常式。