본문 바로가기

My Study/Function

IoCreateDevice, IoDeleteDevice 메모리 할당,해제

 일단 이 함수의 원형를 봐보겠습니다.
VOID IoDeleteDevice(
    IN PDEVICE_OBJECT  DeviceObject
);
인자로 넘겨진 디바이스 오브젝트를 시스템으로부터 제거하는 함수입니다.

제가 이 함수를 사용함으로서 뻑이난 경우가 있어서 그 경우로 들면서 설명하겠습니다.
DPC루틴과 WorkItem루틴을 사용하기 위해 DriverEntry에서 디바이스 오브젝트를 하나 생성했습니다.
//전역변수
PDEVICE_OBJECT pDeviceObject;

//DriverEntry 안
pDeviceObject = (PDEVICE_OBJECT)ExAllocatePool(NonPagedPool,sizeof(DEVICE_OBJECT));

IoCreateDevice(
DriverObject,
0,
&usDeivce,
FILE_DEVICE_UNKNOWN,
FILE_DEVICE_SECURE_OPEN,
FALSE,
&pDeviceObject
);
이런식으로 먼저 pDeviceObject는 포인터 이므로 ExAllocatePool함수로 메모리 할당을 해줍니다.
그리고 IoCreateDevice로 디바이스 오브젝트를 만들죠..

이제 드라이버를 언로드 할 시기가 와서 생성했던 디바이스 오브젝트를 시스템에서 없애주어야합니다.
그래서 IoDeviceObject함수를 사용했고.....
ExAllocatePool함수에 의해 할당된 메모리 영역을 없애주기 위해 ExFreePool 함수도 써줬습니다...
IoDeleteDevice(pDeviceObject);
ExFreePool(pDeviceObject);

이렇게 드라이버를 만들고 커널에 로드를 시켜 할일을 하다가... 커널에서 언로드 되는 시점에!!
갑자기 뻑이 나는 것입니다.. =_=

이유가 뭘까요.. 덤프 파일을 분석해 보니 
IoDeleteDevice(pDeviceObject);
ExFreePool(pDeviceObject);
이 부분에 문제가 있다고 나왔습니다.

덤프파일 처음에 나오는 설명입니다.
BAD_POOL_CALLER (c2)
The current thread is making a bad pool request.  
Typically this is at a bad IRQL level or double freeing the same allocation, etc.

스레드가 잘못된 영역을 요청했다는군요;;
보통 IRQL이 잘못됬거나 같은 메모리 영역을 두번 해제 하는 경우라고도 나오네요..; 기타 등등
일단 뻑난 코드 부분에서 의심할 것은 "같은 메모리 영역을 두번 해제 하는 경우" 를 의심해야겠군요.
IoDeleteDevice 함수 내부를 봐보았습니다.

그 중에 이러한 부분이 있었습니다.
__drv_freesMem(Mem)

메모리를 해제해주는 부분입니다....=_=;;
그렇습니다. IoDeleteDevice함수 내부에서 디바이스 오브젝트 포인터를 해제도 해주고 있었습니다.

해결방법이야 . 
ExFreePool(pDeviceObject);
이 부분만 지워주면 되겠죠.

이 글을 다 쓰고나서 IoCreateDevice 함수 내부를 또한 봐보았습니다.
그런데..!! IoCreatedevice 함수 내부에도 메모리 할당을 해주는 부분이 있었습니다.
NonPaged영역으로 만들어 지더군요.
가장 위 코드에서도 ExAllocatePool함수 같은건 쓸 필요가 없습니다.!!!

최종 결론!!
IoCreateDeviceIoDeleteDevice 함수를 사용해 디바이스를 생성하고 삭제 시 반환되는 값이 디바이스가 포인터 이지만 ExAllocatePool, ExFreePool 이런거 사용안하면 되겠습니다.

저 같은 실수를 하지 마세요..!!

'My Study > Function' 카테고리의 다른 글

GetDesktopWindow  (1) 2010.05.02
GetForegroundWindow  (0) 2010.05.02
ContinueDebugEvent  (0) 2010.04.12
WaitForDebugEvent  (0) 2010.04.12
DebugActiveProcess  (0) 2010.04.12