SD Kart Veri Yolu Arayüzünü Açma, Başlatma ve Kapatma

Secure Digital (SD) cihaz sürücülerinin, yönettiği cihazlarla veya konak denetleyicisiyle etkileşime geçmek için bir SD veri yolu arabirimi açması ve başlatması gerekir. Bunun için SD veri yolu kitaplığına iki çağrı gerekir: SdBusOpenInterface çağrısı ve ardından arabirimi başlatan veri yolu sürücüsü tarafından sağlanan bir yordam çağrısı. SdBusOpenInterface, SDBUS_INTERFACE_STANDARD yapısındaki InterfaceReference üyesinde işlevi başlatan yordamın adresini döndürür. Bus sürücüsüne kesme bildirimi geri çağırma yordamı işaretçisi sağlamak için cihaz sürücüsünün bu başlatma yordamını çağırması gerekir. Veri yolu sürücüsü, donanım kesintisini cihaz sürücüsüne bildirmek için bu geri çağırmayı kullanır. SD veri yolu arabirimini başlatan yordam hakkında daha fazla bilgi için bkz. PSDBUS_INITIALIZE_INTERFACE_ROUTINE. Cihaz sürücüsü normalde AddDevice yordamının içinden bir SD veri yolu arabirimi açar ve başlatır.

Aşağıdaki kod örneği, SD veri yolu arabirimini açan ve başlatan çağrıların sırasını gösterir:

  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);
    }
      }

Bu kod örneğinde, cihaz sürücüsü arabirimi açmak için SdBusOpenInterface çağırır ve veri yolu sürücüsü cihaz uzantısında başlatma yordamının işaretçisini depolar (DeviceExtension->BusInterface.InitializeInterface). SdBusOpenInterface döndüğünde, sürücü bu işaretçiyi cihaz uzantısından alır. Ardından sürücü, SDBUS_INTERFACE_PARAMETERS yapısında pMyDriverCallback kendi kesme geri çağırma yordamına bir işaretçi koyar ve bu yapıyı başlatma yordamına geçirir.

Cihaz sürücüsü, SDBUS_INTERFACE_STANDARD yapısının Bağlam üyesinde SdBusOpenInterface döndürdüğü bağlam bilgilerini de almalıdır. Sürücü bir SD veri yolu arayüz rutinini her çağırdığında, bu bağlam verilerini iletmesi gerekir.

SD Arabirimini Kapatma

Bir SD arabirimini kapatmak için sürücülerin, SDBUS_INTERFACE_STANDARD yapısının InterfaceDereference üyesindeki yordamı çağırarak arabirimin başvurusunu kaldırması gerekir ve bu da SdBusOpenInterface yordamı tarafından ayrılan tüm kaynakları serbest bırakır. SD cihaz sürücüleri, aşağıdaki IRP'lerden herhangi birini alırken tüm açık SD arabirimlerini kapatmalıdır:

IRP_MN_QUERY_REMOVE_DEVICE

IRP_MN_REMOVE_DEVICE

IRP_MN_SURPRISE_REMOVAL

Aşağıdaki kod örneği, bir sürücünün SD kart veri yolu arabirimine nasıl başvurabileceğini gösterir:

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

SdBusOpenInterface çağrısı, SDBUS_INTERFACE_STANDARD yapısındaki arabirim başvuru kaldırma yordamına yönelik bir işaretçi depolar. Ancak, sürücüler yordama geçmeden önce işaretçinin NULL olmadığını doğrulamalıdır.