Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Для блокировки используется два уровня таблиц соответствия:
Таблица объектов по устройствам для структур 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 |
Финализировать |
Монопольная блокировка таблицы 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).