Suporte a clientes Kernel-Mode em drivers UMDF

Este tópico descreve como um driver umDF (User-Mode Driver Framework) dá suporte a clientes no modo kernel, começando no UMDF versão 2.

Um cliente no modo kernel é um driver no modo kernel que envia solicitações de E/S para o driver UMDF. O driver do modo kernel pode estar acima do driver UMDF, na mesma pilha de dispositivos, ou pode estar em uma pilha de dispositivos diferente.

O driver do modo kernel pode encaminhar solicitações de E/S recebidas de um aplicativo no modo de usuário ou pode criar novas solicitações de E/S e enviá-las para o driver de modo de usuário.

Como dar suporte a clientes no modo kernel em um driver UMDF

Para habilitar o suporte de um driver UMDF para clientes no modo kernel, o arquivo INF do driver UMDF deve incluir uma diretiva UmdfKernelModeClientPolicy em seu INF DDInstall. Seção WDF .

A estrutura fornece dois métodos úteis para drivers que dão suporte a clientes no modo kernel. Um driver pode chamar o método WdfRequestGetRequestorMode para determinar se uma solicitação de E/S veio do modo kernel ou do modo de usuário. Se a solicitação de E/S veio do modo de usuário, o driver pode chamar WdfRequestIsFromUserModeDriver para determinar se a solicitação veio de um aplicativo ou de outro driver de modo de usuário.

Restrições em drivers no modo kernel

Um driver UMDF poderá processar solicitações de E/S de um driver no modo kernel somente se o driver do modo kernel atender aos seguintes requisitos:

  • O driver de modo kernel deve estar em execução em IRQL = PASSIVE_LEVEL ao enviar a solicitação de E/S.

  • A menos que o driver tenha definido a diretiva INF UmdfFileObjectPolicy como AllowNullAndUnknownFileObjects, cada solicitação de E/S que um driver de modo kernel envia a um driver de modo de usuário deve ter um objeto de arquivo associado. A estrutura deve ter sido notificada anteriormente de que o gerenciador de E/S criou o objeto de arquivo. (Essa notificação faz com que a estrutura chame a função de retorno de chamada EvtDeviceFileCreate do driver de modo de usuário, mas essa função de retorno de chamada é opcional.)

  • A solicitação de E/S não pode conter um código de função IRP_MJ_INTERNAL_DEVICE_CONTROL .

  • Os buffers da solicitação de E/S não devem conter ponteiros para informações adicionais, pois o driver de modo de usuário não pode desreferenciar os ponteiros.

  • Se a solicitação de E/S contiver um código de controle de E/S que especifica o método de acesso ao buffer "nenhum", o driver de modo kernel deverá enviar a solicitação de E/S no contexto de processo do aplicativo que criou a solicitação de E/S. Para obter mais informações sobre como dar suporte ao método "nenhum" em um driver UMDF, consulte Gerenciando métodos de acesso a buffer em drivers UMDF.

  • O driver UMDF pode modificar os dados de saída de uma solicitação de E/S, no modo de usuário. Portanto, o driver do modo kernel deve validar todos os dados de saída recebidos do driver de modo de usuário.

  • O cliente do modo kernel normalmente deve validar o valor informações que um driver UMDF passa para WdfRequestCompleteWithInformation. Se o cliente for um driver KMDF, ele poderá chamar WdfRequestGetCompletionParams para obter essas informações em uma estrutura IO_STATUS_BLOCK.

    Normalmente, a estrutura não valida o valor das informações que um driver UMDF passa para WdfRequestCompleteWithInformation. (Esse parâmetro geralmente especifica o número de bytes transferidos.) A estrutura valida o valor das informações somente para buffers de saída e somente para o método de acesso a dados de E/S em buffer . (Por exemplo, a estrutura verifica se o número de bytes transferidos não excede o tamanho do buffer de saída de uma operação de leitura, se o método de acesso tiver E/S em buffer.)