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


Изменения MUP в Microsoft Windows Vista

Windows Vista реализует ряд изменений в нескольких поставщиках UNC (MUP), которые могут повлиять на перенаправители сети.

MUP и клиент распределенной файловой системы (DFS) находятся в отдельных двоичных файлах. Компонент MUP находится в mup.sys, а клиент DFS находится в dfsc.sys. В Windows Server 2003, Windows XP и Windows 2000 компонент ядра MUP, mup.sys, также содержал клиент DFS.

В Windows Vista определена новая модель перенаправителя:

  • MUP регистрируется в качестве файловой системы в диспетчере ввода-вывода путем вызова IoRegisterFileSystem.

  • Сетевой перенаправитель регистрируется в MUP с помощью FsRtlRegisterUncProviderEx , новой процедуры, представленной в Windows Vista.

  • Перенаправитель сети передает неименованный объект устройства в FsRtlRegisterUncProviderEx.

  • Перенаправитель сети передает имя устройства в FsRtlRegisterUncProviderEx.

  • Сетевой перенаправитель не регистрируется в качестве файловой системы в диспетчере ввода-вывода (не вызывает IoRegisterFileSystem).

  • Все вызовы из MUP к перенаправителю сети, включая разрешение префиксов, ioCTL и FSCTL, выполняются с включенными apcs. Ожидается, что все вызовы из других компонентов в MUP будут выполняться с включенными apcs. Если вызовы используются с FsRtlCancellableWaitForSingleObject или FsRtlCancellableWaitForMultipleObjects, новыми подпрограммами, представленными в Windows Vista, это гарантирует, что длительные ожидания могут быть прерваны, если поток, выдавший запрос ввода-вывода, будет прерван.

  • Разрешение префиксов выполняется с помощью IOCTL_REDIR_QUERY_PATH_EX , нового IOCTL, появилось в Windows Vista.

  • Имя устройства перенаправителя сети, зарегистрированное в MUP, становится символьной ссылкой на объект устройства MUP.

Для сетевого перенаправления, соответствующего модели перенаправителя Windows Vista, MUP создает символьную ссылку в пространстве имен диспетчера объектов с именем устройства, указанным сетевым перенаправлением в вызове FsRtlRegisterUncProviderEx. Целью этой символьной ссылки является объект устройства MUP (\Device\Mup).

Преимущество регистрации MUP в качестве файловой системы и имя устройства перенаправления сети, являющееся символьной ссылкой на объект устройства MUP, заключается в том, что все операции ввода-вывода удаленной файловой системы, а не только на основе имен, проходят через MUP. Таким образом, драйверы фильтров файловой системы, которые должны находиться в удаленном стеке файловой системы, могут просто подключиться к объекту устройства MUP. Драйверам фильтров файловой системы больше не нужно жестко задавать имена объектов устройств поставщика (например, \Device\LanmanRedirector) в их драйвере. Таким образом, драйверы фильтров файловой системы могут отслеживать все операции ввода-вывода, выданные всем сетевым перенаправлениям с помощью одного вложения. Это также исключает дублирование операций ввода-вывода, наблюдаемых драйверами фильтров файловой системы до Windows Vista, которые подключаются отдельно к DFS (mup.sys) и отдельным сетевым перенаправлениям (например,\Device\LanmanRedirector), чтобы отслеживать операции ввода-вывода для обоих.

Драйвер фильтра файловой системы, подключенный к объекту устройства MUP, может выборочно фильтровать трафик, отправляемый определенным сетевым перенаправителям. В этом случае драйвер фильтра сопоставляет имена устройств сетевых перенаправителей с идентификаторами поставщиков путем вызова подпрограммы FsRtlMupGetProviderIdFromName . Затем драйвер фильтра может определить, следует ли фильтровать трафик для определенного объекта файла, сравнив идентификатор поставщика, полученный путем вызова подпрограммы FsRtlMupGetProviderInfoFromFileObject с идентификаторами поставщиков заинтересованных сетевых директоров.

