UINTN FileInfoSize;\r
EFI_TPL OldTpl;\r
\r
- if (This == NULL || BufferSize == NULL || Buffer == NULL) {\r
+ if (This == NULL || BufferSize == NULL) {\r
return EFI_INVALID_PARAMETER;\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
} 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