summaryrefslogtreecommitdiff
path: root/EdkNt32Pkg/Dxe/WinNtThunk/Bus/SimpleFileSystem/WinNtSimpleFileSystem.c
diff options
context:
space:
mode:
Diffstat (limited to 'EdkNt32Pkg/Dxe/WinNtThunk/Bus/SimpleFileSystem/WinNtSimpleFileSystem.c')
-rw-r--r--EdkNt32Pkg/Dxe/WinNtThunk/Bus/SimpleFileSystem/WinNtSimpleFileSystem.c46
1 files changed, 45 insertions, 1 deletions
diff --git a/EdkNt32Pkg/Dxe/WinNtThunk/Bus/SimpleFileSystem/WinNtSimpleFileSystem.c b/EdkNt32Pkg/Dxe/WinNtThunk/Bus/SimpleFileSystem/WinNtSimpleFileSystem.c
index 28fd819..eb7b434 100644
--- a/EdkNt32Pkg/Dxe/WinNtThunk/Bus/SimpleFileSystem/WinNtSimpleFileSystem.c
+++ b/EdkNt32Pkg/Dxe/WinNtThunk/Bus/SimpleFileSystem/WinNtSimpleFileSystem.c
@@ -1273,7 +1273,7 @@ Returns:
UINTN FileInfoSize;
EFI_TPL OldTpl;
- if (This == NULL || BufferSize == NULL || Buffer == NULL) {
+ if (This == NULL || BufferSize == NULL) {
return EFI_INVALID_PARAMETER;
}
@@ -1717,6 +1717,11 @@ Returns:
SYSTEMTIME SystemTime;
CHAR16 *RealFileName;
CHAR16 *TempPointer;
+ EFI_FILE_INFO *DirInfo;
+ UINTN ReadSize;
+ UINT64 Location;
+ EFI_STATUS DirStatus;
+
Size = SIZE_OF_EFI_FILE_INFO;
NameSize = StrSize (PrivateFile->FileName);
@@ -1801,6 +1806,45 @@ Returns:
} else {
CopyMem ((CHAR8 *) Buffer + Size, RealFileName, NameSize);
}
+
+ if (Info->Attribute & EFI_FILE_DIRECTORY) {
+ //
+ // The GetFileInformationByHandle.nFileSizeLow is bogus for dir so we
+ // need to do the same thing the caller would do to get the right value
+ //
+ ASSERT (PrivateFile->EfiFile.Read != NULL);
+ DirStatus = PrivateFile->EfiFile.GetPosition (&PrivateFile->EfiFile, &Location);
+ if (EFI_ERROR (DirStatus)) {
+ Location = 0;
+ }
+
+ PrivateFile->EfiFile.SetPosition (&PrivateFile->EfiFile, 0);
+ Info->FileSize = 0;
+ do {
+ ReadSize = 0;
+ DirInfo = NULL;
+ DirStatus = PrivateFile->EfiFile.Read (&PrivateFile->EfiFile, &ReadSize, DirInfo);
+ if (DirStatus == EFI_BUFFER_TOO_SMALL) {
+ DirInfo = AllocatePool (ReadSize);
+ if (DirInfo != NULL) {
+ //
+ // Read each dir entry to figure out how big the directory is
+ //
+ DirStatus = PrivateFile->EfiFile.Read (&PrivateFile->EfiFile, &ReadSize, DirInfo);
+ if (!EFI_ERROR (DirStatus) && (ReadSize != 0)) {
+ Info->FileSize += ReadSize;
+ }
+ FreePool (DirInfo);
+ }
+ }
+
+ } while (!EFI_ERROR (DirStatus) && (ReadSize != 0));
+
+ //
+ // reset the file possition back to the previous location
+ //
+ PrivateFile->EfiFile.SetPosition (&PrivateFile->EfiFile, Location);
+ }
}
*BufferSize = ResultSize;