Как получить доступ к глобальной таблице блокировки файлов Windows в.Net?

Есть ли способ, через.Net или через Win32 API в.Net, получить доступ к глобальной таблице блокировки файлов Windows?

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

1 ответ

Решение

Нет, он хранится в коде кольца 0. Код ядра, только драйвер устройства может получить к нему. Тип, который динамически устанавливается, например, с помощью утилиты SysInternals' Handle. Чей автор также пересмотрел недокументированные структуры ядра, чтобы найти эту таблицу, и готов сохранить этот код для всех предыдущих и будущих версий Windows. С надеждой.

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

Предположим, это сработает, и вы напишите функцию IsLocked(). Вы вернете false, когда обнаружите, что файлы не заблокированы. Должен быть прерван переключателем контекста операционной системы, который прерывает ваш поток так же, как IsLocked() возвращает вызывающей стороне. И уступить другому потоку в другом процессе, который блокирует файл. Когда ваш поток возобновляется, вызывающая сторона становится ложной, но файл все равно блокируется. Полный провал кита. Такой баг чрезвычайно сложно устранить. Это случится, но не достаточно часто, чтобы попытаться понять, почему это не работает.

Замки должны быть атомарными, абсолютно необходимыми для их правильной работы. Другими словами, операция проверки и установки должна быть непрерывной. Что очень легко сделать в Windows, просто откройте файл. Если вы не можете получить блокировку, то это не удастся. Если этого не произойдет, никто больше не сможет открыть его, потому что вы также приобрели замок.

Другие вопросы по тегам