Для сетевого перенаправления, соответствующего модели перенаправителя Windows Vista:

  • Все объекты файлов в стеке удаленной файловой системы разрешаются в MUP. Таким образом, IoGetDeviceAttachmentBaseRef возвращает объект устройства для MUP, а не сетевой перенаправитель, которому принадлежит объект файла. Однако содержимое объекта файла по-прежнему принадлежит сетевому перенаправлению.

  • IRP_MJ_CREATE, выдаваемый на имя устройства сетевого перенаправителя (например,\Device\LanmanRedirector\server\share), будет предназначен для этого перенаправителя сети без разрешения префикса MUP, точно так же, как в Windows Server 2003, Windows XP и Windows 2000.

Сетевые перенаправления, не основанные на RDBSS Windows Vista (динамическое или статическое связывание), называются устаревшими перенаправлениями. К этим устаревшим сетевым перенаправлениям относятся:

  • Сетевые перенаправления, написанные для Windows Server 2003, Windows XP и Windows 2000, которые регистрируются непосредственно в MUP с помощью FsRtlRegisterUncProvider.

  • Сетевые мини-перенаправления, написанные для Windows Server 2003, Windows XP и Windows 2000, которые статически связываются с библиотекой rdbsslib.lib для Windows Server 2003, Windows XP или Windows 2000.

  • Сетевые перенаправления, написанные для Windows Vista, которые регистрируются непосредственно в MUP с помощью FsRtlRegisterUncProviderEx.

Сетевые мини-перенаправления, которые динамически связываются с windows Vista RDBSS (rdbss.sys), автоматически соответствуют модели перенаправителя Windows Vista, так как RDBSS регистрируется в MUP с помощью FsRtlRegisterUncProviderEx. Сетевые мини-перенаправления, которые статически связываются с RDBSS Windows Vista (rdbsslib.lib), также автоматически соответствуют модели перенаправителя Windows Vista, так как RDBSS регистрируется в MUP с помощью FsRtlRegisterUncProviderEx.

Устаревший перенаправитель сети, написанный для Windows Vista, который регистрируется непосредственно в MUP, должен соответствовать модели перенаправителя Windows Vista.

Сетевые перенаправления, написанные для Windows Server 2003, Windows XP и Windows 2000, которые регистрируются в MUP непосредственно с помощью FsRtlRegisterUncProvider , работают точно так же, как и в Windows Server 2003, Windows XP и Windows 2000. Сетевые мини-перенаправления, написанные для Windows Server 2003, Windows XP и Windows 2000, которые статически связываются с библиотекой rdbsslib.lib для Windows Server 2003, Windows XP и Windows 2000, продолжают работать точно так же, как и в Windows Server 2003, Windows XP и Windows 2000. Эти устаревшие сетевые перенаправления и мини-перенаправления демонстрируют следующее поведение:

  • Они будут видны драйверам фильтров файловой системы, которые отслеживают регистрацию файловой системы.

  • Их объекты устройств имеют имена. Имена устройств не являются символическими ссылками и не указывают на \Device\MUP.

  • Объекты файлов разрешаются в именованный объект устройства сетевого перенаправителя.

  • MUP участвует только в операции разрешения префиксов. После определения поставщика сети MUP "выходит из пути", возвращая STATUS_REPARSE. Все последующие операции не будут проходить через MUP.

Это поведение было сохранено, чтобы предотвратить двойную фильтрацию, которая в противном случае произошла бы, если имя устройства поставщика было символьной ссылкой на \Device\MUP. Эта двойная фильтрация будет происходить по следующим причинам:

  • Драйвер фильтра файловой системы уже подключен к \Device\MUP.

  • Драйвер фильтра файловой системы подключается к любой регистрируемой файловой системе. Так как сетевые перенаправители, использующие именованные объекты устройств, регистрируются как файловые системы, драйвер фильтра файловой системы будет фильтровать один и тот же ввод-вывод дважды.

