共用方式為


SD 記憶卡要求

在安全數位 (SD) 卡設備驅動器開啟並初始化 SD 總線驅動程式的介面之後,它可以提交要求。 有兩種方式可以提交要求:透過 SdBusSubmitRequest 例程以同步方式提交要求,並以異步方式透過 SdBusSubmitRequestAsync 例程。 這兩個例程都是由 SD 總線連結庫導出(sdbus.lib)。

同步要求例程採用兩個參數:介面內容和要求封包。

介面內容
裝置驅動程式會在使用 SdBusOpenInterface開啟 SD 介面之後,從 ContextSDBUS_INTERFACE_STANDARD 成員擷取介面內容。 每當驅動程式在 介面中呼叫 方法時,都必須傳入此內容資訊。

要求封包
設備驅動器必須配置和初始化 SDBUS_REQUEST_PACKET 結構。 此結構會指定要求函式和其他要求特性。

因為 SdBusSubmitRequest 是同步的,所以不會傳回STATUS_PENDING。 裝置驅動程序必須在 IRQL < DISPATCH_LEVEL 呼叫此例程時執行。

異步要求例程會採用下列五個參數:介面內容、要求封包、IRP、完成例程的指標,以及完成內容。

介面內容
這個參數與同步運行情況下使用的同名參數相同。

要求封包
這個參數與同步情況下使用的同名參數相同。

IRP
此參數會保存裝置驅動程式已配置的 IRP,或從位於驅動程式堆疊上層的驅動程式收到的 IRP。 IRP 用作請求的載體。

完成例程
此參數會保存 IRP 參數中提供的 IRP IoCompletion 例程。

使用者環境
此參數保存一個指向使用者上下文數據的指標,這些數據由系統傳遞至完成函數參數中指定的完成函數。

當裝置驅動程式在 IRQL <= DISPATCH_LEVEL 執行時,必須呼叫 SdBusSubmitRequestAsync 例程。 SdBusSubmitRequest 是一種包裝函式,會配置自己的 IRP,並呼叫 SdBusSubmitRequestAsync。 這是為了方便驅動程式開發者而提供。

下列各節提供程式碼範例,說明設備驅動器如何提交 SD 要求的兩個主要類別:如需不同要求的描述,請參閱 SD_REQUEST_FUNCTION

安全數位 (SD) 屬性要求

安全數位(SD) 卡片驅動程式會使用屬性要求來讀取或設定卡片屬性。 例如,SD 記憶卡驅動程式可能會讀取屬性,以判斷 SD 記憶卡上的寫入保護開關是否位於鎖定的位置,或多功能 SDIO 記憶卡上特定函式的驅動程式可能會要求總線驅動程式指派給它所管理之函式的數位。

下列程式代碼範例說明多功能卡片上函式的驅動程式如何向總線驅動程式要求其函式號碼:

 sdrp = ExAllocatePool(NonPagedPool, 
 sizeof(SDBUS_REQUEST_PACKET));
 if (!sdrp) {
 return STATUS_INSUFFICIENT_RESOURCES;
 }
 RtlZeroMemory(sdrp, sizeof(SDBUS_REQUEST_PACKET));
 sdrp->RequestFunction = SDRF_GET_PROPERTY;
 sdrp->Parameters.GetSetProperty.Property = 
 SDP_FUNCTION_NUMBER;
 sdrp->Parameters.GetSetProperty.Buffer = 
 &pDevExt->FunctionNumber;
 sdrp->Parameters.GetSetProperty.Length = 
 sizeof(pDevExt->FunctionNumber);
 status = SdBusSubmitRequest (pDevExt->BusInterface.Context,sdrp);
 ExFreePool(sdrp);
 if (!NT_SUCCESS(status)) {
 return status;
 }

在這裡程式代碼範例中,設備驅動器會初始化 SD 總線要求封包,SDBUS_REQUEST_PACKET,並將它傳遞給 SdBusSubmitRequest。 完整初始化的要求封包具有下列特性:

要求 的類型
程式代碼範例會在要求封包的 RequestFunction 成員中指定SDRF_GET_PROPERTY要求,以指示總線驅動程式從卡片擷取屬性。 如需SDRF_GET_PROPERTY要求的描述,請參閱 SD_REQUEST_FUNCTION

用於擷取 屬性
程序碼範例在要求封包的 Parameters.GetSetProperty.Property 成員中指定 SDP_FUNCTION_NUMBER 屬性,指示總線驅動程式擷取函數號屬性的內容。 如需SDP_FUNCTION_NUMBER屬性的描述,請參閱 SDBUS_PROPERTY

屬性內容和長度
程式碼範例將一個指向緩衝區的指標放入裝置延伸模組中

Parameters.GetSetProperty.Buffer 請求數據包中的成員。 總線驅動程式會將函式號碼儲存在此位置。 此範例程式代碼也會將此緩衝區的大小儲存在要求封包的 Parameters.GetSetProperty.Length 成員中。

安全數位 (SD) 裝置命令要求

驅動程式會使用 Secure Digital (SD) 卡片命令要求,將命令傳送至 SD 裝置。 SD 命令的通訊協定定義於 安全數位卡 規格中。 驅動程式可以在啟動裝置的 IRP IRP_MN_START_DEVICE 成功完成之後,隨時傳送命令要求。

本節包含兩個程式代碼範例:使用直接 I/O 從 SD 記憶卡快取數據位元組的命令要求,以及使用擴充 I/O 將數據寫入 SD 記憶卡的裝置命令要求。 第二節的解釋取決於第一節,因此,讀者應該先研究第一節,然後再研究第二節:

使用 的安全數位請求

使用擴充 I/O 的安全數位請求