72 IN EFI_DRIVER_BINDING_PROTOCOL *This,
73 IN EFI_HANDLE ControllerHandle,
74 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
78 EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
79 EFI_DISK_IO_PROTOCOL *DiskIo;
85 if (RemainingDevicePath != NULL) {
90 if (!IsDevicePathEnd (RemainingDevicePath)) {
95 Node = (EFI_DEV_PATH *)RemainingDevicePath;
96 if ((Node->DevPath.Type != MEDIA_DEVICE_PATH) ||
97 (Node->DevPath.SubType != MEDIA_HARDDRIVE_DP) ||
98 (DevicePathNodeLength (&Node->DevPath) != sizeof (HARDDRIVE_DEVICE_PATH)))
100 return EFI_UNSUPPORTED;
108 Status =
gBS->OpenProtocol (
112 This->DriverBindingHandle,
114 EFI_OPEN_PROTOCOL_BY_DRIVER
116 if (Status == EFI_ALREADY_STARTED) {
120 if (EFI_ERROR (Status)) {
130 This->DriverBindingHandle,
137 Status =
gBS->OpenProtocol (
140 (VOID **)&ParentDevicePath,
141 This->DriverBindingHandle,
143 EFI_OPEN_PROTOCOL_BY_DRIVER
145 if (Status == EFI_ALREADY_STARTED) {
149 if (EFI_ERROR (Status)) {
159 This->DriverBindingHandle,
166 Status =
gBS->OpenProtocol (
170 This->DriverBindingHandle,
172 EFI_OPEN_PROTOCOL_TEST_PROTOCOL
196 IN EFI_DRIVER_BINDING_PROTOCOL *This,
197 IN EFI_HANDLE ControllerHandle,
198 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
202 EFI_STATUS OpenStatus;
203 EFI_BLOCK_IO_PROTOCOL *BlockIo;
204 EFI_BLOCK_IO2_PROTOCOL *BlockIo2;
205 EFI_DISK_IO_PROTOCOL *DiskIo;
206 EFI_DISK_IO2_PROTOCOL *DiskIo2;
207 EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
209 BOOLEAN MediaPresent;
213 OldTpl =
gBS->RaiseTPL (TPL_CALLBACK);
217 if (RemainingDevicePath != NULL) {
222 if (IsDevicePathEnd (RemainingDevicePath)) {
223 Status = EFI_SUCCESS;
232 Status =
gBS->OpenProtocol (
236 This->DriverBindingHandle,
238 EFI_OPEN_PROTOCOL_GET_PROTOCOL
240 if (EFI_ERROR (Status)) {
244 Status =
gBS->OpenProtocol (
246 &gEfiBlockIo2ProtocolGuid,
248 This->DriverBindingHandle,
250 EFI_OPEN_PROTOCOL_GET_PROTOCOL
252 if (EFI_ERROR (Status)) {
259 Status =
gBS->OpenProtocol (
262 (VOID **)&ParentDevicePath,
263 This->DriverBindingHandle,
265 EFI_OPEN_PROTOCOL_BY_DRIVER
267 if (EFI_ERROR (Status) && (Status != EFI_ALREADY_STARTED)) {
274 Status =
gBS->OpenProtocol (
278 This->DriverBindingHandle,
280 EFI_OPEN_PROTOCOL_BY_DRIVER
282 if (EFI_ERROR (Status) && (Status != EFI_ALREADY_STARTED)) {
286 This->DriverBindingHandle,
294 Status =
gBS->OpenProtocol (
298 This->DriverBindingHandle,
300 EFI_OPEN_PROTOCOL_BY_DRIVER
302 if (EFI_ERROR (Status) && (Status != EFI_ALREADY_STARTED)) {
309 Status = EFI_UNSUPPORTED;
310 MediaPresent = BlockIo->Media->MediaPresent;
311 if (BlockIo->Media->MediaPresent ||
312 (BlockIo->Media->RemovableMedia && !BlockIo->Media->LogicalPartition))
320 while (*Routine != NULL) {
330 if (!EFI_ERROR (Status) || (Status == EFI_MEDIA_CHANGED) || (Status == EFI_NO_MEDIA)) {
350 if (EFI_ERROR (Status) &&
351 !EFI_ERROR (OpenStatus) &&
352 (Status != EFI_MEDIA_CHANGED) &&
353 !(MediaPresent && (Status == EFI_NO_MEDIA)))
358 This->DriverBindingHandle,
367 This->DriverBindingHandle,
374 This->DriverBindingHandle,
380 gBS->RestoreTPL (OldTpl);
401 IN EFI_DRIVER_BINDING_PROTOCOL *This,
402 IN EFI_HANDLE ControllerHandle,
403 IN UINTN NumberOfChildren,
404 IN EFI_HANDLE *ChildHandleBuffer
409 EFI_BLOCK_IO_PROTOCOL *BlockIo;
410 EFI_BLOCK_IO2_PROTOCOL *BlockIo2;
411 BOOLEAN AllChildrenStopped;
413 EFI_DISK_IO_PROTOCOL *DiskIo;
420 if (NumberOfChildren == 0) {
427 DEBUG ((EFI_D_ERROR,
"PartitionDriverBindingStop: Still has child.\n"));
428 return EFI_DEVICE_ERROR;
437 This->DriverBindingHandle,
446 This->DriverBindingHandle,
453 This->DriverBindingHandle,
459 AllChildrenStopped = TRUE;
460 for (Index = 0; Index < NumberOfChildren; Index++) {
462 ChildHandleBuffer[Index],
465 This->DriverBindingHandle,
467 EFI_OPEN_PROTOCOL_GET_PROTOCOL
473 ChildHandleBuffer[Index],
474 &gEfiBlockIo2ProtocolGuid,
476 This->DriverBindingHandle,
478 EFI_OPEN_PROTOCOL_GET_PROTOCOL
492 BlockIo->FlushBlocks (BlockIo);
494 if (BlockIo2 != NULL) {
495 Status = BlockIo2->FlushBlocksEx (BlockIo2, NULL);
496 DEBUG ((EFI_D_ERROR,
"PartitionDriverBindingStop: FlushBlocksEx returned with %r\n", Status));
498 Status = EFI_SUCCESS;
504 This->DriverBindingHandle,
505 ChildHandleBuffer[Index]
519 if (BlockIo2 != NULL) {
526 if (Status != EFI_MEDIA_CHANGED) {
527 Status =
gBS->UninstallMultipleProtocolInterfaces (
528 ChildHandleBuffer[Index],
533 &gEfiBlockIo2ProtocolGuid,
535 &gEfiPartitionInfoProtocolGuid,
545 Status =
gBS->UninstallMultipleProtocolInterfaces (
546 ChildHandleBuffer[Index],
551 &gEfiPartitionInfoProtocolGuid,
561 if (EFI_ERROR (Status)) {
567 This->DriverBindingHandle,
568 ChildHandleBuffer[Index],
569 EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
576 if (EFI_ERROR (Status)) {
577 AllChildrenStopped = FALSE;
578 if (Status == EFI_MEDIA_CHANGED) {
584 if (!AllChildrenStopped) {
585 return EFI_DEVICE_ERROR;
605 IN EFI_BLOCK_IO_PROTOCOL *This,
606 IN BOOLEAN ExtendedVerification
634 IN EFI_DISK_IO_PROTOCOL *DiskIo,
636 IN EFI_STATUS DefaultStatus
648 Status = DiskIo->ReadDisk (DiskIo, MediaId, 0, 1, (VOID *)
Buffer);
649 if ((Status == EFI_NO_MEDIA) || (Status == EFI_MEDIA_CHANGED)) {
653 return DefaultStatus;
678 IN EFI_BLOCK_IO_PROTOCOL *This,
690 if (BufferSize % Private->
BlockSize != 0) {
695 if (Offset + BufferSize > Private->
End) {
704 return Private->
DiskIo->ReadDisk (Private->
DiskIo, MediaId, Offset, BufferSize,
Buffer);
730 IN EFI_BLOCK_IO_PROTOCOL *This,
742 if (BufferSize % Private->
BlockSize != 0) {
747 if (Offset + BufferSize > Private->
End) {
756 return Private->
DiskIo->WriteDisk (Private->
DiskIo, MediaId, Offset, BufferSize,
Buffer);
772 IN EFI_BLOCK_IO_PROTOCOL *This
797 IN EFI_DISK_IO2_PROTOCOL *DiskIo2,
799 IN EFI_STATUS DefaultStatus
811 Status = DiskIo2->ReadDiskEx (DiskIo2, MediaId, 0, NULL, 1, (VOID *)
Buffer);
812 if ((Status == EFI_NO_MEDIA) || (Status == EFI_MEDIA_CHANGED)) {
816 return DefaultStatus;
833 IN EFI_BLOCK_IO2_PROTOCOL *This,
834 IN BOOLEAN ExtendedVerification
864 gBS->CloseEvent (Event);
881 IN EFI_BLOCK_IO2_TOKEN *Token
887 Task = AllocatePool (
sizeof (*Task));
892 Status =
gBS->CreateEvent (
899 if (EFI_ERROR (Status)) {
945 IN EFI_BLOCK_IO2_PROTOCOL *This,
948 IN OUT EFI_BLOCK_IO2_TOKEN *Token,
960 if (BufferSize % Private->
BlockSize != 0) {
965 if (Offset + BufferSize > Private->
End) {
969 if ((Token != NULL) && (Token->Event != NULL)) {
972 return EFI_OUT_OF_RESOURCES;
976 if (EFI_ERROR (Status)) {
981 Status = Private->
DiskIo2->ReadDiskEx (Private->
DiskIo2, MediaId, Offset, NULL, BufferSize,
Buffer);
1021 IN EFI_BLOCK_IO2_PROTOCOL *This,
1024 IN OUT EFI_BLOCK_IO2_TOKEN *Token,
1025 IN UINTN BufferSize,
1036 if (BufferSize % Private->
BlockSize != 0) {
1041 if (Offset + BufferSize > Private->
End) {
1045 if ((Token != NULL) && (Token->Event != NULL)) {
1048 return EFI_OUT_OF_RESOURCES;
1052 if (EFI_ERROR (Status)) {
1057 Status = Private->
DiskIo2->WriteDiskEx (Private->
DiskIo2, MediaId, Offset, NULL, BufferSize,
Buffer);
1088 IN EFI_BLOCK_IO2_PROTOCOL *This,
1089 IN OUT EFI_BLOCK_IO2_TOKEN *Token
1098 if ((Token != NULL) && (Token->Event != NULL)) {
1101 return EFI_OUT_OF_RESOURCES;
1105 if (EFI_ERROR (Status)) {
1141 IN EFI_DRIVER_BINDING_PROTOCOL *This,
1142 IN EFI_HANDLE ParentHandle,
1143 IN EFI_DISK_IO_PROTOCOL *ParentDiskIo,
1144 IN EFI_DISK_IO2_PROTOCOL *ParentDiskIo2,
1145 IN EFI_BLOCK_IO_PROTOCOL *ParentBlockIo,
1146 IN EFI_BLOCK_IO2_PROTOCOL *ParentBlockIo2,
1147 IN EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath,
1148 IN EFI_DEVICE_PATH_PROTOCOL *DevicePathNode,
1149 IN EFI_PARTITION_INFO_PROTOCOL *PartitionInfo,
1154 IN EFI_GUID *TypeGuid
1160 Status = EFI_SUCCESS;
1162 if (Private == NULL) {
1163 return EFI_OUT_OF_RESOURCES;
1174 Private->
DiskIo = ParentDiskIo;
1175 Private->
DiskIo2 = ParentDiskIo2;
1180 Private->
BlockIo.Revision = ParentBlockIo->Revision;
1183 CopyMem (Private->
BlockIo.Media, ParentBlockIo->Media, sizeof (EFI_BLOCK_IO_MEDIA));
1193 if (Private->
DiskIo2 != NULL) {
1196 CopyMem (Private->
BlockIo2.Media, ParentBlockIo2->Media, sizeof (EFI_BLOCK_IO_MEDIA));
1204 Private->
Media.IoAlign = 0;
1205 Private->
Media.LogicalPartition = TRUE;
1209 ParentBlockIo->Media->BlockSize
1216 Private->
Media2.IoAlign = 0;
1217 Private->
Media2.LogicalPartition = TRUE;
1218 Private->
Media2.LastBlock = Private->
Media.LastBlock;
1225 if (Private->
BlockIo.Revision >= EFI_BLOCK_IO_PROTOCOL_REVISION2) {
1226 Private->
Media.LowestAlignedLba = 0;
1227 Private->
Media.LogicalBlocksPerPhysicalBlock = 0;
1228 Private->
Media2.LowestAlignedLba = 0;
1229 Private->
Media2.LogicalBlocksPerPhysicalBlock = 0;
1230 if (Private->
BlockIo.Revision >= EFI_BLOCK_IO_PROTOCOL_REVISION3) {
1231 Private->
Media.OptimalTransferLengthGranularity = 0;
1232 Private->
Media2.OptimalTransferLengthGranularity = 0;
1236 Private->
DevicePath = AppendDevicePathNode (ParentDevicePath, DevicePathNode);
1240 return EFI_OUT_OF_RESOURCES;
1249 if (TypeGuid != NULL) {
1259 if (Private->
DiskIo2 != NULL) {
1260 Status =
gBS->InstallMultipleProtocolInterfaces (
1266 &gEfiBlockIo2ProtocolGuid,
1268 &gEfiPartitionInfoProtocolGuid,
1277 Status =
gBS->InstallMultipleProtocolInterfaces (
1283 &gEfiPartitionInfoProtocolGuid,
1293 if (!EFI_ERROR (Status)) {
1297 Status =
gBS->OpenProtocol (
1300 (VOID **)&ParentDiskIo,
1301 This->DriverBindingHandle,
1303 EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
1314 if (Status == EFI_ALREADY_STARTED) {
1315 Status = EFI_SUCCESS;
1335 IN EFI_HANDLE ImageHandle,
1336 IN EFI_SYSTEM_TABLE *SystemTable
1344 Status = EfiLibInstallDriverBindingComponentName2 (
1352 ASSERT_EFI_ERROR (Status);
1368 IN EFI_HANDLE ControllerHandle
1371 EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *OpenInfoBuffer;
1376 Status =
gBS->OpenProtocolInformation (
1382 ASSERT_EFI_ERROR (Status);
1384 for (Index = 0; Index < EntryCount; Index++) {
1385 if ((OpenInfoBuffer[Index].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {
1390 FreePool (OpenInfoBuffer);
1392 return (BOOLEAN)(Index < EntryCount);
EFI_STATUS PartitionInstallAppleChildHandles(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE Handle, IN EFI_DISK_IO_PROTOCOL *DiskIo, IN EFI_DISK_IO2_PROTOCOL *DiskIo2, IN EFI_BLOCK_IO_PROTOCOL *BlockIo, IN EFI_BLOCK_IO2_PROTOCOL *BlockIo2, IN EFI_DEVICE_PATH_PROTOCOL *DevicePath)
EFI_GUID gApplePartitionInfoProtocolGuid
EFI_DEVICE_PATH_PROTOCOL End
VOID EFIAPI Exit(IN EFI_STATUS Status)
EFI_STATUS PartitionInstallGptChildHandles(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE Handle, IN EFI_DISK_IO_PROTOCOL *DiskIo, IN EFI_DISK_IO2_PROTOCOL *DiskIo2, IN EFI_BLOCK_IO_PROTOCOL *BlockIo, IN EFI_BLOCK_IO2_PROTOCOL *BlockIo2, IN EFI_DEVICE_PATH_PROTOCOL *DevicePath)
EFI_STATUS PartitionInstallMbrChildHandles(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE Handle, IN EFI_DISK_IO_PROTOCOL *DiskIo, IN EFI_DISK_IO2_PROTOCOL *DiskIo2, IN EFI_BLOCK_IO_PROTOCOL *BlockIo, IN EFI_BLOCK_IO2_PROTOCOL *BlockIo2, IN EFI_DEVICE_PATH_PROTOCOL *DevicePath)
OC_TYPING_BUFFER_ENTRY Buffer[OC_TYPING_BUFFER_SIZE]
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gPartitionComponentName
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gPartitionComponentName2
EFI_STATUS EFIAPI PartitionWriteBlocks(IN EFI_BLOCK_IO_PROTOCOL *This, IN UINT32 MediaId, IN EFI_LBA Lba, IN UINTN BufferSize, IN VOID *Buffer)
EFI_STATUS EFIAPI PartitionResetEx(IN EFI_BLOCK_IO2_PROTOCOL *This, IN BOOLEAN ExtendedVerification)
EFI_STATUS EFIAPI PartitionWriteBlocksEx(IN EFI_BLOCK_IO2_PROTOCOL *This, IN UINT32 MediaId, IN EFI_LBA Lba, IN OUT EFI_BLOCK_IO2_TOKEN *Token, IN UINTN BufferSize, IN VOID *Buffer)
EFI_STATUS EFIAPI PartitionFlushBlocksEx(IN EFI_BLOCK_IO2_PROTOCOL *This, IN OUT EFI_BLOCK_IO2_TOKEN *Token)
EFI_STATUS EFIAPI PartitionDriverBindingStop(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN UINTN NumberOfChildren, IN EFI_HANDLE *ChildHandleBuffer)
EFI_STATUS EFIAPI InitializePartition(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)
VOID EFIAPI PartitionOnAccessComplete(IN EFI_EVENT Event, IN VOID *Context)
EFI_DRIVER_BINDING_PROTOCOL gPartitionDriverBinding
EFI_STATUS EFIAPI PartitionDriverBindingSupported(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath)
EFI_STATUS EFIAPI PartitionReadBlocksEx(IN EFI_BLOCK_IO2_PROTOCOL *This, IN UINT32 MediaId, IN EFI_LBA Lba, IN OUT EFI_BLOCK_IO2_TOKEN *Token, IN UINTN BufferSize, OUT VOID *Buffer)
BOOLEAN HasChildren(IN EFI_HANDLE ControllerHandle)
EFI_STATUS EFIAPI PartitionDriverBindingStart(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath)
EFI_STATUS ProbeMediaStatusEx(IN EFI_DISK_IO2_PROTOCOL *DiskIo2, IN UINT32 MediaId, IN EFI_STATUS DefaultStatus)
EFI_STATUS EFIAPI PartitionFlushBlocks(IN EFI_BLOCK_IO_PROTOCOL *This)
EFI_STATUS PartitionInstallChildHandle(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE ParentHandle, IN EFI_DISK_IO_PROTOCOL *ParentDiskIo, IN EFI_DISK_IO2_PROTOCOL *ParentDiskIo2, IN EFI_BLOCK_IO_PROTOCOL *ParentBlockIo, IN EFI_BLOCK_IO2_PROTOCOL *ParentBlockIo2, IN EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath, IN EFI_DEVICE_PATH_PROTOCOL *DevicePathNode, IN EFI_PARTITION_INFO_PROTOCOL *PartitionInfo, IN APPLE_PARTITION_INFO_PROTOCOL *ApplePartitionInfo, IN EFI_LBA Start, IN EFI_LBA End, IN UINT32 BlockSize, IN EFI_GUID *TypeGuid)
EFI_STATUS EFIAPI PartitionReset(IN EFI_BLOCK_IO_PROTOCOL *This, IN BOOLEAN ExtendedVerification)
PARTITION_DETECT_ROUTINE mPartitionDetectRoutineTable[]
PARTITION_ACCESS_TASK * PartitionCreateAccessTask(IN EFI_BLOCK_IO2_TOKEN *Token)
EFI_STATUS EFIAPI PartitionReadBlocks(IN EFI_BLOCK_IO_PROTOCOL *This, IN UINT32 MediaId, IN EFI_LBA Lba, IN UINTN BufferSize, OUT VOID *Buffer)
EFI_STATUS ProbeMediaStatus(IN EFI_DISK_IO_PROTOCOL *DiskIo, IN UINT32 MediaId, IN EFI_STATUS DefaultStatus)
#define PARTITION_PRIVATE_DATA_SIGNATURE
#define PARTITION_DEVICE_FROM_BLOCK_IO_THIS(a)
#define PARTITION_DEVICE_FROM_BLOCK_IO2_THIS(a)
EFI_STATUS(* PARTITION_DETECT_ROUTINE)(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE Handle, IN EFI_DISK_IO_PROTOCOL *DiskIo, IN EFI_DISK_IO2_PROTOCOL *DiskIo2, IN EFI_BLOCK_IO_PROTOCOL *BlockIo, IN EFI_BLOCK_IO2_PROTOCOL *BlockIo2, IN EFI_DEVICE_PATH_PROTOCOL *DevicePath)
EFI_STATUS PartitionInstallUdfChildHandles(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE Handle, IN EFI_DISK_IO_PROTOCOL *DiskIo, IN EFI_DISK_IO2_PROTOCOL *DiskIo2, IN EFI_BLOCK_IO_PROTOCOL *BlockIo, IN EFI_BLOCK_IO2_PROTOCOL *BlockIo2, IN EFI_DEVICE_PATH_PROTOCOL *DevicePath)
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
GUID *EFIAPI CopyGuid(OUT GUID *DestinationGuid, IN CONST GUID *SourceGuid)
VOID *EFIAPI ZeroMem(OUT VOID *Buffer, IN UINTN Length)
BOOLEAN EFIAPI IsZeroGuid(IN CONST GUID *Guid)
EFI_GUID gEfiDiskIo2ProtocolGuid
EFI_GUID gEfiBlockIoProtocolGuid
EFI_GUID gEfiDiskIoProtocolGuid
EFI_GUID gEfiDevicePathProtocolGuid
UINT64 EFIAPI MultU64x32(IN UINT64 Multiplicand, IN UINT32 Multiplier)
#define DivU64x32(x, y, z)
EFI_BLOCK_IO2_TOKEN * BlockIo2Token
EFI_DISK_IO2_TOKEN DiskIo2Token
EFI_BLOCK_IO_MEDIA Media2
APPLE_PARTITION_INFO_PROTOCOL ApplePartitionInfo
EFI_BLOCK_IO_PROTOCOL * ParentBlockIo
EFI_BLOCK_IO_PROTOCOL BlockIo
EFI_DISK_IO2_PROTOCOL * DiskIo2
EFI_DISK_IO_PROTOCOL * DiskIo
EFI_PARTITION_INFO_PROTOCOL PartitionInfo
EFI_DEVICE_PATH_PROTOCOL * DevicePath
EFI_BLOCK_IO2_PROTOCOL BlockIo2
EFI_BLOCK_IO2_PROTOCOL * ParentBlockIo2