{{위키데이터 속성 추적}}
'''네이티브 API'''({{lang|en|Native API}})는 [[윈도우 NT]]와 사용자 모드의 응용 프로그램에서 사용되는 [[API]]이다. 다른 윈도우 구성 요소들이 사용되기 힘들 때 사용되며, 주로 시스템 부팅 시나 kernel32.dll 같은 [[윈도우 API]]를 구현하는 용도로 쓰인다. ntdll.dll의 [[엔트리 포인트]]는 '''LdrInitializeThunk'''이다. 대부분의 네이티브 API의 호출은 [[ntoskrnl.exe]]에서 구현되며, ntdll.dll에 의해서 [[사용자 모드]]로 노출된다. 어떤 경우에는 사용자 모드에서 ntdll.dll 내부의 네이티브 API가 직접 호출되기도 한다.

네이티브 API 호출은 [[시스템 서비스 서술자 테이블|SSDT]]를 통해서 [[윈도우 NT 아키텍처|커널]]에 의해 관리된다.

대부분의 마이크로소프트 윈도우가 잘 정의된 [[윈도우 API]]에 의해 구현된 반면, [[클라이언트/서버 런타임 하위 시스템]]같은 소수의 구성 요소들은 네이티브 API로 구현된다. 왜냐하면 이것이 [[윈도우 NT 시작 프로세스]] 전에 호출되는데, 이 때는 WIndows API가 아직 사용 가능하지 않기 때문이다.

== 함수 그룹 ==
네이티브 API는 많은 함수들로 이루어져 있다. strlen(), sprintf() 등이 있고 floor() 같은 기본적인 [[C (프로그래밍 언어)|C]] 런타임 실행을 위해 [[C 표준 라이브러리|C 런타임 함수]]들을 포함한다. malloc(), printf(), scanf() 같은 공통 프로시저들은 빠졌다. 대다수의 네이티브 API들은 관행적으로 아래와 같은 접두사를 갖는다.
* '''Nt''' 또는 '''Zw'''는 ntdll.dll과 ntoskrnl.exe에서 선언된 [[시스템 호출]]이다. 사용자 모드의 ntdll.dll에서 호출되면, 이 그룹들은 다음과 같은 면에서 거의 같다. [[보호 링#수퍼바이저 모드|커널 모드]]에 들어가서 [[시스템 서비스 서술자 테이블|SSDT]]를 통해 ntoskrnl.exe의 같은 의미를 가진 함수를 호출한다. ntoskrnl.exe에서 직접적으로 호출될 경우(커널 모드에서만 가능)에는 Zw는 Nt와 달리 커널 모드인 것을 보장한다.<ref>{{저널 인용
 | author=The NT Insider
 | work=OSR Online
 | volume=10
 | issue=4
 | date=August 27, 2003
 | url=http://www.osronline.com/article.cfm?article=257
 | title=Nt vs. Zw - Clearing Confusion On The Native API
 | publisher=OSR Open Systems Resources
 | accessdate=2016-02-11
}}</ref> Zw 접두사는 아무것도 의미하지 않는다.<ref name="oldnewthing">{{웹 인용
 | author=Raymond Chen
 | year=2009
 | url=http://blogs.msdn.com/oldnewthing/archive/2009/06/03/9687937.aspx
 | title=The Old New Thing : What does the "Zw" prefix mean?
 | publisher=[[마이크로소프트]]
 | accessdate=2016-02-11}}</ref>
* '''Rtl'''은 ntdll 함수 중에서 두번째로 많은 그룹이다. 이것은 (확장된) C 런타임 라이브러리를 구성하고 있다. (확장된) C 런타임 라이브러리는 (커널 지원을 직접적으로 포함하지 않지만) 네이티브 응용 프로그램들에 쓰이는 많은 유틸리티 함수를 포함한다.
* '''Csr'''은 Win32 하위 시스템 프로세스([[csrss.exe]])와 통신할 때 사용되는 클라이언트-서버 함수들이다.
* '''Dbg'''는 소프트웨어 [[브레이크포인트]] 같은 [[디버그|디버깅]] 함수들이다.
* '''Ki'''는 [[비동기 프로시저 호출|APC]] 디스패칭 같은 이벤트들을 위한 커널 모드에서의 upcall들이다.
* '''Ldr'''은 새로운 프로세스들을 시작시키는 것을 다루는 [[PE 포맷|PE]] 파일을 위한 로더 함수들이다.
* '''Nls'''는 [[국제화와 지역화|네이티브 언어 지원]]을 위해 사용된다.
* '''Pfx'''는 prefix를 다루기 위해 사용된다.

