X-Git-Url: https://code.delx.au/refind/blobdiff_plain/422321bc65fbee93798a7d74f2450eb15d06d871..a8a06ba01058e3ef5f546a4a4a352d06638359a8:/filesystems/scandisk.c diff --git a/filesystems/scandisk.c b/filesystems/scandisk.c index eac4cd5..d8b862a 100644 --- a/filesystems/scandisk.c +++ b/filesystems/scandisk.c @@ -5,10 +5,27 @@ * * Copyright (c) 2013 Tencent, Inc. */ +/* + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #include "fsw_efi.h" #ifdef __MAKEWITH_GNUEFI #include "edk2/DriverBinding.h" #include "edk2/ComponentName.h" +extern EFI_GUID gEfiDiskIoProtocolGuid; +extern EFI_GUID gEfiBlockIoProtocolGuid; #endif #include "../include/refit_call_wrapper.h" @@ -39,11 +56,11 @@ static struct fsw_volume *create_dummy_volume(EFI_DISK_IO *diskio, UINT32 mediai err = fsw_alloc_zero(sizeof(struct fsw_volume), (void **)&vol); if(err) - return NULL; + return NULL; err = fsw_alloc_zero(sizeof(FSW_VOLUME_DATA), (void **)&Volume); if(err) { - fsw_free(vol); - return NULL; + fsw_free(vol); + return NULL; } /* fstype_table->volume_free for fsw_unmount */ vol->fstype_table = &dummy_fstype; @@ -70,32 +87,37 @@ static void free_dummy_volume(struct fsw_volume *vol) static int scan_disks(int (*hook)(struct fsw_volume *, struct fsw_volume *), struct fsw_volume *master) { - EFI_STATUS Status; + EFI_STATUS Status; EFI_HANDLE *Handles; - UINTN HandleCount = 0; - UINTN i; - UINTN scanned = 0; + UINTN HandleCount = 0; + UINTN i; + UINTN scanned = 0; + // Driver hangs if compiled with GNU-EFI unless there's a Print() statement somewhere. + // I'm still trying to track that down; in the meantime, work around it.... +#if defined(__MAKEWITH_GNUEFI) + Print(L" "); +#endif DPRINT(L"Scanning disks\n"); - Status = BS->LocateHandleBuffer(ByProtocol, &PROTO_NAME(DiskIoProtocol), NULL, &HandleCount, &Handles); + Status = refit_call5_wrapper(BS->LocateHandleBuffer, ByProtocol, &gEfiDiskIoProtocolGuid, NULL, &HandleCount, &Handles); if (Status == EFI_NOT_FOUND) - return -1; // no filesystems. strange, but true... + return -1; // no filesystems. strange, but true... for (i = 0; i < HandleCount; i++) { - EFI_DISK_IO *diskio; - EFI_BLOCK_IO *blockio; - Status = refit_call3_wrapper(BS->HandleProtocol, Handles[i], &PROTO_NAME(DiskIoProtocol), (VOID **) &diskio); - if (Status != 0) - continue; - Status = refit_call3_wrapper(BS->HandleProtocol, Handles[i], &PROTO_NAME(BlockIoProtocol), (VOID **) &blockio); - if (Status != 0) - continue; - struct fsw_volume *vol = create_dummy_volume(diskio, blockio->Media->MediaId); - if(vol) { - DPRINT(L"Checking disk %d\n", i); - if(hook(master, vol) == FSW_SUCCESS) - scanned++; - free_dummy_volume(vol); - } + EFI_DISK_IO *diskio; + EFI_BLOCK_IO *blockio; + Status = refit_call3_wrapper(BS->HandleProtocol, Handles[i], &gEfiDiskIoProtocolGuid, (VOID **) &diskio); + if (Status != 0) + continue; + Status = refit_call3_wrapper(BS->HandleProtocol, Handles[i], &gEfiBlockIoProtocolGuid, (VOID **) &blockio); + if (Status != 0) + continue; + struct fsw_volume *vol = create_dummy_volume(diskio, blockio->Media->MediaId); + if(vol) { + DPRINT(L"Checking disk %d\n", i); + if(hook(master, vol) == FSW_SUCCESS) + scanned++; + free_dummy_volume(vol); + } } return scanned; }