Improvements to EFI volume support
This commit is contained in:
parent
5b64cf21a0
commit
9aaf8ddb68
@ -94,10 +94,10 @@ BlGetSecureBootStatus();
|
|||||||
|
|
||||||
XTCDECL
|
XTCDECL
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
BlGetVolumeDevicePath(IN PCHAR SystemPath,
|
BlGetVolumeDevicePath(IN PWCHAR SystemPath,
|
||||||
OUT PEFI_DEVICE_PATH_PROTOCOL *DevicePath,
|
OUT PEFI_DEVICE_PATH_PROTOCOL *DevicePath,
|
||||||
OUT PCHAR *ArcName,
|
OUT PWCHAR *ArcName,
|
||||||
OUT PCHAR *Path);
|
OUT PWCHAR *Path);
|
||||||
|
|
||||||
XTCDECL
|
XTCDECL
|
||||||
VOID
|
VOID
|
||||||
@ -233,9 +233,9 @@ BlpDiscoverEfiBlockDevices(OUT PLIST_ENTRY BlockDevices);
|
|||||||
|
|
||||||
XTCDECL
|
XTCDECL
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
BlpDissectVolumeArcPath(IN PCHAR SystemPath,
|
BlpDissectVolumeArcPath(IN PWCHAR SystemPath,
|
||||||
OUT PCHAR *ArcName,
|
OUT PWCHAR *ArcName,
|
||||||
OUT PCHAR *Path,
|
OUT PWCHAR *Path,
|
||||||
OUT PUSHORT DriveType,
|
OUT PUSHORT DriveType,
|
||||||
OUT PULONG DriveNumber,
|
OUT PULONG DriveNumber,
|
||||||
OUT PULONG PartNumber);
|
OUT PULONG PartNumber);
|
||||||
|
@ -70,7 +70,7 @@ BlEnumerateBlockDevices()
|
|||||||
Status = BlpDiscoverEfiBlockDevices(&BlockDevices);
|
Status = BlpDiscoverEfiBlockDevices(&BlockDevices);
|
||||||
if(Status != STATUS_EFI_SUCCESS)
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
{
|
{
|
||||||
BlDebugPrint(L"ERROR: Failed to discover EFI block devices (status code: %lx)\n", Status);
|
BlDebugPrint(L"ERROR: Failed to discover EFI block devices (Status Code: 0x%lx)\n", Status);
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -169,7 +169,7 @@ BlEnumerateBlockDevices()
|
|||||||
Status = BlMemoryAllocatePool(sizeof(EFI_BLOCK_DEVICE), (PVOID *)&BlockDevice);
|
Status = BlMemoryAllocatePool(sizeof(EFI_BLOCK_DEVICE), (PVOID *)&BlockDevice);
|
||||||
if(Status != STATUS_EFI_SUCCESS)
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
{
|
{
|
||||||
BlDebugPrint(L"ERROR: Unable to allocate memory pool for block device (status code: %lx)\n", Status);
|
BlDebugPrint(L"ERROR: Failed to allocate memory pool for block device (Status Code: 0x%lx)\n", Status);
|
||||||
return STATUS_EFI_OUT_OF_RESOURCES;
|
return STATUS_EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -294,16 +294,16 @@ BlFindVolumeDevicePath(IN PEFI_DEVICE_PATH_PROTOCOL FsHandle,
|
|||||||
*/
|
*/
|
||||||
XTCDECL
|
XTCDECL
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
BlGetVolumeDevicePath(IN PCHAR SystemPath,
|
BlGetVolumeDevicePath(IN PWCHAR SystemPath,
|
||||||
OUT PEFI_DEVICE_PATH_PROTOCOL *DevicePath,
|
OUT PEFI_DEVICE_PATH_PROTOCOL *DevicePath,
|
||||||
OUT PCHAR *ArcName,
|
OUT PWCHAR *ArcName,
|
||||||
OUT PCHAR *Path)
|
OUT PWCHAR *Path)
|
||||||
{
|
{
|
||||||
PEFI_BLOCK_DEVICE Device;
|
PEFI_BLOCK_DEVICE Device;
|
||||||
USHORT DriveType;
|
USHORT DriveType;
|
||||||
ULONG DriveNumber;
|
ULONG DriveNumber;
|
||||||
ULONG PartNumber;
|
ULONG PartNumber;
|
||||||
PCHAR Volume;
|
PWCHAR Volume;
|
||||||
ULONG PathLength;
|
ULONG PathLength;
|
||||||
PLIST_ENTRY ListEntry;
|
PLIST_ENTRY ListEntry;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
@ -333,13 +333,13 @@ BlGetVolumeDevicePath(IN PCHAR SystemPath,
|
|||||||
if(PathLength == GUID_STRING_LENGTH)
|
if(PathLength == GUID_STRING_LENGTH)
|
||||||
{
|
{
|
||||||
/* This is EFI GUID */
|
/* This is EFI GUID */
|
||||||
BlDebugPrint(L"EFI/GPT GUID in system path is not supported yet\n");
|
BlDebugPrint(L"WARNING: EFI/GPT GUID in system path is not supported\n");
|
||||||
return STATUS_EFI_UNSUPPORTED;
|
return STATUS_EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
else if(PathLength == PARTUUID_STRING_LENGTH)
|
else if(PathLength == PARTUUID_STRING_LENGTH)
|
||||||
{
|
{
|
||||||
/* This is MBR UUID */
|
/* This is MBR UUID */
|
||||||
BlDebugPrint(L"MBR partition UUID in system path is not supported yet\n");
|
BlDebugPrint(L"WARNING: MBR partition UUID in system path is not supported\n");
|
||||||
return STATUS_EFI_UNSUPPORTED;
|
return STATUS_EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -358,7 +358,7 @@ BlGetVolumeDevicePath(IN PCHAR SystemPath,
|
|||||||
if(Status != STATUS_EFI_SUCCESS)
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
{
|
{
|
||||||
/* Failed to parse system path */
|
/* Failed to parse system path */
|
||||||
BlDebugPrint(L"Failed to parse system path: '%s' with status code: %lx\n", SystemPath, Status);
|
BlDebugPrint(L"ERROR: Failed to parse system path: '%s' (Status Code: 0x%lx)\n", SystemPath, Status);
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -382,7 +382,7 @@ BlGetVolumeDevicePath(IN PCHAR SystemPath,
|
|||||||
if(*DevicePath == NULL)
|
if(*DevicePath == NULL)
|
||||||
{
|
{
|
||||||
/* Failed to find volume */
|
/* Failed to find volume */
|
||||||
BlDebugPrint(L"Volume (DriveType: %u, DriveNumber: %lu, PartNumber: %lu) not found\n",
|
BlDebugPrint(L"ERROR: Volume (DriveType: %u, DriveNumber: %lu, PartNumber: %lu) not found\n",
|
||||||
DriveType, DriveNumber, PartNumber);
|
DriveType, DriveNumber, PartNumber);
|
||||||
return STATUS_EFI_NOT_FOUND;
|
return STATUS_EFI_NOT_FOUND;
|
||||||
}
|
}
|
||||||
@ -617,7 +617,7 @@ BlpDiscoverEfiBlockDevices(OUT PLIST_ENTRY BlockDevices)
|
|||||||
if(Status != STATUS_EFI_SUCCESS)
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
{
|
{
|
||||||
/* Failed to locate handles */
|
/* Failed to locate handles */
|
||||||
BlDebugPrint(L"ERROR: Failed to locate block devices handles (status code: %lx)\n", Status);
|
BlDebugPrint(L"ERROR: Failed to locate block devices handles (Status Code: 0x%lx)\n", Status);
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -634,7 +634,7 @@ BlpDiscoverEfiBlockDevices(OUT PLIST_ENTRY BlockDevices)
|
|||||||
if(Status != STATUS_EFI_SUCCESS || Io == NULL)
|
if(Status != STATUS_EFI_SUCCESS || Io == NULL)
|
||||||
{
|
{
|
||||||
/* Failed to open I/O protocol, skip it */
|
/* Failed to open I/O protocol, skip it */
|
||||||
BlDebugPrint(L"WARNING: Failed to open EFI Block I/O protocol (status code: %lx)\n", Status);
|
BlDebugPrint(L"WARNING: Failed to open EFI Block I/O protocol (Status Code: 0x%lx)\n", Status);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -652,7 +652,7 @@ BlpDiscoverEfiBlockDevices(OUT PLIST_ENTRY BlockDevices)
|
|||||||
if(Status != STATUS_EFI_SUCCESS || DevicePath == NULL)
|
if(Status != STATUS_EFI_SUCCESS || DevicePath == NULL)
|
||||||
{
|
{
|
||||||
/* Device failed to handle DP protocol */
|
/* Device failed to handle DP protocol */
|
||||||
BlDebugPrint(L"WARNING: Unable to open DevicePath protocol (status code: %lx)\n", Status);
|
BlDebugPrint(L"WARNING: Unable to open DevicePath protocol (Status Code: 0x%lx)\n", Status);
|
||||||
EfiSystemTable->BootServices->CloseProtocol(Handles[Index], &IoGuid, EfiImageHandle, NULL);
|
EfiSystemTable->BootServices->CloseProtocol(Handles[Index], &IoGuid, EfiImageHandle, NULL);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -662,7 +662,7 @@ BlpDiscoverEfiBlockDevices(OUT PLIST_ENTRY BlockDevices)
|
|||||||
if(Status != STATUS_EFI_SUCCESS)
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
{
|
{
|
||||||
/* Memory allocation failure */
|
/* Memory allocation failure */
|
||||||
BlDebugPrint(L"ERROR: Unable to allocate memory pool for block device (status code: %lx)\n", Status);
|
BlDebugPrint(L"ERROR: Failed to allocate memory pool for block device (Status Code: 0x%lx)\n", Status);
|
||||||
EfiSystemTable->BootServices->CloseProtocol(Handles[Index], &DevicePathGuid, EfiImageHandle, NULL);
|
EfiSystemTable->BootServices->CloseProtocol(Handles[Index], &DevicePathGuid, EfiImageHandle, NULL);
|
||||||
EfiSystemTable->BootServices->CloseProtocol(Handles[Index], &IoGuid, EfiImageHandle, NULL);
|
EfiSystemTable->BootServices->CloseProtocol(Handles[Index], &IoGuid, EfiImageHandle, NULL);
|
||||||
return Status;
|
return Status;
|
||||||
@ -705,14 +705,14 @@ BlpDiscoverEfiBlockDevices(OUT PLIST_ENTRY BlockDevices)
|
|||||||
*/
|
*/
|
||||||
XTCDECL
|
XTCDECL
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
BlpDissectVolumeArcPath(IN PCHAR SystemPath,
|
BlpDissectVolumeArcPath(IN PWCHAR SystemPath,
|
||||||
OUT PCHAR *ArcName,
|
OUT PWCHAR *ArcName,
|
||||||
OUT PCHAR *Path,
|
OUT PWCHAR *Path,
|
||||||
OUT PUSHORT DriveType,
|
OUT PUSHORT DriveType,
|
||||||
OUT PULONG DriveNumber,
|
OUT PULONG DriveNumber,
|
||||||
OUT PULONG PartNumber)
|
OUT PULONG PartNumber)
|
||||||
{
|
{
|
||||||
PCHAR ArcPath, LocalArcName;
|
PWCHAR ArcPath, LocalArcName;
|
||||||
ULONG ArcLength = 0;
|
ULONG ArcLength = 0;
|
||||||
|
|
||||||
/* Set default values */
|
/* Set default values */
|
||||||
@ -721,20 +721,20 @@ BlpDissectVolumeArcPath(IN PCHAR SystemPath,
|
|||||||
*PartNumber = 0;
|
*PartNumber = 0;
|
||||||
|
|
||||||
/* Look for the ARC path */
|
/* Look for the ARC path */
|
||||||
if(RtlCompareStringInsensitive(SystemPath, "ramdisk(0)", 0) == 0)
|
if(RtlCompareWideStringInsensitive(SystemPath, L"ramdisk(0)", 0) == 0)
|
||||||
{
|
{
|
||||||
/* This is RAM disk */
|
/* This is RAM disk */
|
||||||
ArcLength = 10;
|
ArcLength = 10;
|
||||||
*DriveType = XTBL_BOOT_DEVICE_RAMDISK;
|
*DriveType = XTBL_BOOT_DEVICE_RAMDISK;
|
||||||
}
|
}
|
||||||
else if(RtlCompareStringInsensitive(SystemPath, "multi(0)disk(0)", 0) == 0)
|
else if(RtlCompareWideStringInsensitive(SystemPath, L"multi(0)disk(0)", 0) == 0)
|
||||||
{
|
{
|
||||||
/* This is a multi-disk port */
|
/* This is a multi-disk port */
|
||||||
ArcLength = 15;
|
ArcLength = 15;
|
||||||
ArcPath = SystemPath + ArcLength;
|
ArcPath = SystemPath + ArcLength;
|
||||||
|
|
||||||
/* Check for disk type */
|
/* Check for disk type */
|
||||||
if(RtlCompareStringInsensitive(ArcPath, "cdrom(", 0) == 0)
|
if(RtlCompareWideStringInsensitive(ArcPath, L"cdrom(", 0) == 0)
|
||||||
{
|
{
|
||||||
/* This is an optical drive */
|
/* This is an optical drive */
|
||||||
ArcLength += 6;
|
ArcLength += 6;
|
||||||
@ -755,7 +755,7 @@ BlpDissectVolumeArcPath(IN PCHAR SystemPath,
|
|||||||
*DriveType = XTBL_BOOT_DEVICE_CDROM;
|
*DriveType = XTBL_BOOT_DEVICE_CDROM;
|
||||||
ArcLength++;
|
ArcLength++;
|
||||||
}
|
}
|
||||||
else if(RtlCompareStringInsensitive(ArcPath, "fdisk(", 0) == 0)
|
else if(RtlCompareWideStringInsensitive(ArcPath, L"fdisk(", 0) == 0)
|
||||||
{
|
{
|
||||||
/* This is a floppy drive */
|
/* This is a floppy drive */
|
||||||
ArcLength += 6;
|
ArcLength += 6;
|
||||||
@ -776,7 +776,7 @@ BlpDissectVolumeArcPath(IN PCHAR SystemPath,
|
|||||||
*DriveType = XTBL_BOOT_DEVICE_FLOPPY;
|
*DriveType = XTBL_BOOT_DEVICE_FLOPPY;
|
||||||
ArcLength++;
|
ArcLength++;
|
||||||
}
|
}
|
||||||
else if(RtlCompareStringInsensitive(ArcPath, "rdisk(", 0) == 0)
|
else if(RtlCompareWideStringInsensitive(ArcPath, L"rdisk(", 0) == 0)
|
||||||
{
|
{
|
||||||
/* This is a hard disk */
|
/* This is a hard disk */
|
||||||
ArcLength += 6;
|
ArcLength += 6;
|
||||||
@ -799,7 +799,7 @@ BlpDissectVolumeArcPath(IN PCHAR SystemPath,
|
|||||||
ArcPath = SystemPath + ArcLength;
|
ArcPath = SystemPath + ArcLength;
|
||||||
|
|
||||||
/* Look for a partition */
|
/* Look for a partition */
|
||||||
if(RtlCompareStringInsensitive(ArcPath, "partition(", 0) == 0)
|
if(RtlCompareWideStringInsensitive(ArcPath, L"partition(", 0) == 0)
|
||||||
{
|
{
|
||||||
/* Partition information found */
|
/* Partition information found */
|
||||||
ArcLength += 10;
|
ArcLength += 10;
|
||||||
@ -893,7 +893,7 @@ BlpDuplicateDevicePath(IN PEFI_DEVICE_PATH_PROTOCOL DevicePath)
|
|||||||
if(Status != STATUS_EFI_SUCCESS)
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
{
|
{
|
||||||
/* Failed to allocate memory */
|
/* Failed to allocate memory */
|
||||||
BlDebugPrint(L"ERROR: Unable to allocate memory pool for device path duplicate\n");
|
BlDebugPrint(L"ERROR: Failed to allocate memory pool for device path duplicate (Status Code: 0x%lx)\n", Status);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user