/**@file\r
\r
-Copyright (c) 2006 - 2008, Intel Corporation\r
+Copyright (c) 2006 - 2009, 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
WIN_NT_SIMPLE_FILE_SYSTEM_PRIVATE *Private;\r
WIN_NT_EFI_FILE_PRIVATE *PrivateFile;\r
EFI_TPL OldTpl;\r
+ CHAR16 *TempFileName;\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
+ Status = gBS->AllocatePool (\r
+ EfiBootServicesData,\r
+ StrSize (PrivateFile->FilePath) + StrSize (L"\\*"),\r
+ &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
// 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
BOOLEAN LoopFinish;\r
UINTN InfoSize;\r
EFI_FILE_INFO *Info;\r
+ UINTN Size;\r
\r
//\r
// Check for obvious invalid parameters.\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
- // If file name does not equal to "." or "..",\r
+ // If file name does not equal to "." or ".." and not trailed with "\..",\r
// then we trim the leading/trailing blanks and trailing dots\r
//\r
- if (StrCmp (FileName, L".") != 0 && StrCmp (FileName, L"..") != 0) {\r
+ if (StrCmp (FileName, L".") != 0 && StrCmp (FileName, L"..") != 0 && \r
+ ((StrLen (FileName) >= 3) ? (StrCmp (&FileName[StrLen (FileName) - 3], L"\\..") != 0) : TRUE)) {\r
//\r
// Trim leading blanks\r
//\r
StrCpy (NewPrivateFile->FilePath, PrivateFile->FilePath);\r
}\r
\r
- NewPrivateFile->FileName = AllocatePool (StrSize (NewPrivateFile->FilePath) + StrSize (L"\\") + StrSize (FileName));\r
+ Size = StrSize (NewPrivateFile->FilePath);\r
+ Size += StrSize (L"\\");\r
+ Size += StrSize (FileName);\r
+ NewPrivateFile->FileName = AllocatePool (Size);\r
if (NewPrivateFile->FileName == NULL) {\r
Status = EFI_OUT_OF_RESOURCES;\r
goto Done;\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
if (NewPrivateFile->IsDirectoryPath) {\r
\r
- TempFileName = AllocatePool (StrSize (NewPrivateFile->FileName) + StrSize (L"\\*"));\r
+ Size = StrSize (NewPrivateFile->FileName);\r
+ Size += StrSize (L"\\*");\r
+ TempFileName = AllocatePool (Size);\r
if (TempFileName == NULL) {\r
Status = EFI_OUT_OF_RESOURCES;\r
goto Done;\r
WinNtSimpleFileSystemSetInfo (&NewPrivateFile->EfiFile, &gEfiFileInfoGuid, InfoSize, Info);\r
}\r
\r
-Done: ;\r
+Done:\r
FreePool (FileName);\r
\r
if (EFI_ERROR (Status)) {\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
}\r
\r
Status = PrivateFile->WinNtThunk->ReadFile (\r
- PrivateFile->LHandle,\r
- Buffer,\r
- *BufferSize,\r
- BufferSize,\r
- NULL\r
- ) ? EFI_SUCCESS : EFI_DEVICE_ERROR;\r
+ PrivateFile->LHandle,\r
+ Buffer,\r
+ *BufferSize,\r
+ (LPDWORD)BufferSize,\r
+ NULL\r
+ ) ? EFI_SUCCESS : EFI_DEVICE_ERROR;\r
goto Done;\r
}\r
\r
}\r
\r
Status = PrivateFile->WinNtThunk->WriteFile (\r
- PrivateFile->LHandle,\r
- Buffer,\r
- *BufferSize,\r
- BufferSize,\r
- NULL\r
- ) ? EFI_SUCCESS : EFI_DEVICE_ERROR;\r
+ PrivateFile->LHandle,\r
+ Buffer,\r
+ *BufferSize,\r
+ (LPDWORD)BufferSize,\r
+ NULL\r
+ ) ? EFI_SUCCESS : EFI_DEVICE_ERROR;\r
\r
Done:\r
gBS->RestoreTPL (OldTpl);\r
UINT32 PosHigh;\r
CHAR16 *FileName;\r
EFI_TPL OldTpl;\r
+ UINTN Size;\r
\r
if (This == NULL) {\r
return EFI_INVALID_PARAMETER;\r
goto Done;\r
}\r
\r
- FileName = AllocatePool (StrSize (PrivateFile->FileName) + StrSize (L"\\*"));\r
+ Size = StrSize (PrivateFile->FileName);\r
+ Size += StrSize (L"\\*");\r
+ FileName = AllocatePool (Size);\r
if (FileName == NULL) {\r
Status = EFI_OUT_OF_RESOURCES;\r
goto Done;\r
} else {\r
PosHigh = (UINT32) RShiftU64 (Position, 32);\r
\r
- PosLow = PrivateFile->WinNtThunk->SetFilePointer (PrivateFile->LHandle, (ULONG) Position, &PosHigh, FILE_BEGIN);\r
+ PosLow = PrivateFile->WinNtThunk->SetFilePointer (PrivateFile->LHandle, (ULONG) Position, (PLONG)&PosHigh, FILE_BEGIN);\r
}\r
\r
Status = (PosLow == 0xFFFFFFFF) ? EFI_DEVICE_ERROR : EFI_SUCCESS;\r
\r
PositionHigh = 0;\r
*Position = PrivateFile->WinNtThunk->SetFilePointer (\r
- PrivateFile->LHandle,\r
- 0,\r
- &PositionHigh,\r
- FILE_CURRENT\r
- );\r
+ PrivateFile->LHandle,\r
+ 0,\r
+ (PLONG)&PositionHigh,\r
+ FILE_CURRENT\r
+ );\r
\r
Status = *Position == 0xffffffff ? EFI_DEVICE_ERROR : EFI_SUCCESS;\r
if (EFI_ERROR (Status)) {\r
//\r
NtStatus = PrivateFile->WinNtThunk->GetDiskFreeSpace (\r
DriveNameFound ? DriveName : NULL,\r
- &SectorsPerCluster,\r
- &BytesPerSector,\r
- &FreeClusters,\r
- &TotalClusters\r
+ (LPDWORD)&SectorsPerCluster,\r
+ (LPDWORD)&BytesPerSector,\r
+ (LPDWORD)&FreeClusters,\r
+ (LPDWORD)&TotalClusters\r
);\r
if (DriveName) {\r
FreePool (DriveName);\r
WIN32_FIND_DATA FindBuf;\r
EFI_FILE_SYSTEM_INFO *NewFileSystemInfo;\r
EFI_TPL OldTpl;\r
+ UINTN Size;\r
\r
//\r
// Check for invalid parameters.\r
// Make full pathname from new filename and rootpath.\r
//\r
if (NewFileInfo->FileName[0] == '\\') {\r
- NewFileName = AllocatePool (StrSize (PrivateRoot->FilePath) + StrSize (L"\\") + StrSize (NewFileInfo->FileName));\r
+ Size = StrSize (PrivateRoot->FilePath);\r
+ Size += StrSize (L"\\");\r
+ Size += StrSize (NewFileInfo->FileName);\r
+ NewFileName = AllocatePool (Size);\r
if (NewFileName == NULL) {\r
Status = EFI_OUT_OF_RESOURCES;\r
goto Done;\r
StrCat (NewFileName, L"\\");\r
StrCat (NewFileName, NewFileInfo->FileName + 1);\r
} else {\r
- NewFileName = AllocatePool (StrSize (PrivateFile->FilePath) + StrSize (L"\\") + StrSize (NewFileInfo->FileName));\r
+ Size = StrSize (PrivateFile->FilePath);\r
+ Size += StrSize (L"\\");\r
+ Size += StrSize (NewFileInfo->FileName);\r
+ NewFileName = AllocatePool (Size);\r
if (NewFileName == NULL) {\r
Status = EFI_OUT_OF_RESOURCES;\r
goto Done;\r
\r
StrCpy (PrivateFile->FileName, NewFileName);\r
\r
- TempFileName = AllocatePool (StrSize (NewFileName) + StrSize (L"\\*"));\r
+ Size = StrSize (NewFileName);\r
+ Size += StrSize (L"\\*");\r
+ TempFileName = AllocatePool (Size);\r
\r
StrCpy (TempFileName, NewFileName);\r
\r
goto Done;\r
}\r
\r
- TempFileName = AllocatePool (StrSize (OldFileName) + StrSize (L"\\*"));\r
+ Size = StrSize (OldFileName);\r
+ Size += StrSize (L"\\*");\r
+ TempFileName = AllocatePool (Size);\r
\r
StrCpy (TempFileName, OldFileName);\r
\r