답변
커널 드라이버는 Win32 하위 시스템의 API가 아닌 Windows NT의 기본 API에 대해 작성된 프로그램이며 기본 하드웨어의 커널 모드로 실행되는 프로그램입니다. 이것은 드라이버가 프로세스간에 가상 메모리 컨텍스트를 전환 할 수 있어야하고 커널 드라이버가 커널 모드에서 실행되기 때문에 매우 안정적으로 작성되어야한다는 것을 의미합니다. 충돌이 발생하면 전체 시스템이 중단됩니다. 커널 드라이버는 설치 또는 시작을위한 관리 액세스가 필요하고 커널이 충돌하는 프로그램에 커널이 제공하는 보안을 제거하기 때문에 하드웨어 장치 이외의 다른 장치에 적합하지 않습니다. 즉 시스템 전체가 아닌 스스로 충돌합니다. 짧은
긴 이야기 :
- 드라이버는 Win32 API가 아닌 네이티브 API를 사용
- 이 드라이버는 일반적으로 모든 UI를 표시 할 수 없음을 의미합니다.
- 드라이버는 페이지 된 풀과 비 페이징 된 풀과 같은 것을 사용하여 메모리를 명시 적으로 페이지하는 방법과 메모리를 관리해야합니다.
- 드라이버는 프로세스 컨텍스트 전환을 처리해야하며 실행 중 페이지 테이블을 보유하고있는 프로세스에 의존하지 않아야합니다.
- 제한된 사용자는 드라이버를 커널에 설치할 수 없습니다.
- 드라이버는 프로세서 수준에서 권한있는 권한으로 실행됩니다.
- 사용자 수준 프로그램의 오류로 인해 해당 프로그램 프로세스가 종료됩니다. 운전자의 잘못으로 블루 스크린의 죽음이 초래됩니다.
- 드라이버는 IRQL (Interrupts and Interrupt Request Level)과 같은 저수준 하드웨어 비트를 처리해야합니다.
기본 드라이버 programm에서 Win32 API를 사용할 수 있습니까? WDK에는 프로세스의 이름을 가져 오는 예제가 있습니다. WinAPI에서도 이와 동일하게 수행합니다. – userbb
@userbb : 아니요. 드라이버는 Windows 하위 시스템을 호출 할 수 없습니다.이 하위 시스템은 해당 하위 시스템보다 낮은 수준에서 실행됩니다. (실제로 Windows 하위 시스템이 시작되기 전에 일반적으로로드됩니다.) Windows 프로그램과 네이티브 프로그램 모두에서 프로세스의 이름을 얻을 수 있습니다. 네이티브 프로그램에서는 네이티브 API 만 사용할 수 있으며 Windows 프로그램에서는 네이티브 API 또는 Windows API를 사용할 수 있습니다. –
@userbb : 즉, 드라이버는 프로세스 이름을 얻기 위해'ZwQueryInformationProcess'를 호출해야합니다. 응용 프로그램은'ZwQueryInformationProcess','NtQueryInformationProcess' 또는'EnumProcessModules'를 호출 할 수 있습니다. –
사용자 모드가 아닌 커널 모드로 실행되는 코드입니다. 커널 모드 코드는 OS, 하드웨어 등의 내부에 직접 액세스 할 수 있습니다.
항상 device drivers을 구현하는 커널 모드 모듈을 작성하십시오.
커널 드라이버는 "응용 프로그램"의 저수준 구현입니다.
커널 컨텍스트에서 실행되므로 커널 API 및 메모리에 직접 액세스 할 수 있습니다.
예를 들어, 커널 드라이버를 사용해야합니다 (숨기고, 암호 보호) 파일에
- 액세스 제어
- 내선, ReiserFS에, ZFS 등처럼 (비 표준 파일 시스템에 접근 허용) 및 장치
- 진정한 API 후크
- ... 그리고 많은 다른 이유
더 알고 얻을하려는 경우 를 들어, 당신은 당신의 마음에 드는 검색 엔진으로 "ring0"이라는 키워드를 검색 할 수 있습니다.
[Wikipedia entry on Kernel] (http://en.wikipedia.org/wiki/Kernel_(컴퓨팅))을 읽어보십시오. 그 차이가 꽤 분명해야합니다. – DarkDust