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에 좀더 자세하게 설명해주었다면 더 좋았을텐데요... ^^;;)


정답은

Posted by kuaaan
,


사랑합니다. 편안히 잠드소서