최신목록

2016년 4월 21일 목요일

[WINDOWS]FltGetFileNameInformation 시 BAD_POOL_CALLER 발생

minifilter dirver 개발시 pre callback에서 context를 만들어서 post callback으로 넘겨주기 위해 ExAllocatePoolWithTag를 이용하여 allocation 하여
FltGetFileNameInformation 파라미터로 넘기고
그 포인터를 post callback에서 ExFreePool 하였을대 BAD_POOL_CALLER가 발생하였다.

FltGetFileNameInformation 선언은 아래와 같다.

NTSTATUS FltGetFileNameInformation(
  _In_  PFLT_CALLBACK_DATA         CallbackData,
  _In_  FLT_FILE_NAME_OPTIONS      NameOptions,
  _Out_ PFLT_FILE_NAME_INFORMATION *FileNameInformation

);



아래와 같이 사용하였다.

PFILE_NAME_INFORMATION pFileInfo = ExAllocatePoolWithTag(NonPagedPool, 1024, MEM_TAG);
FltGetFileNameInforamtion(Data, FLT_FILE_NAME_NORMATLIZED | FLT_FILE_NAME_QUERY_DEFAULT, &pFileInfo);
.....
ExFreePool(pFileInfo);









아래와 같이 사용하였다. ExFreePool시 CRASH!!! 



음...왜그러징..다시 FltGetFileNameInformation의 msdn을 천천히 읽어보았다.

파라미터로 들어가는 FLT_FILE_NAME_INFORMATION은 이중포인터로 들어가서 내부에서 ALLOCATION을 해서 포인터를 리턴해주고 있더라...결국 위에서 내가 ExFreePool한 포인터는 내가 allocation 한 그놈이 아니고 system이 allocation 한 놈을 내가 함부로..free한 격이 되었다. 그래서 BAD_POOL_CALLER 에러가 났군~!!!



system이 allocation 한 놈들은 보통 free하는 API가 존재하는 법!
그놈이 FltReleaseFileNameInformation!




제대로 된 사용법은 아래와 같다.

PFILE_NAME_INFORMATION pFileInfo = NULL;
FltGetFileNameInforamtion(Data, FLT_FILE_NAME_NORMATLIZED | FLT_FILE_NAME_QUERY_DEFAULT, &pFileInfo);
...
FltReleaseFileNameInformation(pFileInfo);




댓글 없음:

댓글 쓰기