Пишу драйвер-фильтр файловой системы на базе sfilter (из IFS Kit) и пытаюсь получить имя файла.
Для этого я написал функцию, которая вызывается из обработчиков IRP (Creat, CloseCleanUp, Read, Write, SetFileInformation)/
Она выделяет память под хранения имени файла и заносит туда имя (Код ниже).
Когда ставлю драйвер изапускаю винду, то все работает отлично. 100 тысяч вызовов — работает как часы.
Но стоит попробовать несколько раз откомпилировать что-то компилятором DDK (консольным) — как вылетает синий экран. Синий экран может вылететь тока на 20-ой попытке компиляции. Синий экран с ошибкой PAGE_FAULT_IN_NON_PAGED_AREA.
Вроде все грамотно. Что выделяю — то уничтожаю. С IRQL тоже вроде все ОК. За пределы своего буфера тоже не вылезаю. Не пойму.
Без этой части все работает
if (FileObject->RelatedFileObject != NULL)
if ((FileObject->RelatedFileObject)->FileName.Buffer != NULL){
RtlAppendUnicodeStringToString(&UStr,&FileObject->RelatedFileObject->FileName);
RtlAppendUnicodeToString(&UStr, L"\\" );
}
RtlAppendUnicodeStringToString(&UStr,&FileObject->FileName);
ЛИСТИНГ:
//-----------------Выдает имя файла
UNICODE_STRING SfGetFileName2(IN PFILE_OBJECT FileObject)
{
USHORT newSize;
PVOID newBuffer;
UNICODE_STRING UStr;
UStr.Buffer = NULL;
if (FileObject == NULL)
return UStr;
if (FileObject->FileName.Buffer == NULL)
return UStr;
newSize = FileObject->FileName.Length;
if (FileObject->RelatedFileObject != NULL)
if ((FileObject->RelatedFileObject)->FileName.Buffer != NULL)
newSize = newSize + ((FileObject->RelatedFileObject)->FileName).Length + 4*sizeof(WCHAR);
newBuffer = ExAllocatePoolWithTag(NonPagedPool,newSize,SFLT_POOL_TAG );
if (newBuffer!=NULL){
UStr.Buffer = newBuffer;
UStr.Length=0;
UStr.MaximumLength=newSize;
if (FileObject->RelatedFileObject != NULL)
if ((FileObject->RelatedFileObject)->FileName.Buffer != NULL){
RtlAppendUnicodeStringToString(&UStr,&FileObject->RelatedFileObject->FileName);
RtlAppendUnicodeToString(&UStr, L"\\" );
}
RtlAppendUnicodeStringToString(&UStr,&FileObject->FileName);
}
else{
UStr.Buffer = NULL;
UStr.Length=0;
UStr.MaximumLength=0;
}
return UStr;
}
//Вызов
uu3 = SfGetFileName2(irpSp->FileObject);
if (uu3.Buffer!=NULL)
ExFreePool(uu3.Buffer);