Registro de driver e controle iniciar/parar
Quando o sistema operacional é iniciado, o Windows carrega o RDBSS e todos os drivers de minidiretório de rede com base nas configurações no Registro. Para um driver de minidiretório de rede monolítico, que é vinculado estaticamente com rdbsslib.lib, o driver deve chamar a rotina RxDriverEntry de sua rotina DriverEntry para inicializar a cópia da biblioteca RDBSSLIB vinculada ao driver de rede. Nesse caso, a rotina RxDriverEntry deve ser chamada antes que quaisquer outras rotinas RDBSS sejam chamadas e usadas. Para um driver de minidiretório de rede não monolítico (o redirecionador SMB da Microsoft), o driver de dispositivo rdbss.sys é inicializado em sua própria rotina driverEntry quando carregado.
Um minidiretório de rede registra-se com RDBSS quando o driver é carregado pelo kernel e cancela o registro com RDBSS quando o driver é descarregado. Um minidiretório de rede informa ao RDBSS que ele foi carregado chamando RxRegisterMinirdr, a rotina de registro exportada do RDBSS. Como parte desse processo de registro, o minidiretório de rede passa um parâmetro para RxRegisterMinirdr que é um ponteiro para uma estrutura grande, MINIRDR_DISPATCH. Essa estrutura contém informações de configuração para o minidiretório de rede e uma tabela de expedição de ponteiros para rotinas de retorno de chamada implementadas pelo driver de kernel de minidiretório de rede. O RDBSS faz chamadas para o driver de minidiretório de rede por meio dessa lista de rotinas de retorno de chamada.
A rotina RxRegisterMinirdr define todas as rotinas de expedição do driver do driver de minidiretório de rede para apontar para a rotina de expedição rdbss de nível superior, RxFsdDispatch. Um minidiretório de rede pode substituir esse comportamento salvando seus próprios pontos de entrada e reescrevendo a expedição do driver com seus próprios pontos de entrada após a chamada para RxRegisterMinirdr retornar ou definindo um parâmetro especial ao chamar RxRegisterMinirdr.
O driver de minidiretório de rede não inicia a operação até receber uma chamada para sua rotina MRxStart , uma das rotinas de retorno de chamada passadas na estrutura de MINIRDR_DISPATCH. A rotina de retorno de chamada mrxStart deve ser implementada pelo driver de minidiretório de rede se quiser receber rotinas de retorno de chamada para operações, a menos que o minidiretor de rede preserve seus próprios pontos de entrada de expedição de driver. Caso contrário, o RDBSS permitirá apenas os seguintes pacotes de solicitação de E/S até que o MrxStart retorne com êxito:
- Solicitações IRP para dispositivo cria e operações de dispositivo em que FileObject-FileName.Length> no IRPSP é zero e FileObject-RelatedFileObject> é NULL.
Para qualquer outra solicitação IRP, a rotina de expedição do RDBSS RxFsdDispatch retornará uma status de STATUS_REDIRECTOR_NOT_STARTED.
A rotina de expedição do RDBSS também falhará nas solicitações para os seguintes pacotes de solicitação de E/S:
IRP_MJ_CREATE_MAILSLOT
IRP_MJ_CREATE_NAMED_PIPE
A rotina de retorno de chamada mrxStart implementada pelo minidiretório de rede é chamada pelo RDBSS quando a rotina RxStartMinirdr é chamada. A rotina RDBSS RxStartMinirdr geralmente é chamada como resultado de uma solicitação FSCTL (código de controle de E/S) ou código de controle de E/S (IOCTL) de um aplicativo ou serviço no modo de usuário para iniciar o minidiretório de rede. A chamada para RxStartMinirdr não pode ser feita a partir da rotina DriverEntry do minidiretório de rede após uma chamada bem-sucedida para RxRegisterMinirdr, pois parte do processamento inicial requer que a inicialização do driver seja concluída. Depois que a chamada RxStartMinirdr é recebida, o RDBSS conclui o processo inicial chamando a rotina MrxStart do minidiretório de rede. Se a chamada para MrxStart retornar êxito, o RDBSS definirá o estado interno do minidiretório no RDBSS como RDBSS_STARTED.
O RDBSS exporta uma rotina, RxSetDomainForMailslotBroadcast, para definir o domínio para transmissões de emaillot. Essa rotina será usada durante o registro se o minidiretório de rede der suporte a maillots.
Uma rotina de conveniência, __RxFillAndInstallFastIoDispatch, exportada pelo RDBSS pode ser usada para copiar todos os ponteiros de rotina do driver IRP_MJ_XXX para lidar com o processamento de solicitações de E/S para os vetores de expedição de E/S rápidos comparáveis, mas essa rotina só funciona para drivers não monolíticos.
O RDBSS também exporta rotinas para notificar o RDBSS de que o minidiretório de rede está sendo iniciado ou interrompido. Essas chamadas serão usadas se um minidiretório de rede incluir um serviço de administração do modo de usuário ou um aplicativo utilitário que inicia e interrompe o redirecionador. Esse serviço ou aplicativo no modo de usuário pode enviar solicitações FSCTL ou IOCTL personalizadas para o driver de minidiretório de rede para indicar que ele deve iniciar ou parar. O redirecionador pode chamar as rotinas RDBSS RxStartMinirdr ou RxStopMinirdr para notificar o RDBSS para iniciar ou parar esse minidiretório de rede.
A tabela a seguir lista as rotinas de controle de início/parada e registro do driver RDBSS.
Rotina | Descrição |
---|---|
Essa rotina é chamada por um driver de minidiretório de rede monolítico de sua rotina DriverEntry para inicializar o RDBSS. Para drivers não monolíticos, essa rotina de inicialização é equivalente à rotina DriverEntry do driver de dispositivo rbss.sys. |
|
Essa rotina é chamada por um driver de minidiretório de rede para registrar o driver com RDBSS, o que adiciona as informações de registro a uma tabela de registro interno. O RDBSS também cria um objeto de dispositivo para o minidiretório de rede. |
|
Essa rotina é chamada por um driver de minidiretório de rede para definir o domínio usado para transmissões de emaillot, se houver suporte para emailslots pelo driver. |
|
Essa rotina inicia um minidiretório de rede que chamou para se registrar. O RDBSS também registrará o driver de minidiretório de rede como um provedor UNC com o MUP se o driver indicar suporte para nomes UNC. |
|
Essa rotina interrompe um driver de minidiretório de rede. Um driver parado não receberá mais novos comandos, exceto solicitações IOCTL ou FSCTL. |
|
Essa rotina é chamada por um driver de minidiretório de rede para desinscrever o driver com RDBSS e remover as informações de registro da tabela de registro rdbss interna. |
|
Essa rotina é uma função embutida definida em rxstruc.h que é chamada por um driver de minidiretório de rede para desinscrever o driver com RDBSS e remover as informações de registro da tabela de registro rdbss interna. A função embutida RxUnregisterMinirdr chama internamente RxpUnregisterMinirdr. |
|
Essa rotina preenche um vetor de expedição de E/S rápido para ser idêntico ao vetor de E/S de expedição normal e o instala no objeto driver associado ao objeto de dispositivo passado. |
A macro a seguir é definida no arquivo de cabeçalho mrx.h que chama uma dessas rotinas. Normalmente, essa macro é usada em vez de chamar a rotina __RxFillAndInstallFastIoDispatch diretamente.
Macro | Descrição |
---|---|
RxFillAndInstallFastIoDispatch(__devobj, __fastiodisp) |
Essa macro chama __RxFillAndInstallFastIoDispatchpara preencher um vetor de expedição de E/S rápido para ser idêntico ao vetor de E/S de expedição normal e o instala no objeto de driver associado ao objeto de dispositivo passado. |