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
\r
/**\r
- Set a files current position\r
+ Get a file's current position\r
\r
@param This Protocol instance pointer.\r
@param Position Byte position from the start of the file.\r
\r
\r
/**\r
- Get a file's current position\r
+ Set file's current position\r
\r
@param This Protocol instance pointer.\r
@param Position Byte position from the start of the file.\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