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


Проверка состояния oplock операции IRP_MJ_CREATE

Следующее применяется только при открытии существующего потока файла (т. е. для вновь созданных потоков не может быть уже существующих блокировок).

Примечание При обработке IRP_MJ_CREATE для любой операции блокировки, если требуемый доступ не содержит ничего, кроме FILE_READ_ATTRIBUTES, FILE_WRITE_ATTRIBUTES или SYNCHRONIZE, операция не прерывается, если не указан FILE_RESERVE_OPFILTER. Указание FILE_RESERVE_OPFILTER всегда приводит к разрыву блокировки, если создание завершается успешно. Для краткости и простоты в следующей таблице описано выше, так как оно применяется ко всем блокировкам.

Тип запроса Условия

уровне 1

Не работает на IRP_MJ_CREATE, когда:

  • Клавиша oplock, связанная с FILE_OBJECT, в которой происходит открытие, отличается от ключа блокировки, связанного с FILE_OBJECT, которой принадлежит блокировка.

Если блокировка не работает:

  • Прервать на нет , если:

    • Установлен флаг FILE_RESERVE_OPFILTER

      OR

    • Указываются любые из следующих значений ликвидации создания:
      • FILE_SUPERSEDE
      • FILE_OVERWRITE
      • FILE_OVERWRITE_IF

    ЕЩЕ:

    • Перерыв на уровень 2.
  • Подтверждение должно быть получено до продолжения операции.

Уровень 2

Не работает на IRP_MJ_CREATE, когда:

  • Клавиша oplock, связанная с FILE_OBJECT, в которой происходит открытие, отличается от ключа блокировки, связанного с FILE_OBJECT, которой принадлежит блокировка.
  • И:
    • Установлен флаг FILE_RESERVE_OPFILTER

      OR

    • Указываются любые из следующих значений ликвидации создания:
      • FILE_SUPERSEDE
      • FILE_OVERWRITE
      • FILE_OVERWRITE_IF

Если блокировка не работает:

  • Прервать на Нет.

  • Подтверждение не требуется, операция выполняется немедленно.

Пакетная служба

Не работает на IRP_MJ_CREATE, когда:

  • Клавиша oplock, связанная с FILE_OBJECT, в которой происходит открытие, отличается от ключа блокировки, связанного с FILE_OBJECT, которой принадлежит блокировка.

Если блокировка не работает:

  • Прервать на нет , если:

    • Установлен флаг FILE_RESERVE_OPFILTER.

      OR

    • Указываются любые из следующих значений ликвидации создания:
      • FILE_SUPERSEDE
      • FILE_OVERWRITE
      • FILE_OVERWRITE_IF

    ЕЩЕ:

    • Перерыв на уровень 2.
  • Подтверждение должно быть получено до продолжения операции.

Фильтр

Не работает на IRP_MJ_CREATE, когда:

  • Клавиша oplock, связанная с FILE_OBJECT, в которой происходит открытие, отличается от ключа блокировки, связанного с FILE_OBJECT, которой принадлежит блокировка.

  • И:
    • Запрошен "доступный для записи" доступ к потоку, который не был открыт для FILE_SHARE_READ доступа. Обратите внимание, что доступ к записи определяется как любой атрибут, отличный от:

      • FILE_READ_ATTRIBUTES
      • FILE_WRITE_ATTRIBUTES
      • FILE_READ_DATA
      • FILE_READ_EA
      • FILE_EXECUTE
      • SYNCHRONIZE
      • READ_CONTROL

Если блокировка не работает:

  • Прервать на Нет.

  • Подтверждение должно быть получено до продолжения операции.

Read

Не работает на IRP_MJ_CREATE, когда:

  • Клавиша oplock, связанная с FILE_OBJECT, в которой происходит открытие, отличается от ключа блокировки, связанного с FILE_OBJECT, которой принадлежит блокировка.

  • И:
    • Установлен флаг FILE_RESERVE_OPFILTER

      OR

    • Указываются любые из следующих значений ликвидации создания:
      • FILE_SUPERSEDE
      • FILE_OVERWRITE
      • FILE_OVERWRITE_IF

Если блокировка не работает:

  • Прервать на Нет.

  • Подтверждение не требуется, операция выполняется немедленно.

