CreateMutex
까보면 다나와~
디바이스 (1)

드라이버와 어플리케이션과의 통신

1. IRP(I/O Request Packet) : 통신의 주체이며 데이터 버퍼를 포함하는 데이터 구조체, 드라이버는 IRP를 처리하는 함수를 가지고 있어야 한다.
2. IOCTL(I/O Control) : 유저 에플리케이션과 커널 드라이브간 통신을 위해 프로그래머가 정의하는 명령

#드라이버의 생성 절차(http://gogil.tistory.com/9)
DriverEntry -> IoCreateDevice -> IoCreateSymbolicLink -> MajorFunction과 DriverUnload 등록

#App와 통신 절차(http://guimong.tistory.com/66)
IRP_MJ_CREATE -> IRP_MJ_DEVICE_CONTROL(APP에서 드라이버로 입력이 있을 경우) -> IRP_MJ_CLOSE


User App에서 DeviceIoControl()에 전달될 IoCotrolCode의 정의(#예)는 다음과 같다.
#define IOCTL_EXAMPLE_SAMPLE_DIRECT_IN_IO  CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_IN_DIRECT, FILE_READ_DATA | FILE_WRITE_DATA)

특히 CTL_CODE 부분은 다음과 같은 구조로 되어있다.

출처 : http://luckey.tistory.com/122

Method는 다음과 같다.
METHOD_IN_DIRECT
METHOD_IOUT_DIRECT
METHOD_BUFFERED
METHOD_NEITHER : 3(11b), App 메모리 주소를 사용(?)

IOCTL에 대한 다른 정보!~
http://ezbeat.tistory.com/341

보충~(http://ezbeat.tistory.com/286)
User에서 I/O Control을 위해 DeviceIoControl()함수를 호출하면 디바이스에 IRP가 전달되는데, 디바이스에서 해당 IRP를 처리하기 위해 IoGetCrurrentirpStackLocation을 사용하여 IRP에 존재하는 IO 스택 포인터 위치를 전달 받는다. 전달 받은 구조체는 IO_STACK_LOCATION(24byte)이고 그안에 DeviceIoControl()함수 호출시 파라미터로 넘긴 IoControlCode를 처리한다.
pStack->Parameters.DeviceIoControl.IoControlCode


와우!! DDK 모든 Ref!!!!
http://www.perisoft.net/engineer/wdmcard.htm


------------------
맞는지 모르겠지만 일단 나름대로 하면!
드라이버는 최초 디바이스와 심볼링링크, MajorFunction을 미리 생성한다. 이후 App는 미리 생성된 MajorFunction을 호출하여 원하는 행위를 할 수 있는데 이때 IoControlCode라는 것이 핵심으로 User App에서 보내는 IRP를 확인하면 어떤 행위를 하려는 것인지 알 수가 있다. 따라서 Control Code의 구조를 알고 호출하는 Function이 무엇인지 확인하는 것이 주요하다. 해당 Function은 IRP_MJ_DEVICE_CONTROL(0x0e)에서 확인한다.
  Comments,     Trackbacks