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

Function GetVolumeHandleWithDir

FSInject/Test.c:24–76  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

22
23
24EFI_STATUS
25EFIAPI
26GetVolumeHandleWithDir(CHAR16 *SearchDir, OUT EFI_HANDLE *Handle)
27{
28 EFI_STATUS Status;
29 UINTN HandlesSize;
30 UINTN Idx;
31 EFI_HANDLE *Handles;
32 EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *FS = NULL;
33 EFI_FILE_PROTOCOL *FP = NULL;
34 EFI_FILE_PROTOCOL *FP2 = NULL;
35
36 // get all handles with EFI_SIMPLE_FILE_SYSTEM_PROTOCOL
37 Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiSimpleFileSystemProtocolGuid, NULL, &HandlesSize, &Handles);
38 if (EFI_ERROR(Status)) {
39 Print(L"LocateHandleBuffer: %r\n", Status);
40 return Status;
41 }
42 Print(L"LocateHandleBuffer: %r, got %d handles\n", Status, HandlesSize);
43
44 // find handle that contains SearchDir
45 for (Idx = 0; Idx < HandlesSize; Idx++) {
46 // get EFI_SIMPLE_FILE_SYSTEM_PROTOCOL first
47 Print(L"Trying handle: %p\n", Handles[Idx]);
48 Status = gBS->OpenProtocol(Handles[Idx], &gEfiSimpleFileSystemProtocolGuid, (void **)&FS, gImageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);
49 if (EFI_ERROR(Status)) {
50 Print(L"OpenProtocol(gEfiSimpleFileSystemProtocolGuid): %r\n", Status);
51 continue;
52 }
53 // open volume
54 Status = FS->OpenVolume(FS, &FP);
55 if (EFI_ERROR(Status)) {
56 Print(L"OpenVolume(): %r\n", Status);
57 gBS->CloseProtocol(Handles[Idx], &gEfiSimpleFileSystemProtocolGuid, gImageHandle, NULL);
58 continue;
59 }
60 // try to open injection dir
61 Status = FP->Open(FP, &FP2, SearchDir, EFI_FILE_MODE_READ, 0);
62 if (EFI_ERROR(Status)) {
63 Print(L"Open(%s): %r\n", SearchDir, Status);
64 FP->Close(FP);
65 gBS->CloseProtocol(Handles[Idx], &gEfiSimpleFileSystemProtocolGuid, gImageHandle, NULL);
66 continue;
67 }
68 // we have found it - close it and return handle
69 FP2->Close(FP2);
70 FP->Close(FP);
71 *Handle = Handles[Idx];
72 return EFI_SUCCESS;
73 }
74 // not found
75 return EFI_NOT_FOUND;
76}
77
78EFI_STATUS
79EFIAPI

Callers 1

InstallTestFSinjectionFunction · 0.85

Calls 3

PrintFunction · 0.85
OpenMethod · 0.45
CloseMethod · 0.45

Tested by

no test coverage detected