/**@file\r
\r
-Copyright (c) 2006 - 2010, 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 - 2017, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
Module Name:\r
\r
WIN_NT_EFI_FILE_PRIVATE *PrivateFile;\r
EFI_TPL OldTpl;\r
CHAR16 *TempFileName;\r
+ UINTN Size;\r
\r
if (This == NULL || Root == NULL) {\r
return EFI_INVALID_PARAMETER;\r
//\r
// Find the first file under it\r
//\r
+ Size = StrSize (PrivateFile->FilePath);\r
+ Size += StrSize (L"\\*");\r
Status = gBS->AllocatePool (\r
EfiBootServicesData,\r
- StrSize (PrivateFile->FilePath) + StrSize (L"\\*"),\r
- &TempFileName\r
+ Size,\r
+ (VOID **)&TempFileName\r
);\r
if (EFI_ERROR (Status)) {\r
goto Done;\r
StrCat (TempFileName, L"\\*");\r
\r
PrivateFile->LHandle = PrivateFile->WinNtThunk->FindFirstFile (TempFileName, &PrivateFile->FindBuf);\r
+ FreePool (TempFileName);\r
\r
if (PrivateFile->LHandle == INVALID_HANDLE_VALUE) {\r
PrivateFile->IsValidFindBuf = FALSE;\r
// Point *FileName to the next character after L'\'.\r
//\r
*FileName = *FileName + Offset + 1;\r
+ //\r
+ // If *FileName is an empty string, then set *FileName to NULL\r
+ //\r
+ if (**FileName == L'\0') {\r
+ *FileName = NULL;\r
+ }\r
}\r
\r
return Token;\r
Status = EFI_NOT_FOUND;\r
}\r
\r
+ FreePool (TempFileName);\r
goto Done;\r
}\r
\r
//\r
StrCat (TempFileName, L"\\*");\r
NewPrivateFile->LHandle = NewPrivateFile->WinNtThunk->FindFirstFile (TempFileName, &NewPrivateFile->FindBuf);\r
+ FreePool (TempFileName);\r
\r
if (NewPrivateFile->LHandle == INVALID_HANDLE_VALUE) {\r
NewPrivateFile->IsValidFindBuf = FALSE;\r
Status = WinNtSimpleFileSystemGetInfo (&NewPrivateFile->EfiFile, &gEfiFileInfoGuid, &InfoSize, Info);\r
\r
if (EFI_ERROR (Status)) {\r
+ FreePool (Info);\r
goto Done;\r
}\r
\r
Info->Attribute = Attributes;\r
\r
WinNtSimpleFileSystemSetInfo (&NewPrivateFile->EfiFile, &gEfiFileInfoGuid, InfoSize, Info);\r
+ FreePool (Info);\r
}\r
\r
Done:\r
FreePool (PrivateFile->FileName);\r
}\r
\r
+ if (PrivateFile->FilePath) {\r
+ FreePool (PrivateFile->FilePath);\r
+ }\r
+\r
FreePool (PrivateFile);\r
\r
gBS->RestoreTPL (OldTpl);\r
}\r
\r
FreePool (PrivateFile->FileName);\r
+ FreePool (PrivateFile->FilePath);\r
FreePool (PrivateFile);\r
\r
gBS->RestoreTPL (OldTpl);\r
}\r
}\r
\r
+/**\r
+ Convert the FileTime to EfiTime.\r
+\r
+ @param PrivateFile Pointer to WIN_NT_EFI_FILE_PRIVATE.\r
+ @param TimeZone Pointer to the current time zone.\r
+ @param FileTime Pointer to file time.\r
+ @param EfiTime Pointer to EFI time.\r
+**/\r
+VOID\r
+WinNtFileTimeToEfiTime ( \r
+ IN CONST WIN_NT_EFI_FILE_PRIVATE *PrivateFile,\r
+ IN TIME_ZONE_INFORMATION *TimeZone,\r
+ IN CONST FILETIME *FileTime,\r
+ OUT EFI_TIME *EfiTime\r
+ )\r
+{\r
+ FILETIME TempFileTime;\r
+ SYSTEMTIME SystemTime;\r
+\r
+ PrivateFile->WinNtThunk->FileTimeToLocalFileTime (FileTime, &TempFileTime);\r
+ PrivateFile->WinNtThunk->FileTimeToSystemTime (&TempFileTime, &SystemTime);\r
+ WinNtSystemTimeToEfiTime (&SystemTime, TimeZone, EfiTime);\r
+}\r
+\r
EFI_STATUS\r
EFIAPI\r
WinNtSimpleFileSystemRead (\r
UINTN NameSize;\r
UINTN ResultSize;\r
UINTN Index;\r
- SYSTEMTIME SystemTime;\r
EFI_FILE_INFO *Info;\r
WCHAR *pw;\r
TIME_ZONE_INFORMATION TimeZone;\r
Status = PrivateFile->WinNtThunk->ReadFile (\r
PrivateFile->LHandle,\r
Buffer,\r
- *BufferSize,\r
+ (DWORD)*BufferSize,\r
(LPDWORD)BufferSize,\r
NULL\r
) ? EFI_SUCCESS : EFI_DEVICE_ERROR;\r
Info->Size = ResultSize;\r
\r
PrivateFile->WinNtThunk->GetTimeZoneInformation (&TimeZone);\r
-\r
- PrivateFile->WinNtThunk->FileTimeToLocalFileTime (\r
- &PrivateFile->FindBuf.ftCreationTime,\r
- &PrivateFile->FindBuf.ftCreationTime\r
- );\r
-\r
- PrivateFile->WinNtThunk->FileTimeToSystemTime (&PrivateFile->FindBuf.ftCreationTime, &SystemTime);\r
-\r
- WinNtSystemTimeToEfiTime (&SystemTime, &TimeZone, &Info->CreateTime);\r
-\r
- PrivateFile->WinNtThunk->FileTimeToLocalFileTime (\r
- &PrivateFile->FindBuf.ftLastWriteTime,\r
- &PrivateFile->FindBuf.ftLastWriteTime\r
- );\r
-\r
- PrivateFile->WinNtThunk->FileTimeToSystemTime (&PrivateFile->FindBuf.ftLastWriteTime, &SystemTime);\r
-\r
- WinNtSystemTimeToEfiTime (&SystemTime, &TimeZone, &Info->ModificationTime);\r
+ WinNtFileTimeToEfiTime (PrivateFile, &TimeZone, &PrivateFile->FindBuf.ftCreationTime, &Info->CreateTime);\r
+ WinNtFileTimeToEfiTime (PrivateFile, &TimeZone, &PrivateFile->FindBuf.ftLastAccessTime, &Info->LastAccessTime);\r
+ WinNtFileTimeToEfiTime (PrivateFile, &TimeZone, &PrivateFile->FindBuf.ftLastWriteTime, &Info->ModificationTime);\r
\r
Info->FileSize = PrivateFile->FindBuf.nFileSizeLow;\r
\r
Status = PrivateFile->WinNtThunk->WriteFile (\r
PrivateFile->LHandle,\r
Buffer,\r
- *BufferSize,\r
+ (DWORD)*BufferSize,\r
(LPDWORD)BufferSize,\r
NULL\r
) ? EFI_SUCCESS : EFI_DEVICE_ERROR;\r
UINTN ResultSize;\r
EFI_FILE_INFO *Info;\r
BY_HANDLE_FILE_INFORMATION FileInfo;\r
- SYSTEMTIME SystemTime;\r
CHAR16 *RealFileName;\r
CHAR16 *TempPointer;\r
+ TIME_ZONE_INFORMATION TimeZone;\r
\r
Size = SIZE_OF_EFI_FILE_INFO;\r
- NameSize = StrSize (PrivateFile->FileName);\r
- ResultSize = Size + NameSize;\r
+\r
+ RealFileName = PrivateFile->FileName;\r
+ TempPointer = RealFileName;\r
+ while (*TempPointer) {\r
+ if (*TempPointer == '\\') {\r
+ RealFileName = TempPointer + 1;\r
+ }\r
+\r
+ TempPointer++;\r
+ }\r
+ NameSize = StrSize (RealFileName);\r
+\r
+ ResultSize = Size + NameSize; \r
\r
Status = EFI_BUFFER_TOO_SMALL;\r
if (*BufferSize >= ResultSize) {\r
Info->FileSize = FileInfo.nFileSizeLow;\r
Info->PhysicalSize = Info->FileSize;\r
\r
- PrivateFile->WinNtThunk->FileTimeToSystemTime (&FileInfo.ftCreationTime, &SystemTime);\r
- Info->CreateTime.Year = SystemTime.wYear;\r
- Info->CreateTime.Month = (UINT8) SystemTime.wMonth;\r
- Info->CreateTime.Day = (UINT8) SystemTime.wDay;\r
- Info->CreateTime.Hour = (UINT8) SystemTime.wHour;\r
- Info->CreateTime.Minute = (UINT8) SystemTime.wMinute;\r
- Info->CreateTime.Second = (UINT8) SystemTime.wSecond;\r
-\r
- PrivateFile->WinNtThunk->FileTimeToSystemTime (&FileInfo.ftLastAccessTime, &SystemTime);\r
- Info->LastAccessTime.Year = SystemTime.wYear;\r
- Info->LastAccessTime.Month = (UINT8) SystemTime.wMonth;\r
- Info->LastAccessTime.Day = (UINT8) SystemTime.wDay;\r
- Info->LastAccessTime.Hour = (UINT8) SystemTime.wHour;\r
- Info->LastAccessTime.Minute = (UINT8) SystemTime.wMinute;\r
- Info->LastAccessTime.Second = (UINT8) SystemTime.wSecond;\r
-\r
- PrivateFile->WinNtThunk->FileTimeToSystemTime (&FileInfo.ftLastWriteTime, &SystemTime);\r
- Info->ModificationTime.Year = SystemTime.wYear;\r
- Info->ModificationTime.Month = (UINT8) SystemTime.wMonth;\r
- Info->ModificationTime.Day = (UINT8) SystemTime.wDay;\r
- Info->ModificationTime.Hour = (UINT8) SystemTime.wHour;\r
- Info->ModificationTime.Minute = (UINT8) SystemTime.wMinute;\r
- Info->ModificationTime.Second = (UINT8) SystemTime.wSecond;\r
+ PrivateFile->WinNtThunk->GetTimeZoneInformation (&TimeZone);\r
+ WinNtFileTimeToEfiTime (PrivateFile, &TimeZone, &FileInfo.ftCreationTime, &Info->CreateTime);\r
+ WinNtFileTimeToEfiTime (PrivateFile, &TimeZone, &FileInfo.ftLastAccessTime, &Info->LastAccessTime);\r
+ WinNtFileTimeToEfiTime (PrivateFile, &TimeZone, &FileInfo.ftLastWriteTime, &Info->ModificationTime);\r
\r
if (FileInfo.dwFileAttributes & FILE_ATTRIBUTE_ARCHIVE) {\r
Info->Attribute |= EFI_FILE_ARCHIVE;\r
Info->Attribute |= EFI_FILE_DIRECTORY;\r
}\r
\r
- RealFileName = PrivateFile->FileName;\r
- TempPointer = RealFileName;\r
-\r
- while (*TempPointer) {\r
- if (*TempPointer == '\\') {\r
- RealFileName = TempPointer + 1;\r
- }\r
-\r
- TempPointer++;\r
- }\r
-\r
if (PrivateFile->IsRootDirectory) {\r
*((CHAR8 *) Buffer + Size) = 0;\r
} else {\r
// Set file system information.\r
//\r
if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) {\r
- if (BufferSize < SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot->VolumeLabel)) {\r
+ NewFileSystemInfo = (EFI_FILE_SYSTEM_INFO *) Buffer;\r
+ if (BufferSize < SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (NewFileSystemInfo->VolumeLabel)) {\r
Status = EFI_BAD_BUFFER_SIZE;\r
goto Done;\r
}\r
\r
- NewFileSystemInfo = (EFI_FILE_SYSTEM_INFO *) Buffer;\r
\r
FreePool (PrivateRoot->VolumeLabel);\r
PrivateRoot->VolumeLabel = AllocatePool (StrSize (NewFileSystemInfo->VolumeLabel));\r
//\r
NewFileInfo = (EFI_FILE_INFO *) Buffer;\r
\r
- if (NewFileInfo->Size <= sizeof (EFI_FILE_INFO) ||\r
+ if ((NewFileInfo->Size <= SIZE_OF_EFI_FILE_INFO) ||\r
(NewFileInfo->Attribute &~(EFI_FILE_VALID_ATTR)) ||\r
(sizeof (UINTN) == 4 && NewFileInfo->Size > 0xFFFFFFFF)\r
) {\r
FreePool (TempFileName);\r
}\r
} else {\r
+ Status = EFI_ACCESS_DENIED;\r
Reopen: ;\r
- Status = EFI_DEVICE_ERROR;\r
\r
NtStatus = PrivateFile->WinNtThunk->SetFileAttributes (OldFileName, OldAttr);\r
\r
goto Done;\r
}\r
\r
+ if (!PrivateFile->WinNtThunk->LocalFileTimeToFileTime (\r
+ &NewCreationFileTime,\r
+ &NewCreationFileTime\r
+ )) {\r
+ goto Done;\r
+ }\r
+\r
NewLastAccessSystemTime.wYear = NewFileInfo->LastAccessTime.Year;\r
NewLastAccessSystemTime.wMonth = NewFileInfo->LastAccessTime.Month;\r
NewLastAccessSystemTime.wDay = NewFileInfo->LastAccessTime.Day;\r
goto Done;\r
}\r
\r
+ if (!PrivateFile->WinNtThunk->LocalFileTimeToFileTime (\r
+ &NewLastAccessFileTime,\r
+ &NewLastAccessFileTime\r
+ )) {\r
+ goto Done;\r
+ }\r
+\r
NewLastWriteSystemTime.wYear = NewFileInfo->ModificationTime.Year;\r
NewLastWriteSystemTime.wMonth = NewFileInfo->ModificationTime.Month;\r
NewLastWriteSystemTime.wDay = NewFileInfo->ModificationTime.Day;\r
goto Done;\r
}\r
\r
+ if (!PrivateFile->WinNtThunk->LocalFileTimeToFileTime (\r
+ &NewLastWriteFileTime,\r
+ &NewLastWriteFileTime\r
+ )) {\r
+ goto Done;\r
+ }\r
+\r
if (!PrivateFile->WinNtThunk->SetFileTime (\r
PrivateFile->IsDirectoryPath ? PrivateFile->DirHandle : PrivateFile->LHandle,\r
&NewCreationFileTime,\r
NtStatus = PrivateFile->WinNtThunk->SetFileAttributes (NewFileName, NewAttr);\r
\r
if (!NtStatus) {\r
+ Status = EFI_DEVICE_ERROR;\r
goto Reopen;\r
}\r
\r