]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkNt32Pkg/Dxe/WinNtThunk/Bus/SimpleFileSystem/WinNtSimpleFileSystem.c
Fixed bug in NT32 file system driver. The FileInfo->FileSize returned for a directory...
[mirror_edk2.git] / EdkNt32Pkg / Dxe / WinNtThunk / Bus / SimpleFileSystem / WinNtSimpleFileSystem.c
index bea7de40f831989a641e3b3963177de5afb2a51b..eb7b4346f71d3ef2a563e7d46f0feb4a9f54d942 100644 (file)
@@ -1,13 +1,13 @@
 /*++\r
 \r
-Copyright (c) 2006, Intel Corporation                                                         \r
-All rights reserved. This program and the accompanying materials                          \r
-are licensed and made available under the terms and conditions of the BSD License         \r
-which accompanies this distribution.  The full text of the license may be found at        \r
-http://opensource.org/licenses/bsd-license.php                                            \r
-                                                                                          \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             \r
+Copyright (c) 2006 - 2007, Intel Corporation\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
 \r
 Module Name:\r
 \r
@@ -16,8 +16,8 @@ Module Name:
 Abstract:\r
 \r
   Produce Simple File System abstractions for directories on your PC using Win32 APIs.\r
-  The configuration of what devices to mount or emulate comes from NT \r
-  environment variables. The variables must be visible to the Microsoft* \r
+  The configuration of what devices to mount or emulate comes from NT\r
+  environment variables. The variables must be visible to the Microsoft*\r
   Developer Studio for them to work.\r
 \r
   * Other names and brands may be claimed as the property of others.\r
@@ -138,11 +138,12 @@ Returns:
     ASSERT (0);\r
   }\r
 \r
-  for (Pointer = Str; *(Pointer + Count); Pointer++) {\r
+  if (Count != 0) {\r
+    for (Pointer = Str; *(Pointer + Count); Pointer++) {\r
+      *Pointer = *(Pointer + Count);\r
+    }\r
     *Pointer = *(Pointer + Count);\r
   }\r
-\r
-  *Pointer = *(Pointer + Count);\r
 }\r
 \r
 \r
@@ -283,12 +284,10 @@ Returns:
     goto Done;\r
   }\r
 \r
-  Status = gBS->AllocatePool (\r
-                  EfiBootServicesData,\r
-                  sizeof (WIN_NT_SIMPLE_FILE_SYSTEM_PRIVATE),\r
-                  &Private\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
+  Private = AllocatePool (sizeof (WIN_NT_SIMPLE_FILE_SYSTEM_PRIVATE));\r
+  if (Private == NULL) {\r
+    Status = EFI_OUT_OF_RESOURCES;\r
+\r
     goto Done;\r
   }\r
 \r
@@ -297,14 +296,9 @@ Returns:
 \r
   Private->FilePath = WinNtIo->EnvString;\r
 \r
-  Private->VolumeLabel      = NULL;\r
-  Status = gBS->AllocatePool (\r
-                  EfiBootServicesData,\r
-                  StrSize (L"EFI_EMULATED"),\r
-                  &Private->VolumeLabel\r
-                  );\r
-\r
-  if (EFI_ERROR (Status)) {\r
+  Private->VolumeLabel = AllocatePool (StrSize (L"EFI_EMULATED"));\r
+  if (Private->VolumeLabel == NULL) {\r
+    Status = EFI_OUT_OF_RESOURCES;\r
     goto Done;\r
   }\r
 \r
@@ -338,7 +332,7 @@ Done:
 \r
       FreeUnicodeStringTable (Private->ControllerNameTable);\r
 \r
-      gBS->FreePool (Private);\r
+      FreePool (Private);\r
     }\r
 \r
     gBS->CloseProtocol (\r
@@ -430,7 +424,7 @@ Returns:
     //\r
     FreeUnicodeStringTable (Private->ControllerNameTable);\r
 \r
-    gBS->FreePool (Private);\r
+    FreePool (Private);\r
   }\r
 \r
   return Status;\r
@@ -478,40 +472,31 @@ Returns:
   EFI_STATUS                        Status;\r
   WIN_NT_SIMPLE_FILE_SYSTEM_PRIVATE *Private;\r
   WIN_NT_EFI_FILE_PRIVATE           *PrivateFile;\r
+  EFI_TPL                           OldTpl;\r
 \r
   if (This == NULL || Root == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
+  OldTpl = gBS->RaiseTPL (EFI_TPL_CALLBACK);\r
+\r
   Private     = WIN_NT_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS (This);\r
 \r
-  PrivateFile = NULL;\r
-  Status = gBS->AllocatePool (\r
-                  EfiBootServicesData,\r
-                  sizeof (WIN_NT_EFI_FILE_PRIVATE),\r
-                  &PrivateFile\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
+  PrivateFile = AllocatePool (sizeof (WIN_NT_EFI_FILE_PRIVATE));\r
+  if (PrivateFile == NULL) {\r
+    Status = EFI_OUT_OF_RESOURCES;\r
     goto Done;\r
   }\r
 \r
-  PrivateFile->FileName = NULL;\r
-  Status = gBS->AllocatePool (\r
-                  EfiBootServicesData,\r
-                  StrSize (Private->FilePath),\r
-                  &PrivateFile->FileName\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
+  PrivateFile->FileName = AllocatePool (StrSize (Private->FilePath));\r
+  if (PrivateFile->FileName == NULL) {\r
+    Status = EFI_OUT_OF_RESOURCES;\r
     goto Done;\r
   }\r
 \r
-  PrivateFile->FilePath = NULL;\r
-  Status = gBS->AllocatePool (\r
-                  EfiBootServicesData,\r
-                  StrSize (Private->FilePath),\r
-                  &PrivateFile->FilePath\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
+  PrivateFile->FilePath = AllocatePool (StrSize (Private->FilePath));\r
+  if (PrivateFile->FilePath == NULL) {\r
+    Status = EFI_OUT_OF_RESOURCES;\r
     goto Done;\r
   }\r
 \r
@@ -537,7 +522,7 @@ Returns:
   PrivateFile->LHandle              = INVALID_HANDLE_VALUE;\r
   PrivateFile->DirHandle            = INVALID_HANDLE_VALUE;\r
   PrivateFile->IsValidFindBuf       = FALSE;\r
-  \r
+\r
   *Root = &PrivateFile->EfiFile;\r
 \r
   Status = EFI_SUCCESS;\r
@@ -546,17 +531,19 @@ Done:
   if (EFI_ERROR (Status)) {\r
     if (PrivateFile) {\r
       if (PrivateFile->FileName) {\r
-        gBS->FreePool (PrivateFile->FileName);\r
+        FreePool (PrivateFile->FileName);\r
       }\r
 \r
       if (PrivateFile->FilePath) {\r
-        gBS->FreePool (PrivateFile->FilePath);\r
+        FreePool (PrivateFile->FilePath);\r
       }\r
 \r
-      gBS->FreePool (PrivateFile);\r
+      FreePool (PrivateFile);\r
     }\r
   }\r
 \r
+  gBS->RestoreTPL (OldTpl);\r
+\r
   return Status;\r
 }\r
 \r
@@ -627,13 +614,10 @@ Returns:
   CHAR16                            TempChar;\r
   DWORD                             LastError;\r
   UINTN                             Count;\r
-  BOOLEAN                           TrailingDash;\r
   BOOLEAN                           LoopFinish;\r
   UINTN                             InfoSize;\r
   EFI_FILE_INFO                     *Info;\r
 \r
-  TrailingDash = FALSE;\r
-\r
   //\r
   // Check for obvious invalid parameters.\r
   //\r
@@ -663,12 +647,22 @@ Returns:
   }\r
 \r
   //\r
-  //\r
+  // Init local variables\r
   //\r
   PrivateFile     = WIN_NT_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);\r
   PrivateRoot     = WIN_NT_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS (PrivateFile->SimpleFileSystem);\r
   NewPrivateFile  = NULL;\r
 \r
+  //\r
+  // Allocate buffer for FileName as the passed in FileName may be read only\r
+  //\r
+  TempFileName = AllocatePool (StrSize (FileName));\r
+  if (TempFileName == NULL) {\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+  StrCpy (TempFileName, FileName);\r
+  FileName = TempFileName;\r
+\r
   //\r
   // BUGBUG: assume an open of root\r
   // if current location, return current data\r
@@ -684,34 +678,49 @@ OpenRoot:
   }\r
 \r
   if (FileName[StrLen (FileName) - 1] == L'\\') {\r
-    TrailingDash                        = TRUE;\r
     FileName[StrLen (FileName) - 1]  = 0;\r
   }\r
 \r
   //\r
-  // Attempt to open the file\r
+  // If file name does not equal to "." or "..",\r
+  // then we trim the leading/trailing blanks and trailing dots\r
   //\r
-  Status = gBS->AllocatePool (\r
-                  EfiBootServicesData,\r
-                  sizeof (WIN_NT_EFI_FILE_PRIVATE),\r
-                  &NewPrivateFile\r
-                  );\r
+  if (StrCmp (FileName, L".") != 0 && StrCmp (FileName, L"..") != 0) {\r
+    //\r
+    // Trim leading blanks\r
+    //\r
+    Count = 0;\r
+    for (TempFileName = FileName;\r
+      *TempFileName != 0 && *TempFileName == L' ';\r
+      TempFileName++) {\r
+      Count++;\r
+    }\r
+    CutPrefix (FileName, Count);\r
+    //\r
+    // Trim trailing dots and blanks\r
+    //\r
+    for (TempFileName = FileName + StrLen (FileName) - 1;\r
+      TempFileName >= FileName && (*TempFileName == L' ' || *TempFileName == L'.');\r
+      TempFileName--) {\r
+      ;\r
+    }\r
+    *(TempFileName + 1) = 0;\r
+  }\r
 \r
-  if (EFI_ERROR (Status)) {\r
+  //\r
+  // Attempt to open the file\r
+  //\r
+  NewPrivateFile = AllocatePool (sizeof (WIN_NT_EFI_FILE_PRIVATE));\r
+  if (NewPrivateFile == NULL) {\r
+    Status = EFI_OUT_OF_RESOURCES;\r
     goto Done;\r
   }\r
 \r
   CopyMem (NewPrivateFile, PrivateFile, sizeof (WIN_NT_EFI_FILE_PRIVATE));\r
 \r
-  NewPrivateFile->FilePath = NULL;\r
-\r
-  Status = gBS->AllocatePool (\r
-                  EfiBootServicesData,\r
-                  StrSize (PrivateFile->FileName),\r
-                  &NewPrivateFile->FilePath\r
-                  );\r
-\r
-  if (EFI_ERROR (Status)) {\r
+  NewPrivateFile->FilePath = AllocatePool (StrSize (PrivateFile->FileName));\r
+  if (NewPrivateFile->FilePath == NULL) {\r
+    Status = EFI_OUT_OF_RESOURCES;\r
     goto Done;\r
   }\r
 \r
@@ -721,14 +730,9 @@ OpenRoot:
     StrCpy (NewPrivateFile->FilePath, PrivateFile->FilePath);\r
   }\r
 \r
-  NewPrivateFile->FileName = NULL;\r
-  Status = gBS->AllocatePool (\r
-                  EfiBootServicesData,\r
-                  StrSize (NewPrivateFile->FilePath) + StrSize (L"\\") + StrSize (FileName),\r
-                  &NewPrivateFile->FileName\r
-                  );\r
-\r
-  if (EFI_ERROR (Status)) {\r
+  NewPrivateFile->FileName = AllocatePool (StrSize (NewPrivateFile->FilePath) + StrSize (L"\\") + StrSize (FileName));\r
+  if (NewPrivateFile->FileName == NULL) {\r
+    Status = EFI_OUT_OF_RESOURCES;\r
     goto Done;\r
   }\r
 \r
@@ -738,8 +742,13 @@ OpenRoot:
     StrCat (NewPrivateFile->FileName, FileName + 1);\r
   } else {\r
     StrCpy (NewPrivateFile->FileName, NewPrivateFile->FilePath);\r
-    StrCat (NewPrivateFile->FileName, L"\\");\r
-    StrCat (NewPrivateFile->FileName, FileName);\r
+    if (StrCmp (FileName, L"") != 0) {\r
+      //\r
+      // In case the filename becomes empty, especially after trimming dots and blanks\r
+      //\r
+      StrCat (NewPrivateFile->FileName, L"\\");\r
+      StrCat (NewPrivateFile->FileName, FileName);\r
+    }\r
   }\r
 \r
   //\r
@@ -800,9 +809,9 @@ OpenRoot:
 \r
   if (StrCmp (NewPrivateFile->FileName, PrivateRoot->FilePath) == 0) {\r
     NewPrivateFile->IsRootDirectory = TRUE;\r
-    gBS->FreePool (NewPrivateFile->FilePath);\r
-    gBS->FreePool (NewPrivateFile->FileName);\r
-    gBS->FreePool (NewPrivateFile);\r
+    FreePool (NewPrivateFile->FilePath);\r
+    FreePool (NewPrivateFile->FileName);\r
+    FreePool (NewPrivateFile);\r
     goto OpenRoot;\r
   }\r
 \r
@@ -814,15 +823,11 @@ OpenRoot:
   TempChar            = *(RealFileName - 1);\r
   *(RealFileName - 1) = 0;\r
 \r
-  gBS->FreePool (NewPrivateFile->FilePath);\r
+  FreePool (NewPrivateFile->FilePath);\r
   NewPrivateFile->FilePath = NULL;\r
-  Status = gBS->AllocatePool (\r
-                  EfiBootServicesData,\r
-                  StrSize (NewPrivateFile->FileName),\r
-                  &NewPrivateFile->FilePath\r
-                  );\r
-\r
-  if (EFI_ERROR (Status)) {\r
+  NewPrivateFile->FilePath = AllocatePool (StrSize (NewPrivateFile->FileName));\r
+  if (NewPrivateFile->FilePath == NULL) {\r
+    Status = EFI_OUT_OF_RESOURCES;\r
     goto Done;\r
   }\r
 \r
@@ -876,13 +881,9 @@ OpenRoot:
   //\r
   if (NewPrivateFile->IsDirectoryPath) {\r
 \r
-    Status = gBS->AllocatePool (\r
-                    EfiBootServicesData,\r
-                    StrSize (NewPrivateFile->FileName) + StrSize (L"\\*"),\r
-                    &TempFileName\r
-                    );\r
-\r
-    if (EFI_ERROR (Status)) {\r
+    TempFileName = AllocatePool (StrSize (NewPrivateFile->FileName) + StrSize (L"\\*"));\r
+    if (TempFileName == NULL) {\r
+      Status = EFI_OUT_OF_RESOURCES;\r
       goto Done;\r
     }\r
 \r
@@ -896,7 +897,7 @@ OpenRoot:
 \r
         LastError = PrivateFile->WinNtThunk->GetLastError ();\r
         if (LastError != ERROR_ALREADY_EXISTS) {\r
-          gBS->FreePool (TempFileName);\r
+          FreePool (TempFileName);\r
           Status = EFI_ACCESS_DENIED;\r
           goto Done;\r
         }\r
@@ -1012,13 +1013,9 @@ OpenRoot:
       goto Done;\r
     }\r
 \r
-    Status = gBS->AllocatePool (\r
-                    EfiBootServicesData,\r
-                    InfoSize,\r
-                    &Info\r
-                    );\r
-\r
-    if (EFI_ERROR (Status)) {\r
+    Info = AllocatePool (InfoSize);\r
+    if (Info == NULL) {\r
+      Status = EFI_OUT_OF_RESOURCES;\r
       goto Done;\r
     }\r
 \r
@@ -1034,22 +1031,19 @@ OpenRoot:
   }\r
 \r
 Done: ;\r
-  if (TrailingDash) {\r
-    FileName[StrLen (FileName) + 1]  = 0;\r
-    FileName[StrLen (FileName)]      = L'\\';\r
-  }\r
+  FreePool (FileName);\r
 \r
   if (EFI_ERROR (Status)) {\r
     if (NewPrivateFile) {\r
       if (NewPrivateFile->FileName) {\r
-        gBS->FreePool (NewPrivateFile->FileName);\r
+        FreePool (NewPrivateFile->FileName);\r
       }\r
 \r
       if (NewPrivateFile->FilePath) {\r
-        gBS->FreePool (NewPrivateFile->FilePath);\r
+        FreePool (NewPrivateFile->FilePath);\r
       }\r
 \r
-      gBS->FreePool (NewPrivateFile);\r
+      FreePool (NewPrivateFile);\r
     }\r
   } else {\r
     *NewHandle = &NewPrivateFile->EfiFile;\r
@@ -1081,11 +1075,14 @@ Returns:
 // TODO:    EFI_INVALID_PARAMETER - add return value to function comment\r
 {\r
   WIN_NT_EFI_FILE_PRIVATE *PrivateFile;\r
+  EFI_TPL                 OldTpl;\r
 \r
   if (This == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
+  OldTpl = gBS->RaiseTPL (EFI_TPL_CALLBACK);\r
+\r
   PrivateFile = WIN_NT_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);\r
 \r
   if (PrivateFile->LHandle != INVALID_HANDLE_VALUE) {\r
@@ -1104,10 +1101,13 @@ Returns:
   }\r
 \r
   if (PrivateFile->FileName) {\r
-    gBS->FreePool (PrivateFile->FileName);\r
+    FreePool (PrivateFile->FileName);\r
   }\r
 \r
-  gBS->FreePool (PrivateFile);\r
+  FreePool (PrivateFile);\r
+\r
+  gBS->RestoreTPL (OldTpl);\r
+\r
   return EFI_SUCCESS;\r
 }\r
 \r
@@ -1137,11 +1137,14 @@ Returns:
 {\r
   EFI_STATUS              Status;\r
   WIN_NT_EFI_FILE_PRIVATE *PrivateFile;\r
+  EFI_TPL                 OldTpl;\r
 \r
   if (This == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
+  OldTpl = gBS->RaiseTPL (EFI_TPL_CALLBACK);\r
+\r
   PrivateFile = WIN_NT_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);\r
 \r
   Status      = EFI_WARN_DELETE_FAILURE;\r
@@ -1170,8 +1173,10 @@ Returns:
     }\r
   }\r
 \r
-  gBS->FreePool (PrivateFile->FileName);\r
-  gBS->FreePool (PrivateFile);\r
+  FreePool (PrivateFile->FileName);\r
+  FreePool (PrivateFile);\r
+\r
+  gBS->RestoreTPL (OldTpl);\r
 \r
   return Status;\r
 }\r
@@ -1266,29 +1271,30 @@ Returns:
   UINT64                  Pos;\r
   UINT64                  FileSize;\r
   UINTN                   FileInfoSize;\r
+  EFI_TPL                 OldTpl;\r
 \r
-  if (This == NULL || BufferSize == NULL || Buffer == NULL) {\r
+  if (This == NULL || BufferSize == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
+  OldTpl = gBS->RaiseTPL (EFI_TPL_CALLBACK);\r
+\r
   PrivateFile = WIN_NT_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);\r
 \r
   if (PrivateFile->LHandle == INVALID_HANDLE_VALUE) {\r
-    return EFI_DEVICE_ERROR;\r
+    Status = EFI_DEVICE_ERROR;\r
+    goto Done;\r
   }\r
 \r
   if (!PrivateFile->IsDirectoryPath) {\r
 \r
     if (This->GetPosition (This, &Pos) != EFI_SUCCESS) {\r
-      return EFI_DEVICE_ERROR;\r
+      Status = EFI_DEVICE_ERROR;\r
+      goto Done;\r
     }\r
 \r
     FileInfoSize = SIZE_OF_EFI_FILE_SYSTEM_INFO;\r
-    gBS->AllocatePool (\r
-          EfiBootServicesData,\r
-          FileInfoSize,\r
-          &FileInfo\r
-          );\r
+    FileInfo = AllocatePool (FileInfoSize);\r
 \r
     Status = This->GetInfo (\r
                     This,\r
@@ -1298,12 +1304,8 @@ Returns:
                     );\r
 \r
     if (Status == EFI_BUFFER_TOO_SMALL) {\r
-      gBS->FreePool (FileInfo);\r
-      gBS->AllocatePool (\r
-            EfiBootServicesData,\r
-            FileInfoSize,\r
-            &FileInfo\r
-            );\r
+      FreePool (FileInfo);\r
+      FileInfo = AllocatePool (FileInfoSize);\r
       Status = This->GetInfo (\r
                       This,\r
                       &gEfiFileInfoGuid,\r
@@ -1313,29 +1315,33 @@ Returns:
     }\r
 \r
     if (EFI_ERROR (Status)) {\r
-      return EFI_DEVICE_ERROR;\r
+      Status = EFI_DEVICE_ERROR;\r
+      goto Done;\r
     }\r
 \r
     FileSize = FileInfo->FileSize;\r
 \r
-    gBS->FreePool (FileInfo);\r
+    FreePool (FileInfo);\r
 \r
     if (Pos >= FileSize) {\r
       *BufferSize = 0;\r
       if (Pos == FileSize) {\r
-        return EFI_SUCCESS;\r
+        Status = EFI_SUCCESS;\r
+        goto Done;\r
       } else {\r
-        return EFI_DEVICE_ERROR;\r
+        Status = EFI_DEVICE_ERROR;\r
+        goto Done;\r
       }\r
     }\r
 \r
-    return PrivateFile->WinNtThunk->ReadFile (\r
+    Status = PrivateFile->WinNtThunk->ReadFile (\r
                                       PrivateFile->LHandle,\r
                                       Buffer,\r
                                       *BufferSize,\r
                                       BufferSize,\r
                                       NULL\r
                                       ) ? EFI_SUCCESS : EFI_DEVICE_ERROR;\r
+    goto Done;\r
   }\r
 \r
   //\r
@@ -1343,7 +1349,8 @@ Returns:
   //\r
   if (!PrivateFile->IsValidFindBuf) {\r
     *BufferSize = 0;\r
-    return EFI_SUCCESS;\r
+    Status = EFI_SUCCESS;\r
+    goto Done;\r
   }\r
 \r
   Size        = SIZE_OF_EFI_FILE_INFO;\r
@@ -1423,6 +1430,8 @@ Returns:
 \r
   *BufferSize = ResultSize;\r
 \r
+Done:\r
+  gBS->RestoreTPL (OldTpl);\r
   return Status;\r
 }\r
 \r
@@ -1470,26 +1479,33 @@ Returns:
 // TODO:    EFI_INVALID_PARAMETER - add return value to function comment\r
 {\r
   WIN_NT_EFI_FILE_PRIVATE *PrivateFile;\r
+  EFI_STATUS              Status;\r
+  EFI_TPL                 OldTpl;\r
 \r
   if (This == NULL || BufferSize == NULL || Buffer == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
+  OldTpl = gBS->RaiseTPL (EFI_TPL_CALLBACK);\r
+\r
   PrivateFile = WIN_NT_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);\r
 \r
   if (PrivateFile->LHandle == INVALID_HANDLE_VALUE) {\r
-    return EFI_DEVICE_ERROR;\r
+    Status = EFI_DEVICE_ERROR;\r
+    goto Done;\r
   }\r
 \r
   if (PrivateFile->IsDirectoryPath) {\r
-    return EFI_UNSUPPORTED;\r
+    Status = EFI_UNSUPPORTED;\r
+    goto Done;\r
   }\r
 \r
   if (PrivateFile->IsOpenedByRead) {\r
-    return EFI_ACCESS_DENIED;\r
+    Status = EFI_ACCESS_DENIED;\r
+    goto Done;\r
   }\r
 \r
-  return PrivateFile->WinNtThunk->WriteFile (\r
+  Status = PrivateFile->WinNtThunk->WriteFile (\r
                                     PrivateFile->LHandle,\r
                                     Buffer,\r
                                     *BufferSize,\r
@@ -1497,6 +1513,10 @@ Returns:
                                     NULL\r
                                     ) ? EFI_SUCCESS : EFI_DEVICE_ERROR;\r
 \r
+Done:\r
+  gBS->RestoreTPL (OldTpl);\r
+  return Status;\r
+\r
   //\r
   // bugbug: need to access windows error reporting\r
   //\r
@@ -1534,26 +1554,26 @@ Returns:
   UINT32                  PosLow;\r
   UINT32                  PosHigh;\r
   CHAR16                  *FileName;\r
+  EFI_TPL                 OldTpl;\r
 \r
   if (This == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
+  OldTpl = gBS->RaiseTPL (EFI_TPL_CALLBACK);\r
+\r
   PrivateFile = WIN_NT_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);\r
 \r
   if (PrivateFile->IsDirectoryPath) {\r
     if (Position != 0) {\r
-      return EFI_UNSUPPORTED;\r
+      Status = EFI_UNSUPPORTED;\r
+      goto Done;\r
     }\r
 \r
-    Status = gBS->AllocatePool (\r
-                    EfiBootServicesData,\r
-                    StrSize (PrivateFile->FileName) + StrSize (L"\\*"),\r
-                    &FileName\r
-                    );\r
-\r
-    if (EFI_ERROR (Status)) {\r
-      return Status;\r
+    FileName = AllocatePool (StrSize (PrivateFile->FileName) + StrSize (L"\\*"));\r
+    if (FileName == NULL) {\r
+      Status = EFI_OUT_OF_RESOURCES;\r
+      goto Done;\r
     }\r
 \r
     StrCpy (FileName, PrivateFile->FileName);\r
@@ -1571,7 +1591,7 @@ Returns:
       PrivateFile->IsValidFindBuf = TRUE;\r
     }\r
 \r
-    gBS->FreePool (FileName);\r
+    FreePool (FileName);\r
 \r
     Status = (PrivateFile->LHandle == INVALID_HANDLE_VALUE) ? EFI_DEVICE_ERROR : EFI_SUCCESS;\r
   } else {\r
@@ -1586,6 +1606,8 @@ Returns:
     Status = (PosLow == 0xFFFFFFFF) ? EFI_DEVICE_ERROR : EFI_SUCCESS;\r
   }\r
 \r
+Done:\r
+  gBS->RestoreTPL (OldTpl);\r
   return Status;\r
 }\r
 \r
@@ -1620,11 +1642,13 @@ Returns:
   WIN_NT_EFI_FILE_PRIVATE *PrivateFile;\r
   INT32                   PositionHigh;\r
   UINT64                  PosHigh64;\r
+  EFI_TPL                 OldTpl;\r
 \r
   if (This == NULL || Position == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
+  OldTpl = gBS->RaiseTPL (EFI_TPL_CALLBACK);\r
   PrivateFile   = WIN_NT_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);\r
 \r
   PositionHigh  = 0;\r
@@ -1632,7 +1656,8 @@ Returns:
 \r
   if (PrivateFile->IsDirectoryPath) {\r
 \r
-    return EFI_UNSUPPORTED;\r
+    Status = EFI_UNSUPPORTED;\r
+    goto Done;\r
 \r
   } else {\r
 \r
@@ -1654,6 +1679,7 @@ Returns:
   }\r
 \r
 Done:\r
+  gBS->RestoreTPL (OldTpl);\r
   return Status;\r
 }\r
 \r
@@ -1691,6 +1717,11 @@ Returns:
   SYSTEMTIME                  SystemTime;\r
   CHAR16                      *RealFileName;\r
   CHAR16                      *TempPointer;\r
+  EFI_FILE_INFO               *DirInfo;\r
+  UINTN                       ReadSize;\r
+  UINT64                      Location;\r
+  EFI_STATUS                  DirStatus;\r
+\r
 \r
   Size        = SIZE_OF_EFI_FILE_INFO;\r
   NameSize    = StrSize (PrivateFile->FileName);\r
@@ -1775,6 +1806,45 @@ Returns:
     } else {\r
       CopyMem ((CHAR8 *) Buffer + Size, RealFileName, NameSize);\r
     }\r
+\r
+    if (Info->Attribute & EFI_FILE_DIRECTORY) {\r
+      //\r
+      // The GetFileInformationByHandle.nFileSizeLow is bogus for dir so we \r
+      // need to do the same thing the caller would do to get the right value\r
+      //\r
+      ASSERT (PrivateFile->EfiFile.Read != NULL);\r
+      DirStatus = PrivateFile->EfiFile.GetPosition (&PrivateFile->EfiFile, &Location);\r
+      if (EFI_ERROR (DirStatus)) {\r
+        Location = 0;\r
+      }\r
+\r
+      PrivateFile->EfiFile.SetPosition (&PrivateFile->EfiFile, 0);\r
+      Info->FileSize = 0; \r
+      do {\r
+        ReadSize = 0;\r
+        DirInfo = NULL;\r
+        DirStatus = PrivateFile->EfiFile.Read (&PrivateFile->EfiFile, &ReadSize, DirInfo);\r
+        if (DirStatus == EFI_BUFFER_TOO_SMALL) {\r
+          DirInfo = AllocatePool (ReadSize);\r
+          if (DirInfo != NULL) {\r
+            //\r
+            // Read each dir entry to figure out how big the directory is\r
+            //\r
+            DirStatus = PrivateFile->EfiFile.Read (&PrivateFile->EfiFile, &ReadSize, DirInfo);\r
+            if (!EFI_ERROR (DirStatus) && (ReadSize != 0)) {\r
+              Info->FileSize += ReadSize;\r
+            }\r
+            FreePool (DirInfo);\r
+          }\r
+        }\r
+        \r
+      } while (!EFI_ERROR (DirStatus) && (ReadSize != 0));\r
+\r
+      //\r
+      // reset the file possition back to the previous location\r
+      //\r
+      PrivateFile->EfiFile.SetPosition (&PrivateFile->EfiFile, Location);\r
+    }\r
   }\r
 \r
   *BufferSize = ResultSize;\r
@@ -1837,11 +1907,14 @@ Returns:
   BOOL                              NtStatus;\r
   UINTN                             Index;\r
   WIN_NT_SIMPLE_FILE_SYSTEM_PRIVATE *PrivateRoot;\r
+  EFI_TPL                           OldTpl;\r
 \r
   if (This == NULL || InformationType == NULL || BufferSize == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
+  OldTpl = gBS->RaiseTPL (EFI_TPL_CALLBACK);\r
+\r
   PrivateFile = WIN_NT_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);\r
   PrivateRoot = WIN_NT_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS (PrivateFile->SimpleFileSystem);\r
 \r
@@ -1854,7 +1927,8 @@ Returns:
   if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) {\r
     if (*BufferSize < SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot->VolumeLabel)) {\r
       *BufferSize = SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot->VolumeLabel);\r
-      return EFI_BUFFER_TOO_SMALL;\r
+      Status = EFI_BUFFER_TOO_SMALL;\r
+      goto Done;\r
     }\r
 \r
     FileSystemInfoBuffer            = (EFI_FILE_SYSTEM_INFO *) Buffer;\r
@@ -1864,15 +1938,11 @@ Returns:
     //\r
     // Try to get the drive name\r
     //\r
-    DriveName       = NULL;\r
     DriveNameFound  = FALSE;\r
-    Status = gBS->AllocatePool (\r
-                    EfiBootServicesData,\r
-                    StrSize (PrivateFile->FilePath) + 1,\r
-                    &DriveName\r
-                    );\r
-    if (EFI_ERROR (Status)) {\r
-      return Status;\r
+    DriveName = AllocatePool (StrSize (PrivateFile->FilePath) + 1);\r
+    if (DriveName == NULL) {\r
+      Status = EFI_OUT_OF_RESOURCES;\r
+      goto Done;\r
     }\r
 \r
     StrCpy (DriveName, PrivateFile->FilePath);\r
@@ -1911,7 +1981,7 @@ Returns:
                                           &TotalClusters\r
                                           );\r
     if (DriveName) {\r
-      gBS->FreePool (DriveName);\r
+      FreePool (DriveName);\r
     }\r
 \r
     if (NtStatus) {\r
@@ -1935,7 +2005,8 @@ Returns:
                                             NULL\r
                                             );\r
       if (!NtStatus) {\r
-        return EFI_DEVICE_ERROR;\r
+        Status = EFI_DEVICE_ERROR;\r
+        goto Done;\r
       }\r
     }\r
 \r
@@ -1947,7 +2018,8 @@ Returns:
   if (CompareGuid (InformationType, &gEfiFileSystemVolumeLabelInfoIdGuid)) {\r
     if (*BufferSize < StrSize (PrivateRoot->VolumeLabel)) {\r
       *BufferSize = StrSize (PrivateRoot->VolumeLabel);\r
-      return EFI_BUFFER_TOO_SMALL;\r
+      Status = EFI_BUFFER_TOO_SMALL;\r
+      goto Done;\r
     }\r
 \r
     StrCpy ((CHAR16 *) Buffer, PrivateRoot->VolumeLabel);\r
@@ -1955,6 +2027,8 @@ Returns:
     Status      = EFI_SUCCESS;\r
   }\r
 \r
+Done:\r
+  gBS->RestoreTPL (OldTpl);\r
   return Status;\r
 }\r
 \r
@@ -2032,6 +2106,7 @@ Returns:
   FILETIME                          NewLastWriteFileTime;\r
   WIN32_FIND_DATA                   FindBuf;\r
   EFI_FILE_SYSTEM_INFO              *NewFileSystemInfo;\r
+  EFI_TPL                           OldTpl;\r
 \r
   //\r
   // Check for invalid parameters.\r
@@ -2040,6 +2115,8 @@ Returns:
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
+  OldTpl = gBS->RaiseTPL (EFI_TPL_CALLBACK);\r
+\r
   //\r
   // Initialise locals.\r
   //\r
@@ -2056,27 +2133,23 @@ Returns:
   //\r
   if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) {\r
     if (BufferSize < SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot->VolumeLabel)) {\r
-      return EFI_BAD_BUFFER_SIZE;\r
+      Status = EFI_BAD_BUFFER_SIZE;\r
+      goto Done;\r
     }\r
 \r
     NewFileSystemInfo = (EFI_FILE_SYSTEM_INFO *) Buffer;\r
 \r
-    gBS->FreePool (PrivateRoot->VolumeLabel);\r
-\r
-    PrivateRoot->VolumeLabel = NULL;\r
-    Status = gBS->AllocatePool (\r
-                    EfiBootServicesData,\r
-                    StrSize (NewFileSystemInfo->VolumeLabel),\r
-                    &PrivateRoot->VolumeLabel\r
-                    );\r
-\r
-    if (EFI_ERROR (Status)) {\r
+    FreePool (PrivateRoot->VolumeLabel);\r
+    PrivateRoot->VolumeLabel = AllocatePool (StrSize (NewFileSystemInfo->VolumeLabel));\r
+    if (PrivateRoot->VolumeLabel == NULL) {\r
+      Status = EFI_OUT_OF_RESOURCES;\r
       goto Done;\r
     }\r
 \r
     StrCpy (PrivateRoot->VolumeLabel, NewFileSystemInfo->VolumeLabel);\r
 \r
-    return EFI_SUCCESS;\r
+    Status = EFI_SUCCESS;\r
+    goto Done;\r
   }\r
 \r
   //\r
@@ -2084,20 +2157,24 @@ Returns:
   //\r
   if (CompareGuid (InformationType, &gEfiFileSystemVolumeLabelInfoIdGuid)) {\r
     if (BufferSize < StrSize (PrivateRoot->VolumeLabel)) {\r
-      return EFI_BAD_BUFFER_SIZE;\r
+      Status = EFI_BAD_BUFFER_SIZE;\r
+      goto Done;\r
     }\r
 \r
     StrCpy (PrivateRoot->VolumeLabel, (CHAR16 *) Buffer);\r
 \r
-    return EFI_SUCCESS;\r
+    Status = EFI_SUCCESS;\r
+    goto Done;\r
   }\r
 \r
   if (!CompareGuid (InformationType, &gEfiFileInfoGuid)) {\r
-    return EFI_UNSUPPORTED;\r
+    Status = EFI_UNSUPPORTED;\r
+    goto Done;\r
   }\r
 \r
   if (BufferSize < SIZE_OF_EFI_FILE_INFO) {\r
-    return EFI_BAD_BUFFER_SIZE;\r
+    Status = EFI_BAD_BUFFER_SIZE;\r
+    goto Done;\r
   }\r
 \r
   //\r
@@ -2113,7 +2190,8 @@ Returns:
       (NewFileInfo->Attribute &~(EFI_FILE_VALID_ATTR)) ||\r
       (sizeof (UINTN) == 4 && NewFileInfo->Size > 0xFFFFFFFF)\r
       ) {\r
-    return EFI_INVALID_PARAMETER;\r
+    Status = EFI_INVALID_PARAMETER;\r
+    goto Done;\r
   }\r
 \r
   //\r
@@ -2134,9 +2212,9 @@ Returns:
     goto Done;\r
   }\r
 \r
-  Status = gBS->AllocatePool (EfiBootServicesData, OldInfoSize, &OldFileInfo);\r
-\r
-  if (EFI_ERROR (Status)) {\r
+  OldFileInfo = AllocatePool (OldInfoSize);\r
+  if (OldFileInfo == NULL) {\r
+    Status = EFI_OUT_OF_RESOURCES;\r
     goto Done;\r
   }\r
 \r
@@ -2146,13 +2224,9 @@ Returns:
     goto Done;\r
   }\r
 \r
-  Status = gBS->AllocatePool (\r
-                  EfiBootServicesData,\r
-                  StrSize (PrivateFile->FileName),\r
-                  &OldFileName\r
-                  );\r
-\r
-  if (EFI_ERROR (Status)) {\r
+  OldFileName = AllocatePool (StrSize (PrivateFile->FileName));\r
+  if (OldFileName == NULL) {\r
+    Status = EFI_OUT_OF_RESOURCES;\r
     goto Done;\r
   }\r
 \r
@@ -2162,13 +2236,9 @@ Returns:
   // Make full pathname from new filename and rootpath.\r
   //\r
   if (NewFileInfo->FileName[0] == '\\') {\r
-    Status = gBS->AllocatePool (\r
-                    EfiBootServicesData,\r
-                    StrSize (PrivateRoot->FilePath) + StrSize (L"\\") + StrSize (NewFileInfo->FileName),\r
-                    &NewFileName\r
-                    );\r
-\r
-    if (EFI_ERROR (Status)) {\r
+    NewFileName = AllocatePool (StrSize (PrivateRoot->FilePath) + StrSize (L"\\") + StrSize (NewFileInfo->FileName));\r
+    if (NewFileName == NULL) {\r
+      Status = EFI_OUT_OF_RESOURCES;\r
       goto Done;\r
     }\r
 \r
@@ -2176,13 +2246,9 @@ Returns:
     StrCat (NewFileName, L"\\");\r
     StrCat (NewFileName, NewFileInfo->FileName + 1);\r
   } else {\r
-    Status = gBS->AllocatePool (\r
-                    EfiBootServicesData,\r
-                    StrSize (PrivateFile->FilePath) + StrSize (L"\\") + StrSize (NewFileInfo->FileName),\r
-                    &NewFileName\r
-                    );\r
-\r
-    if (EFI_ERROR (Status)) {\r
+    NewFileName = AllocatePool (StrSize (PrivateFile->FilePath) + StrSize (L"\\") + StrSize (NewFileInfo->FileName));\r
+    if (NewFileName == NULL) {\r
+      Status = EFI_OUT_OF_RESOURCES;\r
       goto Done;\r
     }\r
 \r
@@ -2288,30 +2354,22 @@ Returns:
       //\r
       // modify file name\r
       //\r
-      gBS->FreePool (PrivateFile->FileName);\r
-\r
-      Status = gBS->AllocatePool (\r
-                      EfiBootServicesData,\r
-                      StrSize (NewFileName),\r
-                      &PrivateFile->FileName\r
-                      );\r
+      FreePool (PrivateFile->FileName);\r
 \r
-      if (EFI_ERROR (Status)) {\r
+      PrivateFile->FileName = AllocatePool (StrSize (NewFileName));\r
+      if (PrivateFile->FileName == NULL) {\r
+        Status = EFI_OUT_OF_RESOURCES;\r
         goto Done;\r
       }\r
 \r
       StrCpy (PrivateFile->FileName, NewFileName);\r
 \r
-      Status = gBS->AllocatePool (\r
-                      EfiBootServicesData,\r
-                      StrSize (NewFileName) + StrSize (L"\\*"),\r
-                      &TempFileName\r
-                      );\r
+      TempFileName = AllocatePool (StrSize (NewFileName) + StrSize (L"\\*"));\r
 \r
       StrCpy (TempFileName, NewFileName);\r
 \r
       if (!PrivateFile->IsDirectoryPath) {\r
-        PrivateFile->LHandle = PrivateFile->WinNtThunk->CreateFile (\r
+       PrivateFile->LHandle = PrivateFile->WinNtThunk->CreateFile (\r
                                                           TempFileName,\r
                                                           PrivateFile->IsOpenedByRead ? GENERIC_READ : GENERIC_READ | GENERIC_WRITE,\r
                                                           FILE_SHARE_READ | FILE_SHARE_WRITE,\r
@@ -2321,7 +2379,7 @@ Returns:
                                                           NULL\r
                                                           );\r
 \r
-        gBS->FreePool (TempFileName);\r
+        FreePool (TempFileName);\r
 \r
         //\r
         //  Flush buffers just in case\r
@@ -2344,7 +2402,7 @@ Returns:
         StrCat (TempFileName, L"\\*");\r
         PrivateFile->LHandle = PrivateFile->WinNtThunk->FindFirstFile (TempFileName, &FindBuf);\r
 \r
-        gBS->FreePool (TempFileName);\r
+        FreePool (TempFileName);\r
       }\r
     } else {\r
 Reopen: ;\r
@@ -2356,11 +2414,7 @@ Reopen: ;
         goto Done;\r
       }\r
 \r
-      Status = gBS->AllocatePool (\r
-                      EfiBootServicesData,\r
-                      StrSize (OldFileName) + StrSize (L"\\*"),\r
-                      &TempFileName\r
-                      );\r
+      TempFileName = AllocatePool (StrSize (OldFileName) + StrSize (L"\\*"));\r
 \r
       StrCpy (TempFileName, OldFileName);\r
 \r
@@ -2389,7 +2443,7 @@ Reopen: ;
         PrivateFile->LHandle = PrivateFile->WinNtThunk->FindFirstFile (TempFileName, &FindBuf);\r
       }\r
 \r
-      gBS->FreePool (TempFileName);\r
+      FreePool (TempFileName);\r
 \r
       goto Done;\r
 \r
@@ -2531,17 +2585,18 @@ Reopen: ;
 \r
 Done:\r
   if (OldFileInfo != NULL) {\r
-    gBS->FreePool (OldFileInfo);\r
+    FreePool (OldFileInfo);\r
   }\r
 \r
   if (OldFileName != NULL) {\r
-    gBS->FreePool (OldFileName);\r
+    FreePool (OldFileName);\r
   }\r
 \r
   if (NewFileName != NULL) {\r
-    gBS->FreePool (NewFileName);\r
+    FreePool (NewFileName);\r
   }\r
 \r
+  gBS->RestoreTPL (OldTpl);\r
   return Status;\r
 }\r
 \r
@@ -2581,35 +2636,47 @@ Returns:
 {\r
   BY_HANDLE_FILE_INFORMATION  FileInfo;\r
   WIN_NT_EFI_FILE_PRIVATE     *PrivateFile;\r
+  EFI_STATUS                  Status;\r
+  EFI_TPL                     OldTpl;\r
 \r
   if (This == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
+  OldTpl = gBS->RaiseTPL (EFI_TPL_CALLBACK);\r
+\r
   PrivateFile = WIN_NT_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);\r
 \r
   if (PrivateFile->LHandle == INVALID_HANDLE_VALUE) {\r
-    return EFI_DEVICE_ERROR;\r
+    Status = EFI_DEVICE_ERROR;\r
+    goto Done;\r
   }\r
 \r
   if (PrivateFile->IsDirectoryPath) {\r
-    return EFI_SUCCESS;\r
+    Status = EFI_SUCCESS;\r
+    goto Done;\r
   }\r
 \r
   if (PrivateFile->IsOpenedByRead) {\r
-    return EFI_ACCESS_DENIED;\r
+    Status = EFI_ACCESS_DENIED;\r
+    goto Done;\r
   }\r
 \r
   PrivateFile->WinNtThunk->GetFileInformationByHandle (PrivateFile->LHandle, &FileInfo);\r
 \r
   if (FileInfo.dwFileAttributes & FILE_ATTRIBUTE_READONLY) {\r
-    return EFI_ACCESS_DENIED;\r
+    Status = EFI_ACCESS_DENIED;\r
+    goto Done;\r
   }\r
 \r
-  return PrivateFile->WinNtThunk->FlushFileBuffers (PrivateFile->LHandle) ? EFI_SUCCESS : EFI_DEVICE_ERROR;\r
+  Status = PrivateFile->WinNtThunk->FlushFileBuffers (PrivateFile->LHandle) ? EFI_SUCCESS : EFI_DEVICE_ERROR;\r
 \r
+Done:\r
+  gBS->RestoreTPL (OldTpl);\r
+  return Status;\r
   //\r
   // bugbug: - Use Windows error reporting.\r
   //\r
 }\r
 \r
+\r