본문 바로가기

WDM3

DeviceIoControl에서 Overlapped I/O 사용하기 DeviceIoControl에서 Overlapped I/O 사용하기 커널드라이버에서 발생한 빈번한 대량의 이벤트를 유저모드에서 하나하나 모니터링 하기위해서 이벤트를 이용하여 동기화, polling으로 이벤트를 계속 수신하거나 하는 방법 등 다양한 방법이 쓰일 수 있다. 문제의 시나리오 비교적 간단한 polling으로 이벤트를 계속 수신한다고 생각해보자. 커널드라이버에서는 발생한 이벤트를 큐에 큐잉하고 유저모드 애플리케이션에서는 IOCTL을 발생시켜 큐의 내용을 꺼내온다. 이런식의 로직에서 유저모드 애플리케이션은 While과 같은 반복문을 수행하며 DeviceIoControl를 호출하여 드라이버와 계속 통신할 것이다. while(true) { BOOL ret = DeviceIoControl(hDevice,.. 2020. 2. 18.
DeviceIoControl 버퍼 사용법 DeviceIoControl 사용시 버퍼 방식에 따른 버퍼 접근에 대한 정리이다. METHOD_BUFFERED Input과 Output 버퍼 모두 AssociatedIrp.SystemBuffer를 사용한다. 이때 버퍼의 사이즈는 사용자의 Input과 Output 버퍼사이즈의 최대 사이즈이다. Input과 Output 모두 같은 메모리를 사용하기 때문에 버퍼를 사용할때 Input 버퍼를 먼저 읽고 Output버퍼에 써야 한다. (안그럼 덮어 써진다.) METHOD_IN_DIRECT, METHOED_OUT_DIRECT Input Data는 Irp->AssoicatedIrp.SystemBuffer로 표현된다. Output Data는 MDL로 표현되며 Irp->MdlAddress에 들어간다. 읽기나 쓰기 버퍼의.. 2020. 1. 7.
장치 드라이버와 파일의 관계? 장치는 파일로 취급 된다. 리눅스에서는 디바이스를 하나의 파일로 취급하여 파일처럼 엑세스 가능하다. 그렇기 때문에 디바이스를 컨트롤 하는 방법은 File Operation 인터페이스를 통해 컨트롤 할 수 있게 된다. 예를 들면 Open, Write, Read, Close 등.. 세상에. 그런데 윈도우도 마찬가지다. 윈도우에서도 장치를 File Object를 통해 관리 하고 접근 할 수 있다. 마치 파일처럼 CreateFile, WriteFile, ReadFile, CloseHandle 로 말이다. 밑으로 내려가면 거기서 거기이다. 왜 File Object 윈도우에서 파일객체는 장치를 나타내는 커널모드 자료구조체 이다. 왜 파일 객체로 장치를 표현할까? 두 개 이상의 유저모드 프로세스가 공유할 수 있는 시.. 2019. 12. 30.