Вызовы MUP в Windows Vista выполняются с включенными apcs, что имеет следующие последствия:

  • При необходимости важно защитить пути кода, вызываемые из MUP, от приостановки потока соответствующими средствами, особенно IOCTL_REDIR_QUERY_PATH обработчиками. Обратите внимание, что приостановка потока — это операция "неограниченного ожидания", которая может длиться долго.

  • Важно убедиться, что любая операция "ожидание ввода-вывода", включающая потоки пользовательского режима (в отличие от системных потоков), всегда использует "отменяемые ожидания". Дополнительные сведения см. в подпрограммах FsRtlCancellableWaitForSingleObject и FsRtlCancellableWaitForMultipleObjects .

  • Взаимоблокировки могут возникать, когда поток приостанавливается, удерживая некоторую важную блокировку. Важно выполнять тесты при наличии произвольной приостановки потоков пользовательского режима, чтобы проверка для условий взаимоблокировки.

  • Важно выполнить тесты, чтобы убедиться, что "ожидание операций ввода-вывода" действительно можно отменить и что приложение в пользовательском режиме может завершить поток достаточно быстро, чтобы приложение не было в состоянии "не отвечать" при попытке завершить этот поток.

Размер кэша префиксов и время ожидания, используемые MUP в Windows Vista, теперь управляются следующими значениями реестра:

  • PrefixCacheSizeInKB

  • PrefixCacheTimeoutInSeconds.

Эти значения реестра можно изменять динамически без перезагрузки. Эти значения реестра находятся в следующем разделе реестра:

HKLM\System\CurrentControlSet\Services\Mup\Parameters.

Значение реестра ProviderOrder, определяющее порядок, в котором MUP выдает запросы разрешения префиксов к отдельным перенаправителям, можно динамически изменять без перезагрузки системы. Это значение реестра находится в следующем разделе реестра:

HKLM\CurrentControlSet\Control\NetworkProvider\Order

В Windows Vista MUP выполняет разрешение префиксов по-разному в зависимости от того, зарегистрирован ли перенаправление сети с помощью MUP путем вызова FsRtlRegisterUncProvider или FsRtlRegisterUncProviderEx. Устаревшие сетевые перенаправления, которые регистрируются в MUP путем вызова FsRtlRegisterUncProvider , получат IOCTL_REDIR_QUERY_PATH запрос на разрешение префиксов. Это тот же метод, который используется в Windows Server 2003, Windows XP и Windows 2000.

Сетевые перенаправления, которые соответствуют модели перенаправителя Windows Vista и регистрируются в MUP путем вызова FsRtlRegisterUncProviderEx , получат IOCTL_REDIR_QUERY_PATH_EX запрос на разрешение префиксов. Обратите внимание, что в Windows Vista сетевые мини-перенаправления, статически связанные с rdbsslib.lib или динамически связанные с rdbss.sys будут вызывать FsRtlRegisterUncProviderEx косвенно через RDBSS.

Входной и выходной буферы для IOCTL_REDIR_QUERY_PATH_EX:

Параметр доступен в Формат структуры данных

Входной буфер

IrpSp-> Parameters.DeviceIoControl.Type3InputBuffer

QUERY_PATH_REQUEST_EX

Выходной буфер

IRP-UserBuffer>

QUERY_PATH_RESPONSE

IOCTL и структуры данных определяются в файле ntifs.h. Буферы выделяются из нестраничного пула.

Сетевые перенаправления должны учитывать только отправителей режима ядра для этого IOCTL, проверяя, что Irp-RequestorMode> имеет значение KernelMode.

MUP использует структуру данных QUERY_PATH_REQUEST_EX для сведений о запросе.

typedef struct _QUERY_PATH_REQUEST_EX {
  PIO_SECURITY_CONTEXT  pSecurityContext;
 ULONG  EaLength;
 PVOID  pEaBuffer;
  UNICODE_STRING  PathName;
} QUERY_PATH_REQUEST_EX, *PQUERY_PATH_REQUEST_EX;
Элемент структуры Описание

pSecurityContext

Указатель на контекст безопасности.

EaLength

Длина буфера расширенных атрибутов в байтах.

pEaBuffer

Указатель на буфер расширенных атрибутов.

PathName

Строка Юникода, не заканчивающаяся значением NULL, для пути к> общей папке><сервера><формы<.

Поставщики UNC должны использовать структуру данных QUERY_PATH_RESPONSE для получения сведений об ответе.

typedef struct _QUERY_PATH_RESPONSE {
 ULONG  LengthAccepted;
} QUERY_PATH_RESPONSE, *PQUERY_PATH_RESPONSE;
Элемент структуры Описание

