Add a lock to protect the critical region in Service APIs for gEfiBlockIoProtocolGuid...
authorqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 12 Mar 2007 09:58:28 +0000 (09:58 +0000)
committerqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 12 Mar 2007 09:58:28 +0000 (09:58 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2450 6f19259b-4bc3-4df7-8a09-765794883524

EdkNt32Pkg/Dxe/WinNtThunk/Bus/BlockIo/WinNtBlockIo.c
EdkNt32Pkg/Dxe/WinNtThunk/Bus/SimpleFileSystem/WinNtSimpleFileSystem.c

index c160aaf..143d6b5 100644 (file)
@@ -1,6 +1,6 @@
 /*++\r
 \r
 /*++\r
 \r
-Copyright (c) 2006, Intel Corporation\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
 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
@@ -851,25 +851,33 @@ WinNtBlockIoReadBlocks (
   BOOL                    Flag;\r
   EFI_STATUS              Status;\r
   DWORD                   BytesRead;\r
   BOOL                    Flag;\r
   EFI_STATUS              Status;\r
   DWORD                   BytesRead;\r
+  EFI_TPL                 OldTpl;\r
+\r
+  OldTpl = gBS->RaiseTPL (EFI_TPL_CALLBACK);\r
 \r
   Private = WIN_NT_BLOCK_IO_PRIVATE_DATA_FROM_THIS (This);\r
 \r
   Status  = WinNtBlockIoReadWriteCommon (Private, MediaId, Lba, BufferSize, Buffer, "WinNtReadBlocks");\r
   if (EFI_ERROR (Status)) {\r
 \r
   Private = WIN_NT_BLOCK_IO_PRIVATE_DATA_FROM_THIS (This);\r
 \r
   Status  = WinNtBlockIoReadWriteCommon (Private, MediaId, Lba, BufferSize, Buffer, "WinNtReadBlocks");\r
   if (EFI_ERROR (Status)) {\r
-    return Status;\r
+    goto Done;\r
   }\r
 \r
   Flag = Private->WinNtThunk->ReadFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesRead, NULL);\r
   if (!Flag || (BytesRead != BufferSize)) {\r
     DEBUG ((EFI_D_INIT, "ReadBlocks: ReadFile failed. (%d)\n", Private->WinNtThunk->GetLastError ()));\r
   }\r
 \r
   Flag = Private->WinNtThunk->ReadFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesRead, NULL);\r
   if (!Flag || (BytesRead != BufferSize)) {\r
     DEBUG ((EFI_D_INIT, "ReadBlocks: ReadFile failed. (%d)\n", Private->WinNtThunk->GetLastError ()));\r
-    return WinNtBlockIoError (Private);\r
+    Status = WinNtBlockIoError (Private);\r
+    goto Done;\r
   }\r
 \r
   //\r
   // If we wrote then media is present.\r
   //\r
   This->Media->MediaPresent = TRUE;\r
   }\r
 \r
   //\r
   // If we wrote then media is present.\r
   //\r
   This->Media->MediaPresent = TRUE;\r
-  return EFI_SUCCESS;\r
+  Status = EFI_SUCCESS;\r
+\r
+Done:\r
+  gBS->RestoreTPL (OldTpl);\r
+  return Status;\r
 }\r
 \r
 STATIC\r
 }\r
 \r
 STATIC\r
@@ -911,18 +919,22 @@ WinNtBlockIoWriteBlocks (
   UINTN                   BytesWritten;\r
   BOOL                    Flag;\r
   EFI_STATUS              Status;\r
   UINTN                   BytesWritten;\r
   BOOL                    Flag;\r
   EFI_STATUS              Status;\r
+  EFI_TPL                 OldTpl;\r
+\r
+  OldTpl = gBS->RaiseTPL (EFI_TPL_CALLBACK);\r
 \r
   Private = WIN_NT_BLOCK_IO_PRIVATE_DATA_FROM_THIS (This);\r
 \r
   Status  = WinNtBlockIoReadWriteCommon (Private, MediaId, Lba, BufferSize, Buffer, "WinNtWriteBlocks");\r
   if (EFI_ERROR (Status)) {\r
 \r
   Private = WIN_NT_BLOCK_IO_PRIVATE_DATA_FROM_THIS (This);\r
 \r
   Status  = WinNtBlockIoReadWriteCommon (Private, MediaId, Lba, BufferSize, Buffer, "WinNtWriteBlocks");\r
   if (EFI_ERROR (Status)) {\r
-    return Status;\r
+    goto Done;\r
   }\r
 \r
   Flag = Private->WinNtThunk->WriteFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesWritten, NULL);\r
   if (!Flag || (BytesWritten != BufferSize)) {\r
     DEBUG ((EFI_D_INIT, "ReadBlocks: WriteFile failed. (%d)\n", Private->WinNtThunk->GetLastError ()));\r
   }\r
 \r
   Flag = Private->WinNtThunk->WriteFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesWritten, NULL);\r
   if (!Flag || (BytesWritten != BufferSize)) {\r
     DEBUG ((EFI_D_INIT, "ReadBlocks: WriteFile failed. (%d)\n", Private->WinNtThunk->GetLastError ()));\r
-    return WinNtBlockIoError (Private);\r
+    Status = WinNtBlockIoError (Private);\r
+    goto Done;\r
   }\r
 \r
   //\r
   }\r
 \r
   //\r
@@ -930,7 +942,12 @@ WinNtBlockIoWriteBlocks (
   //\r
   This->Media->MediaPresent = TRUE;\r
   This->Media->ReadOnly     = FALSE;\r
   //\r
   This->Media->MediaPresent = TRUE;\r
   This->Media->ReadOnly     = FALSE;\r
-  return EFI_SUCCESS;\r
+  Status = EFI_SUCCESS;\r
+\r
+Done:\r
+  OldTpl = gBS->RaiseTPL (EFI_TPL_CALLBACK);\r
+  return Status;\r
+\r
 }\r
 \r
 STATIC\r
 }\r
 \r
 STATIC\r
@@ -981,6 +998,9 @@ WinNtBlockIoResetBlock (
 --*/\r
 {\r
   WIN_NT_BLOCK_IO_PRIVATE *Private;\r
 --*/\r
 {\r
   WIN_NT_BLOCK_IO_PRIVATE *Private;\r
+  EFI_TPL                 OldTpl;\r
+\r
+  OldTpl = gBS->RaiseTPL (EFI_TPL_CALLBACK);\r
 \r
   Private = WIN_NT_BLOCK_IO_PRIVATE_DATA_FROM_THIS (This);\r
 \r
 \r
   Private = WIN_NT_BLOCK_IO_PRIVATE_DATA_FROM_THIS (This);\r
 \r
@@ -989,6 +1009,8 @@ WinNtBlockIoResetBlock (
     Private->NtHandle = INVALID_HANDLE_VALUE;\r
   }\r
 \r
     Private->NtHandle = INVALID_HANDLE_VALUE;\r
   }\r
 \r
+  gBS->RestoreTPL (OldTpl);\r
+\r
   return EFI_SUCCESS;\r
 }\r
 \r
   return EFI_SUCCESS;\r
 }\r
 \r
