Domanda

Nella API nativa Microsoft esporta due versioni di ciascuna chiamata API, una prefissata con ZW e una con NT, per EG. Zwcreatethread e ntcreatethread.

La mia domanda è qual è la differenza tra quelle due versioni delle chiamate e quando e perché si dovrebbe usare ZW o NT esclusivamente? Alla mia comprensione della versione ZW garantisce che il chiamante risieda in modalità kernel, mentre NT non lo fa.

Mi chiedo anche il significato specifico per i prefissi/abbreviazioni di ZW e NT? Si può indovinare che NT probabilmente si riferisce alla famiglia di Windows (nuova tecnologia) o nativa (probabilmente no)? Per quanto riguarda ZW, rappresenta qualcosa?

È stato utile?

Soluzione

Aggiornare:

A parte la risposta di Larry Osterman (cosa che dovresti decisamente Leggi), c'è un'altra cosa che dovrei menzionare:

Poiché le varianti NTXXX eseguono i controlli come se la chiamata provenga dalla modalità utente, ciò significa Eventuali buffer passati alla funzione NTXXS devono risiedere negli spazi degli indirizzi in modalità utente, non in modalità kernel. Quindi se chiami una funzione simile NtCreateFile nel tuo driver e passalo puntatori ai buffer in modalità kernel, tornerai a STATUS_ACCESS_VIOLATION A causa di ciò.


Vedere Utilizzo delle versioni NT e ZW delle routine di servizi di sistema nativi.

Un driver in modalità kernel chiama la versione ZW di una routine di servizi di sistema nativo per informare la routine che i parametri provengono da una fonte affidabile in modalità kernel. In questo caso, la routine presuppone che possa usare in sicurezza i parametri senza prima convalidarli. Tuttavia, se i parametri potrebbero provenire da una sorgente in modalità utente o da una sorgente in modalità kernel, il driver chiama invece la versione NT della routine, che determina, in base alla cronologia del thread chiamante, se i parametri hanno avuto origine nell'utente modalità o modalità kernel.

Le routine dei servizi di sistema nativi fanno ulteriori ipotesi sui parametri che ricevono. Se una routine riceve un puntatore a un buffer assegnato da un driver in modalità kernel, la routine presuppone che il buffer sia stato assegnato nella memoria di sistema, non nella memoria in modalità utente. Se la routine riceve un impugnatura aperta da un'applicazione in modalità utente, la routine cerca la maniglia nella tabella della maniglia in modalità utente, non nella tabella della maniglia in modalità kernel.

Anche, Zw Non rappresenta niente. Vedere Cosa significa il prefisso ZW?:

Le routine dei servizi di sistema nativo di Windows hanno nomi che iniziano con i prefissi NT e ZW. Il prefisso NT è un'abbreviazione di Windows NT, ma il prefisso ZW non ha significato. ZW è stato selezionato in parte per evitare potenziali conflitti di denominazione con altre API, e in parte per evitare di utilizzare eventuali prefissi potenzialmente utili a due lettere che potrebbero essere necessari in futuro.

Altri suggerimenti

Stavo per lasciare questo come un commento sulla risposta di Merhdad ma è diventato troppo lungo ...

La risposta di Mehrdad è accurata al 100%. È anche leggermente fuorviante. Il "Precedente"Articolo collegato da" Usando NT e ZW ... "L'articolo Mehrdad lo entra in modo più dettagliato. Parafrasando: la differenza principale tra le chiamate API NT e ZW è che le chiamate ZW passano attraverso il dispatcher di chiamata di sistema, ma ma per i conducenti, Le chiamate NT sono chiamate dirette all'API.

Quando un driver chiama un'API ZW, l'unico effetto reale dell'esecuzione tramite il dispatcher di chiamata di sistema è che imposta KegetPreviousMode () su KernelMode anziché UserMode (ovviamente al codice della modalità utente, i moduli ZW e NT sono identici). Quando le varie chiamate di sistema vedono che ExgetPreusMode è KernelMode, bypassano il controllo dell'accesso (poiché i conducenti possono fare qualsiasi cosa).

Se un driver chiama il modulo NT delle API, è possibile che fallisca a causa dei controlli di accesso.

Un esempio concreto: se un driver chiama NtCreateFile, NtCreateFile chiamerà SeaCcessCheck () per vedere se l'applicazione che viene chiamata al driver ha le autorizzazioni per creare il file. Se lo stesso driver chiamato ZWCreateFile, la chiamata API NTCreateFile non chiamerà SeaCcessCheck perché ExgetPreviousMode ha restituito KernelMode e quindi si presume che il driver abbia accesso al file.

È importante che gli autori dei conducenti comprendano la differenza tra i due poiché può avere profonde implicazioni per la sicurezza ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top