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);
댓글 없음:
댓글 쓰기