KDFS-windows-afsrdr-kernel-20090104
authorJeffrey Altman <jaltman@secure-endpoints.com>
Mon, 5 Jan 2009 05:24:44 +0000 (05:24 +0000)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Mon, 5 Jan 2009 05:24:44 +0000 (05:24 +0000)
LICENSE BSD

In order to evaluate the file attributes the fcb of the parent
is required.  For volume roots, the parent is the current fcb.

src/WINNT/afsrdr/kernel/AFSDirControl.cpp
src/WINNT/afsrdr/kernel/AFSFileInfo.cpp

index 005ecfd..a999756 100644 (file)
@@ -563,7 +563,18 @@ AFSQueryDirectory( IN PIRP Irp)
                 if( BooleanFlagOn( pCcb->Flags, CCB_FLAG_DIR_OF_DIRS_ONLY))
                 {
 
-                    if( !(AFSGetFileAttributes( pFcb->ParentFcb, pDirEntry) & FILE_ATTRIBUTE_DIRECTORY))
+                    AFSFcb * pParentFcb = NULL;
+
+                    if ( pFcb->ParentFcb )
+                    {
+                        pParentFcb = pFcb->ParentFcb;
+                    }
+                    else if (pFcb->DirEntry->DirectoryEntry.FileId.Vnode == 1)
+                    {   
+                        pParentFcb = pFcb;
+                    }
+
+                    if( !(AFSGetFileAttributes( pParentFcb, pDirEntry) & FILE_ATTRIBUTE_DIRECTORY))
                     {
 
                         if( pDirEntry->ListEntry.fLink != NULL)
@@ -750,7 +761,22 @@ AFSQueryDirectory( IN PIRP Irp)
                     pDirInfo->ChangeTime = pDirEntry->DirectoryEntry.LastWriteTime;
                     pDirInfo->EndOfFile = pDirEntry->DirectoryEntry.EndOfFile;
                     pDirInfo->AllocationSize = pDirEntry->DirectoryEntry.AllocationSize;
-                    pDirInfo->FileAttributes = AFSGetFileAttributes( pFcb->ParentFcb, pDirEntry);
+
+                    {
+                        AFSFcb * pParentFcb = NULL;
+
+                        if ( pFcb->ParentFcb )
+                        {
+                            pParentFcb = pFcb->ParentFcb;
+                        }
+                        else if (pFcb->DirEntry->DirectoryEntry.FileId.Vnode == 1)
+                        {   
+                            pParentFcb = pFcb;
+                        }
+
+                        pDirInfo->FileAttributes = AFSGetFileAttributes( pParentFcb, pDirEntry);
+                    }
+
                     pDirInfo->FileIndex = pDirEntry->DirectoryEntry.FileIndex; 
                     pDirInfo->FileNameLength = pDirEntry->DirectoryEntry.FileName.Length;
 
index c07e80a..c6e01e5 100644 (file)
@@ -710,6 +710,8 @@ AFSQueryStandardInfo( IN PIRP Irp,
 
     if( *Length >= sizeof( FILE_STANDARD_INFORMATION))
     {
+        ULONG ulAttrs;
+        AFSFcb * pParentFcb = NULL;
 
         RtlZeroMemory( Buffer, 
                        *Length);
@@ -718,7 +720,19 @@ AFSQueryStandardInfo( IN PIRP Irp,
         Buffer->EndOfFile = Fcb->DirEntry->DirectoryEntry.EndOfFile;
         Buffer->NumberOfLinks = 0;
         Buffer->DeletePending = BooleanFlagOn( Fcb->Flags, AFS_FCB_PENDING_DELETE);
-        Buffer->Directory = BooleanFlagOn( AFSGetFileAttributes( Fcb->ParentFcb, Fcb->DirEntry), FILE_ATTRIBUTE_DIRECTORY);
+        
+        if ( Fcb->ParentFcb )
+        {
+            pParentFcb = Fcb->ParentFcb;
+        }
+        else if (Fcb->DirEntry->DirectoryEntry.FileId.Vnode == 1)
+        {   
+            pParentFcb = Fcb;
+        }
+
+        ulAttrs = AFSGetFileAttributes( pParentFcb, Fcb->DirEntry);
+
+        Buffer->Directory = BooleanFlagOn( ulAttrs, FILE_ATTRIBUTE_DIRECTORY);
 
         *Length -= sizeof( FILE_STANDARD_INFORMATION);
     }