Dela via


Använda Nt- och Zw-versioner av de interna systemtjänstrutinerna

API:et för inbyggda operativsystemtjänster i Windows implementeras som en uppsättning rutiner som körs i kernelläge. Dessa rutiner har namn som börjar med prefixet Nt eller Zw. Drivrutiner i kernelläge kan anropa dessa rutiner direkt. Användarlägesprogram kan komma åt dessa rutiner med hjälp av systemanrop.

Med några få undantag har varje intern systemtjänstrutin två lite olika versioner som har liknande namn men olika prefix. Anrop till NtCreateFile och ZwCreateFile utför liknande åtgärder och hanteras i själva verket av samma rutin i kernelläge. För systemanrop från användarläge fungerar Nt och Zw versioner av en rutin på samma sätt. För anrop från en drivrutin i kernelläge skiljer sig Nt och Zw versioner av en rutin åt i hur de hanterar de parametervärden som anroparen skickar till rutinen.

En drivrutin i kernelläge anropar Zw version av en intern systemtjänstrutin för att informera rutinen om att parametrarna kommer från en betrodd källa i kernelläge. I det här fallet förutsätter rutinen att den på ett säkert sätt kan använda parametrarna utan att först verifiera dem. Men om parametrarna kan komma från antingen en källa i användarläge eller en källa i kernelläge anropar drivrutinen i stället Nt-versionen av rutinen, som avgör, baserat på historiken för den anropande tråden, om parametrarna har sitt ursprung i användarläge eller kernelläge. Mer information om hur rutinen skiljer parametrar i användarläge från parametrar i kernelläge finns i PreviousMode.

När ett användarlägesprogram anropar Nt - eller Zw-versionen av en intern systemtjänstrutin behandlar rutinen alltid de parametrar som den tar emot som värden som kommer från en källa i användarläge som inte är betrodd. Rutinen verifierar parametervärdena noggrant innan parametrarna används. I synnerhet avsöker rutinen alla buffertar som tillhandahålls av anroparen för att verifiera att buffertarna finns i giltigt minne i användarläge och är korrekt justerade.

Interna systemtjänstrutiner gör andra antaganden om de parametrar som de får. Om en rutin tar emot en pekare till en buffert som allokeras av en drivrutin i kernelläge förutsätter rutinen att bufferten allokeras i systemminnet, inte i användarlägesminnet. Om rutinen tar emot ett handtag som öppnas av ett användarlägesprogram letar rutinen efter handtaget i användarlägesreferenstabellen, inte i referenstabellen i kernelläge.

I några få fall skiljer sig innebörden av ett parametervärde betydligt mellan anrop från användarläge och från kernelläge. Till exempel har ZwNotifyChangeKey rutin (eller dess NtNotifyChangeKey motsvarighet) ett par indataparametrar, ApcRoutine och ApcContext, som betyder olika saker, beroende på om parametrarna kommer från en källa i användarläge eller kernelläge. För ett anrop från användarläge pekar ApcRoutine på en APC-rutin och ApcContext pekar på ett kontextvärde som operativsystemet tillhandahåller när det anropar APC-rutinen. För ett anrop från kärnläge pekar ApcRoutine på en WORK_QUEUE_ITEM-struktur, och ApcContext anger vilken typ av arbetsköobjekt som beskrivs av WORK_QUEUE_ITEM-strukturen.

Det här avsnittet innehåller följande artiklar:

FöregåendeLäge

bibliotek och rubriker

Vad betyder Zw-prefixet?

ange åtkomsträttigheter

NtXxx-rutiner