'DeviceIoControl'에 해당되는 글 1건
- 2009.06.09 어플리케이션과 드라이버간의 통신 방법 - DeviceIoControl()
2009. 6. 9. 16:12
어플리케이션과 드라이버간의 통신 방법 - DeviceIoControl()
2009. 6. 9. 16:12 in Windows/Device Driver
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
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 - 사용되는 버퍼의 사용 전략을 명시
((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, ...);
#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 |