'ioctl'에 해당되는 글 1건

  1. 2009.06.09 어플리케이션과 드라이버간의 통신 방법 - DeviceIoControl()
2009. 6. 9. 16:12

어플리케이션과 드라이버간의 통신 방법 - DeviceIoControl()



DeviceIoControl() 함수는 2개의 버퍼를 제공하여 디바이스 드라이버와 양방향으로 통신을 하는 함수이다.
이 함수는 일반적인 I/O가 아닌 디바이스 드라이버의 기능을 제어하는 용도로 주로 사용된다. 예를 들어 키보드의 caps lock키를 누를 때 디바이스 드라이버는 키보드 관련 app를 통해 caps lock LED를 On 하도록 한다. 이처럼 디바이스 설정과 같은 부분을 변경하고자 할 때 대부분 이 함수를 사용하여 구현을 하게 된다.

DeviceIoControl() 함수를 보면 아래와 같다.
BOOL DeviceIoControl ( HANDLE FileHandle,
                                      DWORD dwIoControlCode,
                                      LPVOID lpInBuffer,
                                      DWORD nInBufferSize,
                                      LPVOID lpOutBuffer,
                                      DWORD nOutBufferSize,
                                      LPDWORD lpBytesReturned,
                                      LPOVERLAPPED lpOverLapped
                                    );

FileHandle - Handle to device of interest
dwIoControlCode - Control code of operation to perform
lpInBuffer - Pointer to buffer to supply input data(App -> Device Driver)
nInBufferSize - Size of input buffer
lpOutBuffer - Pointer to buffer to receive output data(Device Driver -> App)
nOutBufferSize - Size of output buffer
lpBytesReturned - Pointer to variable to receive byte count
lpOverLapped - pointer to overlapped structure

또한 IoControlCode 라는 것을 사용한다는 특징을 가지고 있다. 이 코드를 가지고 응용 프로그램과 디바이스 드라이버가 통신을 하게 된다. 이는 "CTL_CODE"라는 매크로를 사용하게 되는데 DDK의 "devioctl.h"파일이나 SDK의 "winioctl.h"파일을 참고하면 된다.

DDK에서 정의하는 CTL_CODE 매크로는 아래와 같다.
#define CTL_CODE ( DeviceType, Function, Method, Access ) (       \
                              ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))
DeviceType - IoControlCode 가 사용되는 디바이스 장치의 유형을 정의
Access - 해당하는 IoControlCode 와 같이 사용되는 버퍼의 방향을 명시
Function - 구체적인 수행 코드를 구분
                  MS에서 0~2047까지의 수를 예약해서 사용하므로 드라이버 개발자는 2048~4095까지의 수만
                  사용할 수 있다.
Method - 사용되는 버퍼의 사용 전략을 명시

사용 예
#define IOCTL_INDEX   0x800
#define IOCTL_MY_CODE   CTLCODE(FILE_DEVICE_UNKNOWN,  \
                                                          IOCTL_INDEX,  \
                                                          MEHTOD_BUFFERED,  \
                                                          FILE_ANY_ACCESS)
...
DeviceIoControl(Device, IOCTL_MY_CODE, ...);


'Windows > Device Driver' 카테고리의 다른 글

키보드 스캔코드  (0) 2009.05.21
시스템 장치별 CLASS GUID  (0) 2009.02.17
DDK 다운로드, Windbg 사용...  (2) 2008.11.04
DriverEntry()  (0) 2008.09.04
DEVICE_OBJECT  (0) 2008.09.04