//! Driver Binding Protocol
//!
//! Provides the services required to determine if a driver supports a given controller. If
//! a controller is supported, then it also provides routines to start and stop the controller.

pub const PROTOCOL_GUID: crate::base::Guid = crate::base::Guid::from_fields(
    0x18a031ab,
    0xb443,
    0x4d1a,
    0xa5,
    0xc0,
    &[0x0c, 0x09, 0x26, 0x1e, 0x9f, 0x71],
);

pub type ProtocolSupported = unsafe extern "efiapi" fn(
    *mut Protocol,
    crate::base::Handle,
    *mut crate::protocols::device_path::Protocol,
) -> crate::base::Status;

pub type ProtocolStart = unsafe extern "efiapi" fn(
    *mut Protocol,
    crate::base::Handle,
    *mut crate::protocols::device_path::Protocol,
) -> crate::base::Status;

pub type ProtocolStop = unsafe extern "efiapi" fn(
    *mut Protocol,
    crate::base::Handle,
    usize,
    *mut crate::base::Handle,
) -> crate::base::Status;

#[repr(C)]
pub struct Protocol {
    pub supported: ProtocolSupported,
    pub start: ProtocolStart,
    pub stop: ProtocolStop,
    pub version: u32,
    pub image_handle: crate::base::Handle,
    pub driver_binding_handle: crate::base::Handle,
}
