environment variables. The variables must be visible to the Microsoft*\r
Developer Studio for them to work.\r
\r
-Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
Portions copyright (c) 2011, Apple Inc. All rights reserved.\r
This program and the accompanying materials\r
are licensed and made available under the terms and conditions of the BSD License\r
IN UINT64 Attributes\r
)\r
{\r
+ EFI_STATUS Status;\r
+ EFI_TPL OldTpl;\r
EMU_EFI_FILE_PRIVATE *PrivateFile;\r
+ EMU_EFI_FILE_PRIVATE *NewPrivateFile;\r
\r
//\r
// Check for obvious invalid parameters.\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);\r
+ OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
+\r
+ PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);\r
+\r
+ NewPrivateFile = AllocateCopyPool (sizeof (EMU_EFI_FILE_PRIVATE), PrivateFile);\r
+ if (NewPrivateFile == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto Done;\r
+ }\r
+\r
+\r
+ Status = PrivateFile->Io->Open (PrivateFile->Io, &NewPrivateFile->Io, FileName, OpenMode, Attributes);\r
+ if (!EFI_ERROR (Status)) {\r
+ *NewHandle = &NewPrivateFile->EfiFile;\r
+ } else {\r
+ *NewHandle = NULL;\r
+ FreePool (NewPrivateFile);\r
+ }\r
+\r
+Done:\r
+ gBS->RestoreTPL (OldTpl);\r
\r
- return PrivateFile->Io->Open (PrivateFile->Io, NewHandle, FileName, OpenMode, Attributes);\r
+ return Status;\r
}\r
\r
\r
\r
PrivateFile = AllocatePool (sizeof (EMU_EFI_FILE_PRIVATE));\r
if (PrivateFile == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
goto Done;\r
}\r
\r
PrivateFile->Signature = EMU_EFI_FILE_PRIVATE_SIGNATURE;\r
PrivateFile->IoThunk = Private->IoThunk;\r
PrivateFile->SimpleFileSystem = This;\r
- PrivateFile->EfiFile.Revision = EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_REVISION;\r
+\r
+ ZeroMem (&PrivateFile->EfiFile, sizeof (PrivateFile->EfiFile));\r
+ PrivateFile->EfiFile.Revision = EFI_FILE_PROTOCOL_REVISION;\r
PrivateFile->EfiFile.Open = EmuSimpleFileSystemOpen;\r
PrivateFile->EfiFile.Close = EmuSimpleFileSystemClose;\r
PrivateFile->EfiFile.Delete = EmuSimpleFileSystemDelete;\r
\r
Private = AllocateZeroPool (sizeof (EMU_SIMPLE_FILE_SYSTEM_PRIVATE));\r
if (Private == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
goto Done;\r
}\r
\r
}\r
\r
Private = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS (SimpleFileSystem);\r
- Status = Private->IoThunk->Close (Private->IoThunk);\r
\r
//\r
// Uninstall the Simple File System Protocol from ControllerHandle\r
This->DriverBindingHandle,\r
ControllerHandle\r
);\r
- }\r
-\r
- if (!EFI_ERROR (Status)) {\r
+ ASSERT_EFI_ERROR (Status);\r
+ //\r
+ // Destroy the IO interface.\r
+ //\r
+ Status = Private->IoThunk->Close (Private->IoThunk);\r
+ ASSERT_EFI_ERROR (Status);\r
//\r
// Free our instance data\r
//\r