/** @file\r
Locate handle functions\r
\r
-Copyright (c) 2006 - 2008, Intel Corporation. <BR>\r
-All rights reserved. This program and the accompanying materials\r
+Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
are licensed and made available under the terms and conditions of the BSD License\r
which accompanies this distribution. The full text of the license may be found at\r
http://opensource.org/licenses/bsd-license.php\r
**/\r
\r
#include "DxeMain.h"\r
+#include "Handle.h"\r
\r
//\r
// ProtocolRequest - Last LocateHandle request ID\r
VOID *Interface;\r
\r
if (BufferSize == NULL) {\r
- Status = EFI_INVALID_PARAMETER;\r
+ return EFI_INVALID_PARAMETER;\r
}\r
\r
if ((*BufferSize > 0) && (Buffer == NULL)) {\r
return Status;\r
}\r
\r
+ ASSERT (GetNext != NULL);\r
//\r
// Enumerate out the matching handles\r
//\r
// If this is a search by register notify and a handle was\r
// returned, update the register notification position\r
//\r
+ ASSERT (SearchKey != NULL);\r
ProtNotify = SearchKey;\r
ProtNotify->Position = ProtNotify->Position->ForwardLink;\r
}\r
\r
*Device = NULL;\r
SourcePath = *DevicePath;\r
- SourceSize = GetDevicePathSize (SourcePath) - sizeof(EFI_DEVICE_PATH_PROTOCOL);\r
-\r
- //\r
- // The source path can only have 1 instance\r
- //\r
- if (IsDevicePathMultiInstance (SourcePath)) {\r
- DEBUG((DEBUG_ERROR, "LocateDevicePath: Device path has too many instances\n"));\r
- return EFI_INVALID_PARAMETER;\r
+ TmpDevicePath = SourcePath;\r
+ while (!IsDevicePathEnd (TmpDevicePath)) {\r
+ if (IsDevicePathEndInstance (TmpDevicePath)) {\r
+ //\r
+ // If DevicePath is a multi-instance device path,\r
+ // the function will operate on the first instance \r
+ //\r
+ break;\r
+ }\r
+ TmpDevicePath = NextDevicePathNode (TmpDevicePath);\r
}\r
\r
+ SourceSize = (UINTN) TmpDevicePath - (UINTN) SourcePath;\r
+\r
//\r
// Get a list of all handles that support the requested protocol\r
//\r
if ((Size <= SourceSize) && CompareMem (SourcePath, TmpDevicePath, Size) == 0) {\r
//\r
// If the size is equal to the best match, then we\r
- // have a duplice device path for 2 different device\r
+ // have a duplicate device path for 2 different device\r
// handles\r
//\r
ASSERT (Size != BestMatch);\r
\r
/**\r
Return the first Protocol Interface that matches the Protocol GUID. If\r
- Registration is pasased in return a Protocol Instance that was just add\r
- to the system. If Retistration is NULL return the first Protocol Interface\r
+ Registration is passed in, return a Protocol Instance that was just add\r
+ to the system. If Registration is NULL return the first Protocol Interface\r
you find.\r
\r
@param Protocol The protocol to search for\r