Condividi tramite


Handle di oggetto

I driver e i componenti in modalità utente accedono alla maggior parte degli oggetti definiti dal sistema tramite handle. Gli handle sono rappresentati dal tipo di dati opaco HANDLE. Si noti che gli handle non vengono usati per accedere agli oggetti dispositivo o agli oggetti driver.

Per la maggior parte dei tipi di oggetto, la routine in modalità kernel che crea o apre l'oggetto fornisce un handle al chiamante. Il chiamante usa quindi tale handle nelle operazioni successive sull'oggetto .

Di seguito è riportato un elenco di tipi di oggetto usati in genere dai driver e dalle routine che forniscono handle agli oggetti di quel tipo.

Tipo oggetto Routine di creazione/apertura corrispondente

File

IoCreateFile, ZwCreateFile, ZwOpenFile

Chiavi del Registro di sistema

IoOpenDeviceInterfaceRegistryKey, IoOpenDeviceRegistryKey, ZwCreateKey, ZwOpenKey

Thread

PsCreateSystemThread

Eventi

IoCreateSynchronizationEvent, IoCreateNotificationEvent

Collegamenti simbolici

ZwOpenSymbolicLinkObject

Oggetti directory

ZwCreateDirectoryObject

Oggetti Section

ZwOpenSection

Quando il driver non richiede più l'accesso all'oggetto, chiama la routine ZwClose per chiudere l'handle. Questa operazione funziona per tutti i tipi di oggetto elencati nella tabella precedente.

La maggior parte delle routine che forniscono handle accettano una struttura OBJECT_ATTRIBUTES come parametro. Questa struttura può essere utilizzata per specificare gli attributi per l'handle.

I driver possono specificare gli attributi di handle seguenti:

  • OBJ_KERNEL_HANDLE

    È possibile accedere all'handle solo dalla modalità kernel.

  • OBJ_INHERIT

    Tutti gli elementi figlio del processo corrente ricevono una copia dell'handle al momento della creazione.

  • OBJ_FORCE_ACCESS_CHECK

    Questo attributo specifica che il sistema esegue tutti i controlli di accesso sull'handle. Per impostazione predefinita, il sistema ignora tutti i controlli di accesso sugli handle creati in modalità kernel.

Utilizzare la routine InitializeObjectAttributes per impostare questi attributi in una struttura OBJECT_ATTRIBUTES .

Per informazioni sulla convalida degli handle di oggetti, vedere Errore di convalida degli handle di oggetti.

Handle di oggetto privato

Ogni volta che un driver crea un handle di oggetto per l'uso privato, il driver deve specificare l'attributo OBJ_KERNEL_HANDLE. Ciò garantisce che l'handle non sia accessibile alle applicazioni in modalità utente.

Handle di oggetti condivisi

Un driver che condivide gli handle di oggetti tra la modalità kernel e la modalità utente deve essere scritto attentamente per evitare la creazione accidentale di fori di sicurezza. Ecco alcune linee guida:

  1. Creare handle in modalità kernel e passarli alla modalità utente, anziché viceversa. Gli handle creati da un componente in modalità utente e passati al driver non devono essere considerati attendibili.

  2. Se il driver deve modificare gli handle per conto delle applicazioni in modalità utente, usare l'attributo OBJ_FORCE_ACCESS_CHECK per verificare che l'applicazione abbia l'accesso necessario.

  3. Usare ObReferenceObjectByPointer per mantenere un riferimento in modalità kernel in un handle condiviso. In caso contrario, se un componente in modalità utente chiude l'handle, il conteggio dei riferimenti passa a zero e, se il driver tenta di usare o chiudere l'handle, si arresterà in modo anomalo.

Se un'applicazione in modalità utente crea un oggetto evento, un driver può attendere in modo sicuro che tale evento venga segnalato, ma solo se l'applicazione passa un handle all'oggetto evento al driver tramite un IOCTL. Il driver deve gestire IOCTL nel contesto del processo che ha creato l'evento e deve verificare che l'handle sia un handle di evento chiamando ObReferenceObjectByHandle.