70 IN EFI_FILE_PROTOCOL *File,
81 Status = File->SetPosition (File, Position);
82 if (EFI_ERROR (Status)) {
91 ReadSize = RequestedSize =
MIN (
Size, BASE_1MB);
92 Status = File->Read (File, &ReadSize,
Buffer);
93 if (EFI_ERROR (Status)) {
94 File->SetPosition (File, 0);
98 if (ReadSize != RequestedSize) {
99 File->SetPosition (File, 0);
100 return EFI_BAD_BUFFER_SIZE;
103 Position += (UINT32)ReadSize;
105 Size -= (UINT32)ReadSize;
108 File->SetPosition (File, 0);
115 IN EFI_FILE_PROTOCOL *File,
121 EFI_FILE_INFO *FileInfo;
123 Status = File->SetPosition (File, 0xFFFFFFFFFFFFFFFFULL);
124 if (EFI_ERROR (Status)) {
130 if (FileInfo != NULL) {
131 if ((UINT32)FileInfo->FileSize == FileInfo->FileSize) {
132 *
Size = (UINT32)FileInfo->FileSize;
133 Status = EFI_SUCCESS;
142 Status = File->GetPosition (File, &Position);
143 File->SetPosition (File, 0);
144 if (EFI_ERROR (Status)) {
148 if ((UINT32)Position != Position) {
149 return EFI_OUT_OF_RESOURCES;
152 *
Size = (UINT32)Position;
313 IN EFI_FILE_PROTOCOL *WritableFs OPTIONAL,
314 IN CONST CHAR16 *FileName,
320 EFI_FILE_PROTOCOL *Fs;
321 EFI_FILE_PROTOCOL *File;
324 ASSERT (FileName != NULL);
327 if (WritableFs == NULL) {
329 if (EFI_ERROR (Status)) {
330 DEBUG ((DEBUG_VERBOSE,
"OCFS: WriteFileData can't find writable FS\n"));
341 EFI_FILE_MODE_CREATE | EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE,
345 if (!EFI_ERROR (Status)) {
347 Status = File->Write (File, &WrittenSize, (VOID *)
Buffer);
350 if (EFI_ERROR (Status)) {
351 DEBUG ((DEBUG_VERBOSE,
"OCFS: WriteFileData file->Write returned %r\n", Status));
352 }
else if (WrittenSize !=
Size) {
355 "WriteFileData: File->Write truncated %u to %u\n",
359 Status = EFI_BAD_BUFFER_SIZE;
362 DEBUG ((DEBUG_VERBOSE,
"OCFS: WriteFileData Fs->Open of %s returned %r\n", FileName, Status));
365 if (WritableFs == NULL) {
446 IN EFI_FILE_PROTOCOL *Directory,
447 IN CHAR16 *FileNameStartsWith OPTIONAL,
448 OUT EFI_FILE_INFO **FileInfo
452 EFI_FILE_INFO *FileInfoCurrent;
453 EFI_FILE_INFO *FileInfoLatest;
462 ASSERT (Directory != NULL);
463 ASSERT (FileInfo != NULL);
469 if (EFI_ERROR (Status)) {
478 FileInfoCurrent = AllocatePool (SIZE_1KB);
479 if (FileInfoCurrent == NULL) {
480 return EFI_OUT_OF_RESOURCES;
483 FileInfoLatest = AllocateZeroPool (SIZE_1KB);
484 if (FileInfoLatest == NULL) {
485 FreePool (FileInfoCurrent);
486 return EFI_OUT_OF_RESOURCES;
489 Directory->SetPosition (Directory, 0);
498 FileInfoSize = SIZE_1KB -
sizeof (CHAR16);
499 Status = Directory->Read (Directory, &FileInfoSize, FileInfoCurrent);
500 if (EFI_ERROR (Status)) {
501 Directory->SetPosition (Directory, 0);
502 FreePool (FileInfoCurrent);
503 FreePool (FileInfoLatest);
507 if (FileInfoSize > 0) {
511 if (FileNameStartsWith != NULL) {
512 if (StrnCmp (FileInfoCurrent->FileName, FileNameStartsWith, StrLen (FileNameStartsWith)) != 0) {
521 EpochCurrent =
EfiTimeToEpoch (&FileInfoCurrent->ModificationTime);
522 DEBUG ((DEBUG_VERBOSE,
"OCFS: Current file %s with time %u\n", FileInfoCurrent->FileName, EpochCurrent));
527 if ((Context->PreviousTime > 0) && (EpochCurrent > Context->PreviousTime)) {
528 DEBUG ((DEBUG_VERBOSE,
"OCFS: Skipping file %s due to time %u > %u\n", FileInfoCurrent->FileName, EpochCurrent, Context->PreviousTime));
538 if (EpochCurrent == Context->PreviousTime) {
539 if (Index <= Context->PreviousIndex) {
540 DEBUG ((DEBUG_VERBOSE,
"OCFS: Skipping file %s with due to index %u <= %u\n", FileInfoCurrent->FileName, Index, Context->PreviousIndex));
554 if ((FileInfoLatest->FileName[0] ==
'\0') || (EpochCurrent >
EfiTimeToEpoch (&FileInfoLatest->ModificationTime))) {
555 CopyMem (FileInfoLatest, FileInfoCurrent, FileInfoSize);
559 DEBUG ((DEBUG_VERBOSE,
"OCFS: Stored newest file %s\n", FileInfoCurrent->FileName));
562 }
while (FileInfoSize > 0);
564 Directory->SetPosition (Directory, 0);
565 FreePool (FileInfoCurrent);
567 if (FileInfoLatest->FileName[0] ==
'\0') {
568 FreePool (FileInfoLatest);
570 DEBUG ((DEBUG_VERBOSE,
"OCFS: No matching files found\n"));
571 return EFI_NOT_FOUND;
574 *FileInfo = FileInfoLatest;
575 Context->PreviousIndex = LatestIndex;
576 Context->PreviousTime = LatestEpoch;
588 IN EFI_FILE_HANDLE Directory,
590 IN OUT VOID *Context OPTIONAL
594 EFI_STATUS TempStatus;
595 EFI_FILE_INFO *FileInfo;
598 ASSERT (Directory != NULL);
599 ASSERT (ProcessEntry != NULL);
602 if (EFI_ERROR (Status)) {
609 FileInfo = AllocatePool (SIZE_1KB);
610 if (FileInfo == NULL) {
611 return EFI_OUT_OF_RESOURCES;
614 Status = EFI_NOT_FOUND;
615 Directory->SetPosition (Directory, 0);
623 FileInfoSize = SIZE_1KB -
sizeof (CHAR16);
624 TempStatus = Directory->Read (Directory, &FileInfoSize, FileInfo);
625 if (EFI_ERROR (TempStatus)) {
630 if (FileInfoSize > 0) {
631 TempStatus = ProcessEntry (Directory, FileInfo, FileInfoSize, Context);
636 if (TempStatus == EFI_NOT_FOUND) {
640 if (EFI_ERROR (TempStatus)) {
648 Status = EFI_SUCCESS;
650 }
while (FileInfoSize > 0);
652 Directory->SetPosition (Directory, 0);