Read-Handle

Не работает на IRP_MJ_CREATE, когда:

  • Текущий открытый конфликтует с существующим открытым, чтобы произошло нарушение общего доступа.

    OR

  • Установлен флаг FILE_RESERVE_OPFILTER.

    OR

  • Указываются любые из следующих значений ликвидации создания:

    • FILE_SUPERSEDE
    • FILE_OVERWRITE
    • FILE_OVERWRITE_IF

    AND (для любого из трех указанных выше условий)

  • Клавиша oplock, связанная с FILE_OBJECT, в которой происходит открытие, отличается от ключа блокировки, связанного с FILE_OBJECT, которой принадлежит блокировка.

Если блокировка не работает:

  • Прервать на нет , если:

    • Установлен флаг FILE_RESERVE_OPFILTER.

      OR

    • Указываются любые из следующих значений ликвидации создания:
      • FILE_SUPERSEDE
      • FILE_OVERWRITE
      • FILE_OVERWRITE_IF

    ЕЩЕ:

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

Read-Write

Не работает на IRP_MJ_CREATE, когда:

  • Ключ oplock, связанный с FILE_OBJECT, на котором выполняется открытие, отличается от ключа oplock, связанного с FILE_OBJECT, которому принадлежит операция.

Если блокировка не работает:

  • Прервать на Нет , если:

    • Установлен флаг FILE_RESERVE_OPFILTER.

      OR

    • Указываются любые из следующих значений ликвидации при создании:
      • FILE_SUPERSEDE
      • FILE_OVERWRITE
      • FILE_OVERWRITE_IF

    ЕЩЕ:

    • Прервать на чтение.
  • Прежде чем операция будет продолжена, необходимо получить подтверждение.

Дескриптор чтения и записи

Не работает на IRP_MJ_CREATE, когда:

  • Ключ oplock, связанный с FILE_OBJECT, на котором выполняется открытие, отличается от ключа oplock, связанного с FILE_OBJECT, которому принадлежит операция.

Если блокировка не работает:

  • Прервать на Нет , если:

    • Установлен флаг FILE_RESERVE_OPFILTER.

      OR

    • Указываются любые из следующих значений ликвидации при создании:
      • FILE_SUPERSEDE
      • FILE_OVERWRITE
      • FILE_OVERWRITE_IF

    ЕЩЕ:

    • Прервать Read-Write, если текущий открытый конфликтует с существующим открытым, что произойдет нарушение общего доступа. В противном случае прервите на Read-Handle.

  • Прежде чем операция будет продолжена, необходимо получить подтверждение.

При обработке операции IRP_MJ_CREATE файловая система выполняет дополнительные проверки на наличие блокировок пакетной службы и фильтрации (а не самого пакета oplock), что влияет на то, запрашивает ли файловая система пакет oplock обработку прерывания операции. Это случай, когда операции в одном потоке данных могут влиять на блокировку других потоков данных одного и того же файла (т. е. на последние два элемента списка из следующего списка условий). Если выполняется одно или несколько из следующих условий, файловая система отправляет запрос пакету oplock для выполнения обработки прерывания операции:

  • Запросите разрыв, если это открытый сетевой запрос и присутствует транзакция KTM . В противном случае не запрашивайте прерывание при открытии сетевого запроса.

  • Если операция SUPERSEDE, OVERWRITE или OVERWRITE_IF выполняется в альтернативном потоке данных, а FILE_SHARE_DELETE не указан и в основном потоке данных имеется блокировка пакетной службы или фильтра, запросите прерывание блокировки пакетной службы или фильтра в основном потоке данных.

  • Если операция SUPERSEDE, OVERWRITE или OVERWRITE_IF выполняется в основном потоке данных и запрошен доступ к DELETE, а в любом альтернативном потоке данных есть блокировки пакетной службы или фильтра, запросите прерывание блокировки пакетной службы или фильтра для всех альтернативных потоков данных, в которых они есть.

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

Перед выполнением проверок доступа к общей папке проверка прерывания блокировок пакетной службы и фильтрации. Это означает, что блокировка пакетной службы или фильтра не работает, даже если открытый запрос в конечном итоге завершается сбоем из-за нарушения общего доступа.