/**@file\r
\r
-Copyright (c) 2006 - 2009, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
+Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>\r
+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
EFIAPI\r
WinNtSimpleFileSystemOpenVolume (\r
IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *This,\r
- OUT EFI_FILE **Root\r
+ OUT EFI_FILE_PROTOCOL **Root\r
)\r
/*++\r
\r
WIN_NT_SIMPLE_FILE_SYSTEM_PRIVATE *Private;\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
PrivateFile->EfiFile.GetInfo = WinNtSimpleFileSystemGetInfo;\r
PrivateFile->EfiFile.SetInfo = WinNtSimpleFileSystemSetInfo;\r
PrivateFile->EfiFile.Flush = WinNtSimpleFileSystemFlush;\r
- PrivateFile->LHandle = INVALID_HANDLE_VALUE;\r
- PrivateFile->DirHandle = INVALID_HANDLE_VALUE;\r
PrivateFile->IsValidFindBuf = FALSE;\r
\r
+ //\r
+ // Set DirHandle\r
+ //\r
+ PrivateFile->DirHandle = PrivateFile->WinNtThunk->CreateFile (\r
+ PrivateFile->FilePath,\r
+ GENERIC_READ,\r
+ FILE_SHARE_READ | FILE_SHARE_WRITE,\r
+ NULL,\r
+ OPEN_EXISTING,\r
+ FILE_FLAG_BACKUP_SEMANTICS,\r
+ NULL\r
+ );\r
+\r
+ if (PrivateFile->DirHandle == INVALID_HANDLE_VALUE) {\r
+ Status = EFI_NOT_FOUND;\r
+ goto Done;\r
+ }\r
+\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
+ Size,\r
+ (VOID **)&TempFileName\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ goto Done;\r
+ }\r
+ StrCpy (TempFileName, PrivateFile->FilePath);\r
+ StrCat (TempFileName, L"\\*");\r
+\r
+ PrivateFile->LHandle = PrivateFile->WinNtThunk->FindFirstFile (TempFileName, &PrivateFile->FindBuf);\r
+\r
+ if (PrivateFile->LHandle == INVALID_HANDLE_VALUE) {\r
+ PrivateFile->IsValidFindBuf = FALSE;\r
+ } else {\r
+ PrivateFile->IsValidFindBuf = TRUE;\r
+ }\r
*Root = &PrivateFile->EfiFile;\r
\r
Status = EFI_SUCCESS;\r
EFI_STATUS\r
EFIAPI\r
WinNtSimpleFileSystemOpen (\r
- IN EFI_FILE *This,\r
- OUT EFI_FILE **NewHandle,\r
- IN CHAR16 *FileName,\r
- IN UINT64 OpenMode,\r
- IN UINT64 Attributes\r
+ IN EFI_FILE_PROTOCOL *This,\r
+ OUT EFI_FILE_PROTOCOL **NewHandle,\r
+ IN CHAR16 *FileName,\r
+ IN UINT64 OpenMode,\r
+ IN UINT64 Attributes\r
)\r
/*++\r
\r
\r
Arguments:\r
\r
- This - A pointer to the seource file location.\r
+ This - A pointer to the source file location.\r
\r
NewHandle - Pointer to storage for the new file handle.\r
\r
// TODO: EFI_INVALID_PARAMETER - add return value to function comment\r
// TODO: EFI_INVALID_PARAMETER - add return value to function comment\r
{\r
- EFI_FILE *Root;\r
WIN_NT_EFI_FILE_PRIVATE *PrivateFile;\r
WIN_NT_EFI_FILE_PRIVATE *NewPrivateFile;\r
WIN_NT_SIMPLE_FILE_SYSTEM_PRIVATE *PrivateRoot;\r
StrCpy (TempFileName, FileName);\r
FileName = TempFileName;\r
\r
- //\r
- // BUGBUG: assume an open of root\r
- // if current location, return current data\r
- //\r
- if (StrCmp (FileName, L"\\") == 0 || (StrCmp (FileName, L".") == 0 && PrivateFile->IsRootDirectory)) {\r
- //\r
- // BUGBUG: assume an open root\r
- //\r
-OpenRoot:\r
- Status = WinNtSimpleFileSystemOpenVolume (PrivateFile->SimpleFileSystem, &Root);\r
- NewPrivateFile = WIN_NT_EFI_FILE_PRIVATE_DATA_FROM_THIS (Root);\r
- goto Done;\r
- }\r
-\r
if (FileName[StrLen (FileName) - 1] == L'\\') {\r
FileName[StrLen (FileName) - 1] = 0;\r
}\r
}\r
}\r
\r
- if (StrCmp (NewPrivateFile->FileName, PrivateRoot->FilePath) == 0) {\r
- NewPrivateFile->IsRootDirectory = TRUE;\r
- FreePool (NewPrivateFile->FilePath);\r
- FreePool (NewPrivateFile->FileName);\r
- FreePool (NewPrivateFile);\r
- goto OpenRoot;\r
- }\r
-\r
RealFileName = NewPrivateFile->FileName;\r
while (EfiStrChr (RealFileName, L'\\') != NULL) {\r
RealFileName = EfiStrChr (RealFileName, L'\\') + 1;\r
}\r
\r
- TempChar = *(RealFileName - 1);\r
- *(RealFileName - 1) = 0;\r
-\r
+ TempChar = 0;\r
+ if (RealFileName != NewPrivateFile->FileName) {\r
+ TempChar = *(RealFileName - 1);\r
+ *(RealFileName - 1) = 0;\r
+ }\r
+ \r
FreePool (NewPrivateFile->FilePath);\r
NewPrivateFile->FilePath = NULL;\r
NewPrivateFile->FilePath = AllocatePool (StrSize (NewPrivateFile->FileName));\r
}\r
\r
StrCpy (NewPrivateFile->FilePath, NewPrivateFile->FileName);\r
-\r
- *(RealFileName - 1) = TempChar;\r
+ if (TempChar != 0) {\r
+ *(RealFileName - 1) = TempChar;\r
+ }\r
\r
NewPrivateFile->IsRootDirectory = FALSE;\r
\r
}\r
} else {\r
*NewHandle = &NewPrivateFile->EfiFile;\r
+ if (StrCmp (NewPrivateFile->FileName, PrivateRoot->FilePath) == 0) {\r
+ NewPrivateFile->IsRootDirectory = TRUE;\r
+ } \r
}\r
\r
return Status;\r
EFI_STATUS\r
EFIAPI\r
WinNtSimpleFileSystemClose (\r
- IN EFI_FILE *This\r
+ IN EFI_FILE_PROTOCOL *This\r
)\r
/*++\r
\r
EFI_STATUS\r
EFIAPI\r
WinNtSimpleFileSystemDelete (\r
- IN EFI_FILE *This\r
+ IN EFI_FILE_PROTOCOL *This\r
)\r
/*++\r
\r
EFI_STATUS\r
EFIAPI\r
WinNtSimpleFileSystemRead (\r
- IN EFI_FILE *This,\r
- IN OUT UINTN *BufferSize,\r
- OUT VOID *Buffer\r
+ IN EFI_FILE_PROTOCOL *This,\r
+ IN OUT UINTN *BufferSize,\r
+ OUT VOID *Buffer\r
)\r
/*++\r
\r
EFI_STATUS\r
EFIAPI\r
WinNtSimpleFileSystemWrite (\r
- IN EFI_FILE *This,\r
- IN OUT UINTN *BufferSize,\r
- IN VOID *Buffer\r
+ IN EFI_FILE_PROTOCOL *This,\r
+ IN OUT UINTN *BufferSize,\r
+ IN VOID *Buffer\r
)\r
/*++\r
\r
EFI_STATUS\r
EFIAPI\r
WinNtSimpleFileSystemSetPosition (\r
- IN EFI_FILE *This,\r
- IN UINT64 Position\r
+ IN EFI_FILE_PROTOCOL *This,\r
+ IN UINT64 Position\r
)\r
/*++\r
\r
EFI_STATUS\r
EFIAPI\r
WinNtSimpleFileSystemGetPosition (\r
- IN EFI_FILE *This,\r
- OUT UINT64 *Position\r
+ IN EFI_FILE_PROTOCOL *This,\r
+ OUT UINT64 *Position\r
)\r
/*++\r
\r
SYSTEMTIME SystemTime;\r
CHAR16 *RealFileName;\r
CHAR16 *TempPointer;\r
- EFI_FILE_INFO *DirInfo;\r
- UINTN ReadSize;\r
- UINT64 Location;\r
- EFI_STATUS DirStatus;\r
-\r
\r
Size = SIZE_OF_EFI_FILE_INFO;\r
NameSize = StrSize (PrivateFile->FileName);\r
Info->FileSize = FileInfo.nFileSizeLow;\r
Info->PhysicalSize = Info->FileSize;\r
\r
+ PrivateFile->WinNtThunk->FileTimeToLocalFileTime(&FileInfo.ftCreationTime, &FileInfo.ftCreationTime);\r
PrivateFile->WinNtThunk->FileTimeToSystemTime (&FileInfo.ftCreationTime, &SystemTime);\r
Info->CreateTime.Year = SystemTime.wYear;\r
Info->CreateTime.Month = (UINT8) SystemTime.wMonth;\r
Info->CreateTime.Minute = (UINT8) SystemTime.wMinute;\r
Info->CreateTime.Second = (UINT8) SystemTime.wSecond;\r
\r
+ PrivateFile->WinNtThunk->FileTimeToLocalFileTime(&FileInfo.ftLastAccessTime, &FileInfo.ftLastAccessTime);\r
PrivateFile->WinNtThunk->FileTimeToSystemTime (&FileInfo.ftLastAccessTime, &SystemTime);\r
Info->LastAccessTime.Year = SystemTime.wYear;\r
Info->LastAccessTime.Month = (UINT8) SystemTime.wMonth;\r
Info->LastAccessTime.Minute = (UINT8) SystemTime.wMinute;\r
Info->LastAccessTime.Second = (UINT8) SystemTime.wSecond;\r
\r
+ PrivateFile->WinNtThunk->FileTimeToLocalFileTime(&FileInfo.ftLastWriteTime, &FileInfo.ftLastWriteTime);\r
PrivateFile->WinNtThunk->FileTimeToSystemTime (&FileInfo.ftLastWriteTime, &SystemTime);\r
Info->ModificationTime.Year = SystemTime.wYear;\r
Info->ModificationTime.Month = (UINT8) SystemTime.wMonth;\r
} else {\r
CopyMem ((CHAR8 *) Buffer + Size, RealFileName, NameSize);\r
}\r
-\r
- if (Info->Attribute & EFI_FILE_DIRECTORY) {\r
- //\r
- // The GetFileInformationByHandle.nFileSizeLow is bogus for dir so we \r
- // need to do the same thing the caller would do to get the right value\r
- //\r
- ASSERT (PrivateFile->EfiFile.Read != NULL);\r
- DirStatus = PrivateFile->EfiFile.GetPosition (&PrivateFile->EfiFile, &Location);\r
- if (EFI_ERROR (DirStatus)) {\r
- Location = 0;\r
- }\r
-\r
- PrivateFile->EfiFile.SetPosition (&PrivateFile->EfiFile, 0);\r
- Info->FileSize = 0; \r
- do {\r
- ReadSize = 0;\r
- DirInfo = NULL;\r
- DirStatus = PrivateFile->EfiFile.Read (&PrivateFile->EfiFile, &ReadSize, DirInfo);\r
- if (DirStatus == EFI_BUFFER_TOO_SMALL) {\r
- DirInfo = AllocatePool (ReadSize);\r
- if (DirInfo != NULL) {\r
- //\r
- // Read each dir entry to figure out how big the directory is\r
- //\r
- DirStatus = PrivateFile->EfiFile.Read (&PrivateFile->EfiFile, &ReadSize, DirInfo);\r
- if (!EFI_ERROR (DirStatus) && (ReadSize != 0)) {\r
- Info->FileSize += ReadSize;\r
- }\r
- FreePool (DirInfo);\r
- }\r
- }\r
- \r
- } while (!EFI_ERROR (DirStatus) && (ReadSize != 0));\r
-\r
- //\r
- // reset the file possition back to the previous location\r
- //\r
- PrivateFile->EfiFile.SetPosition (&PrivateFile->EfiFile, Location);\r
- }\r
}\r
\r
*BufferSize = ResultSize;\r
EFI_STATUS\r
EFIAPI\r
WinNtSimpleFileSystemGetInfo (\r
- IN EFI_FILE *This,\r
- IN EFI_GUID *InformationType,\r
- IN OUT UINTN *BufferSize,\r
- OUT VOID *Buffer\r
+ IN EFI_FILE_PROTOCOL *This,\r
+ IN EFI_GUID *InformationType,\r
+ IN OUT UINTN *BufferSize,\r
+ OUT VOID *Buffer\r
)\r
/*++\r
\r
EFI_STATUS\r
EFIAPI\r
WinNtSimpleFileSystemSetInfo (\r
- IN EFI_FILE *This,\r
+ IN EFI_FILE_PROTOCOL*This,\r
IN EFI_GUID *InformationType,\r
IN UINTN BufferSize,\r
IN VOID *Buffer\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
EFI_STATUS\r
EFIAPI\r
WinNtSimpleFileSystemFlush (\r
- IN EFI_FILE *This\r
+ IN EFI_FILE_PROTOCOL *This\r
)\r
/*++\r
\r