Подключения и блокировка структуры файлов
В целях блокировки используются два уровня таблиц подстановки:
Таблица объектов для SRV_CALL и NET_ROOT структур (таблица префиксов)
Структура таблицы на NET_ROOT для структур FCB (таблица FCB)
Эти отдельные таблицы позволяют выполнять операции каталогов в разных структурах NET_ROOT почти полностью без вмешательства после установки подключений. Однако операции с каталогами в той же NET_ROOT структуре немного мешают. В следующей таблице описаны блокировки, необходимые для конкретных операций.
Операция | Типы данных | Требуется блокировка |
---|---|---|
Создание или завершение |
SRV_CALL NET_ROOT V_NET_ROOT | Монопольная блокировка таблицы NetName (поле TableLock объекта RxContext-RxDeviceObject-pRxNetNameTable>>). |
Ссылка, разыменовка или уточняющий запрос |
SRV_CALL NET_ROOT V_NET_ROOT | Общая или монопольная блокировка таблицы NetName (поле TableLock объекта RxContext-RxDeviceObject-pRxNetNameTable>>). |
Создание или завершение |
FCB SRV_OPEN FOBX | Монопольная блокировка таблицы FCB (поле TableLock NET_ROOT-FcbTable>). |
Ссылка, разыменовка или уточняющий запрос |
FCB SRV_OPEN FOBX | Общая или монопольная блокировка таблицы FCB (поле TableLock NET_ROOT-FcbTable>). |
Обратите внимание, что для работы со структурами данных SRV_OPEN и FOBX в настоящее время требуется та же блокировка, что и для работы со структурами данных FCB. Это просто идея сохранения памяти. Будущие версии Windows могут добавлять еще один ресурс на уровне FCB, чтобы снять это ограничение, чтобы набор общих ресурсов можно было использовать для снижения вероятности конфликта до приемлемо низкого уровня.
Если требуются обе блокировки (например, FinalizeNetFcb), необходимо сначала заблокировать таблицу NetName, а затем — таблицу FCB. Блокировки должны быть сняты в обратном порядке.
Процесс создания и завершения SRV_CALL, NET_ROOT и V_NET_ROOT регулируется получением и освобождением блокировки RDBSS в таблице NetName.
Процесс создания и завершения fcb регулируется приобретением и освобождением блокировки в таблице NetName, связанной со структурой NET_ROOT.
Процесс создания и завершения FOBX и SRVOPEN регулируется приобретением и освобождением блокировки таблицы FCB.
В следующей таблице перечислены блокировки и режимы, в которых они должны быть получены для создания и завершения различных структур данных.
Тип операции | SRV_CALL | NET_ROOT | FCB | SRV_OPEN | FOBX |
---|---|---|---|---|---|
Создать |
Монопольная блокировка для таблицы NetName |
Монопольная блокировка для таблицы NetName |
Монопольная блокировка таблицы FCB |
Монопольная блокировка таблицы FCB |
Монопольная блокировка таблицы FCB |
Finalize |
Монопольная блокировка для таблицы NetName |
Монопольная блокировка для таблицы NetName |
Монопольная блокировка таблицы FCB |
Монопольная блокировка таблицы FCB |
Монопольная блокировка таблицы FCB |
Ссылки и разыменовывание этих структур данных также должны соответствовать определенным соглашениям.
Когда число ссылок, связанных с любой из структур данных, падает до 1 (в большинстве случаев единственная ссылка хранится в таблице имен), структура данных является потенциальным кандидатом для завершения. Структура данных может быть либо завершена немедленно, либо ее можно пометить для очистки. Оба этих метода реализуются в RDBSS. Когда во время разыменования выполняются требования к блокировке, структуры данных немедленно завершаются. Исключением является реализация оптимизации отложенной операции (например, разыменовка структуры FCB). В противном случае структура данных помечается для очистки.
Сетевой мини-перенаправитель должен иметь монопольную блокировку для таблицы NetName, чтобы вызвать подпрограмму завершения.
Чтобы выполнить создание для одной из этих структур данных, драйвер сетевого мини-перенаправления должен выполнить примерно следующее:
getshared();lookup();
if (failed) {
release(); getexclusive(); lookup();
if ((failed) { create(); }
}
deref();
release();
После успешного получения блокировки вставьте узел в таблицу, снимите блокировку, а затем посмотрите, доступен ли сервер. Если сервер доступен, настройте остальные сведения и разблокируйте всех, кто ожидает на том же сервере (структуры SRV_CALL или NET_ROOT).