IoQueryFileDosDeviceName 의 msdn 문서를 보면 다음과 같은 부분이 있습니다.
Syntax
NTSTATUS IoQueryFileDosDeviceName( _In_ PFILE_OBJECT FileObject, _Out_ POBJECT_NAME_INFORMATION *ObjectNameInformation );
Parameters
- FileObject [in]
Pointer to a file object for the file.
- ObjectNameInformation [out]
A returned pointer to a newly allocated OBJECT_NAME_INFORMATION structure. This structure is filled in on successful return with the MS-DOS device name information. The structure is defined as follows:
typedef struct _OBJECT_NAME_INFORMATION { UNICODE_STRING Name; } OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;Note This structure must eventually be freed by calling ExFreePool.
두번째 인자는... ExFreePool을 호출해서 Free해주어야 한다는군요...
근데 그렇다면 구체적으로 어떻게 Free해주어야 하는 걸까요?? 어디에도 구체적인 샘플코드가 없습니다..
1번. UNICODE_STRING의 Buffer를 Free한 후 구조체를 Free
2번. 그냥 구조체만 Free
1번? 2번? 알쏭달쏭 합니다...
이런 무뚝뚝한 MSDN이 있나...
구글에서 아무리 찾아봐도 확실한 소스코드가 없어서... 한번 디버깅을 해보았습니다.
1: kd> dt -r nt!_OBJECT_NAME_INFORMATION 0xa636c008
+0x000 Name : _UNICODE_STRING "D:\"
+0x000 Length : 6
+0x002 MaximumLength : 8
+0x004 Buffer : 0xa636c010 "D:\"
음... 보시면요... 일단 구조체의 주소와 UNICODE_STRING의 Buffer가 가리키는 주소가 거의 인접한 값이라는 걸 알수 있습니다.
0x8 만큼 차이가 나죠. (음... 8바이트?? 이것은... sizeof(UNICODE_STRING) ??)
1: kd> !pool 0xa636c008
Pool page a636c008 region is Paged pool
*a636c000 size: d0 previous size: 0 (Allocated) *IoDn
Pooltag IoDn : Io device name info, Binary : nt!io
a636c0d0 size: 1a8 previous size: d0 (Allocated) AlMs
a636c278 size: 38 previous size: 1a8 (Allocated) CMVa
a636c2b0 size: 100 previous size: 38 (Allocated) IoNm
...
1: kd> !pool 0xa636c010
Pool page a636c010 region is Paged pool
*a636c000 size: d0 previous size: 0 (Allocated) *IoDn
Pooltag IoDn : Io device name info, Binary : nt!io
a636c0d0 size: 1a8 previous size: d0 (Allocated) AlMs
a636c278 size: 38 previous size: 1a8 (Allocated) CMVa
a636c2b0 size: 100 previous size: 38 (Allocated) IoNm
네~~ 그렇습니다.
저 OBJECT_NAME_INFORMATION 구조체와 UNICODE_STRING Buffer 는... 한번에 할당된 동일한 메모리였던 것입니다.
따라서 2번과 같이 구조체 포인터에 대해 한번만 Free해주시면 되겠습니다.
참 친절하군요~~~ (이왕이면 MSDN에 좀더 자세하게 설명해주었다면 더 좋았을텐데요... ^^;;)
정답은
'Kernel Inside > FileSystem' 카테고리의 다른 글
미니필터에서 File I/O Redirect 하기 (부제 : simrep 샘플 코드의 버그?) (0) | 2014.07.31 |
---|---|
File이 Rename (MoveFile)될 때 커널에서 벌어지는 일들 (2) | 2014.07.28 |
미니필터 샘플코드 "scanner" Flow 정리 (0) | 2013.08.13 |
IRP Completion, STATUS_PENDING and FltMgr (0) | 2012.05.24 |
[Minifilter] Filter Manager Overview (0) | 2012.03.28 |