Функция FltInitializePushLock (fltkernel.h)

Подпрограмма FltInitializePushLock инициализирует переменную push-блокировки.

Синтаксис

VOID FLTAPI FltInitializePushLock(
  [out] PEX_PUSH_LOCK PushLock
);

Параметры

[out] PushLock

Указатель на хранилище, предоставленное вызывающей стороной, которое должно быть по крайней мере значением sizeof(EX_PUSH_LOCK) для инициализации переменной push lock. Хранилище должно быть выровнено по 4 байтам на 32-разрядных платформах и 8-байтово для 64-разрядных платформ.

Возвращаемое значение

None

Remarks

Принудительная блокировка редко подходит для минифильтров файловой системы. Как описано ниже, некоторые из их характеристик могут быть несовместимы с характером повторного входа файловых систем.

Принудительные блокировки похожи на структуры ERESOURCE (также называемые "ресурсами") следующими способами:

  • Принудительные блокировки можно использовать для синхронизации набором потоков.
  • Push-блокировки можно получить для общего или монопольного доступа.
  • Хотя вызывающий объект предоставляет хранилище для переменной push-блокировки, структура EX_PUSH_LOCK непрозрачна: то есть ее члены зарезервированы для использования системой.
При сравнении со структурами ERESOURCE принудительные блокировки имеют следующие недостатки:
  • Алгоритм предоставления монопольного доступа не является справедливым для всех потоков. Если существует высокий уровень состязания за монопольную блокировку, нет никакой гарантии в порядке, в котором потоки будут предоставляться монопольный доступ.
  • Процедуры поддержки для определения текущего владельца принудительной блокировки во время выполнения отсутствуют. (Пользователи структур ERESOURCE могут вызывать подпрограммы, такие как ExIsResourceAcquiredExclusiveLite , чтобы определить, имеет ли текущий поток монопольный доступ к ресурсу.)
  • По этой же причине отсутствуют расширения поддержки для определения текущего владельца принудительной блокировки во время отладки и диагностики взаимоблокировок. (Пользователи структур ERESOURCE могут использовать !locks расширение в kd или windbg, чтобы узнать это.)
  • Отсутствует поддержка средства проверки драйверов, помогающего в ранней диагностике взаимоблокировок с помощью push-блокировок.
  • Монопольные принудительные блокировки невозможно получить рекурсивно.
Push-блокировки предоставляют следующие преимущества по сравнению со структурами ERESOURCE:
  • Когда принудительная блокировка в основном используется для общего доступа, они более эффективны, чем структуры ERESOURCE.
  • Хранилище для принудительной блокировки может быть выделено из страничного или невыгружаемого пула. Структуры ERESOURCE должны быть выделены только из пула без паг.
  • EX_PUSH_LOCK структуры гораздо меньше структур ERESOURCE.
Если какое-либо из этих преимуществ не является убедительным, ERESOURCE обычно является более надежным и поддерживающимся решением проблемы синхронизации чтения и записи.

Чтобы получить push-блокировку для монопольного доступа, вызовите Метод FltAcquirePushLockExclusive.

Чтобы получить push-блокировку для общего доступа, вызовите FltAcquirePushLockShared.

Чтобы освободить push-блокировку, вызовите FltReleasePushLock.

Чтобы удалить push-блокировку, вызовите FltDeletePushLock.

Требования

Требование Значение
Минимальная версия клиента Эта подпрограмма доступна в Microsoft Windows XP с пакетом обновления 2 (SP2), Microsoft Windows Server 2003 с пакетом обновления 1 (SP1) и более поздних версиях.
Целевая платформа Универсальное
Верхняя часть fltkernel.h (включая Fltkernel.h)
Библиотека FltMgr.lib
DLL Fltmgr.sys
IRQL <= APC_LEVEL

См. также раздел

ExIsResourceAcquiredExclusiveLite

FltAcquirePushLockExclusive

FltAcquirePushLockShared

FltDeletePushLock

FltReleasePushLock