Непонятное появление синего экрана
От: Kirston  
Дата: 06.06.06 10:13
Оценка:
Пишу драйвер-фильтр файловой системы на базе 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);
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.