개인적인 프로젝트를 진행하며 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 : 전달 데이터 크기
위 프로그램을 돌리면 다음과 같은 결과화면을 볼 수 있습니다.
'Programming > System Programming' 카테고리의 다른 글
NtQueryInformationProcess가 프로세스 정보 가져오는 법 (0) | 2019.04.04 |
---|---|
Processor Affinity사용하기 (0) | 2018.08.06 |
VirtualProtectEx메모리 속성변경 size (0) | 2018.05.24 |
[Driver]프로세스/DLL로드 및 소멸 모니터링 프로그래밍 (0) | 2017.07.06 |
[WIN32 / C]모든 프로세스 모듈 스캔 코드 (0) | 2017.05.04 |
댓글