diff --git a/EdkNt32Pkg/Dxe/WinNtThunk/Bus/SimpleFileSystem/WinNtSimpleFileSystem.c b/EdkNt32Pkg/Dxe/WinNtThunk/Bus/SimpleFileSystem/WinNtSimpleFileSystem.c index 28fd819b1d..eb7b4346f7 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;