Partilhar via


Pontos de entrada duplicados para um tipo de função

Para a maioria dos tipos de função, o SDV pressupõe que o driver tenha, no máximo, uma função de retorno de chamada para cada ponto de entrada. No entanto, há alguns tipos de função de função que podem ter várias funções de retorno de chamada de evento associadas a elas. Por exemplo, um driver KMDF pode ter várias funções de retorno de chamada EvtTimerFunc ou EvtDpcFunc (que usam as anotações de tipo de função EVT_WDF_TIMER e EVT_WDF_DPC). Nesse caso, o SDV acrescenta um inteiro ao tipo de função em Sdv-map.h. Por exemplo, se o driver tiver duas funções de retorno de chamada DPC, o SDV as mapeará para fun_WDF_DPC_1 e fun_WDF_DPC_2.

Se um driver exceder o número máximo de funções de retorno de chamada para um tipo de função, o SDV exibirá a mensagem a seguir.

Static Driver Verifier found more than one entry point for '[role type]'

Se um tipo de função de função tiver mais pontos de entrada do que o SDV dá suporte, não haverá necessariamente algo errado com o driver. No entanto, para obter resultados precisos de verificação, você deve editar o arquivo Sdv.-map.h para remover as entradas duplicadas.

Por exemplo, o arquivo Sdv-map.h a seguir mostra que há duas funções CompletionRoutine que foram anotadas usando o tipo de função EVT_WDF_REQUEST_COMPLETION_ROUTINE. No arquivo Sdv-map.h, o SDV define EvtRequestReadCompletionRoutine e EvtRequestWriteCompletionRoutine como fun_WDF_REQUEST_COMPLETION_ROUTINE.

//Approved=false
#define fun_WDF_DRIVER_DEVICE_ADD OsrFxEvtDeviceAdd
#define fun_WDF_IO_QUEUE_IO_READ OsrFxEvtIoRead
#define fun_WDF_IO_QUEUE_IO_STOP OsrFxEvtIoStop
#define fun_WDF_DEVICE_D0_EXIT OsrFxEvtDeviceD0Exit
#define fun_WDF_REQUEST_COMPLETION_ROUTINE EvtRequestReadCompletionRoutine
#define fun_WDF_REQUEST_COMPLETION_ROUTINE EvtRequestWriteCompletionRoutine
#define fun_WDF_OBJECT_CONTEXT_CLEANUP OsrFxEvtDriverContextCleanup
#define fun_WDF_DEVICE_D0_ENTRY OsrFxEvtDeviceD0Entry
#define fun_WDF_DEVICE_PREPARE_HARDWARE OsrFxEvtDevicePrepareHardware
#define fun_WDF_IO_QUEUE_IO_WRITE OsrFxEvtIoWrite
#define fun_WDF_IO_QUEUE_IO_DEVICE_CONTROL OsrFxEvtIoDeviceControl

Para remover a duplicação, comente a segunda rotina de conclusão (substitua o #d em #define por dois delimitadores de comentário (//). Em seguida, defina Approved=true e execute uma verificação.

#define fun_WDF_REQUEST_COMPLETION_ROUTINE EvtRequestReadCompletionRoutine
//efine fun_WDF_REQUEST_COMPLETION_ROUTINE EvtRequestWriteCompletionRoutine

Depois de exibir os resultados da verificação com a única rotina de conclusão, edite o arquivo Sdv-map.h novamente, mas desta vez comente a rotina de conclusão que acabou de ser verificada e remova o comentário (substitua o // por #d) da rotina de conclusão que não foi verificada. Em seguida, execute o SDV novamente.

Tipos de função de função que dão suporte a vários pontos de entrada

Alguns tipos de função de função dão suporte a várias entradas. Quando o número de entradas excede o máximo com suporte, o SDV também as relata como entradas duplicadas. Você pode tratar essas entradas adicionais da mesma forma que lida com entradas duplicadas, comentando seletivamente as instruções #define para as rotinas de retorno de chamada no arquivo Sdv-map.h e fazendo verificações separadas. Por exemplo, se o driver tiver oito funções de retorno de chamada DPC (que usam o tipo de função EVT_WDF_DPC), você poderá fazer o seguinte:

  • Edite Sdv-map.h e comente as instruções definem para fun_WDF_DPC_5 por meio de fun_WDF_DPC_8.

  • Execute o SDV no driver.

  • Em seguida, edite Sdv-map.h novamente para definir fun_WDF_DPC_5 por meio de fun_WDF_DPC_8 e comentar as instruções de definição para fun_WDF_DPC_1 por meio de fun_WDF_DPC_4.

  • Execute o SDV no driver.

Consulte Anotações kmdf do verificador de driver estático para obter uma lista de tipos de função de função que podem ter mais de uma função de retorno de chamada. A lista mostra o número máximo de funções de retorno de chamada que o SDV dá suporte para esses tipos de função.