Блокировка подключений и структуры файлов

Для блокировки используется два уровня таблиц соответствия:

  • Таблица объектов по устройствам для структур 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).