Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Подпрограмма MRxCreateSrvCall вызывается RDBSS, чтобы запросить создание структуры SRV_CALL сети и установить подключение к серверу.
Синтаксис
PMRX_CREATE_SRVCALL PmrxCreateSrvcall;
NTSTATUS PmrxCreateSrvcall(
IN OUT PMRX_SRV_CALL SrvCall,
IN OUT PMRX_SRVCALL_CALLBACK_CONTEXT SrvCallCallBackContext
)
{...}
Параметры
SrvCall
[in, out] Указатель на созданную структуру SRV_CALL.
SrvCallCallBackContext
[in, out] Указатель на контекст обратного вызова, используемый мини-перенаправлением сети для уведомления RDBSSS при завершении запроса MRxCreateSrvCall. Параметр SrvCallCallBackContext указывает на структуру MRX_SRVCALLDOWN_STRUCTURE, содержащую структуру RX_CONTEXT для этого запроса, а также подпрограмму обратного вызова обратного вызова, которая вызывает мини-перенаправление при завершении запроса MRxCreateSrvCall.
Возвращаемое значение
RDBSS ожидает, что MRxCreateSrvCall вернуть STATUS_PENDING при успешном выполнении или сбое. Это поведение приводит к выполнению этого вызова, так как RDBSS ожидает, что этот вызов будет завершен асинхронно. Мини-перенаправление сети должен сопоставлять STATUS_SUCCESS с STATUS_PENDING как возвращаемое значение для MRxCreateSrvCall.
Окончательное состояние завершения возвращается в SrvCallCallCallBackContext->состояние после завершения вызова и подпрограммы в элементе обратного вызова в структуре MRX_SRVCALLDOWN_STRUCTURE вызывается мини-перенаправлением сети. Этот элемент изначально содержит STATUS_BAD_NETWORK_PATH, пока мини-перенаправление сети не изменит это значение при завершении.
Элемент SrvCallCallBackContext->Status содержит STATUS_SUCCESS при успешном выполнении вызова или один из следующих распространенных кодов ошибок при сбое (хотя другие коды ошибок возможны):
| Возвращаемый код | Описание |
|---|---|
| STATUS_BAD_NETWORK_PATH | Указанный сетевой путь является плохим. |
| STATUS_NETWORK_UNREACHABLE | Сеть недоступна. |
Замечания
Две важные абстракции, используемые в интерфейсе RDBSS и мини-перенаправлением сети, являются SRV_CALL структурой и структурой NET_ROOT. Структура SRV_CALL соответствует контексту, связанному с сервером после установки подключения. Структура NET_ROOT соответствует общей папке на сервере (это также может рассматриваться как часть пространства имен, которое было заявлено мини-перенаправлением сети).
Создание структуры SRV_CALL обычно включает по крайней мере одну сетевую круговую поездку. Эта операция может занять значительное время, так как может потребоваться установить сетевое подключение с удаленным ресурсом. Чтобы обеспечить продолжение асинхронных операций, создание структуры SRV_CALL моделировается как двухфазное действие. Каждый вызов мини-перенаправления сети для создания структуры SRV_CALL сопровождается вызовом из мини-перенаправления сети в RDBSS, который указывает состояние завершения запроса. RDBSS предполагает, что MRxCreateSrvCall будет выполняться асинхронно. Поэтому RDBSS ожидает, что MRxCreateSrvCall вернуть STATUS_PENDING. RDBSS будет уведомляться с помощью подпрограммы обратного вызова после завершения вызова.
Ожидается, что реализация мини-перенаправления сети MRxCreateSrvCall возвращает STATUS_PENDING к первоначальному вызову. После завершения обработки мини-перенаправление сети вызывает подпрограмму обратного вызова, передаваемую в рамках параметра SrvCallBackContext, чтобы уведомить RDBSS о завершении вызова и возвратить состояние завершения. Подпрограмма обратного вызова, которую вызывает мини-перенаправление сети, указывается в качестве члена обратного вызова в MRX_SRVCALLDOWN_STRUCTURE параметра SrvCallCallBackContext. Окончательное состояние завершения вызова должно храниться в элементе Status параметра SrvCallCallCallBackContext.
При успешном выполнении мини-перенаправление сети также должен хранить некоторое значение в RecommunicateContext члена SrvCallCallBackContext. Значение, хранящееся в элементе RecommunicateContext, — это значение, которое RDBSS будет передаваться в MRxSrvCallWinnerNotify в параметре RecommunicateContext, если MRxCreateSrvCall. Мини-перенаправление сети также должен заполнить соответствующие данные в параметре SrvCall для созданной структуры SRV_CALL. Обратите внимание, что параметр SrvCall, переданный MRxCreateSrvCall, совпадает с элементом SrvCall в MRX_SRVCALLDOWN_STRUCTURE параметра SrvCallCallCallBackContext. Этот же параметр SrvCall также передается MRxSrvCallWinnerNotify в параметре SrvCall.
Реализация MRxCreateSrvCall в мини-перенаправлении сети также усложняется необходимостью обработки транспортных дескрипторов. Для некоторых интерфейсов, связанных с транспортом, требуется создать и использовать дескриптор для всего взаимодействия. Для создания SRV_CALL структуры может потребоваться установка связанных с транспортом дескрипторов для сетевого взаимодействия. Так как процесс установления сетевого подключения может занять много времени, после установки подключения имеет смысл использовать подключение для связи до тех пор, пока это возможно. После установки дескриптора транспорта к ресурсу удаленной сети его можно повторно использовать любым количеством других запросов приложений. После завершения работы пользовательского приложения дескриптор, связанный с процессом, удаляется. По этой причине создание дескрипторов транспорта в контексте временного процесса пользовательского режима, который может быть коротким, не имеет смысла. Поэтому SRV_CALL структуру обычно необходимо инициализировать в контексте хорошо известного процесса, который не исчезнет, пока эти дескрипторы транспорта используются для обмена данными.
Один из методов, используемых для решения потенциальных проблем с дескрипторами транспорта, заключается в том, чтобы системный процесс RDBSS выделяет дескриптор транспорта. Это влияет на выполнение процедуры MRxCreateSrvCall. Если запрос на MRxCreateSrvCall был выдан в контексте системного процесса RDBSS, этот вызов можно выполнить немедленно и не нужно отправлять в рабочую очередь. Тем не менее, чтобы избежать проблем, если запрос на MRxCreateSrvCall из любого другого процесса, запрос будет размещен в системной рабочей очереди с помощью RxDispatchToWorkerThread для последующего выполнения. RDBSS позже будет использовать один из системных потоков для обработки запроса рабочей очереди и выполнения MRxCreateSrvCall. Это гарантирует, что любые дескрипторы транспорта будут принадлежать системным процессом.
Мини-перенаправление сети может определить, был ли вызов MRxCreateSrvCall получен непосредственно из RDBSS, вызвав RxGetRDBSSProcess. RxGetRDBSSProcess вернет процесс RDBBS, и это значение можно сравнить с текущим процессом, возвращенным с помощью IoGetCurrentProcess. Если вызов MRxCreateSrvCall не был инициирован в контексте системного процесса RDBSS, MRxCreateSrvCall может вернуть STATUS_PENDING и отправить вызов в рабочую очередь с помощью RxDispatchToWorkerThreadдля последующего выполнения RDBSS. Как правило, эти вызовы будут размещены в DelayedWorkQueue.
Разработчик мини-перенаправления сети решает, как реализуется MRxCreateSrvC all. Если процесс создания SRV_CALL может занять значительное время, то MRxCreateSrvCall необходимо выполнить асинхронно. Если требуются дескриптор транспорта, то мини-перенаправление сети должен найти системный процесс, который долговременен для установки этих дескрипторов.
По завершении этого вызова параметр SrvCall следует изменить с помощью сведений о структуре SRV_CALL, обновленных из мини-перенаправления сети.
Мини-перенаправление сети, указывающий на поддержку в качестве поставщика UNC, получит утверждение префикса от нескольких поставщиков UNC (MUP) в качестве вызова MRxCreateSrvCall. Дополнительные сведения об именовании UNC и MUP см. в разделе Поддержка именования UNC и MUP.
Требования
| Требование | Ценность |
|---|---|
| целевая платформа | Настольный |
| заголовка | mrx.h (include Mrx.h) |