14UINTN mEfiLocateHandleRequest = 0;
56 Position->Position = Position->Position->ForwardLink;
63 if (Position->Position != &gHandleList) {
95 ProtNotify = Position->SearchKey;
100 if (ProtNotify !=
NULL) {
101 ASSERT (ProtNotify->Signature == PROTOCOL_NOTIFY_SIGNATURE);
102 Position->SearchKey =
NULL;
107 Link = ProtNotify->
Position->ForwardLink;
108 if (Link != &ProtNotify->Protocol->
Protocols) {
145 Link = Position->Position->ForwardLink;
146 Position->Position = Link;
151 if (Link == &Position->ProtEntry->Protocols) {
167 if (Handle->LocateRequest != mEfiLocateHandleRequest) {
168 Handle->LocateRequest = mEfiLocateHandleRequest;
196 IN VOID *Registration OPTIONAL,
205 if ((Interface ==
NULL) || (Protocol ==
NULL)) {
206 return EFI_INVALID_PARAMETER;
215 Position.Protocol = Protocol;
216 Position.SearchKey = Registration;
217 Position.Position = &gHandleList;
219 mEfiLocateHandleRequest += 1;
221 if (Registration ==
NULL) {
226 if (Position.ProtEntry ==
NULL) {
227 return EFI_NOT_FOUND;
230 Position.Position = &Position.ProtEntry->
Protocols;
237 if (Handle ==
NULL) {
238 Status = EFI_NOT_FOUND;
239 }
else if (Registration !=
NULL) {
244 ProtNotify = Registration;
274 IN VOID *SearchKey OPTIONAL,
282 CORE_GET_NEXT GetNext;
288 if (BufferSize ==
NULL) {
289 return EFI_INVALID_PARAMETER;
292 if ((*BufferSize > 0) && (Buffer ==
NULL)) {
293 return EFI_INVALID_PARAMETER;
301 Position.Protocol = Protocol;
302 Position.SearchKey = SearchKey;
303 Position.Position = &gHandleList;
306 ResultBuffer = (
IHANDLE **)Buffer;
312 switch (SearchType) {
322 if (SearchKey ==
NULL) {
323 Status = EFI_INVALID_PARAMETER;
330 if (Protocol ==
NULL) {
331 Status = EFI_INVALID_PARAMETER;
339 if (Position.ProtEntry ==
NULL) {
340 Status = EFI_NOT_FOUND;
344 Position.Position = &Position.ProtEntry->
Protocols;
348 Status = EFI_INVALID_PARAMETER;
352 if (EFI_ERROR (Status)) {
359 mEfiLocateHandleRequest += 1;
364 Handle = GetNext (&Position, &Interface);
365 if (
NULL == Handle) {
373 ResultSize +=
sizeof (Handle);
374 if (ResultSize <= *BufferSize) {
375 *ResultBuffer = Handle;
384 if (ResultSize == 0) {
385 Status = EFI_NOT_FOUND;
391 if (ResultSize > *BufferSize) {
392 Status = EFI_BUFFER_TOO_SMALL;
395 *BufferSize = ResultSize;
398 ASSERT (SearchKey !=
NULL);
403 ProtNotify = SearchKey;
438 IN VOID *SearchKey OPTIONAL,
446 if (NumberHandles ==
NULL) {
447 return EFI_INVALID_PARAMETER;
450 if (Buffer ==
NULL) {
451 return EFI_INVALID_PARAMETER;
470 if (EFI_ERROR (Status) && (Status != EFI_BUFFER_TOO_SMALL)) {
471 if (Status != EFI_INVALID_PARAMETER) {
472 Status = EFI_NOT_FOUND;
479 if (*Buffer ==
NULL) {
480 return EFI_OUT_OF_RESOURCES;
491 *NumberHandles = BufferSize /
sizeof (
EFI_HANDLE);
492 if (EFI_ERROR (Status)) {
PROTOCOL_ENTRY * SmmFindProtocolEntry(IN EFI_GUID *Protocol, IN BOOLEAN Create)
IHANDLE * SmmGetNextLocateByProtocol(IN OUT LOCATE_POSITION *Position, OUT VOID **Interface)
EFI_STATUS EFIAPI SmmLocateProtocol(IN EFI_GUID *Protocol, IN VOID *Registration OPTIONAL, OUT VOID **Interface)
IHANDLE * SmmGetNextLocateByRegisterNotify(IN OUT LOCATE_POSITION *Position, OUT VOID **Interface)
EFI_STATUS EFIAPI SmmLocateHandle(IN EFI_LOCATE_SEARCH_TYPE SearchType, IN EFI_GUID *Protocol OPTIONAL, IN VOID *SearchKey OPTIONAL, IN OUT UINTN *BufferSize, OUT EFI_HANDLE *Buffer)
EFI_STATUS EFIAPI SmmLocateHandleBuffer(IN EFI_LOCATE_SEARCH_TYPE SearchType, IN EFI_GUID *Protocol OPTIONAL, IN VOID *SearchKey OPTIONAL, IN OUT UINTN *NumberHandles, OUT EFI_HANDLE **Buffer)
IHANDLE * SmmGetNextLocateAllHandles(IN OUT LOCATE_POSITION *Position, OUT VOID **Interface)
#define CR(Record, TYPE, Field, TestSignature)
VOID *EFIAPI AllocatePool(IN UINTN AllocationSize)
LIST_ENTRY Protocols
All protocol interfaces.
IHANDLE * Handle
Back pointer.
VOID * Interface
The interface value.
LIST_ENTRY * Position
Last position notified.