'Device'에 해당되는 글 2건
- 2009.06.09 어플리케이션과 드라이버간의 통신 방법 - DeviceIoControl()
- 2008.07.31 Windows Device Driver 관련 용어들..
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 |
2008. 7. 31. 10:45
Windows Device Driver 관련 용어들..
2008. 7. 31. 10:45 in Programmings/Windows Programming
갑작스레 디바이스 드라이버를 작성을 해야할 것 같아서.. 현재 열공(?)중이다...
아.. 솔직히 이런 저런일들로.. 아무것도 할 수 없을 것 같은 상태이긴 하지만.. 그래도 한다.. 꾸역꾸역..
아.. Windows Device에서 사요하는 용어는 몇가지가 있다. 그 중에서 기본이 되는 용어들 몇가지를 살펴보고자 한다.
- DDK (Driver Development Kit)
- VxD (Virtual Device Driver)
- WDM (Windows Driver Model)
- IFS (Installable File System)
- WDF (Windows Driver Foundation)
- WDK (Windows Driver Kit)
DDK
- Windows 상에서 Device Driver를 개발하는 사람들이 꼭 사용해야할 모음(?) 정도로 생각하면 될 듯 하다.
가장 기초가 되는, 뭐 이거 없으면 개발을 할 수 없는 뭐.. 그런것?? ntddk.h, wdm.h 등이 있다.
VxD
- 가상 장치 관리자라고 불린다. x는 디바이스에서 키보드, 마우스 등을 나타낸다.
Windows 95, 98, ME 등에서 사용을 하는 녀석이다.
WDM
- windows NT 로 넘어오면서 통합된 Driver 의 필요에 의해 생성된 녀석이다. 일종의 Framework라고 생각하면 맞을 듯 하다.
WDF
- Vista가 출시되면서 나오게 된 모델로, WDM 보다 조금 더 확장 된 개념으로 보면 된다.
IFS
- 파일시스템 위주의 특화된 Kit 이라고 보면 된다. 파일시스템에는 CDFS, FASTFAT, NTFS 등이 있으며, ntifs.h를 사용해서 생성한다.
WDK
- Windows 의 모든 드라이버를 말한다.
기존의 DDK를 사용하였지만, 지금은 이녀석(WDK)를 사용하여 디바이스 드라이버를 작성하게 될것 같다.
아.. 대충 이리 용어라는걸 알아봤는데.. 도데체 디바이스 드라이버는 어찌 만드는 거지?? -_-;;
'Programmings > Windows Programming' 카테고리의 다른 글
GetCurrentDirectory()를 이용한 Windows에서 현재경로 받아오기.. (1) | 2008.08.20 |
---|---|
Windows 프로그램을 시작 프로그램으로 등록하기 (0) | 2008.08.19 |
GetMessage() 와 PeekMessage() (1) | 2008.08.11 |
MSDN 키보드 입력 작동 방식 스크랩 (0) | 2008.07.28 |
키보드 키의 상태값을 알아오기 (0) | 2008.07.24 |