Поделиться через


Управление набором данных драйвера хранилища

Начиная с 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, с которой начинаются диапазоны. Структура системного буфера показана на следующей схеме.

Входной буфер IOCTL DSM.

Если действие управления возвращает выходные данные, указатель на структуру DEVICE_DSM_OUTPUT передается в OutputBuffer IOCTL. Если действие вернет дополнительные выходные данные, относящиеся к конкретному действию, блок вывода будет сразу же следовать за структурой DEVICE_DSM_OUTPUT, а OutputBlockOffset укажет смещение от начала структуры DEVICE_DSM_OUTPUT, с которой начинается блок параметров. Структура выходного буфера показана на следующей схеме.

Выходной буфер IOCTL DSM.

Поток процесса действия DSM

Ниже описан процесс действия DSM, где Отправитель является инициатором запроса действия, а обработчик обрабатывает запрошенное действие. Обратите внимание, что в стеке может быть несколько обработчиков .

Поток действий DSM.

  1. Отправитель инициализирует 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 вместе с выделенным выходным буфером, если таковые есть.
  2. Обработчик обрабатывает запрос IOCTL DSM одним из трех способов:

    1. Обработайте запрос и верните с выходными данными, если таковые есть.
    2. Обработайте запрос и переадресуйте его следующему нижнему драйверу в стеке.
    3. Переадресуйте запрос следующему более низкому драйверу в стеке без обработки 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 следующему драйверу в стеке.
  3. После обработки DSM и возврата отправителю отправитель проверяет выходные данные, если таковые есть, путем вызова DeviceDsmValidateOutput. Если выходные данные допустимы, отправитель извлекает выходной блок, если он есть, путем вызова DeviceDsmOutputBlock.

Дополнительные сведения о каждом конкретном действии DSM см. в разделе Описания действий DSM устройства.