Condividi tramite


Gestione delle eccezioni

Il sistema operativo usa la gestione strutturata delle eccezioni per segnalare determinati tipi di errori. Una routine chiamata da un driver può generare un'eccezione che il driver deve gestire.

Il sistema intercettare i seguenti tipi generali di eccezioni:

  1. Errori o trap definiti dall'hardware, ad esempio

    • Violazioni di accesso (vedere di seguito)
    • Disallineamento del tipo di dati (ad esempio un'entità a 16 bit allineata su un limite di byte dispari)
    • Istruzioni illegali e privilegiate
    • Sequenze di blocco non valide (tentativo di eseguire una sequenza di istruzioni non valida all'interno di una sezione interlock del codice)
    • Integer divide per zero e overflow
    • A virgola mobile divide per zero, overflow, underflow e operandi riservati
    • Punti di interruzione ed esecuzione a passaggio singolo (per supportare i debugger)
  2. Eccezioni software-defined di sistema, ad esempio,

    • Violazioni della pagina di protezione (tentativo di caricare o archiviare dati da o in una posizione all'interno di una pagina guard)
    • Errori di lettura pagina (tentativo di leggere una pagina in memoria e riscontrare un errore di I/O simultaneo)

Una violazione di accesso è un tentativo di eseguire un'operazione in una pagina non consentita nelle impostazioni di protezione della pagina correnti. Le violazioni di accesso si verificano nelle situazioni seguenti:

  • Operazione di lettura o scrittura non valida, ad esempio la scrittura in una pagina di sola lettura.

  • Per accedere alla memoria oltre il limite dello spazio indirizzi del programma corrente (noto come violazione della lunghezza).

  • Per accedere a una pagina attualmente residente ma dedicata all'uso di un componente di sistema. Ad esempio, il codice in modalità utente non è consentito accedere a una pagina usata dal kernel.

Se un'operazione potrebbe causare un'eccezione, il driver deve racchiudere l'operazione in un blocco try/except . Gli accessi alle posizioni in modalità utente sono cause tipiche delle eccezioni. Ad esempio, la routine ProbeForWrite verifica che il driver possa effettivamente scrivere in un buffer in modalità utente. Se non è possibile, la routine genera un'eccezione STATUS_ACCESS_VIOLATION. Nell'esempio di codice seguente il driver chiama ProbeForWrite in un try/except in modo che possa gestire l'eccezione risultante, se necessario.

try {
    ...
    ProbeForWrite(Buffer, BufferSize, BufferAlignment);
 
    /* Note that any access (not just the probe, which must come first,
     * by the way) to Buffer must also be within a try-except.
     */
    ...
} except (EXCEPTION_EXECUTE_HANDLER) {
    /* Error handling code */
    ...
}

I driver devono gestire eventuali eccezioni generate. Un'eccezione che non viene gestita fa sì che il sistema verifichi il bug. Il driver che causa la generazione dell'eccezione deve gestirla: un driver di livello inferiore non può basarsi su un driver di livello superiore per gestire l'eccezione.

I driver possono generare direttamente un'eccezione usando le routine ExRaiseAccessViolation, ExRaiseDatatypeMisalignment o ExRaiseStatus . Il driver deve gestire eventuali eccezioni generate da queste routine.

Di seguito è riportato un elenco parziale di routine che, almeno in determinate situazioni, può generare un'eccezione:

Anche gli accessi in memoria ai buffer in modalità utente possono causare violazioni di accesso. Per altre informazioni, vedere Errori in Riferimento User-Space indirizzi.

Si noti che la gestione delle eccezioni strutturate è distinta dalle eccezioni C++. Il kernel non supporta le eccezioni C++.

Per altre informazioni sulla gestione delle eccezioni strutturate, vedere la Microsoft Windows SDK e la documentazione di Visual Studio.