MCPcopy Create free account
hub / github.com/CloverHackyColor/CloverBootloader / DirNextEntry

Function DirNextEntry

rEFIt_UEFI/refit/lib.cpp:1390–1449  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1388}
1389
1390EFI_STATUS DirNextEntry(IN EFI_FILE *Directory, IN OUT EFI_FILE_INFO **DirEntry, IN UINTN FilterMode)
1391{
1392 EFI_STATUS Status;
1393 VOID *Buffer;
1394 UINTN LastBufferSize, BufferSize;
1395 INTN IterCount;
1396
1397 for (;;) {
1398
1399 // free pointer from last call
1400 if (*DirEntry != NULL) {
1401 FreePool(*DirEntry);
1402 *DirEntry = NULL;
1403 }
1404
1405 // read next directory entry
1406 LastBufferSize = BufferSize = 256;
1407 Buffer = (__typeof__(Buffer))AllocateZeroPool(BufferSize);
1408 for (IterCount = 0; ; IterCount++) {
1409 Status = Directory->Read(Directory, &BufferSize, Buffer);
1410 if (Status != EFI_BUFFER_TOO_SMALL || IterCount >= 4)
1411 break;
1412 if (BufferSize <= LastBufferSize) {
1413 DBG("FS Driver requests bad buffer size %llu (was %llu), using %llu instead\n", BufferSize, LastBufferSize, LastBufferSize * 2);
1414 BufferSize = LastBufferSize * 2;
1415#if REFIT_DEBUG > 0
1416 } else {
1417 DBG("Reallocating buffer from %llu to %llu\n", LastBufferSize, BufferSize);
1418#endif
1419 }
1420 Buffer = (__typeof__(Buffer))EfiReallocatePool(Buffer, LastBufferSize, BufferSize);
1421 LastBufferSize = BufferSize;
1422 }
1423 if (EFI_ERROR(Status)) {
1424 FreePool(Buffer);
1425 break;
1426 }
1427
1428 // check for end of listing
1429 if (BufferSize == 0) { // end of directory listing
1430 FreePool(Buffer);
1431 break;
1432 }
1433
1434 // entry is ready to be returned
1435 *DirEntry = (EFI_FILE_INFO *)Buffer;
1436 if (*DirEntry) {
1437 // filter results
1438 if (FilterMode == 1) { // only return directories
1439 if (((*DirEntry)->Attribute & EFI_FILE_DIRECTORY))
1440 break;
1441 } else if (FilterMode == 2) { // only return files
1442 if (((*DirEntry)->Attribute & EFI_FILE_DIRECTORY) == 0)
1443 break;
1444 } else // no filter or unknown filter -> return everything
1445 break;
1446 }
1447 }

Callers 1

DirIterNextFunction · 0.85

Calls 4

FreePoolFunction · 0.50
AllocateZeroPoolFunction · 0.50
EfiReallocatePoolFunction · 0.50
ReadMethod · 0.45

Tested by

no test coverage detected