121 lines
3.1 KiB
C
121 lines
3.1 KiB
C
|
/*
|
||
|
|
||
|
DoPort.c
|
||
|
|
||
|
Contains large routines that are too complicated to "wrap", so
|
||
|
here you have to rewrite the function for whatever the target is.
|
||
|
|
||
|
*/
|
||
|
|
||
|
#include "diskpart.h"
|
||
|
|
||
|
EFI_STATUS
|
||
|
FindPartitionableDevices(
|
||
|
EFI_HANDLE **ReturnBuffer,
|
||
|
UINTN *Count
|
||
|
)
|
||
|
/*
|
||
|
FindPartitionableDevices gets the list of handles that support
|
||
|
the block I/O protocol. It then traverses these handles, and
|
||
|
filters out any that don't appear to be fixed mount, present, read/write,
|
||
|
disks.
|
||
|
|
||
|
ReturnBuffer - will be set to point to a buffer with a an array of
|
||
|
handles to partitionable disks. NULL if failure or
|
||
|
no such disks found. Caller may free from pool
|
||
|
an
|
||
|
Count - number of entries in ReturnBuffer, 0 if none.
|
||
|
|
||
|
Return is a status.an
|
||
|
*/
|
||
|
{
|
||
|
EFI_HANDLE *HandlePointer;
|
||
|
UINTN HandleCount;
|
||
|
EFI_BLOCK_IO *BlkIo;
|
||
|
EFI_DEVICE_PATH *DevicePath;
|
||
|
UINTN PathSize;
|
||
|
BOOLEAN Partitionable;
|
||
|
EFI_DEVICE_PATH *PathInstance;
|
||
|
UINTN SpindleCount;
|
||
|
UINTN i;
|
||
|
|
||
|
*ReturnBuffer = NULL;
|
||
|
*Count = 0;
|
||
|
|
||
|
//
|
||
|
// Try to find all of the hard disks by finding all
|
||
|
// handles that support BlockIo protocol
|
||
|
//
|
||
|
status = LibLocateHandle(
|
||
|
ByProtocol,
|
||
|
&BlockIoProtocol,
|
||
|
NULL,
|
||
|
&HandleCount,
|
||
|
&HandlePointer
|
||
|
);
|
||
|
|
||
|
if (EFI_ERROR(status)) {
|
||
|
return status;
|
||
|
}
|
||
|
|
||
|
*ReturnBuffer = DoAllocate(sizeof(EFI_HANDLE)*HandleCount);
|
||
|
|
||
|
if (*ReturnBuffer == NULL) {
|
||
|
*Count = 0;
|
||
|
return EFI_OUT_OF_RESOURCES;
|
||
|
}
|
||
|
|
||
|
SpindleCount = 0;
|
||
|
for (i = 0; i < HandleCount; i++) {
|
||
|
Partitionable = TRUE;
|
||
|
status = BS->HandleProtocol(HandlePointer[i], &BlockIoProtocol, &BlkIo);
|
||
|
if (BlkIo->Media->RemovableMedia) {
|
||
|
//
|
||
|
// It's removable, it's not for us
|
||
|
//
|
||
|
Partitionable = FALSE;
|
||
|
}
|
||
|
if ( ! BlkIo->Media->MediaPresent) {
|
||
|
//
|
||
|
// It's still not for us
|
||
|
//
|
||
|
Partitionable = FALSE;
|
||
|
}
|
||
|
|
||
|
if (BlkIo->Media->ReadOnly) {
|
||
|
//
|
||
|
// Cannot partition a read-only device!
|
||
|
//
|
||
|
Partitionable = FALSE;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// OK, it seems to be a present, fixed, read/write, block device.
|
||
|
// Now, make sure it's really the raw device by inspecting the
|
||
|
// device path.
|
||
|
//
|
||
|
DevicePath = DevicePathFromHandle(HandlePointer[i]);
|
||
|
while (DevicePath != NULL) {
|
||
|
PathInstance = DevicePathInstance(&DevicePath, &PathSize);
|
||
|
|
||
|
while (!IsDevicePathEnd(PathInstance)) {
|
||
|
if ((DevicePathType(PathInstance) == MEDIA_DEVICE_PATH)) {
|
||
|
Partitionable = FALSE;
|
||
|
}
|
||
|
|
||
|
PathInstance = NextDevicePathNode(PathInstance);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (Partitionable) {
|
||
|
//
|
||
|
// Return this handle
|
||
|
//
|
||
|
(*ReturnBuffer)[*Count] = HandlePointer[i];
|
||
|
(*Count)++;
|
||
|
}
|
||
|
}
|
||
|
return EFI_SUCCESS;
|
||
|
}
|
||
|
|