LengthAccepted

Длина в байтах префикса, затребованного поставщиком из пути строки Юникода, указанного в элементе PathName структуры QUERY_PATH_REQUEST_EX.

Обратите внимание, что IOCTL_REDIR_QUERY_PATH_EX является METHOD_NEITHER IOCTL. Это означает, что входные и выходные буферы могут находиться не по одному адресу. Распространенной ошибкой поставщиков UNC является предположение, что входной и выходной буфер совпадают, и использовать указатель входного буфера для предоставления ответа.

Когда поставщик UNC получает запрос IOCTL_REDIR_QUERY_PATH_EX, он должен определить, может ли он обрабатывать UNC-путь, указанный в элементе PathName структуры QUERY_PATH_REQUEST_EX. В этом случае поставщик UNC должен обновить элемент LengthAccepted структуры QUERY_PATH_RESPONSE длиной в байтах запрошенного префикса и завершить IRP STATUS_SUCCESS. Если поставщик не может обработать указанный UNC-путь, он должен завершить запрос IOCTL_REDIR_QUERY_PATH_EX с соответствующим кодом ошибки NTSTATUS и не должен обновлять элемент LengthAccepted структуры QUERY_PATH_RESPONSE. Поставщики не должны изменять другие элементы или строку PathName ни при каких условиях.

В Windows Vista мини-перенаправитель сети, основанный на использовании RDBSS, который указывает на поддержку в качестве поставщика UNC, получит это утверждение префикса, как если бы это было обычное создание подключения дерева, аналогично вызову Createfile в пользовательском режиме с установленным флагом FILE_CREATE_TREE_CONNECTION. RDBSS отправит запрос MRxCreateSrvCall мини-перенаправлению сети, за которым следует вызов MRxSrvCallWinnerNotify и MRxCreateVNetRoot. Это утверждение префикса не будет получено в качестве вызова метода MRxLowIOSubmit[LOWIO_OP_IOCTL]. Когда сетевой мини-перенаправитель регистрируется в RDBSS, таблица диспетчеризации драйверов для сетевого мини-перенаправления будет скопирована RDBSS для указания на внутренние точки входа RDBSS. Затем RDBSS получает этот IOCTL_REDIR_QUERY_PATH_EX для мини-перенаправления сети и вызывает MRxCreateSrvCall, MRxSrvCallWinnerNotify и MRxCreateVNetRoot. Исходная IOCTL_REDIR_QUERY_PATH_EX IRP будет содержаться в RX_CONTEXT, переданной в подпрограмму MRxCreateSrvCall . Кроме того, будут изменены следующие элементы в RX_CONTEXT, переданные в MRxCreateSrvCall :

Для элемента MajorFunction задано значение IRP_MJ_CREATE несмотря на то, что исходная IRP была IRP_MJ_DEVICE_CONTROL.

Для элемента PrefixClaim.SuppliedPathName.Buffer задается элемент PathName.Buffer структуры QUERY_PATH_REQUEST_EX.

Для элемента PrefixClaim.SuppliedPathName.Length задается элемент PathName.Length структуры QUERY_PATH_REQUEST_EX.

Элемент Create.ThisIsATreeConnectOpen имеет значение TRUE.

Для элемента Create.ThisIsAPrefixClaim задано значение TRUE.

Для элемента Create.NtCreateParameters.SecurityContext задается элемент SecurityContext структуры QUERY_PATH_REQUEST_EX.

Для элемента Create.EaBuffer задается элемент pEaBuffer структуры QUERY_PATH_REQUEST_EX.

Для элемента Create.EaLength задается элемент EaLength структуры QUERY_PATH_REQUEST_EX.

Элемент Create.Flags будет иметь RX_CONTEXT_CREATE_FLAG_UNC_NAME бит.

Если мини-перенаправитель сети хочет просмотреть сведения о утверждении префикса, он может считывать эти элементы в структуре RX_CONTEXT, передаваемой в MRxCreateSrvCall. В противном случае он может просто попытаться подключиться к общей папке сервера и вернуть STATUS_SUCCESS, если вызов MRxCreateSrvCall был успешным. RDBSS выполнит утверждение префикса от имени мини-перенаправления сети.