Implementando um driver de miniporto virtual do Storport

Esta página fornece informações de implementação de alto nível para um VMiniport (driver de miniporto virtual) do Storport. A interface VMiniport é definida em storport.h.

As considerações de design são exclusivas para vários VMiniports, portanto, as especificidades da implementação não são incluídas aqui.

A interface VMiniport

Esta seção lista as funções, retornos de chamada e estruturas mais proeminentes que um VMiniport implementa/usa. Algumas funções e retornos de chamada são necessários; os retornos de chamada opcionais são exclusivos para o design de um VMiniport.

  • DriverEntry, que é a primeira rotina que o sistema operacional chama depois que o VMiniport é carregado. Essa rotina é necessária.

  • HW_INITIALIZATION_DATA, que é uma estrutura alocada por Vminiport e inicializada que o VMiniport passa para Storport durante a inicialização. O VMiniport fornece ponteiros para suas funções de retorno de chamada nessa estrutura.

    As seguintes rotinas de retorno de chamada são necessárias:

    As seguintes rotinas de retorno de chamada são opcionais, embora um VMiniport possa ter que implementar algumas delas dependendo de sua arquitetura exclusiva:

    • HwInitializeTracing

    • HwCleanupTracing. Essa rotina é necessária quando HwInitializeTracing aponta para uma rotina de retorno de chamada; caso contrário, essa rotina é opcional e é exclusiva de um VMiniport.

    • HwProcessServiceRequest. Essa rotina recebe um IRP "retorno de chamada reverso", que será concluído quando o VMiniport atualizar o chamador (como um aplicativo de modo de usuário ou driver no modo kernel) ou exigir que o chamador faça algo em nome do VMiniport.

    • HwCompleteServiceIrp. Essa rotina é necessária quando HwProcessServiceRequest aponta para uma rotina de retorno de chamada; caso contrário, essa rotina é opcional e é exclusiva de um VMiniport. HwCompleteServiceIrp é chamado quando o adaptador virtual está sendo removido para que o VMiniport possa concluir todos os IRPs de retorno de chamada reverso que possam estar pendentes.

    O VMiniport também deve definir os seguintes membros da estrutura HW_INITIALIZATION_DATA :

    • Defina HwInitializationDataSize como sizeof(HW_INITIALIZATION_DATA).

    • Defina AdapterInterfaceType como Interno, o que indica ao Storport que esse é um adaptador virtual.

    • Defina HwBuildIo como NULL.

    O driver Vminiport define outros campos conforme necessário. Os campos não utilizados devem ser definidos como zero.

  • PORT_CONFIGURATION_INFORMATION, que é uma estrutura alocada pelo Storport. O Storport inicializa alguns membros PORT_CONFIGURATION_INFORMATION e, em seguida, o passou para o retorno de chamada HwFindAdapter do VMiniport , em que o VMiniport conclui a inicialização. Como essa estrutura é pré-inicializada pelo Storport, o HWFindAdapter não deve zerar a estrutura. Um VMiniport deve definir VirtualDevice como TRUE.

Inicialização do VMiniport

Um VMiniport tem três estágios de inicialização.

E/S do VMiniport

O Storport chama um retorno de chamada HwStartIo do VMiniport para iniciar uma solicitação de E/S. No Storport, uma solicitação de E/S é descrita usando um SCSI_REQUEST_BLOCK ou STORAGE_REQUEST_BLOCK (SRB padrão ou estendido, respectivamente).

Ao contrário de um driver de miniporto físico, Storport não chama HwBuildIo em um Vminiport antes de chamar HwStartIo.

Nenhum bloqueio é mantido antes de chamar HwStartIo. A profundidade da fila padrão para cada unidade lógica exposta por meio da interface do miniporto virtual é 250.