]> git.proxmox.com Git - mirror_edk2.git/blobdiff - Nt32Pkg/WinNtSimpleFileSystemDxe/WinNtSimpleFileSystem.c
UefiCpuPkg: Remove double \r
[mirror_edk2.git] / Nt32Pkg / WinNtSimpleFileSystemDxe / WinNtSimpleFileSystem.c
index 167423dea1c0352907da639eb41f88047ab50dd9..f13f82eee22be537d17d5007b64d3fe51fc492bd 100644 (file)
@@ -1,13 +1,7 @@
 /**@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
@@ -628,6 +622,7 @@ Returns:
   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
@@ -747,6 +742,12 @@ GetNextFileNameToken (
     // 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
@@ -1188,6 +1189,7 @@ Returns:
         Status = EFI_NOT_FOUND;\r
       }\r
 \r
+      FreePool (TempFileName);\r
       goto Done;\r
     }\r
 \r
@@ -1196,6 +1198,7 @@ Returns:
     //\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
@@ -1276,12 +1279,14 @@ Returns:
     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
@@ -1361,6 +1366,10 @@ Returns:
     FreePool (PrivateFile->FileName);\r
   }\r
 \r
+  if (PrivateFile->FilePath) {\r
+    FreePool (PrivateFile->FilePath);\r
+  }\r
+\r
   FreePool (PrivateFile);\r
 \r
   gBS->RestoreTPL (OldTpl);\r
@@ -1431,6 +1440,7 @@ Returns:
   }\r
 \r
   FreePool (PrivateFile->FileName);\r
+  FreePool (PrivateFile->FilePath);\r
   FreePool (PrivateFile);\r
 \r
   gBS->RestoreTPL (OldTpl);\r
@@ -1476,6 +1486,30 @@ Returns:
   }\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
@@ -1519,7 +1553,6 @@ Returns:
   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
@@ -1593,7 +1626,7 @@ Returns:
     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
@@ -1626,24 +1659,9 @@ Returns:
     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
@@ -1764,7 +1782,7 @@ Returns:
   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
@@ -1972,13 +1990,24 @@ Returns:
   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
@@ -1995,29 +2024,10 @@ Returns:
     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
@@ -2043,17 +2053,6 @@ Returns:
       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
@@ -2347,12 +2346,12 @@ Returns:
   // 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
@@ -2401,7 +2400,7 @@ Returns:
   //\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
@@ -2628,8 +2627,8 @@ Returns:
         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
@@ -2730,6 +2729,13 @@ Reopen: ;
       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
@@ -2745,6 +2751,13 @@ Reopen: ;
       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
@@ -2760,6 +2773,13 @@ Reopen: ;
       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
@@ -2805,6 +2825,7 @@ Reopen: ;
   NtStatus = PrivateFile->WinNtThunk->SetFileAttributes (NewFileName, NewAttr);\r
 \r
   if (!NtStatus) {\r
+    Status    = EFI_DEVICE_ERROR;\r
     goto Reopen;\r
   }\r
 \r