consplitter.c
来自「Next BIOS Source code : Extensible Firmw」· C语言 代码 · 共 2,473 行 · 第 1/5 页
C
2,473 行
IN EFI_HANDLE ControllerHandle,
IN EFI_GUID *Guid
)
/*++
Routine Description:
Generic Supported Check
Arguments:
(Standard DriverBinding Protocol Supported() function)
Returns:
None
--*/
{
EFI_STATUS Status;
VOID *Instance;
//
// Make sure the Console Splitter does not attempt to attach to itself
//
if (ControllerHandle == mConIn.VirtualHandle) {
return EFI_UNSUPPORTED;
}
if (ControllerHandle == mConOut.VirtualHandle) {
return EFI_UNSUPPORTED;
}
if (ControllerHandle == mStdErr.VirtualHandle) {
return EFI_UNSUPPORTED;
}
//
// Check to see whether the handle has the ConsoleInDevice GUID on it
//
Status = gBS->OpenProtocol (
ControllerHandle,
Guid,
&Instance,
This->DriverBindingHandle,
ControllerHandle,
EFI_OPEN_PROTOCOL_BY_DRIVER
);
if ( EFI_ERROR (Status) ) {
return Status;
}
gBS->CloseProtocol (
ControllerHandle,
Guid,
This->DriverBindingHandle,
ControllerHandle
);
return EFI_SUCCESS;
}
STATIC
EFI_STATUS
EFIAPI
ConSplitterConInDriverBindingSupported (
IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle,
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
)
/*++
Routine Description:
Console In Supported Check
Arguments:
(Standard DriverBinding Protocol Supported() function)
Returns:
None
--*/
{
return ConSplitterSupported (
This,
ControllerHandle,
&gEfiConsoleInDeviceGuid
);
}
STATIC
EFI_STATUS
EFIAPI
ConSplitterSimplePointerDriverBindingSupported (
IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle,
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
)
/*++
Routine Description:
Standard Error Supported Check
Arguments:
(Standard DriverBinding Protocol Supported() function)
Returns:
None
--*/
{
return ConSplitterSupported (
This,
ControllerHandle,
&gEfiSimplePointerProtocolGuid
);
}
STATIC
EFI_STATUS
EFIAPI
ConSplitterConOutDriverBindingSupported (
IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle,
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
)
/*++
Routine Description:
Console Out Supported Check
Arguments:
(Standard DriverBinding Protocol Supported() function)
Returns:
None
--*/
{
return ConSplitterSupported (
This,
ControllerHandle,
&gEfiConsoleOutDeviceGuid
);
}
STATIC
EFI_STATUS
EFIAPI
ConSplitterStdErrDriverBindingSupported (
IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle,
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
)
/*++
Routine Description:
Standard Error Supported Check
Arguments:
(Standard DriverBinding Protocol Supported() function)
Returns:
None
--*/
{
return ConSplitterSupported (
This,
ControllerHandle,
&gEfiStandardErrorDeviceGuid
);
}
STATIC
EFI_STATUS
EFIAPI
ConSplitterStart (
IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle,
IN EFI_HANDLE ConSplitterVirtualHandle,
IN EFI_GUID *DeviceGuid,
IN EFI_GUID *InterfaceGuid,
IN VOID **Interface
)
/*++
Routine Description:
Start ConSplitter on ControllerHandle, and create the virtual
agrogated console device on first call Start for a SimpleTextIn handle.
Arguments:
(Standard DriverBinding Protocol Start() function)
Returns:
EFI_ERROR if a SimpleTextIn protocol is not started.
--*/
{
EFI_STATUS Status;
VOID *Instance;
//
// Check to see whether the handle has the ConsoleInDevice GUID on it
//
Status = gBS->OpenProtocol (
ControllerHandle,
DeviceGuid,
&Instance,
This->DriverBindingHandle,
ControllerHandle,
EFI_OPEN_PROTOCOL_BY_DRIVER
);
if (EFI_ERROR (Status)) {
return Status;
}
Status = gBS->OpenProtocol (
ControllerHandle,
DeviceGuid,
&Instance,
This->DriverBindingHandle,
ConSplitterVirtualHandle,
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
);
if (EFI_ERROR (Status)) {
return Status;
}
return gBS->OpenProtocol (
ControllerHandle,
InterfaceGuid,
Interface,
This->DriverBindingHandle,
ConSplitterVirtualHandle,
EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
}
STATIC
EFI_STATUS
EFIAPI
ConSplitterConInDriverBindingStart (
IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle,
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
)
/*++
Routine Description:
Start ConSplitter on ControllerHandle, and create the virtual
agrogated console device on first call Start for a SimpleTextIn handle.
Arguments:
(Standard DriverBinding Protocol Start() function)
Returns:
EFI_ERROR if a SimpleTextIn protocol is not started.
--*/
{
EFI_STATUS Status;
EFI_SIMPLE_TEXT_IN_PROTOCOL *TextIn;
//
// Start ConSplitter on ControllerHandle, and create the virtual
// agrogated console device on first call Start for a SimpleTextIn handle.
//
Status = ConSplitterStart (
This,
ControllerHandle,
mConIn.VirtualHandle,
&gEfiConsoleInDeviceGuid,
&gEfiSimpleTextInProtocolGuid,
(VOID **)&TextIn
);
if (EFI_ERROR (Status)) {
return Status;
}
return ConSplitterTextInAddDevice (&mConIn, TextIn);
}
STATIC
EFI_STATUS
EFIAPI
ConSplitterSimplePointerDriverBindingStart (
IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle,
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
)
/*++
Routine Description:
Start ConSplitter on ControllerHandle, and create the virtual
agrogated console device on first call Start for a SimpleTextIn handle.
Arguments:
(Standard DriverBinding Protocol Start() function)
Returns:
EFI_ERROR if a SimpleTextIn protocol is not started.
--*/
{
EFI_STATUS Status;
EFI_SIMPLE_POINTER_PROTOCOL *SimplePointer;
Status = ConSplitterStart (
This,
ControllerHandle,
mConIn.VirtualHandle,
&gEfiSimplePointerProtocolGuid,
&gEfiSimplePointerProtocolGuid,
(VOID **)&SimplePointer
);
if (EFI_ERROR (Status)) {
return Status;
}
return ConSplitterSimplePointerAddDevice (&mConIn, SimplePointer);
}
STATIC
EFI_STATUS
EFIAPI
ConSplitterConOutDriverBindingStart (
IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle,
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
)
/*++
Routine Description:
Start ConSplitter on ControllerHandle, and create the virtual
agrogated console device on first call Start for a SimpleTextIn handle.
Arguments:
(Standard DriverBinding Protocol Start() function)
Returns:
EFI_ERROR if a SimpleTextIn protocol is not started.
--*/
{
EFI_STATUS Status;
EFI_SIMPLE_TEXT_OUT_PROTOCOL *TextOut;
EFI_UGA_DRAW_PROTOCOL *UgaDraw;
Status = ConSplitterStart (
This,
ControllerHandle,
mConOut.VirtualHandle,
&gEfiConsoleOutDeviceGuid,
&gEfiSimpleTextOutProtocolGuid,
(VOID **)&TextOut
);
if (EFI_ERROR (Status)) {
return Status;
}
//
// Open UGA_DRAW protocol
//
Status = gBS->OpenProtocol (
ControllerHandle,
&gEfiUgaDrawProtocolGuid,
&UgaDraw,
This->DriverBindingHandle,
mConOut.VirtualHandle,
EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
if (EFI_ERROR (Status)) {
UgaDraw = NULL;
}
//
// If both ConOut and StdErr incorporate the same Text Out device,
// their MaxMode and QueryData should be the intersection of both.
//
return ConSplitterTextOutAddDevice (&mConOut, TextOut, UgaDraw);
}
STATIC
EFI_STATUS
EFIAPI
ConSplitterStdErrDriverBindingStart (
IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle,
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
)
/*++
Routine Description:
Start ConSplitter on ControllerHandle, and create the virtual
agrogated console device on first call Start for a SimpleTextIn handle.
Arguments:
(Standard DriverBinding Protocol Start() function)
Returns:
EFI_ERROR if a SimpleTextIn protocol is not started.
--*/
{
EFI_STATUS Status;
EFI_SIMPLE_TEXT_OUT_PROTOCOL *TextOut;
Status = ConSplitterStart (
This,
ControllerHandle,
mStdErr.VirtualHandle,
&gEfiStandardErrorDeviceGuid,
&gEfiSimpleTextOutProtocolGuid,
(VOID **)&TextOut
);
if (EFI_ERROR (Status)) {
return Status;
}
//
// If both ConOut and StdErr incorporate the same Text Out device,
// their MaxMode and QueryData should be the intersection of both.
//
Status = ConSplitterTextOutAddDevice (&mStdErr, TextOut, NULL);
if (EFI_ERROR (Status)) {
return Status;
}
if (mStdErr.CurrentNumberOfConsoles == 1) {
gST->StandardErrorHandle = mStdErr.VirtualHandle;
gST->StdErr = &mStdErr.TextOut;
//
// Update the CRC32 in the EFI System Table header
//
gST->Hdr.CRC32 = 0;
gBS->CalculateCrc32 ((UINT8 *)&gST->Hdr,
gST->Hdr.HeaderSize,
&gST->Hdr.CRC32
);
}
return Status;
}
STATIC
EFI_STATUS
EFIAPI
ConSplitterStop (
IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle,
IN EFI_HANDLE ConSplitterVirtualHandle,
IN EFI_GUID *DeviceGuid,
IN EFI_GUID *InterfaceGuid,
IN VOID **Interface
)
/*++
Routine Description:
Arguments:
(Standard DriverBinding Protocol Stop() function)
Returns:
None
--*/
{
EFI_STATUS Status;
Status = gBS->OpenProtocol (
ControllerHandle,
InterfaceGuid,
Interface,
This->DriverBindingHandle,
ControllerHandle,
EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
if (EFI_ERROR (Status)) {
return Status;
}
//
// close the protocol refered.
//
gBS->CloseProtocol (
ControllerHandle,
DeviceGuid,
This->DriverBindingHandle,
ConSplitterVirtualHandle
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?