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:
HwResetBus. O significado de "barramento" pode ser definido pelo desenvolvedor do VMiniport.
HwFreeAdapterResources. Essa rotina é chamada quando o adaptador virtual está sendo removido para que o VMiniport possa liberar todos os recursos alocados durante a inicialização.
As seguintes rotinas de retorno de chamada são opcionais, embora um VMiniport possa ter que implementar algumas delas dependendo de sua arquitetura exclusiva:
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.
No primeiro estágio, a rotina DriverEntry do VMiniport chama StorPortInitialize com um ponteiro para sua estrutura de HW_INITIALIZATION_DATA inicializada.
O Storport chama o retorno de chamada HwFindAdapter do VMiniport com uma estrutura de PORT_CONFIGURATION_INFORMATION alocada e parcialmente inicializada do Storport. A função principal de HwFindAdapter é concluir a inicialização de PORT_CONFIGURATION_INFORMATION, incluindo a configuração do membro VirtualDevice como TRUE.
Depois que HwFindAdapter retornar com êxito , o Storport chamará o retorno de chamada HwInitialize do VMiniport para concluir a inicialização do VMiniport.
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.