Запросы SD-карты
После того как драйвер устройства Secure Digital (SD) карта откроет и инициализирует интерфейс для драйвера шины SD, он может отправлять запросы. Существует два способа отправки запросов: синхронно с помощью процедуры SdBusSubmitRequest и асинхронно с помощью процедуры SdBusSubmitRequestAsync . Обе эти процедуры экспортируются библиотекой шины SD (sdbus.lib).
Синхронная подпрограмма запроса принимает два параметра: контекст интерфейса и пакет запроса.
Контекст интерфейса
Драйвер устройства получает контекст интерфейса из элемента Contextструктуры SDBUS_INTERFACE_STANDARD после открытия интерфейса SD с помощью SdBusOpenInterface. Драйвер должен передавать эти сведения контекста в при каждом вызове метода в интерфейсе .
Пакет запроса
Драйвер устройства должен выделить и инициализировать структуру SDBUS_REQUEST_PACKET . Эта структура определяет функцию запроса и другие характеристики запроса.
Так как SdBusSubmitRequest является синхронным, он не возвращает STATUS_PENDING. Драйвер устройства должен работать на DISPATCH_LEVEL IRQL < при вызове этой подпрограммы.
Подпрограмма асинхронного запроса принимает следующие пять параметров: контекст интерфейса, пакет запроса, IRP, указатель на подпрограмму завершения и контекст завершения.
Контекст интерфейса
Этот параметр совпадает с параметром с тем же именем, который используется в синхронном регистре.
Пакет запроса
Этот параметр совпадает с параметром с тем же именем, который используется в синхронном регистре.
IRP
Этот параметр содержит IRP, выделенный драйвером устройства, или IRP, полученный драйвером от драйвера, расположенного над ним в стеке драйверов. IRP используется в качестве оператора для запроса.
Подпрограмма завершения
Этот параметр содержит подпрограмму IoCompletion для IRP, указанной в параметре IRP.
Контекст пользователя
Этот параметр содержит указатель на данные контекста пользователя, которые система передает в подпрограмму завершения, указанную в параметре подпрограммы завершения.
При вызове подпрограммы SdBusSubmitRequestAsync драйвер устройства должен работать в среде IRQL <= DISPATCH_LEVEL. SdBusSubmitRequest — это оболочка, которая выделяет собственный IRP и вызывает SdBusSubmitRequestAsync. Он предоставляется для удобства модуля записи драйвера.
В следующих разделах приведены примеры кода, иллюстрирующие, как драйвер устройства отправляет каждую из двух основных категорий запросов SD. Описание различных запросов см. в разделе SD_REQUEST_FUNCTION.
Запросы свойств Secure Digital (SD)
Драйверы карта Secure Digital (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. Полностью инициализированный пакет запроса имеет следующие характеристики:
Тип запроса
В примере кода указывается запрос SDRF_GET_PROPERTY в элементе RequestFunction пакета запроса, который указывает драйверу шины получить свойство из карта. Описание запроса SDRF_GET_PROPERTY см. в разделе SD_REQUEST_FUNCTION.
Извлекаемое свойство
В примере кода указывается свойство SDP_FUNCTION_NUMBER в элементе Parameters.GetSetProperty.Property пакета запроса, который указывает драйверу шины получить содержимое свойства номера функции. Описание свойства SDP_FUNCTION_NUMBER см. в разделе SDBUS_PROPERTY.
Содержимое и длина свойства
В этом примере кода указатель на буфер помещает в расширение устройства в
Элемент Parameters.GetSetProperty.Buffer пакета запроса. Водитель автобуса сохранит номер функции в этом расположении. В примере кода также сохраняется размер этого буфера в элементе Parameters.GetSetProperty.Length пакета запроса.
Запросы команд устройства Secure Digital (SD)
Драйверы используют Secure Digital (SD) карта запросов команд для отправки команд на устройство SD. Протокол для команд SD определен в спецификации Secure Digital Card . Драйверы могут отправлять командные запросы в любое время после успешного завершения IRP_MN_START_DEVICE IRP, запускающего устройство.
Этот раздел содержит два примера кода: командный запрос, который считывает байт данных из регистра SD-карта с помощью прямого ввода-вывода, и командный запрос устройства, который записывает больше данных в SD-карта с использованием расширенных операций ввода-вывода. Объяснение во втором разделе зависит от первого, поэтому читатели должны изучить первый раздел перед изучением второго:
Защита используемых цифровых запросов
Защита цифровых запросов, использующих расширенный ввод-вывод