Lines 63-75
Link Here
|
63 |
efipart_init(void) |
63 |
efipart_init(void) |
64 |
{ |
64 |
{ |
65 |
EFI_BLOCK_IO *blkio; |
65 |
EFI_BLOCK_IO *blkio; |
66 |
EFI_DEVICE_PATH *devpath, *node; |
66 |
EFI_DEVICE_PATH *devpath, *devpathcpy, *tmpdevpath, *node; |
67 |
EFI_HANDLE *hin, *hout, *aliases, handle; |
67 |
EFI_HANDLE *hin, *hout, *aliases, handle; |
68 |
EFI_STATUS status; |
68 |
EFI_STATUS status; |
69 |
UINTN sz; |
69 |
UINTN sz; |
70 |
CHAR16 *path; |
70 |
CHAR16 *path; |
71 |
u_int n, nin, nout; |
71 |
u_int n, nin, nout; |
72 |
int err; |
72 |
int err; |
|
|
73 |
size_t devpathlen; |
73 |
|
74 |
|
74 |
sz = 0; |
75 |
sz = 0; |
75 |
hin = NULL; |
76 |
hin = NULL; |
Lines 98-106
Link Here
|
98 |
if (EFI_ERROR(status)) { |
99 |
if (EFI_ERROR(status)) { |
99 |
continue; |
100 |
continue; |
100 |
} |
101 |
} |
|
|
102 |
|
101 |
node = devpath; |
103 |
node = devpath; |
102 |
while (!IsDevicePathEnd(NextDevicePathNode(node))) |
104 |
devpathlen = DevicePathNodeLength(node); |
|
|
105 |
while (!IsDevicePathEnd(NextDevicePathNode(node))) { |
103 |
node = NextDevicePathNode(node); |
106 |
node = NextDevicePathNode(node); |
|
|
107 |
devpathlen += DevicePathNodeLength(node); |
108 |
} |
109 |
devpathlen += DevicePathNodeLength(NextDevicePathNode(node)); |
110 |
|
104 |
status = BS->HandleProtocol(hin[n], &blkio_guid, |
111 |
status = BS->HandleProtocol(hin[n], &blkio_guid, |
105 |
(void**)&blkio); |
112 |
(void**)&blkio); |
106 |
if (EFI_ERROR(status)) |
113 |
if (EFI_ERROR(status)) |
Lines 117-126
Link Here
|
117 |
*/ |
124 |
*/ |
118 |
if (DevicePathType(node) == MEDIA_DEVICE_PATH && |
125 |
if (DevicePathType(node) == MEDIA_DEVICE_PATH && |
119 |
DevicePathSubType(node) == MEDIA_CDROM_DP) { |
126 |
DevicePathSubType(node) == MEDIA_CDROM_DP) { |
120 |
node->Type = END_DEVICE_PATH_TYPE; |
127 |
devpathcpy = malloc(devpathlen); |
121 |
node->SubType = END_ENTIRE_DEVICE_PATH_SUBTYPE; |
128 |
memcpy(devpathcpy, devpath, devpathlen); |
122 |
status = BS->LocateDevicePath(&blkio_guid, &devpath, |
129 |
node = devpathcpy; |
|
|
130 |
while (!IsDevicePathEnd(NextDevicePathNode(node))) |
131 |
node = NextDevicePathNode(node); |
132 |
SetDevicePathEndNode(node); |
133 |
tmpdevpath = devpathcpy; |
134 |
status = BS->LocateDevicePath(&blkio_guid, &tmpdevpath, |
123 |
&handle); |
135 |
&handle); |
|
|
136 |
free(devpathcpy); |
124 |
if (EFI_ERROR(status)) |
137 |
if (EFI_ERROR(status)) |
125 |
continue; |
138 |
continue; |
126 |
hout[nout] = handle; |
139 |
hout[nout] = handle; |