ISLab Flash Team Ch 7 IOCTL Ch 7
ISLab Flash Team Ch 7. IOCTL(첨부) Ch 7. IOCTLWindows 2000 Device Driver
IOCTL 구조체 CTL_CODE 매크로 인자 설명 Device. Type Io. Create. Device에 제공되는 FILE_DEVICE_XXX의 값 • 0 x 0000~0 x 7 fff – Microsoft에 의해 예약된 값 • 0 x 8000~0 xffff – 사용자 정의 값 Control. Code 드라이버에서 정의된 IOCTL 코드 • 0 x 00~0 x 7 ff – Microsoft에 의해 예약된 값 • 0 x 8000~0 xfff – 사용자 정의 값 Transfer. Type 해당 컨트롤 코드를 위한 버퍼 전송 매커니즘 Required. Access 요청자의 접근 요청 ISLab Flash Team Ch 7. IOCTL 2 Made By ICEUNI
IOCTL 헤더 파일 Win 32 Application 드라이버 프로젝트 (드라이버 클라이언트) #include <WINIOCTL. H> //IOCTL 헤더 파일 : : #include <DEVIOCTL. H> // IOCTL 헤더 파일 : : ISLab Flash Team Ch 7. IOCTL 3 Made By ICEUNI
Missile Tomahawk® Cruise Missile ISLab Flash Team Ch 7. IOCTL 4 Made By ICEUNI
IOCTL 헤더 파일의 예 #define IOCTL_MISSLEDEVICE_AIM CTL_CODE( FILE_DEVICE_UNKNOWN, // Device. Type 0 x 801, // Control. Code METHOD_BUFFERED, // Transfer. Type IOCTL_MISSLEDEVICE_AIM FILE_ACCESS_ANY) // Required. Access 미사일을 조준하는 디바이스 (사용자 정의 - 0 x 801) // IOCTL_MISSLEDEVICE_AIM 에서 사용된 구조체 Typedef struct _AIM_IN_BUFFER { ULONG Longitude; ULONG Latitude; Longitude : 경도 } AIM_IN_BUFFER, *PAIM_IN_BUFFER; Latitude : 위도 Typedef struct _AIM_OUT_BUFFER { ULONG Extended. Status; } AIM_OUT_BUFFER, *PAIM_OUT_BUFFER; #define IOCTL_MISSLEDEVICE_LAUNCH CTL_CODE( FILE_DEVICE_UNKNOWN, IOCTL_MISSLEDEVICE_LAUNCH 0 x 802, 미사일을 발사하는 디바이스 METHOD_NEITHER, (사용자 정의 – 0 x 802) FILE_ACCESS_ANY) ISLab Flash Team Ch 7. IOCTL 5 Made By ICEUNI
IOCTL 요청 처리 NTSTATUS Dispatch. Io. Control(IN PDEVICE_OBJECT p. DO, IN PIRP p. Irp) {. . . ULONG control. Code; // IOCTL 요청 변수. . . // IOCTL 요청을 뽑아낸다. control. Code = p. Irp. Stack-> Parameters. Device. Io. Control. Code ; . . . switch (control. Code) { case IOCTL_MISSLEDEVICE_AIM : // 각 case에서 항상 매개변수의 유효함을 확인하다. . Io. Mark. Irp. Pending(p. Irp); Io. Start. Packet(p. DO, p. Irp, 0, NULL); return STATUS_PENDING; 헤더파일에서 정의한 control. Code를 처리하는 부분 → 드라이버 디스패치 Io. Control에서 해결 case IOCTL_DEVICE_LAUNCH : if(in. Size > 0 || out. Size >0) { status = STATUS_INVALID_PARAMETER; break; } // 디바이스를 구동하게 하는 동일한 코드를 넣는다. // : return STATUS_PENDING; default : status = STATUS_INVALID_DEVICE_REQUEST; break; }. . . ISLab Flash Team Ch 7. IOCTL 6 Made By ICEUNI
- Slides: 7