| 1071 | // |
| 1072 | |
| 1073 | static VOID ScanDriverDir(IN CONST CHAR16 *Path, OUT EFI_HANDLE **DriversToConnect, OUT UINTN *DriversToConnectNum) |
| 1074 | { |
| 1075 | EFI_STATUS Status; |
| 1076 | REFIT_DIR_ITER DirIter; |
| 1077 | EFI_FILE_INFO *DirEntry; |
| 1078 | CHAR16 FileName[256]; |
| 1079 | EFI_HANDLE DriverHandle; |
| 1080 | EFI_DRIVER_BINDING_PROTOCOL *DriverBinding; |
| 1081 | UINTN DriversArrSize; |
| 1082 | UINTN DriversArrNum; |
| 1083 | EFI_HANDLE *DriversArr; |
| 1084 | BOOLEAN Skip; |
| 1085 | UINT8 AptioBlessed; |
| 1086 | STATIC CHAR16 CONST * CONST AptioNames[] = { |
| 1087 | L"AptioMemoryFix", |
| 1088 | L"AptioFix3Drv", |
| 1089 | L"AptioFix2Drv", |
| 1090 | L"AptioFixDrv", |
| 1091 | L"LowMemFix" |
| 1092 | }; |
| 1093 | STATIC UINT8 CONST AptioIndices[] = { |
| 1094 | OFFSET_OF(DRIVERS_FLAGS, AptioMemFixLoaded), |
| 1095 | OFFSET_OF(DRIVERS_FLAGS, AptioFix3Loaded), |
| 1096 | OFFSET_OF(DRIVERS_FLAGS, AptioFix2Loaded), |
| 1097 | OFFSET_OF(DRIVERS_FLAGS, AptioFixLoaded), |
| 1098 | OFFSET_OF(DRIVERS_FLAGS, MemFixLoaded) |
| 1099 | }; |
| 1100 | |
| 1101 | DriversArrSize = 0; |
| 1102 | DriversArrNum = 0; |
| 1103 | DriversArr = NULL; |
| 1104 | |
| 1105 | //only one driver with highest priority will obtain status "Loaded" |
| 1106 | DirIterOpen(SelfRootDir, Path, &DirIter); |
| 1107 | #define BOOLEAN_AT_INDEX(k) (*(BOOLEAN*)((UINTN)&gDriversFlags + AptioIndices[(k)])) |
| 1108 | for (size_t i = 0; i != ARRAY_SIZE(AptioIndices); ++i) |
| 1109 | BOOLEAN_AT_INDEX(i) = FALSE; |
| 1110 | AptioBlessed = (UINT8) ARRAY_SIZE(AptioNames); |
| 1111 | while (DirIterNext(&DirIter, 2, L"*.efi", &DirEntry)) { |
| 1112 | size_t i; |
| 1113 | for (i = 0; i != ARRAY_SIZE(AptioNames); ++i) |
| 1114 | if (StrStr(DirEntry->FileName, AptioNames[i]) != NULL) |
| 1115 | break; |
| 1116 | if (((UINT8) i) >= AptioBlessed) |
| 1117 | continue; |
| 1118 | AptioBlessed = (UINT8) i; |
| 1119 | if (!i) |
| 1120 | break; |
| 1121 | } |
| 1122 | DirIterClose(&DirIter); |
| 1123 | |
| 1124 | // look through contents of the directory |
| 1125 | DirIterOpen(SelfRootDir, Path, &DirIter); |
| 1126 | while (DirIterNext(&DirIter, 2, L"*.efi", &DirEntry)) { |
| 1127 | Skip = (DirEntry->FileName[0] == L'.'); |
| 1128 | for (size_t i=0; i<gSettings.DisabledDriverArray.size(); i++) { |
| 1129 | if (StrStr(DirEntry->FileName, gSettings.DisabledDriverArray[i].wc_str()) != NULL) { |
| 1130 | Skip = TRUE; // skip this |
no test coverage detected