- Use Unicode strings instead of WCHAR strings.
authorEric Kohl <eric.kohl@reactos.org>
Tue, 14 Sep 2004 21:46:39 +0000 (21:46 +0000)
committerEric Kohl <eric.kohl@reactos.org>
Tue, 14 Sep 2004 21:46:39 +0000 (21:46 +0000)
- Use FsRtl functions to handle wildcards.

svn path=/trunk/; revision=10858

reactos/drivers/fs/cdfs/cdfs.h
reactos/drivers/fs/cdfs/close.c
reactos/drivers/fs/cdfs/create.c
reactos/drivers/fs/cdfs/dirctl.c
reactos/drivers/fs/cdfs/fcb.c
reactos/drivers/fs/cdfs/misc.c

index e9553cc..f13b76f 100644 (file)
@@ -174,10 +174,11 @@ typedef struct _FCB
   PFILE_OBJECT FileObject;
   PDEVICE_EXTENSION DevExt;
 
+  UNICODE_STRING ShortNameU;
+
   WCHAR *ObjectName;           /* point on filename (250 chars max) in PathName */
   WCHAR PathName[MAX_PATH];    /* path+filename 260 max */
-  WCHAR ShortName[13];
-  USHORT ShortNameLength;
+  WCHAR ShortNameBuffer[13];
 
   ERESOURCE MainResource;
 
@@ -205,7 +206,7 @@ typedef struct _CCB
   ULONG Entry;
   ULONG Offset;
   /* for DirectoryControl */
-  PWCHAR DirectorySearchPattern;
+  UNICODE_STRING DirectorySearchPattern;
   ULONG LastCluster;
   ULONG LastOffset;
 } CCB, *PCCB;
