函式角色類型的重複進入點
對於大部分的函式角色類型,SDV 假設驅動程式對於每個進入點最多都有一個回呼函式。 不過,有一些函式角色類型可以有多個相關聯的事件回呼函式。 例如,KMDF 驅動程式可能會有多個 EvtTimerFunc 或 EvtDpcFunc 回呼函式, (使用EVT_WDF_TIMER和EVT_WDF_DPC角色類型注釋) 。 在此情況下,SDV 會將整數附加至 Sdv-map.h 中的函式類型。 例如,如果您的驅動程式有兩個 DPC 回呼函式,SDV 會將它們對應至 fun_WDF_DPC_1 和 fun_WDF_DPC_2。
如果驅動程式超過角色類型的回呼函式數目上限,SDV 會顯示下列訊息。
Static Driver Verifier found more than one entry point for '[role type]'
如果函式角色類型具有比 SDV 支援更多的進入點,驅動程式不一定有問題。 不過,若要取得精確的驗證結果,您必須編輯 Sdv.-map.h 檔案來移除重複的專案。
例如,下列 Sdv-map.h 檔案顯示有兩個使用 EVT_WDF_REQUEST_COMPLETION_ROUTINE 角色類型標注 的 CompletionRoutine 函式。 在 Sdv-map.h 檔案中,SDV 會將 EvtRequestReadCompletionRoutine 和 EvtRequestWriteCompletionRoutine 定義為 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
若要移除重複專案,請將第二個完成常式批註化, (以兩個批註分隔符號取代 #define 中的#d () // 。 然後設定 Approved=true 並執行驗證。
#define fun_WDF_REQUEST_COMPLETION_ROUTINE EvtRequestReadCompletionRoutine
//efine fun_WDF_REQUEST_COMPLETION_ROUTINE EvtRequestWriteCompletionRoutine
檢視使用一個完成常式進行驗證的結果之後,請再次編輯 Sdv-map.h 檔案,但這次將剛驗證的完成常式批註化,並移除批註 (將 取代 // 為未驗證完成例 程#d) 。 然後再次執行 SDV。
支援多個進入點的函式角色類型
某些函式角色類型支援多個專案。 當專案數目超過支援的最大值時,SDV 也會將這些專案報告為重複的專案。 您可以透過選擇性地批註 Sdv-map.h 檔案中回呼常式 的#define 語句,並個別驗證,以處理重複專案的方式處理這些額外的專案。 例如,如果您的驅動程式有八個 DPC 回呼函式, (使用EVT_WDF_DPC角色類型) ,您可以執行下列動作:
編輯 Sdv-map.h,並批註fun_WDF_DPC_5至 fun_WDF_DPC_8的 define 語句。
在驅動程式上執行 SDV。
然後再次編輯 Sdv-map.h,以透過 fun_WDF_DPC_8 定義fun_WDF_DPC_5,並批註fun_WDF_DPC_1至 fun_WDF_DPC_4。
在驅動程式上執行 SDV。
如需可有多個回呼函式的函式角色類型清單,請參閱 靜態驅動程式驗證程式 KMDF 注釋 。 此清單會顯示 SDV 針對這些角色類型所支援的回呼函式數目上限。