index 30f5476..525b45d 100644 (file)
@@ -1,6 +1,6 @@
 /*++\r
 \r
 /*++\r
 \r
-Copyright (c) 2006, Intel Corporation                                                         \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
 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
@@ -478,11 +478,14 @@ Returns:
   EFI_STATUS                        Status;\r
   WIN_NT_SIMPLE_FILE_SYSTEM_PRIVATE *Private;\r
   WIN_NT_EFI_FILE_PRIVATE           *PrivateFile;\r
   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
 \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
   Private     = WIN_NT_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS (This);\r
 \r
   PrivateFile = NULL;\r
@@ -557,6 +560,8 @@ Done:
     }\r
   }\r
 \r
     }\r
   }\r
 \r
+  gBS->RestoreTPL (OldTpl);\r
+\r
   return Status;\r
 }\r
 \r
   return Status;\r
 }\r
 \r
@@ -662,9 +667,6 @@ Returns:
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  //\r
-  //\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
   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
@@ -1112,11 +1114,14 @@ Returns:
 // TODO:    EFI_INVALID_PARAMETER - add return value to function comment\r
 {\r
   WIN_NT_EFI_FILE_PRIVATE *PrivateFile;\r
 // 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
 \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
   PrivateFile = WIN_NT_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);\r
 \r
   if (PrivateFile->LHandle != INVALID_HANDLE_VALUE) {\r
@@ -1139,6 +1144,9 @@ Returns:
   }\r
 \r
   gBS->FreePool (PrivateFile);\r
   }\r
 \r
   gBS->FreePool (PrivateFile);\r
+\r
+  gBS->RestoreTPL (OldTpl);\r
+  \r
   return EFI_SUCCESS;\r
 }\r
 \r
   return EFI_SUCCESS;\r
 }\r
 \r
@@ -1168,11 +1176,14 @@ Returns:
 {\r
   EFI_STATUS              Status;\r
   WIN_NT_EFI_FILE_PRIVATE *PrivateFile;\r
 {\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
 \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
   PrivateFile = WIN_NT_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);\r
 \r
   Status      = EFI_WARN_DELETE_FAILURE;\r
@@ -1204,6 +1215,8 @@ Returns:
   gBS->FreePool (PrivateFile->FileName);\r
   gBS->FreePool (PrivateFile);\r
 \r
   gBS->FreePool (PrivateFile->FileName);\r
   gBS->FreePool (PrivateFile);\r
 \r
+  gBS->RestoreTPL (OldTpl);\r
+\r
   return Status;\r
 }\r
 \r
   return Status;\r
 }\r
 \r
@@ -1297,21 +1310,26 @@ Returns:
   UINT64                  Pos;\r
   UINT64                  FileSize;\r
   UINTN                   FileInfoSize;\r
   UINT64                  Pos;\r
   UINT64                  FileSize;\r
   UINTN                   FileInfoSize;\r
+  EFI_TPL                 OldTpl;\r
 \r
   if (This == NULL || BufferSize == NULL || Buffer == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \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
   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
   }\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
     }\r
 \r
     FileInfoSize = SIZE_OF_EFI_FILE_SYSTEM_INFO;\r
@@ -1344,7 +1362,8 @@ Returns:
     }\r
 \r
     if (EFI_ERROR (Status)) {\r
     }\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
 \r
     FileSize = FileInfo->FileSize;\r
@@ -1354,19 +1373,22 @@ Returns:
     if (Pos >= FileSize) {\r
       *BufferSize = 0;\r
       if (Pos == FileSize) {\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
       } else {\r
-        return EFI_DEVICE_ERROR;\r
+        Status = EFI_DEVICE_ERROR;\r
+        goto Done;\r
       }\r
     }\r
 \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
                                       PrivateFile->LHandle,\r
                                       Buffer,\r
                                       *BufferSize,\r
                                       BufferSize,\r
                                       NULL\r
                                       ) ? EFI_SUCCESS : EFI_DEVICE_ERROR;\r
+    goto Done;\r
   }\r
 \r
   //\r
   }\r
 \r
   //\r
@@ -1374,7 +1396,8 @@ Returns:
   //\r
   if (!PrivateFile->IsValidFindBuf) {\r
     *BufferSize = 0;\r
   //\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
   }\r
 \r
   Size        = SIZE_OF_EFI_FILE_INFO;\r
@@ -1454,6 +1477,8 @@ Returns:
 \r
   *BufferSize = ResultSize;\r
 \r
 \r
   *BufferSize = ResultSize;\r
 \r
+Done:\r
+  gBS->RestoreTPL (OldTpl);\r
   return Status;\r
 }\r
 \r
   return Status;\r
 }\r
 \r
@@ -1501,26 +1526,33 @@ Returns:
 // TODO:    EFI_INVALID_PARAMETER - add return value to function comment\r
 {\r
   WIN_NT_EFI_FILE_PRIVATE *PrivateFile;\r
 // 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
 \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
   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
 \r
   if (PrivateFile->IsDirectoryPath) {\r
-    return EFI_UNSUPPORTED;\r
+    Status = EFI_UNSUPPORTED;\r
+    goto Done;\r
   }\r
 \r
   if (PrivateFile->IsOpenedByRead) {\r
   }\r
 \r
   if (PrivateFile->IsOpenedByRead) {\r
-    return EFI_ACCESS_DENIED;\r
+    Status = EFI_ACCESS_DENIED;\r
+    goto Done;\r
   }\r
 \r
   }\r
 \r
-  return PrivateFile->WinNtThunk->WriteFile (\r
+  Status = PrivateFile->WinNtThunk->WriteFile (\r
                                     PrivateFile->LHandle,\r
                                     Buffer,\r
                                     *BufferSize,\r
                                     PrivateFile->LHandle,\r
                                     Buffer,\r
                                     *BufferSize,\r
@@ -1528,6 +1560,10 @@ Returns:
                                     NULL\r
                                     ) ? EFI_SUCCESS : EFI_DEVICE_ERROR;\r
 \r
                                     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
   //\r
   // bugbug: need to access windows error reporting\r
   //\r
@@ -1565,16 +1601,20 @@ Returns:
   UINT32                  PosLow;\r
   UINT32                  PosHigh;\r
   CHAR16                  *FileName;\r
   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
 \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
   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
     }\r
 \r
     Status = gBS->AllocatePool (\r
@@ -1584,7 +1624,7 @@ Returns:
                     );\r
 \r
     if (EFI_ERROR (Status)) {\r
                     );\r
 \r
     if (EFI_ERROR (Status)) {\r
-      return Status;\r
+      goto Done;\r
     }\r
 \r
     StrCpy (FileName, PrivateFile->FileName);\r
     }\r
 \r
     StrCpy (FileName, PrivateFile->FileName);\r
@@ -1617,6 +1657,8 @@ Returns:
     Status = (PosLow == 0xFFFFFFFF) ? EFI_DEVICE_ERROR : EFI_SUCCESS;\r
   }\r
 \r
     Status = (PosLow == 0xFFFFFFFF) ? EFI_DEVICE_ERROR : EFI_SUCCESS;\r
   }\r
 \r
+Done:\r
+  OldTpl = gBS->RaiseTPL (EFI_TPL_CALLBACK);\r
   return Status;\r
 }\r
 \r
   return Status;\r
 }\r
 \r
@@ -1651,11 +1693,13 @@ Returns:
   WIN_NT_EFI_FILE_PRIVATE *PrivateFile;\r
   INT32                   PositionHigh;\r
   UINT64                  PosHigh64;\r
   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
 \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
   PrivateFile   = WIN_NT_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);\r
 \r
   PositionHigh  = 0;\r
@@ -1663,7 +1707,8 @@ Returns:
 \r
   if (PrivateFile->IsDirectoryPath) {\r
 \r
 \r
   if (PrivateFile->IsDirectoryPath) {\r
 \r
-    return EFI_UNSUPPORTED;\r
+    Status = EFI_UNSUPPORTED;\r
+    goto Done;\r
 \r
   } else {\r
 \r
 \r
   } else {\r
 \r
@@ -1685,6 +1730,7 @@ Returns:
   }\r
 \r
 Done:\r
   }\r
 \r
 Done:\r
+  gBS->RestoreTPL (OldTpl);\r
   return Status;\r
 }\r
 \r
   return Status;\r
 }\r
 \r
@@ -1868,11 +1914,14 @@ Returns:
   BOOL                              NtStatus;\r
   UINTN                             Index;\r
   WIN_NT_SIMPLE_FILE_SYSTEM_PRIVATE *PrivateRoot;\r
   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
 \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
   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
@@ -1885,7 +1934,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
   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
     }\r
 \r
     FileSystemInfoBuffer            = (EFI_FILE_SYSTEM_INFO *) Buffer;\r
@@ -1903,7 +1953,7 @@ Returns:
                     &DriveName\r
                     );\r
     if (EFI_ERROR (Status)) {\r
                     &DriveName\r
                     );\r
     if (EFI_ERROR (Status)) {\r
-      return Status;\r
+      goto Done;\r
     }\r
 \r
     StrCpy (DriveName, PrivateFile->FilePath);\r
     }\r
 \r
     StrCpy (DriveName, PrivateFile->FilePath);\r
@@ -1966,7 +2016,8 @@ Returns:
                                             NULL\r
                                             );\r
       if (!NtStatus) {\r
                                             NULL\r
                                             );\r
       if (!NtStatus) {\r
-        return EFI_DEVICE_ERROR;\r
+        Status = EFI_DEVICE_ERROR;\r
+        goto Done;\r
       }\r
     }\r
 \r
       }\r
     }\r
 \r
@@ -1978,7 +2029,8 @@ Returns:
   if (CompareGuid (InformationType, &gEfiFileSystemVolumeLabelInfoIdGuid)) {\r
     if (*BufferSize < StrSize (PrivateRoot->VolumeLabel)) {\r
       *BufferSize = StrSize (PrivateRoot->VolumeLabel);\r
   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
     }\r
 \r
     StrCpy ((CHAR16 *) Buffer, PrivateRoot->VolumeLabel);\r
@@ -1986,6 +2038,8 @@ Returns:
     Status      = EFI_SUCCESS;\r
   }\r
 \r
     Status      = EFI_SUCCESS;\r
   }\r
 \r
+Done:\r
+  gBS->RestoreTPL (OldTpl);\r
   return Status;\r
 }\r
 \r
   return Status;\r
 }\r
 \r
@@ -2063,6 +2117,7 @@ Returns:
   FILETIME                          NewLastWriteFileTime;\r
   WIN32_FIND_DATA                   FindBuf;\r
   EFI_FILE_SYSTEM_INFO              *NewFileSystemInfo;\r
   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
 \r
   //\r
   // Check for invalid parameters.\r
@@ -2071,6 +2126,8 @@ Returns:
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
+  OldTpl = gBS->RaiseTPL (EFI_TPL_CALLBACK);\r
+\r
   //\r
   // Initialise locals.\r
   //\r
   //\r
   // Initialise locals.\r
   //\r
@@ -2087,7 +2144,8 @@ Returns:
   //\r
   if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) {\r
     if (BufferSize < SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot->VolumeLabel)) {\r
   //\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
 \r
     NewFileSystemInfo = (EFI_FILE_SYSTEM_INFO *) Buffer;\r
@@ -2107,7 +2165,8 @@ Returns:
 \r
     StrCpy (PrivateRoot->VolumeLabel, NewFileSystemInfo->VolumeLabel);\r
 \r
 \r
     StrCpy (PrivateRoot->VolumeLabel, NewFileSystemInfo->VolumeLabel);\r
 \r
-    return EFI_SUCCESS;\r
+    Status = EFI_SUCCESS;\r
+    goto Done;\r
   }\r
 \r
   //\r
   }\r
 \r
   //\r
@@ -2115,20 +2174,24 @@ Returns:
   //\r
   if (CompareGuid (InformationType, &gEfiFileSystemVolumeLabelInfoIdGuid)) {\r
     if (BufferSize < StrSize (PrivateRoot->VolumeLabel)) {\r
   //\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
     }\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
   }\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
   }\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
   }\r
 \r
   //\r
@@ -2144,7 +2207,8 @@ Returns:
       (NewFileInfo->Attribute &~(EFI_FILE_VALID_ATTR)) ||\r
       (sizeof (UINTN) == 4 && NewFileInfo->Size > 0xFFFFFFFF)\r
       ) {\r
       (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
   }\r
 \r
   //\r
@@ -2573,6 +2637,7 @@ Done:
     gBS->FreePool (NewFileName);\r
   }\r
 \r
     gBS->FreePool (NewFileName);\r
   }\r
 \r
+  gBS->RestoreTPL (OldTpl);\r
   return Status;\r
 }\r
 \r
   return Status;\r
 }\r
 \r
@@ -2612,35 +2677,47 @@ Returns:
 {\r
   BY_HANDLE_FILE_INFORMATION  FileInfo;\r
   WIN_NT_EFI_FILE_PRIVATE     *PrivateFile;\r
 {\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
 \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
   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
 \r
   if (PrivateFile->IsDirectoryPath) {\r
-    return EFI_SUCCESS;\r
+    Status = EFI_SUCCESS;\r
+    goto Done;\r
   }\r
 \r
   if (PrivateFile->IsOpenedByRead) {\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
   }\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
   }\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
 \r
+Done:\r
+  gBS->RestoreTPL (OldTpl);\r
+  return Status;\r
   //\r
   // bugbug: - Use Windows error reporting.\r
   //\r
 }\r
 \r
   //\r
   // bugbug: - Use Windows error reporting.\r
   //\r
 }\r
 \r
+\r