본문 바로가기
Programming/System Programming

DeviceIoControl을 이용한 Kernel / User 통신 프로그램

by Winduck 2018. 7. 24.
반응형

개인적인 프로젝트를 진행하며 DeviceIoControl를 이용한 통신방법에 프로그래밍 한 것에 대해 정리해보았습니다.


우선, 유저레벨 코드를 보겠습니다.



※ 코드 흐름 설명

CreateFile(g_lpSymbolName,GENERIC_ALL,0,NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL) : 통신할 디바이스에 접근합니다.

DeviceIoControl(hDev,IOCTL_TEST, g_TestStr, wcslen(g_TestStr), &result, sizeof(result), &dwSize, 0) : 제가 정의한 컨트롤 코드인 IOCTL_TEST와 디바이스에 전달할 g_TestStr를 전달합니다. 디바이스는 잘 전달받았을 때 &result로 결과값을 받습니다.


DriverEntry드라이버코드를 보겠습니다.


※ 코드 흐름 설명

- IoCreateDevice(pDriverObj,0,&devNameString,FILE_DEVICE_UNKNOWN,FILE_DEVICE_SECURE_OPEN,FALSE,&pDevObj) : 드라이버에서 사용할 디바이스 오브젝트를 생성합니다. 단, devNameString"\\Device\\[디바이스 이름]"으로 사용합니다.

- IoCreateSymbolicLink(&symNameString,&devNameString) : 생성한 디바이스 이름(devNameString)과 유저레벨 보여질 이름 심볼명(symNameString)을 연결합니다. 단, symNameString"\\DosDevice\\[심볼명]"으로 생성합니다. 

- pDriverObj->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DeviceIoControlDispatcher : 유저레벨에서 DeviceIoControl을 처리할 루틴을 등록합니다.

- IRP_MJ_CLOSE, IRP_MJ_CLOSE, IRP_MJ_CLEANUP : 는 디폴트로 생성해야 CreateFile로 접근시, CloseHandle시, 커널오브젝트 해제시 처리가 가능합니다.

다음은 DeviceIoControl처리를 위해 IRP_MJ_DEVICE_CONTROL등록된 Driver코드입니다.



※ 코드 흐름 설명( 한가지 파라미터로 입출력 )

- pirp->AssociatedIrp.SystemBuffer : 유저모드로부터 전달받은 데이터를 받아오거나 유저모드어플리케이션으로 전달하는 파라미터

- pirp->IoStatus.Information = strlen(result) + 1 : 전달 데이터 크기 


위 프로그램을 돌리면 다음과 같은 결과화면 볼 수 있습니다.









반응형

댓글