2 * File to implement an full version of EFI_BOOT_SERVICES, to go beyond
3 * what GNU-EFI provides. Most of the data structures in this file are taken
4 * from the Tianocore UDK's UefiSpec.h file or HandleParsingLib.h files.
5 * The EFI_DEVICE_PATH_PROTOCOL definition is from
6 * http://wiki.phoenix.com/wiki/index.php/EFI_DEVICE_PATH_PROTOCOL.
7 * The UefiSpec.h and HandleParsingLib files include the following copyright
10 * Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
11 * This program and the accompanying materials are licensed and made available under
12 * the terms and conditions of the BSD License that accompanies this distribution.
13 * The full text of the license may be found at
14 * http://opensource.org/licenses/bsd-license.php.
16 * THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
22 #include <efi/efilib.h>
24 #ifndef _MY_BOOT_SERVICES_FILE
25 #define _MY_BOOT_SERVICES_FILE
27 typedef struct _EFI_DEVICE_PATH_PROTOCOL
{
31 } EFI_DEVICE_PATH_PROTOCOL
;
35 (EFIAPI
*EFI_CONNECT_CONTROLLER
)(
36 IN EFI_HANDLE ControllerHandle
,
37 IN EFI_HANDLE
*DriverImageHandle
, OPTIONAL
38 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
, OPTIONAL
44 (EFIAPI
*EFI_DISCONNECT_CONTROLLER
)(
45 IN EFI_HANDLE ControllerHandle
,
46 IN EFI_HANDLE DriverImageHandle
, OPTIONAL
47 IN EFI_HANDLE ChildHandle OPTIONAL
52 (EFIAPI
*EFI_OPEN_PROTOCOL
) (
54 IN EFI_GUID
* Protocol
,
56 IN EFI_HANDLE ImageHandle
,
57 IN EFI_HANDLE ControllerHandle
, OPTIONAL
63 (EFIAPI
*EFI_CLOSE_PROTOCOL
) (
65 IN EFI_GUID
* Protocol
,
66 IN EFI_HANDLE ImageHandle
,
67 IN EFI_HANDLE DeviceHandle
71 EFI_HANDLE AgentHandle
;
72 EFI_HANDLE ControllerHandle
;
75 } EFI_OPEN_PROTOCOL_INFORMATION_ENTRY
;
79 (EFIAPI
*EFI_OPEN_PROTOCOL_INFORMATION
) (
80 IN EFI_HANDLE UserHandle
,
81 IN EFI_GUID
* Protocol
,
82 IN EFI_OPEN_PROTOCOL_INFORMATION_ENTRY
**EntryBuffer
,
88 (EFIAPI
*EFI_PROTOCOLS_PER_HANDLE
) (
89 IN EFI_HANDLE UserHandle
,
90 OUT EFI_GUID
***ProtocolBuffer
,
91 OUT UINTN
*ProtocolBufferCount
96 (EFIAPI
*EFI_LOCATE_HANDLE_BUFFER
) (
97 IN EFI_LOCATE_SEARCH_TYPE SearchType
,
98 IN EFI_GUID
* Protocol OPTIONAL
,
99 IN VOID
*SearchKey OPTIONAL
,
100 IN OUT UINTN
*NumberHandles
,
101 OUT EFI_HANDLE
**Buffer
106 (EFIAPI
*EFI_LOCATE_PROTOCOL
) (
108 VOID
*Registration
, OPTIONAL
113 /// EFI Boot Services Table.
115 typedef struct _MY_BOOT_SERVICES
{
117 /// The table header for the EFI Boot Services Table.
119 EFI_TABLE_HEADER Hdr
;
122 // Task Priority Services
124 EFI_RAISE_TPL RaiseTPL
;
125 EFI_RESTORE_TPL RestoreTPL
;
130 EFI_ALLOCATE_PAGES AllocatePages
;
131 EFI_FREE_PAGES FreePages
;
132 EFI_GET_MEMORY_MAP GetMemoryMap
;
133 EFI_ALLOCATE_POOL AllocatePool
;
134 EFI_FREE_POOL FreePool
;
137 // Event & Timer Services
139 EFI_CREATE_EVENT CreateEvent
;
140 EFI_SET_TIMER SetTimer
;
141 EFI_WAIT_FOR_EVENT WaitForEvent
;
142 EFI_SIGNAL_EVENT SignalEvent
;
143 EFI_CLOSE_EVENT CloseEvent
;
144 EFI_CHECK_EVENT CheckEvent
;
147 // Protocol Handler Services
149 EFI_INSTALL_PROTOCOL_INTERFACE InstallProtocolInterface
;
150 EFI_REINSTALL_PROTOCOL_INTERFACE ReinstallProtocolInterface
;
151 EFI_UNINSTALL_PROTOCOL_INTERFACE UninstallProtocolInterface
;
152 EFI_HANDLE_PROTOCOL HandleProtocol
;
154 EFI_REGISTER_PROTOCOL_NOTIFY RegisterProtocolNotify
;
155 EFI_LOCATE_HANDLE LocateHandle
;
156 EFI_LOCATE_DEVICE_PATH LocateDevicePath
;
157 EFI_INSTALL_CONFIGURATION_TABLE InstallConfigurationTable
;
162 EFI_IMAGE_LOAD LoadImage
;
163 EFI_IMAGE_START StartImage
;
165 EFI_IMAGE_UNLOAD UnloadImage
;
166 EFI_EXIT_BOOT_SERVICES ExitBootServices
;
169 // Miscellaneous Services
171 EFI_GET_NEXT_MONOTONIC_COUNT GetNextMonotonicCount
;
173 EFI_SET_WATCHDOG_TIMER SetWatchdogTimer
;
176 // DriverSupport Services
178 EFI_CONNECT_CONTROLLER ConnectController
;
179 EFI_DISCONNECT_CONTROLLER DisconnectController
;
182 // Open and Close Protocol Services
184 EFI_OPEN_PROTOCOL OpenProtocol
;
185 EFI_CLOSE_PROTOCOL CloseProtocol
;
186 EFI_OPEN_PROTOCOL_INFORMATION OpenProtocolInformation
;
191 EFI_PROTOCOLS_PER_HANDLE ProtocolsPerHandle
;
192 EFI_LOCATE_HANDLE_BUFFER LocateHandleBuffer
;
193 EFI_LOCATE_PROTOCOL LocateProtocol
;
194 // EFI_INSTALL_MULTIPLE_PROTOCOL_INTERFACES InstallMultipleProtocolInterfaces;
195 // EFI_UNINSTALL_MULTIPLE_PROTOCOL_INTERFACES UninstallMultipleProtocolInterfaces;
198 // // 32-bit CRC Services
200 // EFI_CALCULATE_CRC32 CalculateCrc32;
203 // // Miscellaneous Services
205 // EFI_COPY_MEM CopyMem;
206 // EFI_SET_MEM SetMem;
207 // EFI_CREATE_EVENT_EX CreateEventEx;
210 // Below is from http://git.etherboot.org/?p=mirror/efi/shell/.git;a=commitdiff;h=b1b0c63423cac54dc964c2930e04aebb46a946ec;
211 // Seems to have been replaced by ParseHandleDatabaseByRelationshipWithType(), but the latter isn't working for me....
213 LibScanHandleDatabase (
214 EFI_HANDLE DriverBindingHandle
, OPTIONAL
215 UINT32
*DriverBindingHandleIndex
, OPTIONAL
216 EFI_HANDLE ControllerHandle
, OPTIONAL
217 UINT32
*ControllerHandleIndex
, OPTIONAL
219 EFI_HANDLE
**HandleBuffer
,
223 extern MY_BOOT_SERVICES
*gBS
;
225 #define EFI_HANDLE_TYPE_UNKNOWN 0x000
226 #define EFI_HANDLE_TYPE_IMAGE_HANDLE 0x001
227 #define EFI_HANDLE_TYPE_DRIVER_BINDING_HANDLE 0x002
228 #define EFI_HANDLE_TYPE_DEVICE_DRIVER 0x004
229 #define EFI_HANDLE_TYPE_BUS_DRIVER 0x008
230 #define EFI_HANDLE_TYPE_DRIVER_CONFIGURATION_HANDLE 0x010
231 #define EFI_HANDLE_TYPE_DRIVER_DIAGNOSTICS_HANDLE 0x020
232 #define EFI_HANDLE_TYPE_COMPONENT_NAME_HANDLE 0x040
233 #define EFI_HANDLE_TYPE_DEVICE_HANDLE 0x080
234 #define EFI_HANDLE_TYPE_PARENT_HANDLE 0x100
235 #define EFI_HANDLE_TYPE_CONTROLLER_HANDLE 0x200
236 #define EFI_HANDLE_TYPE_CHILD_HANDLE 0x400
239 // Below from EfiApi.h
240 #define EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL 0x00000001
241 #define EFI_OPEN_PROTOCOL_GET_PROTOCOL 0x00000002
242 #define EFI_OPEN_PROTOCOL_TEST_PROTOCOL 0x00000004
243 #define EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER 0x00000008
244 #define EFI_OPEN_PROTOCOL_BY_DRIVER 0x00000010
245 #define EFI_OPEN_PROTOCOL_EXCLUSIVE 0x00000020