Управление набором данных драйвера хранилища
Начиная с Windows 7 драйверы могут выполнять действия по управлению набором данных устройства. Список действий по управлению набором данных (DSM), которые могут выполняться на запоминающих устройствах, определяется корпорацией Майкрософт.
Использование IOCTL_STORAGE_MANAGE_DATA_SET_ATTRIBUTES
Константой DEVICE_DSM_ACTION определяется действие. Эта константа передается в элемент Actionструктуры DEVICE_DSM_INPUT , содержащейся в системном буфере запроса IOCTL_STORAGE_MANAGE_DATA_SET_ATTRIBUTES . Если действие требует дополнительных параметров, блок параметров будет сразу же следовать за структурой DEVICE_DSM_INPUT, а ParameterBlockOffset укажет смещение от начала структуры DEVICE_DSM_INPUT, с которой начинается блок параметров. Диапазоны наборов данных, если таковые есть, будут немедленно следовать за блоком параметров, а DataSetRangesOffset задает смещение от начала структуры DEVICE_DSM_INPUT, с которой начинаются диапазоны. Структура системного буфера показана на следующей схеме.
Если действие управления возвращает выходные данные, указатель на структуру DEVICE_DSM_OUTPUT передается в OutputBuffer IOCTL. Если действие вернет дополнительные выходные данные, относящиеся к конкретному действию, блок вывода будет сразу же следовать за структурой DEVICE_DSM_OUTPUT, а OutputBlockOffset укажет смещение от начала структуры DEVICE_DSM_OUTPUT, с которой начинается блок параметров. Структура выходного буфера показана на следующей схеме.
Поток процесса действия DSM
Ниже описан процесс действия DSM, где Отправитель является инициатором запроса действия, а обработчик обрабатывает запрошенное действие. Обратите внимание, что в стеке может быть несколько обработчиков .
Отправитель инициализирует DSM и отправляет его первому обработчику в стеке, выполнив следующие действия:
- Выделите и инициализируйте структуру DEVICE_DSM_DEFINITION с определением, связанным с действием.
- Вызовите DeviceDsmGetInputLength , чтобы определить размер, необходимый для входного буфера действия, а затем выделить память для этого буфера.
- Вызовите DeviceDsmInitializeInput , чтобы инициализировать структуру DSM_DEVICE_INPUT , а если действие имеет параметры, блок параметров. Формат блока параметров зависит от действия. Дополнительные сведения см. в описании DEVICE_DSM_ACTION .
- Если действие имеет диапазоны, вызовите DeviceDsmAddDataSetRange для каждого диапазона, чтобы добавить DEVICE_DSM_RANGE структуры во входной буфер.
- Если DSM имеет выходные данные, вызовите DeviceDsmGetOutputLength , чтобы определить размер, необходимый для выходного буфера действия, а затем выделить память для этого буфера.
- Отправьте запрос IOCTL_STORAGE_MANAGE_DATA_SET_ATTRIBUTES , передавая инициализированные входные данные в системный буфер IOCTL вместе с выделенным выходным буфером, если таковые есть.
Обработчик обрабатывает запрос IOCTL DSM одним из трех способов:
- Обработайте запрос и верните с выходными данными, если таковые есть.
- Обработайте запрос и переадресуйте его следующему нижнему драйверу в стеке.
- Переадресуйте запрос следующему более низкому драйверу в стеке без обработки DSM.
Примечание
Независимо от того, обрабатывает ли драйвер DSM, он может безопасно пересылать запрос только в том случае, если задан самый значительный бит DEVICE_DSM_ACTION (DeviceDsmActionFlag_NonDestructive). Если DeviceDsmActionFlag_NonDestructiveне задано, драйвер должен вернуться с ошибкой.
Если обработчик обрабатывает DSM, он выполняет следующие действия:
- Проверьте входные данные, вызвав DeviceDsmValidateInput.
- Если входные данные допустимы, обработчик извлекает входные данные, чтобы получить действие . Если действие содержит блок параметров, обработчик вызывает DeviceDsmParameterBlock , чтобы получить блок параметров. Если действие содержит данные диапазона, обработчик вызывает DeviceDsmDataSetRanges , чтобы получить указатель на блок диапазонов набора данных, а затем выполняет обычную обработку блока. Этот блок находится в dataSetRangesOffset и состоит из одной или нескольких смежных записей, отформатированных как DEVICE_DSM_RANGE структуры. Длина (в байтах) диапазонов набора данных задается в элементе DataSetRangesLengthDEVICE_DSM_INPUT.
- Если для действия требуются выходные данные, обработчик вызывает DeviceDsmValidateOutputLength для проверки предоставленного отправителем выходного буфера. Если это допустимо, обработчик инициализирует DEVICE_DSM_OUTPUT часть выходного буфера, вызывая DeviceDsmInitializeOutput, и заполняет выходной блок выходными данными, зависящими от действия, если таковые есть. Затем обработчик завершает IOCTL и возвращает или пересылает IOCTL следующему драйверу в стеке.
После обработки DSM и возврата отправителю отправитель проверяет выходные данные, если таковые есть, путем вызова DeviceDsmValidateOutput. Если выходные данные допустимы, отправитель извлекает выходной блок, если он есть, путем вызова DeviceDsmOutputBlock.
Дополнительные сведения о каждом конкретном действии DSM см. в разделе Описания действий DSM устройства.