Функция RxFinalizeNetFcb (rxprocs.h)
RxFinalizeNetFCB завершает указанную структуру FCB. Вызывающий объект должен иметь монопольную блокировку на NET_ROOT, связанной с FCB.
Синтаксис
BOOLEAN RxFinalizeNetFcb(
[out] OUT PFCB ThisFcb,
[in] IN BOOLEAN RecursiveFinalize,
[in] IN BOOLEAN ForceFinalize,
[in] IN LONG ReferenceCount
);
Параметры
[out] ThisFcb
Указатель на завершаемую структуру FCB.
[in] RecursiveFinalize
Значение, указывающее, следует ли выполнять рекурсивное завершение.
[in] ForceFinalize
Значение, указывающее, следует ли принудительно завершать, независимо от количества ссылок.
Если этот параметр имеет значение FALSE, то элемент NodeReferenceCount fcb должен иметь значение 1 для завершения fcb.
[in] ReferenceCount
Количество ссылок на FCB, которое по-прежнему будет разрешать принудительное завершение.
Возвращаемое значение
RxFinalizeNetFCB возвращает значение TRUE при успешном выполнении или false , если завершение не выполнено:
Комментарии
Подпрограмма RxFinalizeNetFCB обычно не вызывается драйверами сетевого мини-перенаправления напрямую. RDBSS вызывает эту подпрограмму внутренне при получении пакета запроса ввода-вывода для IRP_MJ_CLOSE. Этот IRP обычно получается RDBSS в ответ на запрос приложения пользовательского режима, запрашивающего операцию закрытия файла. Такой IRP также может выдать другой драйвер ядра.
Стратегия тесной обработки в RDBSS основана на аксиоме, что рабочая нагрузка на сервере должна быть по возможности сведена к минимуму. Существует несколько приложений, которые многократно закрывают и открывают один и тот же файл (например, пакетная обработка файлов). В этих случаях открывается один и тот же файл, считывается строка из буфера, файл закрывается и один и тот же набор операций повторяется снова и снова.
Это обрабатывается в RDBSS путем отложенной обработки запроса закрытия. Между выполнением запроса и запуском обработки запроса на закрытие происходит задержка в 10 секунд. Откроется окно, в течение которого последующая операция открытия может быть свернута на существующий SRV_OPEN. Интервал времени можно настроить в соответствии с этими требованиями.
Перед вызовом RxFinalizeNetFCB блокировка структуры FCB должна быть получена в монопольном режиме.
Если параметр RecursiveFinalize имеет значение FALSE, rxFinalizeNetFCB завершится ошибкой при наличии невыполненных ссылок на FCB (члены OpenCount или CleanCount структуры FCB не равны нулю).
Если параметр ForceFinalize имеет значение TRUE, RxFinalizeNetFCB вызывает в системе assert в проверенных сборках.
После рекурсивного завершения количество ссылок, связанных с FCB, может быть не более 1 для дальнейшей завершения. Это окончательное число ссылок относится к таблице имен префиксов NET_ROOT. Фактическое завершение состоит из двух частей:
- Если число ссылок равно 1 или параметр ForceFinalize имеет значение TRUE, RxFinalizeNetFCB завершает fcb.
- Если количество ссылок равно нулю, fcb завершается и освобождается память, используемая для FCB.
Требования
Требование | Значение |
---|---|
Целевая платформа | Персональный компьютер |
Верхняя часть | rxprocs.h (включая Rxprocs.h) |
IRQL | <= APC_LEVEL |