deviceiocontrol 예제

일반 32비트 페이징은 다음을 사용하여 수행됩니다. CR3라는 페이지 디렉토리 테이블의 기준을 가리키는 CPU 레지스터가 있습니다. 아래 다이어그램은 페이징 메커니즘의 작동 방식을 표시합니다. 실제 페이지의 위치는 가상 주소와 선형이거나 이전 페이지 테이블 항목으로도 선형일 필요는 없습니다. 파란색 선은 예제 번역에 포함되며 검은색 선은 페이지 테이블을 설정하는 방법의 추가 예입니다. 이해해야 할 매우 중요한 개념은 커널 드라이버 개체에 있는 MajorFunction 배열입니다. 장치 상태 및 생성된 모든 IRP를 처리하는 데 사용되는 이벤트 콜백으로 볼 수 있습니다. 예를 들어 IRP_MJ_CREATE MajorFunction은 사용자 랜드 응용 프로그램이 CreateFile 함수를 사용할 때 호출되므로 장치 핸들을 CreateFile 함수로 올바르게 설정하는 데 필요한 모든 작업을 수행할 수 있습니다. 어쩌면 그것은 분명하지 않다, 그러나 우리가 나중에 그것에 대해 충분히 이야기로 될 것입니다. 이 게시물에서는 IRP_MJ_CREATE, IRP_MJ_CLOSE 및 IRP_MJ_DEVICE_CONTROL을 살펴보겠습니다. 다음 두 비트는 IOCTL을 발급하는 데 필요한 액세스를 정의합니다. 올바른 액세스 로 핸들을 열지 않은 경우 I/O 관리자가 IOCTL 요청을 거부할 수 있는 방법입니다.

액세스 유형은 예를 들어 FILE_READ_DATA 및 FILE_WRITE_DATA와 같습니다. IoCompleteRequest는 IRP를 완료한 후 항상 드라이버에 의해 호출됩니다. 이전 예제에서 이 작업을 수행하지 않은 이유는 I/O 관리자가 좋은 사람이기 때문에 대부분의 경우 이 작업을 완료할 수 있기 때문입니다. 그러나 필요한 경우 운전자가 IRP를 완료하는 것이 적절합니다. 이 위치에는 자세한 정보를 제공할 수 있는 “IRP 처리”에 대한 문서가 포함되어 있습니다. 응용 프로그램은 DeviceIoControl() 함수를 사용하여 플로피 디스크 드라이브, 하드 디스크 드라이브, 테이프 드라이브 또는 CD-ROM 드라이브에 대한 직접 입력 및 출력 작업을 수행하거나 정보를 검색할 수 있습니다. 다음 예제에서는 시스템의 첫 번째 실제 드라이브에 대한 정보를 검색하는 방법을 보여 줍니다. CreateFile() 함수를 사용하여 첫 번째 물리적 드라이브에 장치 핸들을 검색한 다음 IOCTL_DISK_GET_DRIVE_GEOMETRY 컨트롤 코드와 함께 DeviceIoControl()을 사용하여 DISK_GEOMETRY 구조를 드라이브에 대한 정보로 채웁니다.