Синхронизация мини-драйвера
Разработчики мини-драйверов потоковой передачи могут разрешить драйверу класса обрабатывать синхронизацию. Когда мини-накопители регистрируются в драйвере класса, они могут выбрать синхронизацию, предоставляемую драйвером класса, установив для элемента TurnOffSynchronizationHW_INITIALIZATION_DATAзначение FALSE.
Когда драйвер класса обрабатывает синхронизацию, он гарантирует, что два фрагмента кода мини-драйвера никогда не будут выполняться одновременно. Драйвер класса помещает в очередь все потоковые запросы и передает их в мини-накопитель по одному.
Одной из целей этой синхронизации является освобождение модуля записи мини-накопителя от необходимости обрабатывать все сведения о синхронизации драйверов и постановке запросов в очередь в многозадачности, повторной и многопроцессорной среде. Однако некоторые мини-отвертки не должны использовать его. В разделе Примеры синхронизации приведены два примера, которые иллюстрируют, что необходимо сделать мини-накопителю в отношении синхронизации.
Отключение синхронизации потокового класса означает, что все запросы немедленно и асинхронно вызываются в мини-хранилище в контексте потока отправки на PASSIVE_LEVEL. Исключениями из предыдущего правила являются подпрограммы HwCancelPacket, TimeoutHandler и Таймер. Они вызываются на DISPATCH_LEVEL. Последним исключением является обработчик прерываний, который вызывается в DIRQL.
Если синхронизация отключена, мини-диск отвечает за синхронизацию в соответствии с моделью WDM. Если мини-накопитель вызывается обратно в PASSIVE_LEVEL, он может быть вытеснено любыми более высокими событиями IRQL, такими как dpcs или прерывания. Аналогичным образом, если мини-диск вызывается в DISPATCH_LEVEL, он может быть вытеснено прерыванием. Функции minidriver, которые управляют общими ресурсами, должны синхронизировать доступы.
Если синхронизация классов потоков отключена, можно одновременно отправлять несколько запросов к одному или разным потокам. Мини-driver должен ставить в очередь собственные запросы и обрабатывать любые аппаратные синхронизации с другими потоками и ISR. Спиновые блокировки, мьютексы и KeSynchronizeExecution — это некоторые объекты синхронизации, доступные для потоковых мини-драйверов, работающих без синхронизации класса потока.