Подтвердить что ты не робот

Изменение драйвера диска Windows для использования обновленных управляющих кодов, таких как IOCTL_DISK_GET_DRIVE_GEOMETRY_EX

Я пытаюсь изменить драйвер диска на уровне ядра Windows, чтобы правильно реагировать на обновленные коды управления. Например, у него был только обработчик для устаревшего кода управления IOCTL_DISK_GET_DRIVE_GEOMETRY, но не более новый управляющий код IOCTL_DISK_GET_DRIVE_GEOMETRY_EX, поэтому я добавил это.
Конечно, я обновил драйвер, чтобы использовать все новые структуры и функции Windows, например, функцию IoReadPartitionTableEx() и структуру DRIVE_LAYOUT_INFORMATION_EX (я пытаюсь добавить поддержку GPT к драйверу). Проблема в том, что когда я использую драйвер диска, я вижу (используя DebugView), что Windows (я думаю, это Windows... возможно, это что-то еще...) по-прежнему отправляет старый управляющий код IOCTL_DISK_GET_DRIVE_GEOMETRY в мой драйвер. Я бы хотел, чтобы Windows отправила новые коды управления моему драйверу. Это даже Windows, которая отправляет эти коды управления? Возможно ли еще один слой между Windows и драйвером, о котором я еще не знаю?

Предполагается ли драйвер каким-то образом идентифицировать свой "тип" для Windows, так что Windows точно знает, как "говорить" с ним? Как Windows точно знает, какие коды управления отправлять конкретному драйверу? Я искал ответы на эти (казалось бы, очень простые) вопросы и не нашел ясного ответа, что заставляет меня поверить, что я принципиально неправильно понял что-то о драйверах Windows. Имеет ли смысл мой вопрос?

4b9b3361

Ответ 1

У ОП есть 5 вопросов (количество зависит от количества вопросительных знаков). Каждый из следующих ответов отвечает на вопросы в том же порядке, что и в OP.

  • Чтобы узнать, кто звонит вашему драйверу с помощью IOCTL_DISK_GET_DRIVE_GEOMETRY, поставьте точку останова на обработчик для этого IOCTL в вашем драйвере. Когда произойдет разрыв, посмотрите на столбец. Вы увидите, кто звонил.

  • На самом деле у вас будет многоуровневый набор абонентов. Это ответит на ваш вопрос о слоях.

  • Windows знает о возможностях ваших драйверов несколькими способами. Если у вас есть драйвер минипорта, тогда существует минимальный набор функций, которые должны реализовывать каждый тип минипорта.

    Кроме того, существуют API-интерфейсы, которые минипорты StorPort могут использовать для указания дополнительных возможностей. Например, StorPortInitializePerfOpts используется для информирования StorPort о различных первичных оптимизации в минипортах StorPort. Чтобы лучше ответить на этот вопрос, укажите тип драйвера, который у вас есть. Если вы не знакомы с различными типами драйверов, я предлагаю вам прочитать это из центра разработчика MS HW. На самом деле вы, возможно, захотите его прочитать.

  • Вопрос предполагает, что Windows отправляет разные управляющие коды в разные драйверы на основе некоторого гипотетического атрибута драйвера. Однако модель Windows использует то, что упоминается в предыдущем ответе. Существуют базовые возможности, основанные на модели драйвера, а затем в некоторых случаях API-интерфейсы для обмена возможностями. (В других случаях драйвер должен указать, что он не поддерживает определенную операцию.)

    В ответе есть еще один аспект: компоненты Windows и не Windows могут выбирать любые управляющие коды, которые они хотят. Таким образом, сторонняя программа разбиения диска может использовать более раннюю геометрию IOCTL, даже если она существует более новая, потому что она хочет быть совместимой с более ранними версиями Windows. Или компонент Windows (например, пространства хранения) может использовать новый IOCTL, поскольку он не поддерживает обратную совместимость.

  • (Этот вопрос требует мнения, поэтому этот ответ - мое мнение). Предполагая, что "вопрос" означает "вопросы", я бы сказал более или менее. Но если это ваш первый (или второй) набег на драйверы Windows, я снова предлагаю прочитать соответствующую документацию MS (связанный выше).

Наконец, несмотря на то, что OP не запрашивает напрямую, похоже, возникает вопрос: "Как проверить функциональность IOCTL_DISK_GET_DRIVE_GEOMETRY_EX, которую я добавил?". Самый простой способ - ИМО - написать тестовую программу Win32. Чтобы вызывать и отображать этот код, IOCTL занимает всего около 20 строк кода. Который будет проще и быстрее, скажем, сценарием DISKPART или аналогичным.