user32.dll과 gdi32.dll은 커널 모드로 가는 다른 호출도 포함한다. 이것은 과거에 하드웨어의 성능 문제로 인해 그래픽 서브 시스템을 커널 모드로 보내기로 결정했기 때문이다. 0x1000~0x1FFF 범위의 시스템 호출들은 win32k.sys용이며, user32.dll과 gdi32.dll에서 정의된다. 이런 함수들은 '''NtUser''', '''NtGdi''' 접두사가 붙는다.

또한 ntoskrnl.exe에서 나온 많은 그룹들이 있으며, 그 이유로 오직 커널 모드에서만 사용될 수 있다. 이것들은 네이티브 API에 포함되기도 하고, 되지 않기도 한다. '''Cc'''(cache controller), '''Ex'''([[Architecture of Windows NT|Windows Executive]]), '''FsRtl'''(file system runtime library), '''Io'''(I/O manager), '''Ke'''(core kernel routines), '''Ks'''(kernel streaming), '''Lpc'''([[로컬 프로시저 호출]]), '''Lsa'''([[로컬 보안 인증 하위 시스템 서비스|로컬 보안 인증]]), '''Mm'''(memory management), '''Ob'''([[객체 관리자]]), '''Ps'''([[프로세스|Process management]]), '''Se'''(security), '''Po'''(power management) 등이 있다.<ref name="oldnewthing"/><ref>{{웹 인용
 | author=[[마이크로소프트]]
 | year=2009
 | url=http://msdn.microsoft.com/en-us/library/ff551797.aspx
 | title=I/O Manager Routines
 | publisher=[[마이크로소프트]]
 | accessdate=2016-02-11
}}</ref><ref>{{웹 인용
 | author=[[마이크로소프트]]
 | year=2009
 | url=http://msdn.microsoft.com/en-us/library/ff539010.aspx
 | title=Cache Manager Routines
 | publisher=[[마이크로소프트]]
 | accessdate=2016-02-11
}}</ref><ref>{{웹 인용
 | author=[[마이크로소프트]]
 | year=2009
 | url=http://msdn.microsoft.com/en-us/library/ff559835.aspx
 | title=Power Manager Routines
 | publisher=[[마이크로소프트]]
 | accessdate=2016-02-11
}}</ref><ref>{{웹 인용
 | author=[[마이크로소프트]]
 | year=2009
 | url=http://msdn.microsoft.com/en-us/library/ff542078.aspx
 | title=Core Kernel Library Support Routines
 | publisher=[[마이크로소프트]]
 | accessdate=2016-02-11
}}</ref><ref>{{웹 인용
 | author=[[마이크로소프트]]
 | year=2009
 | url=http://msdn.microsoft.com/en-us/library/ff540426.aspx
 | title=File System Runtime Library Routines
 | publisher=[[마이크로소프트]]
 | accessdate=2016-02-11
}}</ref>

== 사용 ==
* 특권 부여와 회수 (RtlAdjustPrivilege)
* 다른 세션에서 실행 중인 프로세스 내부에서 원격 쓰레드 생성 (RtlCreateUserThread)
* 네이티브 응용 프로그램 실행 (RtlCreateUserProcess)
* 강제 종료 (NtShutdownSystem)

== 같이 보기 ==
* [[마이크로소프트 윈도우 구성 요소 목록]]
* [[윈도우 API]]

== 각주 ==
{{각주}}

== 외부 링크 ==
* [http://undocumented.ntinternals.net/ 대부분의 네이티브 API 함수들이 정리된 웹사이트] {{웨이백|url=http://undocumented.ntinternals.net/ |date=20121031022320 }}
* [http://technet.microsoft.com/sysinternals/bb897447.aspx Inside Native Applications]
* [https://web.archive.org/web/20121224002314/http://netcode.cz/img/83/nativeapi.html Inside the Native API]
* [http://zenwinx.sourceforge.net/ Open source native applications development framework]
* [https://web.archive.org/web/20150811102814/http://hex.pp.ua/nt-native-applications-shell-eng.php Native shell - Windows command prompt which can start before Winlogon and Win32 subsystem]
* [http://sourceforge.net/projects/nativetools/ Windows NT Native Tools - A free native applications development util]

[[분류:마이크로소프트 API]]
[[분류:윈도우 NT]]
[[분류:윈도우 NT 커널]]
[[분류:운영 체제 API]]