네이티브 시스템 서비스 루틴의 Nt 및 Zw 버전 사용

Windows 네이티브 운영 체제 서비스 API는 커널 모드에서 실행되는 루틴 집합으로 구현됩니다. 이러한 루틴에는 접두사 Nt 또는 Zw로 시작하는 이름이 있습니다. 커널 모드 드라이버는 이러한 루틴을 직접 호출할 수 있습니다. 사용자 모드 애플리케이션은 시스템 호출을 사용하여 이러한 루틴에 액세스할 수 있습니다.

몇 가지 예외를 제외하고 각 네이티브 시스템 서비스 루틴에는 이름이 비슷하지만 접두사는 다른 두 가지 약간 다른 버전이 있습니다. 예를 들어 NtCreateFileZwCreateFile 에 대한 호출은 유사한 작업을 수행하며 실제로 동일한 커널 모드 시스템 루틴에서 처리됩니다. 사용자 모드에서 시스템 호출의 경우 루틴의 NtZw 버전이 동일하게 작동합니다. 커널 모드 드라이버에서 호출하는 경우 루틴의 NtZw 버전은 호출자가 루틴에 전달하는 매개 변수 값을 처리하는 방식이 다릅니다.

커널 모드 드라이버는 네이티브 시스템 서비스 루틴의 Zw 버전을 호출하여 신뢰할 수 있는 커널 모드 원본에서 매개 변수가 제공되었음을 루틴에 알릴 수 있습니다. 이 경우 루틴은 매개 변수의 유효성을 검사하지 않고도 매개 변수를 안전하게 사용할 수 있다고 가정합니다. 그러나 매개 변수가 사용자 모드 원본 또는 커널 모드 원본에서 온 것일 수 있는 경우 드라이버는 대신 호출 스레드의 기록에 따라 매개 변수가 사용자 모드 또는 커널 모드에서 시작되었는지 여부를 결정하는 루틴의 Nt 버전을 호출합니다. 루틴이 사용자 모드 매개 변수와 커널 모드 매개 변수를 구분하는 방법에 대한 자세한 내용은 PreviousMode를 참조하세요.

사용자 모드 애플리케이션이 네이티브 시스템 서비스 루틴의 Nt 또는 Zw 버전을 호출하는 경우 루틴은 항상 수신하는 매개 변수를 신뢰할 수 없는 사용자 모드 원본에서 제공되는 값으로 처리합니다. 루틴은 매개 변수를 사용하기 전에 매개 변수 값의 유효성을 철저히 검사합니다. 특히 루틴은 호출자가 제공한 버퍼를 검색하여 버퍼가 유효한 사용자 모드 메모리에 있고 제대로 정렬되었는지 확인합니다.

네이티브 시스템 서비스 루틴은 수신하는 매개 변수에 대해 추가로 가정합니다. 루틴이 커널 모드 드라이버에 의해 할당된 버퍼에 대한 포인터를 수신하는 경우 루틴은 버퍼가 사용자 모드 메모리가 아닌 시스템 메모리에 할당되었다고 가정합니다. 루틴이 사용자 모드 애플리케이션에서 연 핸들을 수신하는 경우 루틴은 커널 모드 핸들 테이블이 아닌 사용자 모드 핸들 테이블에서 핸들을 찾습니다.

몇 가지 경우에 매개 변수 값의 의미는 사용자 모드와 커널 모드의 호출 간에 더 크게 다릅니다. 예를 들어 ZwNotifyChangeKey 루틴(또는 해당 NtNotifyChangeKey 루틴)에는 한 쌍의 입력 매개 변수인 ApcRoutineApcContext가 있습니다. 이는 매개 변수가 사용자 모드 또는 커널 모드 원본에서 온 것인지에 따라 다른 것을 의미합니다. 사용자 모드에서 호출하는 경우 ApcRoutine 은 APC 루틴을 가리키고 ApcContext 는 운영 체제가 APC 루틴을 호출할 때 제공하는 컨텍스트 값을 가리킵니다. 커널 모드에서 호출하는 경우 ApcRoutineWORK_QUEUE_ITEM 구조를 가리키고 ApcContextWORK_QUEUE_ITEM 구조에서 설명하는 작업 큐 항목의 유형을 지정합니다.

이 단원에 포함된 항목은 다음과 같습니다.

PreviousMode

라이브러리 및 헤더

Zw 접두사는 무엇을 의미하나요?

액세스 권한 지정

NtXxx 루틴