Condividi tramite


Uso dei callback dell'estensione WdbgExts

Quando si scrive una DLL di estensione WdbgExts, è possibile esportare determinate funzioni:

  • È necessario esportare una funzione denominata WinDbgExtensionDllInit. Quando il debugger carica la DLL dell'estensione, chiama prima WinDbgExtensionDllInit e lo passa tre argomenti.

    • Puntatore a una struttura WINDBG_EXTENSION_APIS64 , che contiene puntatori a funzioni implementate dal debugger e dichiarate in Wdbgexts.h. È necessario copiare l'intera struttura in una variabile globale creata nella DLL.
    • Numero di versione principale. È necessario copiare il numero di versione principale in una variabile globale creata nella DLL.
    • Numero di versione secondaria. È necessario copiare il numero di versione secondaria in una variabile globale creata nella DLL.

    Ad esempio, è possibile creare variabili globali denominate ExtensionApis, SavedMajorVersion e SavedMinorVersion, come illustrato nell'esempio seguente.

    WINDBG_EXTENSION_APIS64 ExtensionApis;
    USHORT SavedMajorVersion;
    USHORT SavedMinorVersion;
    
    VOID WinDbgExtensionDllInit(PWINDBG_EXTENSION_APIS64 lpExtensionApis,
        USHORT MajorVersion, USHORT MinorVersion)
    {
       ExtensionApis = *lpExtensionApis;
       SavedMajorVersion = MajorVersion;
       SavedMinorVersion = MinorVersion;
        ...
    }
    
  • È necessario esportare una funzione denominata ExtensionApiVersion. Il debugger chiama questa funzione e prevede di ripristinare un puntatore a una struttura EXT_API_VERSION che contiene il numero di versione della DLL di estensione. Il debugger usa questo numero di versione durante l'esecuzione di comandi come .chain e versione che visualizzano il numero di versione dell'estensione.

  • Facoltativamente, è possibile esportare una funzione denominata CheckVersion. Il debugger chiama questa routine ogni volta che si usa un comando di estensione. È possibile usare questa opzione per stampare avvisi di mancata corrispondenza della versione quando la DLL è di una versione leggermente diversa rispetto al debugger, ma non abbastanza diversa per impedire l'esecuzione.