@@ -305,7 +306,7 @@ CdfsAddFCBToTable(PDEVICE_EXTENSION Vcb,
 
 PFCB
 CdfsGrabFCBFromTable(PDEVICE_EXTENSION Vcb,
-                    PWSTR FileName);
+                    PUNICODE_STRING FileName);
 
 NTSTATUS
 CdfsFCBInitializeCache(PVCB Vcb,
@@ -335,14 +336,14 @@ CdfsAttachFCBToFileObject(PDEVICE_EXTENSION Vcb,
 NTSTATUS
 CdfsDirFindFile(PDEVICE_EXTENSION DeviceExt,
                PFCB DirectoryFcb,
-               PWSTR FileToFind,
+               PUNICODE_STRING FileToFind,
                PFCB *FoundFCB);
 
 NTSTATUS
 CdfsGetFCBForFile(PDEVICE_EXTENSION Vcb,
                  PFCB *pParentFCB,
                  PFCB *pFCB,
-                 const PWSTR pFileName);
+                 PUNICODE_STRING FileName);
 
 
 /* finfo.c */
@@ -365,9 +366,6 @@ CdfsFileSystemControl(PDEVICE_OBJECT DeviceObject,
 
 /* misc.c */
 
-BOOLEAN
-wstrcmpjoki(PWSTR s1, PWSTR s2);
-
 VOID
 CdfsSwapString(PWCHAR Out,
               PUCHAR In,
index 8a087ac..6ae9183 100644 (file)
@@ -16,7 +16,7 @@
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
-/* $Id: close.c,v 1.7 2003/09/20 20:31:57 weiden Exp $
+/* $Id: close.c,v 1.8 2004/09/14 21:46:39 ekohl Exp $
  *
  * COPYRIGHT:        See COPYING in the top level directory
  * PROJECT:          ReactOS kernel
@@ -69,10 +69,7 @@ CdfsCloseFile(PDEVICE_EXTENSION DeviceExt,
       CdfsReleaseFCB(DeviceExt, FileObject->FsContext);
     }
 
-  if (Ccb->DirectorySearchPattern)
-    {
-      ExFreePool(Ccb->DirectorySearchPattern);
-    }
+  RtlFreeUnicodeString(&Ccb->DirectorySearchPattern);
   ExFreePool(Ccb);
 
   return(STATUS_SUCCESS);
index 3a58787..9fed126 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  ReactOS kernel
- *  Copyright (C) 2002, 2003 ReactOS Team
+ *  Copyright (C) 2002, 2003, 2004 ReactOS Team
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -16,7 +16,7 @@
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
-/* $Id: create.c,v 1.11 2003/11/13 15:25:08 ekohl Exp $
+/* $Id: create.c,v 1.12 2004/09/14 21:46:39 ekohl Exp $
  *
  * COPYRIGHT:        See COPYING in the top level directory
  * PROJECT:          ReactOS kernel
 /* FUNCTIONS ****************************************************************/
 
 static NTSTATUS
-CdfsMakeAbsoluteFilename(PFILE_OBJECT pFileObject,
-                        PWSTR pRelativeFileName,
-                        PWSTR *pAbsoluteFilename)
+CdfsMakeAbsoluteFilename(PFILE_OBJECT FileObject,
+                        PUNICODE_STRING RelativeFileName,
+                        PUNICODE_STRING AbsoluteFileName)
 {
-  PWSTR rcName;
+  ULONG Length;
+//  PWSTR rcName;
   PFCB Fcb;
+  NTSTATUS Status;
 
-  DPRINT("try related for %S\n", pRelativeFileName);
-  Fcb = pFileObject->FsContext;
+  DPRINT("try related for %wZ\n", RelativeFileName);
+  Fcb = FileObject->FsContext;
   assert(Fcb);
 
   /* verify related object is a directory and target name
      don't start with \. */
-  if ((Fcb->Entry.FileFlags & 0x02) == 0 ||
-      pRelativeFileName[0] == L'\\')
+  if ((Fcb->Entry.FileFlags & FILE_FLAG_DIRECTORY) == 0 ||
+      RelativeFileName->Buffer[0] == L'\\')
     {
-      return(STATUS_INVALID_PARAMETER);
+      return STATUS_INVALID_PARAMETER;
     }
 
   /* construct absolute path name */
-  assert(wcslen (Fcb->PathName) + 1 + wcslen (pRelativeFileName) + 1
-          <= MAX_PATH);
-  rcName = ExAllocatePool(NonPagedPool, MAX_PATH * sizeof(WCHAR));
-  if (!rcName)
+  Length = (wcslen(Fcb->PathName) * sizeof(WCHAR)) +
+           sizeof(WCHAR) +
+           RelativeFileName->Length +
+           sizeof(WCHAR);
+//  assert(wcslen (Fcb->PathName) + 1 + wcslen (pRelativeFileName) + 1
+//          <= MAX_PATH);
+//  rcName = ExAllocatePool(NonPagedPool, MAX_PATH * sizeof(WCHAR));
+//  if (!rcName)
+//    {
+//      return(STATUS_INSUFFICIENT_RESOURCES);
+//    }
+  AbsoluteFileName->Length = 0;
+  AbsoluteFileName->MaximumLength = Length;
+  AbsoluteFileName->Buffer = ExAllocatePool(NonPagedPool,
+                                           Length);
+  if (AbsoluteFileName->Buffer == NULL)
     {
-      return(STATUS_INSUFFICIENT_RESOURCES);
+CHECKPOINT1;
+      return STATUS_INSUFFICIENT_RESOURCES;
+    }
+
+
+//  wcscpy(rcName, Fcb->PathName);
+  Status = RtlAppendUnicodeToString(AbsoluteFileName,
+                                   Fcb->PathName);
+  if (!NT_SUCCESS(Status))
+    {
+CHECKPOINT1;
+      RtlFreeUnicodeString(AbsoluteFileName);
+      return Status;
     }
 
-  wcscpy(rcName, Fcb->PathName);
   if (!CdfsFCBIsRoot(Fcb))
-    wcscat (rcName, L"\\");
-  wcscat (rcName, pRelativeFileName);
-  *pAbsoluteFilename = rcName;
+    {
+//    wcscat (rcName, L"\\");
+      Status = RtlAppendUnicodeToString(AbsoluteFileName,
+                                       L"\\");
+      if (!NT_SUCCESS(Status))
+       {
+CHECKPOINT1;
+         RtlFreeUnicodeString(AbsoluteFileName);
+         return Status;
+       }
+    }
+
+  Status = RtlAppendUnicodeStringToString(AbsoluteFileName,
+                                         RelativeFileName);
+  if (!NT_SUCCESS(Status))
+    {
+CHECKPOINT1;
+      RtlFreeUnicodeString(AbsoluteFileName);
+      return Status;
+    }
+
+//  wcscat (rcName, pRelativeFileName);
+//  *pAbsoluteFilename = rcName;
 
-  return(STATUS_SUCCESS);
+  return STATUS_SUCCESS;
 }
 
 
-static NTSTATUS
-CdfsOpenFile(PDEVICE_EXTENSION DeviceExt,
-            PFILE_OBJECT FileObject,
-            PWSTR FileName)
 /*
  * FUNCTION: Opens a file
  */
+static NTSTATUS
+CdfsOpenFile(PDEVICE_EXTENSION DeviceExt,
+            PFILE_OBJECT FileObject,
+            PUNICODE_STRING FileName)
 {
   PFCB ParentFcb;
   PFCB Fcb;
   NTSTATUS Status;
-  PWSTR AbsFileName = NULL;
+  UNICODE_STRING AbsFileName;
 
-  DPRINT("CdfsOpenFile(%08lx, %08lx, %S)\n", DeviceExt, FileObject, FileName);
+  DPRINT("CdfsOpenFile(%08lx, %08lx, %wZ)\n", DeviceExt, FileObject, FileName);
 
   if (FileObject->RelatedFileObject)
     {
@@ -99,12 +144,15 @@ CdfsOpenFile(PDEVICE_EXTENSION DeviceExt,
       Status = CdfsMakeAbsoluteFilename(FileObject->RelatedFileObject,
                                        FileName,
                                        &AbsFileName);
-      FileName = AbsFileName;
       if (!NT_SUCCESS(Status))
        {
          return Status;
        }
 
+      FileName = &AbsFileName;
+
+      RtlFreeUnicodeString(&AbsFileName);
+
       return STATUS_UNSUCCESSFUL;
     }
 
@@ -141,9 +189,7 @@ CdfsOpenFile(PDEVICE_EXTENSION DeviceExt,
       return Status;
     }
 
-  //FIXME: Get cannonical path name (remove .'s, ..'s and extra separators)
-
-  DPRINT("PathName to open: %S\n", FileName);
+  DPRINT("PathName to open: %wZ\n", FileName);
 
   /*  try first to find an existing FCB in memory  */
   DPRINT("Checking for existing FCB in memory\n");
@@ -166,10 +212,10 @@ CdfsOpenFile(PDEVICE_EXTENSION DeviceExt,
        {
          DPRINT("Could not make a new FCB, status: %x\n", Status);
 
-         if (AbsFileName)
-           ExFreePool(AbsFileName);
+         if (FileName == &AbsFileName)
+           RtlFreeUnicodeString(&AbsFileName);
 
-         return(Status);
+         return Status;
        }
     }
 
@@ -178,19 +224,19 @@ CdfsOpenFile(PDEVICE_EXTENSION DeviceExt,
                                     Fcb,
                                     FileObject);
 
-  if (AbsFileName)
-    ExFreePool (AbsFileName);
+  if (FileName == &AbsFileName)
+    RtlFreeUnicodeString(&AbsFileName);
 
   return Status;
 }
 
 
-static NTSTATUS
-CdfsCreateFile(PDEVICE_OBJECT DeviceObject,
-              PIRP Irp)
 /*
  * FUNCTION: Opens a file
  */
+static NTSTATUS
+CdfsCreateFile(PDEVICE_OBJECT DeviceObject,
+              PIRP Irp)
 {
   PDEVICE_EXTENSION DeviceExt;
   PIO_STACK_LOCATION Stack;
@@ -198,7 +244,6 @@ CdfsCreateFile(PDEVICE_OBJECT DeviceObject,
   ULONG RequestedDisposition;
   ULONG RequestedOptions;
   PFCB Fcb;
-//  PWSTR FileName;
   NTSTATUS Status;
 
   DPRINT("CdfsCreateFile() called\n");
@@ -219,13 +264,12 @@ CdfsCreateFile(PDEVICE_OBJECT DeviceObject,
       RequestedDisposition == FILE_OVERWRITE_IF ||
       RequestedDisposition == FILE_SUPERSEDE)
     {
-      return(STATUS_ACCESS_DENIED);
+      return STATUS_ACCESS_DENIED;
     }
 
   Status = CdfsOpenFile(DeviceExt,
                        FileObject,
-                       FileObject->FileName.Buffer);
-
+                       &FileObject->FileName);
   if (NT_SUCCESS(Status))
     {
       Fcb = FileObject->FsContext;
index 62627b3..31ccefc 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  ReactOS kernel
- *  Copyright (C) 2002 ReactOS Team
+ *  Copyright (C) 2002, 2004 ReactOS Team
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -16,7 +16,7 @@
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
-/* $Id: dirctl.c,v 1.15 2004/05/23 13:31:25 hbirr Exp $
+/* $Id: dirctl.c,v 1.16 2004/09/14 21:46:39 ekohl Exp $
  *
  * COPYRIGHT:        See COPYING in the top level directory
  * PROJECT:          ReactOS kernel
@@ -42,6 +42,9 @@
 
 /* FUNCTIONS ****************************************************************/
 
+/*
+ * FUNCTION: Retrieves the file name, be it in short or long file name format
+ */
 static NTSTATUS
 CdfsGetEntryName(PDEVICE_EXTENSION DeviceExt,
                 PVOID *Context,
@@ -52,9 +55,6 @@ CdfsGetEntryName(PDEVICE_EXTENSION DeviceExt,
                 PWSTR Name,
                 PULONG pIndex,
                 PULONG CurrentOffset)
-/*
- * FUNCTION: Retrieves the file name, be it in short or long file name format
- */
 {
   PDIR_RECORD Record = *Ptr;
   ULONG Index;
@@ -112,8 +112,9 @@ CdfsGetEntryName(PDEVICE_EXTENSION DeviceExt,
      *Ptr = *Block;
      Record = (PDIR_RECORD)*Ptr;
   }
+
   if (*CurrentOffset >= DirLength)
-     return(STATUS_NO_MORE_ENTRIES);
+    return STATUS_NO_MORE_ENTRIES;
 
   DPRINT("Index %lu  RecordLength %lu  Offset %lu\n",
         *pIndex, Record->RecordLength, *CurrentOffset);
@@ -149,20 +150,21 @@ CdfsGetEntryName(PDEVICE_EXTENSION DeviceExt,
   return(STATUS_SUCCESS);
 }
 
+
+/*
+ * FUNCTION: Find a file
+ */
 static NTSTATUS
 CdfsFindFile(PDEVICE_EXTENSION DeviceExt,
             PFCB Fcb,
             PFCB Parent,
-            PWSTR FileToFind,
+            PUNICODE_STRING FileToFind,
             PULONG pDirIndex,
             PULONG pOffset)
-/*
- * FUNCTION: Find a file
- */
 {
   WCHAR name[256];
-  WCHAR TempStr[2];
   WCHAR ShortNameBuffer[13];
+  UNICODE_STRING TempString;
   UNICODE_STRING ShortName;
   UNICODE_STRING LongName;
   PVOID Block;
@@ -178,19 +180,19 @@ CdfsFindFile(PDEVICE_EXTENSION DeviceExt,
   BOOLEAN HasSpaces;
   GENERATE_NAME_CONTEXT NameContext;
 
-  DPRINT("FindFile(Parent %x, FileToFind '%S', DirIndex: %d)\n",
+  DPRINT("FindFile(Parent %x, FileToFind '%wZ', DirIndex: %d)\n",
         Parent, FileToFind, pDirIndex ? *pDirIndex : 0);
   DPRINT("FindFile: old Pathname %x, old Objectname %x)\n",
         Fcb->PathName, Fcb->ObjectName);
 
   IsRoot = FALSE;
   DirIndex = 0;
-  if (wcslen (FileToFind) == 0)
+
+  if (FileToFind == NULL || FileToFind->Length == 0)
     {
       CHECKPOINT;
-      TempStr[0] = (WCHAR) '.';
-      TempStr[1] = 0;
-      FileToFind = (PWSTR)&TempStr;
+      RtlInitUnicodeString(&TempString, L".");
+      FileToFind = &TempString;
     }
 
   if (Parent)
@@ -211,13 +213,14 @@ CdfsFindFile(PDEVICE_EXTENSION DeviceExt,
       DirSize = DeviceExt->CdInfo.RootSize;
 
 
-      if (FileToFind[0] == 0 || (FileToFind[0] == '\\' && FileToFind[1] == 0)
-         || (FileToFind[0] == '.' && FileToFind[1] == 0))
+      if (FileToFind->Buffer[0] == 0 ||
+         (FileToFind->Buffer[0] == '\\' && FileToFind->Buffer[1] == 0) ||
+         (FileToFind->Buffer[0] == '.' && FileToFind->Buffer[1] == 0))
        {
          /* it's root : complete essentials fields then return ok */
          RtlZeroMemory(Fcb, sizeof(FCB));
 
-         Fcb->PathName[0]='\\';
+         Fcb->PathName[0] = '\\';
          Fcb->ObjectName = &Fcb->PathName[1];
          Fcb->Entry.ExtentLocationL = DeviceExt->CdInfo.RootStart;
          Fcb->Entry.DataLengthL = DeviceExt->CdInfo.RootSize;
@@ -228,7 +231,7 @@ CdfsFindFile(PDEVICE_EXTENSION DeviceExt,
          if (pOffset)
            *pOffset = 0;
          DPRINT("CdfsFindFile: new Pathname %S, new Objectname %S)\n",Fcb->PathName, Fcb->ObjectName);
-         return (STATUS_SUCCESS);
+         return STATUS_SUCCESS;
        }
     }
   else
@@ -243,24 +246,25 @@ CdfsFindFile(PDEVICE_EXTENSION DeviceExt,
     DirIndex = *pDirIndex;
 
   if (pOffset && (*pOffset))
-  {
-     Offset = *pOffset;
-     StreamOffset.QuadPart += ROUND_DOWN(Offset, BLOCKSIZE);
-  }
+    {
+      Offset = *pOffset;
+      StreamOffset.QuadPart += ROUND_DOWN(Offset, BLOCKSIZE);
+    }
 
-  if(!CcMapData(DeviceExt->StreamFileObject, &StreamOffset,
+  if (!CcMapData(DeviceExt->StreamFileObject, &StreamOffset,
                BLOCKSIZE, TRUE, &Context, &Block))
-  {
-    DPRINT("CcMapData() failed\n");
-    return(STATUS_UNSUCCESSFUL);
-  }
+    {
+      DPRINT("CcMapData() failed\n");
+      return STATUS_UNSUCCESSFUL;
+    }
 
   Record = (PDIR_RECORD) (Block + Offset % BLOCKSIZE);
   if (Offset)
-  {  
-     Offset += Record->RecordLength;
-     Record = (PVOID)Record + Record->RecordLength;
-  }
+    {
+      Offset += Record->RecordLength;
+      Record = (PVOID)Record + Record->RecordLength;
+    }
+
   while(TRUE)
     {
       DPRINT("RecordLength %u  ExtAttrRecordLength %u  NameLength %u\n",
@@ -276,7 +280,7 @@ CdfsFindFile(PDEVICE_EXTENSION DeviceExt,
       else if (Status == STATUS_UNSUCCESSFUL)
        {
          /* Note: the directory cache has already been unpinned */
-         return(Status);
+         return Status;
        }
 
       DPRINT("Name '%S'\n", name);
@@ -305,8 +309,8 @@ CdfsFindFile(PDEVICE_EXTENSION DeviceExt,
 
       DPRINT("ShortName '%wZ'\n", &ShortName);
 
-      if (wstrcmpjoki(name, FileToFind) ||
-         wstrcmpjoki(ShortNameBuffer, FileToFind))
+      if (FsRtlIsNameInExpression(FileToFind, &LongName, TRUE, NULL) ||
+         FsRtlIsNameInExpression(FileToFind, &ShortName, TRUE, NULL))
        {
          if (Parent && Parent->PathName)
            {
@@ -332,8 +336,10 @@ CdfsFindFile(PDEVICE_EXTENSION DeviceExt,
          wcsncpy(Fcb->ObjectName, name, MAX_PATH);
 
          /* Copy short name */
-         Fcb->ShortNameLength = ShortName.Length;
-         memcpy(Fcb->ShortName, ShortName.Buffer, ShortName.Length);
+         Fcb->ShortNameU.Length = ShortName.Length;
+         Fcb->ShortNameU.MaximumLength = ShortName.Length;
+         Fcb->ShortNameU.Buffer = Fcb->ShortNameBuffer;
+         memcpy(Fcb->ShortNameBuffer, ShortName.Buffer, ShortName.Length);
 
          if (pDirIndex)
            *pDirIndex = DirIndex;
@@ -345,7 +351,7 @@ CdfsFindFile(PDEVICE_EXTENSION DeviceExt,
 
          CcUnpinData(Context);
 
-         return(STATUS_SUCCESS);
+         return STATUS_SUCCESS;
        }
 
       Offset += Record->RecordLength;
@@ -361,7 +367,7 @@ CdfsFindFile(PDEVICE_EXTENSION DeviceExt,
   if (pOffset)
     *pOffset = Offset;
 
-  return(STATUS_UNSUCCESSFUL);
+  return STATUS_UNSUCCESSFUL;
 }
 
 
@@ -542,8 +548,8 @@ CdfsGetBothDirectoryInformation(PFCB Fcb,
   Info->EaSize = 0;
 
   /* Copy short name */
-  Info->ShortNameLength = Fcb->ShortNameLength;
-  memcpy(Info->ShortName, Fcb->ShortName, Fcb->ShortNameLength);
+  Info->ShortNameLength = Fcb->ShortNameU.Length;
+  memcpy(Info->ShortName, Fcb->ShortNameU.Buffer, Fcb->ShortNameU.Length);
 
   return(STATUS_SUCCESS);
 }
@@ -587,34 +593,40 @@ CdfsQueryDirectory(PDEVICE_OBJECT DeviceObject,
 
   if (SearchPattern != NULL)
     {
-      if (!Ccb->DirectorySearchPattern)
+      if (Ccb->DirectorySearchPattern.Buffer == NULL)
        {
          First = TRUE;
-         Ccb->DirectorySearchPattern =
+         Ccb->DirectorySearchPattern.Buffer =
            ExAllocatePool(NonPagedPool, SearchPattern->Length + sizeof(WCHAR));
-         if (!Ccb->DirectorySearchPattern)
+         if (Ccb->DirectorySearchPattern.Buffer == NULL)
            {
-             return(STATUS_INSUFFICIENT_RESOURCES);
+             return STATUS_INSUFFICIENT_RESOURCES;
            }
 
-         memcpy(Ccb->DirectorySearchPattern,
+         Ccb->DirectorySearchPattern.Length = SearchPattern->Length;
+         Ccb->DirectorySearchPattern.MaximumLength = SearchPattern->Length + sizeof(WCHAR);
+
+         memcpy(Ccb->DirectorySearchPattern.Buffer,
                 SearchPattern->Buffer,
                 SearchPattern->Length);
-         Ccb->DirectorySearchPattern[SearchPattern->Length / sizeof(WCHAR)] = 0;
+         Ccb->DirectorySearchPattern.Buffer[SearchPattern->Length / sizeof(WCHAR)] = 0;
        }
     }
-  else if (!Ccb->DirectorySearchPattern)
+  else if (Ccb->DirectorySearchPattern.Buffer == NULL)
     {
       First = TRUE;
-      Ccb->DirectorySearchPattern = ExAllocatePool(NonPagedPool, 2 * sizeof(WCHAR));
-      if (!Ccb->DirectorySearchPattern)
+      Ccb->DirectorySearchPattern.Buffer = ExAllocatePool(NonPagedPool, 2 * sizeof(WCHAR));
+      if (Ccb->DirectorySearchPattern.Buffer == NULL)
        {
-         return(STATUS_INSUFFICIENT_RESOURCES);
+         return STATUS_INSUFFICIENT_RESOURCES;
        }
-      Ccb->DirectorySearchPattern[0] = L'*';
-      Ccb->DirectorySearchPattern[1] = 0;
+
+      Ccb->DirectorySearchPattern.Length = sizeof(WCHAR);
+      Ccb->DirectorySearchPattern.MaximumLength = 2 * sizeof(WCHAR);
+      Ccb->DirectorySearchPattern.Buffer[0] = L'*';
+      Ccb->DirectorySearchPattern.Buffer[1] = 0;
     }
-  DPRINT("Search pattern '%S'\n", Ccb->DirectorySearchPattern);
+  DPRINT("Search pattern '%wZ'\n", &Ccb->DirectorySearchPattern);
 
   /* Determine directory index */
   if (Stack->Flags & SL_INDEX_SPECIFIED)
@@ -637,7 +649,7 @@ CdfsQueryDirectory(PDEVICE_OBJECT DeviceObject,
     {
       Buffer = Irp->UserBuffer;
     }
-  DPRINT("Buffer=%x tofind=%S\n", Buffer, Ccb->DirectorySearchPattern);
+  DPRINT("Buffer = %p  tofind = %wZ\n", Buffer, &Ccb->DirectorySearchPattern);
 
   TempFcb.ObjectName = TempFcb.PathName;
   while (Status == STATUS_SUCCESS && BufferLength > 0)
@@ -645,7 +657,7 @@ CdfsQueryDirectory(PDEVICE_OBJECT DeviceObject,
       Status = CdfsFindFile(DeviceExtension,
                            &TempFcb,
                            Fcb,
-                           Ccb->DirectorySearchPattern,
+                           &Ccb->DirectorySearchPattern,
                            &Ccb->Entry,
                            &Ccb->Offset);
       DPRINT("Found %S, Status=%x, entry %x\n", TempFcb.ObjectName, Status, Ccb->Entry);
index 2d5246b..99cc53a 100644 (file)
@@ -16,7 +16,7 @@
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
-/* $Id: fcb.c,v 1.18 2004/03/08 08:51:26 ekohl Exp $
+/* $Id: fcb.c,v 1.19 2004/09/14 21:46:39 ekohl Exp $
  *
  * COPYRIGHT:        See COPYING in the top level directory
  * PROJECT:          ReactOS kernel
@@ -176,7 +176,7 @@ CdfsAddFCBToTable(PDEVICE_EXTENSION Vcb,
 
 PFCB
 CdfsGrabFCBFromTable(PDEVICE_EXTENSION Vcb,
-                    PWSTR FileName)
+                    PUNICODE_STRING FileName)
 {
   KIRQL  oldIrql;
   PFCB Fcb;
@@ -184,7 +184,7 @@ CdfsGrabFCBFromTable(PDEVICE_EXTENSION Vcb,
 
   KeAcquireSpinLock(&Vcb->FcbListLock, &oldIrql);
 
-  if (FileName == NULL || *FileName == 0)
+  if (FileName == NULL || FileName->Length == 0 || FileName->Buffer[0] == 0)
     {
       DPRINT("Return FCB for stream file object\n");
       Fcb = Vcb->StreamFileObject->FsContext;
@@ -198,8 +198,8 @@ CdfsGrabFCBFromTable(PDEVICE_EXTENSION Vcb,
     {
       Fcb = CONTAINING_RECORD(current_entry, FCB, FcbListEntry);
 
-      DPRINT("Comparing '%S' and '%S'\n", FileName, Fcb->PathName);
-      if (_wcsicmp(FileName, Fcb->PathName) == 0)
+      DPRINT("Comparing '%wZ' and '%S'\n", FileName, Fcb->PathName);
+      if (_wcsicmp(FileName->Buffer, Fcb->PathName) == 0)
        {
          Fcb->RefCount++;
          KeReleaseSpinLock(&Vcb->FcbListLock, oldIrql);
@@ -286,9 +286,13 @@ CdfsMakeRootFCB(PDEVICE_EXTENSION Vcb)
 PFCB
 CdfsOpenRootFCB(PDEVICE_EXTENSION Vcb)
 {
+  UNICODE_STRING FileName;
   PFCB Fcb;
 
-  Fcb = CdfsGrabFCBFromTable(Vcb, L"\\");
+  RtlInitUnicodeString(&FileName, L"\\");
+
+  Fcb = CdfsGrabFCBFromTable(Vcb,
+                            &FileName);
   if (Fcb == NULL)
     {
       Fcb = CdfsMakeRootFCB(Vcb);
@@ -378,8 +382,10 @@ CdfsMakeFCBFromDirEntry(PVCB Vcb,
   memcpy(&rcFCB->Entry, Record, sizeof(DIR_RECORD));
 
   /* Copy short name into FCB */
-  rcFCB->ShortNameLength = wcslen(ShortName) * sizeof(WCHAR);
-  wcscpy(rcFCB->ShortName, ShortName);
+  rcFCB->ShortNameU.Length = wcslen(ShortName) * sizeof(WCHAR);
+  rcFCB->ShortNameU.MaximumLength = rcFCB->ShortNameU.Length;
+  rcFCB->ShortNameU.Buffer = rcFCB->ShortNameBuffer;
+  wcscpy(rcFCB->ShortNameBuffer, ShortName);
 
   Size = rcFCB->Entry.DataLengthL;
 
@@ -446,10 +452,10 @@ CdfsAttachFCBToFileObject(PDEVICE_EXTENSION Vcb,
 NTSTATUS
 CdfsDirFindFile(PDEVICE_EXTENSION DeviceExt,
                PFCB DirectoryFcb,
-               PWSTR FileToFind,
+               PUNICODE_STRING FileToFind,
                PFCB *FoundFCB)
 {
-  WCHAR TempName[2];
+  UNICODE_STRING TempName;
   WCHAR Name[256];
   PVOID Block;
   ULONG DirSize;
@@ -472,29 +478,32 @@ CdfsDirFindFile(PDEVICE_EXTENSION DeviceExt,
   assert(DirectoryFcb);
   assert(FileToFind);
 
-  DPRINT("CdfsDirFindFile(VCB:%08x, dirFCB:%08x, File:%S)\n",
+  DPRINT("CdfsDirFindFile(VCB:%p, dirFCB:%p, File:%wZ)\n",
         DeviceExt,
         DirectoryFcb,
         FileToFind);
   DPRINT("Dir Path:%S\n", DirectoryFcb->PathName);
 
-  /*  default to '.' if no filename specified */
-  if (wcslen(FileToFind) == 0)
+  /* default to '.' if no filename specified */
+  if (FileToFind->Length == 0)
     {
-      TempName[0] = L'.';
-      TempName[1] = 0;
-      FileToFind = TempName;
+      RtlInitUnicodeString(&TempName, L".");
+      FileToFind = &TempName;
     }
 
   DirSize = DirectoryFcb->Entry.DataLengthL;
   StreamOffset.QuadPart = (LONGLONG)DirectoryFcb->Entry.ExtentLocationL * (LONGLONG)BLOCKSIZE;
 
-  if(!CcMapData(DeviceExt->StreamFileObject, &StreamOffset,
-               BLOCKSIZE, TRUE, &Context, &Block))
-  {
-    DPRINT("CcMapData() failed\n");
-    return(STATUS_UNSUCCESSFUL);
-  }
+  if (!CcMapData(DeviceExt->StreamFileObject,
+                &StreamOffset,
+                BLOCKSIZE,
+                TRUE,
+                &Context,
+                &Block))
+    {
+      DPRINT("CcMapData() failed\n");
+      return STATUS_UNSUCCESSFUL;
+    }
 
   Offset = 0;
   BlockOffset = 0;
@@ -540,7 +549,8 @@ CdfsDirFindFile(PDEVICE_EXTENSION DeviceExt,
 
       DPRINT("ShortName '%wZ'\n", &ShortName);
 
-      if (wstrcmpjoki(Name, FileToFind) || wstrcmpjoki(ShortNameBuffer, FileToFind))
+      if (FsRtlIsNameInExpression(FileToFind, &LongName, TRUE, NULL) ||
+         FsRtlIsNameInExpression(FileToFind, &ShortName, TRUE, NULL))
        {
          DPRINT("Match found, %S\n", Name);
          Status = CdfsMakeFCBFromDirEntry(DeviceExt,
@@ -593,8 +603,10 @@ NTSTATUS
 CdfsGetFCBForFile(PDEVICE_EXTENSION Vcb,
                  PFCB *pParentFCB,
                  PFCB *pFCB,
-                 const PWSTR pFileName)
+                 PUNICODE_STRING FileName)
 {
+  UNICODE_STRING PathName;
+  UNICODE_STRING ElementName;
   NTSTATUS Status;
   WCHAR  pathName [MAX_PATH];
   WCHAR  elementName [MAX_PATH];
@@ -602,14 +614,14 @@ CdfsGetFCBForFile(PDEVICE_EXTENSION Vcb,
   PFCB  FCB;
   PFCB  parentFCB;
 
-  DPRINT("CdfsGetFCBForFile(%x, %x, %x, '%S')\n",
+  DPRINT("CdfsGetFCBForFile(%x, %x, %x, '%wZ')\n",
         Vcb,
         pParentFCB,
         pFCB,
-        pFileName);
+        FileName);
 
   /* Trivial case, open of the root directory on volume */
-  if (pFileName [0] == L'\0' || wcscmp(pFileName, L"\\") == 0)
+  if (FileName->Buffer[0] == L'\0' || wcscmp(FileName->Buffer, L"\\") == 0)
     {
       DPRINT("returning root FCB\n");
 
@@ -621,7 +633,7 @@ CdfsGetFCBForFile(PDEVICE_EXTENSION Vcb,
     }
   else
     {
-      currentElement = pFileName + 1;
+      currentElement = &FileName->Buffer[1];
       wcscpy (pathName, L"\\");
       FCB = CdfsOpenRootFCB (Vcb);
     }
@@ -663,11 +675,13 @@ CdfsGetFCBForFile(PDEVICE_EXTENSION Vcb,
 
       /* Extract next directory level into dirName */
       CdfsWSubString(pathName,
-                    pFileName,
-                    CdfsGetNextPathElement(currentElement) - pFileName);
+                    FileName->Buffer,
+                    CdfsGetNextPathElement(currentElement) - FileName->Buffer);
       DPRINT("  pathName:%S\n", pathName);
 
-      FCB = CdfsGrabFCBFromTable(Vcb, pathName);
+      RtlInitUnicodeString(&PathName, pathName);
+
+      FCB = CdfsGrabFCBFromTable(Vcb, &PathName);
       if (FCB == NULL)
        {
          CdfsWSubString(elementName,
@@ -675,7 +689,11 @@ CdfsGetFCBForFile(PDEVICE_EXTENSION Vcb,
                         CdfsGetNextPathElement(currentElement) - currentElement);
          DPRINT("  elementName:%S\n", elementName);
 
-         Status = CdfsDirFindFile(Vcb, parentFCB, elementName, &FCB);
+         RtlInitUnicodeString(&ElementName, elementName);
+         Status = CdfsDirFindFile(Vcb,
+                                  parentFCB,
+                                  &ElementName,
+                                  &FCB);
          if (Status == STATUS_OBJECT_NAME_NOT_FOUND)
            {
              *pParentFCB = parentFCB;
@@ -705,7 +723,7 @@ CdfsGetFCBForFile(PDEVICE_EXTENSION Vcb,
   *pParentFCB = parentFCB;
   *pFCB = FCB;
 
-  return(STATUS_SUCCESS);
+  return STATUS_SUCCESS;
 }
 
 /* EOF */
index 41af857..38bf02d 100644 (file)
@@ -16,7 +16,7 @@
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
-/* $Id: misc.c,v 1.7 2004/05/23 13:27:26 hbirr Exp $
+/* $Id: misc.c,v 1.8 2004/09/14 21:46:39 ekohl Exp $
  *
  * COPYRIGHT:        See COPYING in the top level directory
  * PROJECT:          ReactOS kernel
 
 /* FUNCTIONS ****************************************************************/
 
-
-BOOLEAN
-wstrcmpjoki(PWSTR s1,
-           PWSTR s2)
-/*
- * FUNCTION: Compare two wide character strings, s2 with jokers (* or ?)
- * return TRUE if s1 like s2
- */
-{
-  while ((*s2=='*')||(*s2=='?')||(towlower(*s1)==towlower(*s2)))
-    {
-      if ((*s1)==0 && (*s2)==0)
-        return(TRUE);
-
-      if(*s2=='*')
-       {
-         s2++;
-         while (*s1)
-           if (wstrcmpjoki(s1,s2))
-             return(TRUE);
-           else
-             s1++;
-       }
-      else
-       {
-         s1++;
-         s2++;
-       }
-    }
-
-  if ((*s2)=='.')
-    {
-      for (;((*s2)=='.')||((*s2)=='*')||((*s2)=='?');s2++)
-       ;
-    }
-
-  if ((*s1)==0 && (*s2)==0)
-    return(TRUE);
-
-  return(FALSE);
-}
-
-
 VOID
 CdfsSwapString(PWCHAR Out,
               PUCHAR In,