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


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

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

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

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

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

Процесс выполнения действия 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. Длина диапазонов наборов данных в байтах задается в члене DataSetRangesLength структуры DEVICE_DSM_INPUT.
    • Если для действия требуются выходные данные, обработчик вызывает DeviceDsmValidateOutputLength для проверки буфера выходных данных, предоставленного отправителем. Если это допустимо, обработчик инициализирует DEVICE_DSM_OUTPUT часть выходного буфера путем вызова DeviceDsmInitializeOutputи заполняет выходной блок выходными данными, определенными действиями, при наличии. Обработчик затем завершает IOCTL и возвращает или направляет IOCTL на следующий драйвер в стеке драйверов.
  3. После обработки DSM и возврата к отправителю, отправитель проверяет выходные данные, если они имеются, вызывая DeviceDsmValidateOutput. Если выходные данные допустимы, отправитель извлекает выходной блок (при наличии), вызвав DeviceDsmOutputBlock.

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