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


Подключения и блокировка структуры файлов

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

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