Функция FltInitializePushLock (fltkernel.h)
Подпрограмма fltInitializePushLock инициализирует переменную блокировки push-блокировки.
Синтаксис
VOID FLTAPI FltInitializePushLock(
[out] PEX_PUSH_LOCK PushLock
);
Параметры
[out] PushLock
Указатель на хранилище, предоставленное вызывающей стороной, которое должно быть по крайней мере значением sizeof (EX_PUSH_LOCK), чтобы переменная блокировки push-блокировки была инициализирована. Хранилище должно быть 4-байтовое выравнивание на 32-разрядных платформах, а 8-байтовое выравнивание на 64-разрядных платформах.
Возвращаемое значение
Никакой
Замечания
Блокировка принудительной передачи — это примитив синхронизации, используемый для управления доступом к общим ресурсам несколькими потоками. Блоки принудительной отправки похожи на структуры ERESOURCE (также называемые "ресурсы") следующими способами:
Push-блокировки можно использовать для синхронизации набором потоков.
Блокировки push-уведомлений можно получить для общего или эксклюзивного доступа.
Хотя вызывающий объект предоставляет хранилище для переменной принудительной блокировки, структура EX_PUSH_LOCK непрозрачна: то есть ее члены зарезервированы для использования системы.
Блокировки push-уведомлений могут не быть правильным выбором для мини-фильтраторов файловой системы, так как некоторые из их характеристик могут быть несовместимы с изначально повторной записью файловых систем.
При сравнении со структурами ERESOURCE следующие недостатки:
Алгоритм предоставления эксклюзивного доступа не является справедливым для всех потоков. Если существует высокий уровень конфликтов с монопольной блокировкой, нет никаких гарантий в том порядке, в котором потоки будут предоставлены монопольный доступ.
Во время выполнения не существуют процедуры поддержки для определения текущего владельца принудительной блокировки. Пользователи структур ERESOURCE могут вызывать подпрограммы, такие как ExIsResourceAcquiredExclusiveLite, чтобы определить, имеет ли текущий поток монопольный доступ к ресурсу.
Нет расширений поддержки для определения текущего владельца принудительной блокировки во время отладки для диагностики взаимоблокировок. Пользователи структур ERESOURCE могут использовать расширение
!locks
в kd или windbg для определения текущего владельца.Нет поддержки средства проверки драйверов, чтобы помочь ранней диагностике взаимоблокировок через push-блокировки.
Монопольные блокировки push-уведомлений не могут быть получены рекурсивно.
Push-блокировки предлагают следующие преимущества преимущества по сравнению со структурами ERESOURCE:
При получении принудительной блокировки в основном для общего доступа они более эффективны, чем структуры ERESOURCE.
Хранилище для push-блокировок можно выделить из страничного или непагированного пула. Структуры ERESOURCE должны быть выделены только из непагированного пула.
EX_PUSH_LOCK структуры гораздо меньше, чем структуры ERESOURCE.
Если ни одно из этих преимуществ не является убедительным, ERESOURCE обычно является более надежным и обслуживаемым решением проблемы синхронизации чтения и записи.
Чтобы получить блокировку принудительной отправки для эксклюзивного доступа, вызовитеFltAcquirePushLockExclusive.
Чтобы получить блокировку принудительной отправки для общего доступа, вызовите FltAcquirePushLockExclusive.
Чтобы освободить блокировку push-уведомлений, вызовите FltReleasePushLock.
Чтобы удалить блокировку push-уведомлений, вызовите FltDeletePushLock.
Требования
Требование | Ценность |
---|---|
минимальные поддерживаемые клиентские | Windows XP с пакетом обновления 2 (SP2) Майкрософт |
минимальный поддерживаемый сервер | Windows Server 2003 с пакетом обновления 1 (SP1) |
целевая платформа | Всеобщий |
заголовка | fltkernel.h (include Fltkernel.h) |
библиотеки |
FltMgr.lib |
DLL | Fltmgr.sys |
IRQL | <= APC_LEVEL |