Fixed some problems if special parameters are delivered like SL_RESTART_SCAN, SL_INDE...
[reactos.git] / reactos / drivers / fs / vfat / dir.c
index 0c64762..8a87c39 100644 (file)
@@ -220,12 +220,12 @@ VfatGetFileBothInformation (PVFAT_DIRENTRY_CONTEXT DirContext,
 {
   if ((sizeof (FILE_BOTH_DIR_INFORMATION) + DirContext->LongNameU.Length) > BufferLength)
     return STATUS_BUFFER_OVERFLOW;
-  
+
   if (DeviceExt->Flags & VCB_IS_FATX)
   {
     pInfo->FileNameLength = DirContext->LongNameU.Length;
     RtlCopyMemory(pInfo->FileName, DirContext->LongNameU.Buffer, DirContext->LongNameU.Length);
-    pInfo->NextEntryOffset = 
+    pInfo->NextEntryOffset =
       ULONG_ROUND_UP (sizeof (FILE_BOTH_DIR_INFORMATION) + DirContext->LongNameU.Length);
     pInfo->ShortName[0] = 0;
     pInfo->ShortNameLength = 0;
@@ -258,7 +258,7 @@ VfatGetFileBothInformation (PVFAT_DIRENTRY_CONTEXT DirContext,
   else
   {
     pInfo->FileNameLength = DirContext->LongNameU.Length;
-    pInfo->NextEntryOffset = 
+    pInfo->NextEntryOffset =
       ULONG_ROUND_UP (sizeof (FILE_BOTH_DIR_INFORMATION) + DirContext->LongNameU.Length);
     RtlCopyMemory(pInfo->ShortName, DirContext->ShortNameU.Buffer, DirContext->ShortNameU.Length);
     pInfo->ShortNameLength = (CCHAR)DirContext->ShortNameU.Length;
@@ -298,13 +298,12 @@ NTSTATUS DoQuery (PVFAT_IRP_CONTEXT IrpContext)
   long BufferLength = 0;
   PUNICODE_STRING pSearchPattern = NULL;
   FILE_INFORMATION_CLASS FileInformationClass;
-  unsigned long FileIndex = 0;
   unsigned char *Buffer = NULL;
   PFILE_NAMES_INFORMATION Buffer0 = NULL;
   PVFATFCB pFcb;
   PVFATCCB pCcb;
-  BOOLEAN First = FALSE;
-  BOOLEAN FirstCall;
+  BOOLEAN FirstQuery = FALSE;
+  BOOLEAN FirstCall = TRUE;
   VFAT_DIRENTRY_CONTEXT DirContext;
   WCHAR LongNameBuffer[LONGNAME_MAX_LENGTH + 1];
   WCHAR ShortNameBuffer[13];
@@ -319,7 +318,7 @@ NTSTATUS DoQuery (PVFAT_IRP_CONTEXT IrpContext)
 #if 0
   /* Do not probe the user buffer until SEH is available */
   if (IrpContext->Irp->RequestorMode != KernelMode &&
-      IrpContext->Irp->MdlAddress == NULL && 
+      IrpContext->Irp->MdlAddress == NULL &&
       IrpContext->Irp->UserBuffer != NULL)
     {
       ProbeForWrite(IrpContext->Irp->UserBuffer, BufferLength, 1);
@@ -348,12 +347,11 @@ NTSTATUS DoQuery (PVFAT_IRP_CONTEXT IrpContext)
 #endif
   FileInformationClass =
     Stack->Parameters.QueryDirectory.FileInformationClass;
-  FileIndex = Stack->Parameters.QueryDirectory.FileIndex;
   if (pSearchPattern)
     {
       if (!pCcb->SearchPattern.Buffer)
         {
-          First = TRUE;
+          FirstQuery = TRUE;
           pCcb->SearchPattern.MaximumLength = pSearchPattern->Length + sizeof(WCHAR);
           pCcb->SearchPattern.Buffer = ExAllocatePool(NonPagedPool, pCcb->SearchPattern.MaximumLength);
           if (!pCcb->SearchPattern.Buffer)
@@ -367,7 +365,7 @@ NTSTATUS DoQuery (PVFAT_IRP_CONTEXT IrpContext)
     }
   else if (!pCcb->SearchPattern.Buffer)
     {
-      First = TRUE;
+      FirstQuery = TRUE;
       pCcb->SearchPattern.MaximumLength = 2 * sizeof(WCHAR);
       pCcb->SearchPattern.Buffer = ExAllocatePool(NonPagedPool, 2 * sizeof(WCHAR));
       if (!pCcb->SearchPattern.Buffer)
@@ -382,18 +380,15 @@ NTSTATUS DoQuery (PVFAT_IRP_CONTEXT IrpContext)
 
   if (IrpContext->Stack->Flags & SL_INDEX_SPECIFIED)
     {
-      DirContext.DirIndex = pCcb->Entry = pCcb->CurrentByteOffset.u.LowPart;
-      FirstCall = TRUE;
+      DirContext.DirIndex = pCcb->Entry = Stack->Parameters.QueryDirectory.FileIndex;
     }
-  else if (First || (IrpContext->Stack->Flags & SL_RESTART_SCAN))
+  else if (FirstQuery || (IrpContext->Stack->Flags & SL_RESTART_SCAN))
     {
       DirContext.DirIndex = pCcb->Entry = 0;
-      FirstCall = TRUE;
     }
   else
     {
       DirContext.DirIndex = pCcb->Entry;
-      FirstCall = FALSE;
     }
 
   DPRINT ("Buffer=%x tofind=%wZ\n", Buffer, &pCcb->SearchPattern);
@@ -405,7 +400,7 @@ NTSTATUS DoQuery (PVFAT_IRP_CONTEXT IrpContext)
 
   while (RC == STATUS_SUCCESS && BufferLength > 0)
     {
-      RC = FindFile (IrpContext->DeviceExt, pFcb, 
+      RC = FindFile (IrpContext->DeviceExt, pFcb,
                      &pCcb->SearchPattern, &DirContext, FirstCall);
       pCcb->Entry = DirContext.DirIndex;
       DPRINT ("Found %wZ, RC=%x, entry %x\n", &DirContext.LongNameU, RC, pCcb->Entry);
@@ -416,25 +411,25 @@ NTSTATUS DoQuery (PVFAT_IRP_CONTEXT IrpContext)
             {
               case FileNameInformation:
                 RC = VfatGetFileNameInformation (&DirContext,
-                                                 (PFILE_NAMES_INFORMATION) Buffer, 
+                                                 (PFILE_NAMES_INFORMATION) Buffer,
                                                 BufferLength);
                 break;
               case FileDirectoryInformation:
-                RC = VfatGetFileDirectoryInformation (&DirContext, 
+                RC = VfatGetFileDirectoryInformation (&DirContext,
                                                      IrpContext->DeviceExt,
-                                                     (PFILE_DIRECTORY_INFORMATION) Buffer, 
+                                                     (PFILE_DIRECTORY_INFORMATION) Buffer,
                                                      BufferLength);
                 break;
              case FileFullDirectoryInformation:
-               RC = VfatGetFileFullDirectoryInformation (&DirContext, 
+               RC = VfatGetFileFullDirectoryInformation (&DirContext,
                                                         IrpContext->DeviceExt,
-                                                        (PFILE_FULL_DIR_INFORMATION) Buffer, 
+                                                        (PFILE_FULL_DIR_INFORMATION) Buffer,
                                                         BufferLength);
                break;
              case FileBothDirectoryInformation:
-               RC = VfatGetFileBothInformation (&DirContext, 
+               RC = VfatGetFileBothInformation (&DirContext,
                                                IrpContext->DeviceExt,
-                                               (PFILE_BOTH_DIR_INFORMATION) Buffer, 
+                                               (PFILE_BOTH_DIR_INFORMATION) Buffer,
                                                BufferLength);
                break;
              default:
@@ -442,20 +437,12 @@ NTSTATUS DoQuery (PVFAT_IRP_CONTEXT IrpContext)
            }
           if (RC == STATUS_BUFFER_OVERFLOW)
             {
-              if (Buffer0)
-                {
-                  Buffer0->NextEntryOffset = 0;
-                }
               break;
             }
        }
       else
         {
-          if (Buffer0)
-            {
-              Buffer0->NextEntryOffset = 0;
-            }
-          if (First)
+          if (FirstQuery)
             {
               RC = STATUS_NO_SUCH_FILE;
             }
@@ -466,21 +453,18 @@ NTSTATUS DoQuery (PVFAT_IRP_CONTEXT IrpContext)
           break;
        }
       Buffer0 = (PFILE_NAMES_INFORMATION) Buffer;
-      Buffer0->FileIndex = FileIndex++;
+      Buffer0->FileIndex = DirContext.DirIndex;
       pCcb->Entry = ++DirContext.DirIndex;
+      BufferLength -= Buffer0->NextEntryOffset;
       if (IrpContext->Stack->Flags & SL_RETURN_SINGLE_ENTRY)
         {
           break;
         }
-      BufferLength -= Buffer0->NextEntryOffset;
       Buffer += Buffer0->NextEntryOffset;
     }
   if (Buffer0)
     {
       Buffer0->NextEntryOffset = 0;
-    }
-  if (FileIndex > 0)
-    {
       RC = STATUS_SUCCESS;
       IrpContext->Irp->IoStatus.Information = Stack->Parameters.QueryDirectory.Length - BufferLength;