'Device'에 해당되는 글 2건

  1. 2009.06.09 어플리케이션과 드라이버간의 통신 방법 - DeviceIoControl()
  2. 2008.07.31 Windows Device Driver 관련 용어들..
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
2008. 7. 31. 10:45

Windows Device Driver 관련 용어들..



갑작스레 디바이스 드라이버를 작성을 해야할 것 같아서.. 현재 열공(?)중이다...

아.. 솔직히 이런 저런일들로.. 아무것도 할 수 없을 것 같은 상태이긴 하지만.. 그래도 한다.. 꾸역꾸역..

아.. 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)를 사용하여 디바이스 드라이버를 작성하게 될것 같다.

아.. 대충 이리 용어라는걸 알아봤는데.. 도데체 디바이스 드라이버는 어찌 만드는 거지?? -_-;;