/**@file\r
\r
-Copyright (c) 2006 - 2007, Intel Corporation\r
-All rights reserved. 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
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+Copyright (c) 2006 - 2009, Intel Corporation. All rights reserved.<BR>\r
+(C) Copyright 2018 Hewlett Packard Enterprise Development LP<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
Module Name:\r
\r
// Table to map NT Environment variable to the GUID that should be in\r
// device path.\r
//\r
-static NT_PCD_ENTRY mPcdEnvironment[] = {\r
+NT_PCD_ENTRY mPcdEnvironment[] = {\r
PcdToken(PcdWinNtConsole), &gEfiWinNtConsoleGuid,\r
PcdToken(PcdWinNtGop), &gEfiWinNtGopGuid,\r
PcdToken(PcdWinNtSerialPort), &gEfiWinNtSerialPortGuid,\r
// it is a legal Device Path Node for this bus driver's children.\r
//\r
if (RemainingDevicePath != NULL) {\r
- if (RemainingDevicePath->Type != HARDWARE_DEVICE_PATH ||\r
- RemainingDevicePath->SubType != HW_VENDOR_DP ||\r
- DevicePathNodeLength(RemainingDevicePath) != sizeof(WIN_NT_VENDOR_DEVICE_PATH_NODE)) {\r
- return EFI_UNSUPPORTED;\r
- }\r
-\r
- for (Index = 0; Index < NT_PCD_ARRAY_SIZE; Index++) {\r
- if (CompareGuid (&((VENDOR_DEVICE_PATH *) RemainingDevicePath)->Guid, mPcdEnvironment[Index].DevicePathGuid)) {\r
- break;\r
+ //\r
+ // Check if RemainingDevicePath is the End of Device Path Node, \r
+ // if yes, go on checking other conditions\r
+ //\r
+ if (!IsDevicePathEnd (RemainingDevicePath)) {\r
+ //\r
+ // If RemainingDevicePath isn't the End of Device Path Node,\r
+ // check its validation\r
+ //\r
+ if (RemainingDevicePath->Type != HARDWARE_DEVICE_PATH ||\r
+ RemainingDevicePath->SubType != HW_VENDOR_DP ||\r
+ DevicePathNodeLength(RemainingDevicePath) != sizeof(WIN_NT_VENDOR_DEVICE_PATH_NODE)) {\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+ \r
+ for (Index = 0; Index < NT_PCD_ARRAY_SIZE; Index++) {\r
+ if (CompareGuid (&((VENDOR_DEVICE_PATH *) RemainingDevicePath)->Guid, mPcdEnvironment[Index].DevicePathGuid)) {\r
+ break;\r
+ }\r
+ }\r
+ \r
+ if (Index >= NT_PCD_ARRAY_SIZE) {\r
+ return EFI_UNSUPPORTED;\r
}\r
- }\r
-\r
- if (Index >= NT_PCD_ARRAY_SIZE) {\r
- return EFI_UNSUPPORTED;\r
}\r
}\r
\r
//\r
Status = gBS->OpenProtocol (\r
ControllerHandle,\r
- &gEfiDevicePathProtocolGuid,\r
- &ParentDevicePath,\r
+ &gEfiWinNtThunkProtocolGuid,\r
+ (VOID **) &WinNtThunk,\r
This->DriverBindingHandle,\r
ControllerHandle,\r
EFI_OPEN_PROTOCOL_BY_DRIVER\r
return Status;\r
}\r
\r
+ //\r
+ // Close the I/O Abstraction(s) used to perform the supported test\r
+ //\r
gBS->CloseProtocol (\r
ControllerHandle,\r
- &gEfiDevicePathProtocolGuid,\r
+ &gEfiWinNtThunkProtocolGuid,\r
This->DriverBindingHandle,\r
ControllerHandle\r
);\r
\r
+ //\r
+ // Open the EFI Device Path protocol needed to perform the supported test\r
+ //\r
Status = gBS->OpenProtocol (\r
ControllerHandle,\r
- &gEfiWinNtThunkProtocolGuid,\r
- &WinNtThunk,\r
+ &gEfiDevicePathProtocolGuid,\r
+ (VOID **) &ParentDevicePath,\r
This->DriverBindingHandle,\r
ControllerHandle,\r
EFI_OPEN_PROTOCOL_BY_DRIVER\r
}\r
\r
//\r
- // Close the I/O Abstraction(s) used to perform the supported test\r
+ // Close protocol, don't use device path protocol in the Support() function\r
//\r
gBS->CloseProtocol (\r
ControllerHandle,\r
- &gEfiWinNtThunkProtocolGuid,\r
+ &gEfiDevicePathProtocolGuid,\r
This->DriverBindingHandle,\r
ControllerHandle\r
);\r
// TODO: EFI_SUCCESS - add return value to function comment\r
{\r
EFI_STATUS Status;\r
- EFI_STATUS InstallStatus;\r
EFI_WIN_NT_THUNK_PROTOCOL *WinNtThunk;\r
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;\r
WIN_NT_BUS_DEVICE *WinNtBusDevice;\r
Status = gBS->OpenProtocol (\r
ControllerHandle,\r
&gEfiDevicePathProtocolGuid,\r
- &ParentDevicePath,\r
+ (VOID **) &ParentDevicePath,\r
This->DriverBindingHandle,\r
ControllerHandle,\r
EFI_OPEN_PROTOCOL_BY_DRIVER\r
Status = gBS->OpenProtocol (\r
ControllerHandle,\r
&gEfiWinNtThunkProtocolGuid,\r
- &WinNtThunk,\r
+ (VOID **) &WinNtThunk,\r
This->DriverBindingHandle,\r
ControllerHandle,\r
EFI_OPEN_PROTOCOL_BY_DRIVER\r
// Loop on the Variable list. Parse each variable to produce a set of handles that\r
// represent virtual hardware devices.\r
//\r
- InstallStatus = EFI_NOT_FOUND;\r
for (Index = 0; Index < NT_PCD_ARRAY_SIZE; Index++) {\r
PcdTempStr = (VOID *)LibPcdGetPtr (mPcdEnvironment[Index].Token);\r
ASSERT (PcdTempStr != NULL);\r
\r
TempStrSize = StrLen (PcdTempStr);\r
- TempStr = AllocateMemory ((TempStrSize * sizeof (CHAR16)) + 1);\r
+ TempStr = AllocateMemory (((TempStrSize + 1) * sizeof (CHAR16)));\r
StrCpy (TempStr, PcdTempStr);\r
\r
StartString = TempStr;\r
CreateDevice = TRUE;\r
if (RemainingDevicePath != NULL) {\r
CreateDevice = FALSE;\r
- Node = (WIN_NT_VENDOR_DEVICE_PATH_NODE *) RemainingDevicePath;\r
- if (Node->VendorDevicePath.Header.Type == HARDWARE_DEVICE_PATH &&\r
- Node->VendorDevicePath.Header.SubType == HW_VENDOR_DP &&\r
- DevicePathNodeLength (&Node->VendorDevicePath.Header) == sizeof (WIN_NT_VENDOR_DEVICE_PATH_NODE)\r
- ) {\r
- if (CompareGuid (&Node->VendorDevicePath.Guid, mPcdEnvironment[Index].DevicePathGuid) &&\r
- Node->Instance == Count\r
+ //\r
+ // Check if RemainingDevicePath is the End of Device Path Node, \r
+ // if yes, don't create any child device \r
+ //\r
+ if (!IsDevicePathEnd (RemainingDevicePath)) {\r
+ //\r
+ // If RemainingDevicePath isn't the End of Device Path Node,\r
+ // check its validation\r
+ //\r
+ Node = (WIN_NT_VENDOR_DEVICE_PATH_NODE *) RemainingDevicePath;\r
+ if (Node->VendorDevicePath.Header.Type == HARDWARE_DEVICE_PATH &&\r
+ Node->VendorDevicePath.Header.SubType == HW_VENDOR_DP &&\r
+ DevicePathNodeLength (&Node->VendorDevicePath.Header) == sizeof (WIN_NT_VENDOR_DEVICE_PATH_NODE)\r
) {\r
- CreateDevice = TRUE;\r
+ if (CompareGuid (&Node->VendorDevicePath.Guid, mPcdEnvironment[Index].DevicePathGuid) &&\r
+ Node->Instance == Count\r
+ ) {\r
+ CreateDevice = TRUE;\r
+ }\r
}\r
}\r
}\r
Status = gBS->OpenProtocol (\r
ControllerHandle,\r
&gEfiWinNtThunkProtocolGuid,\r
- &WinNtThunk,\r
+ (VOID **) &WinNtThunk,\r
This->DriverBindingHandle,\r
WinNtDevice->Handle,\r
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER\r
);\r
- if (!EFI_ERROR (Status)) {\r
- InstallStatus = EFI_SUCCESS;\r
- }\r
}\r
}\r
\r
Status = gBS->OpenProtocol (\r
ControllerHandle,\r
&gWinNtBusDriverGuid,\r
- &WinNtBusDevice,\r
+ (VOID **) &WinNtBusDevice,\r
This->DriverBindingHandle,\r
ControllerHandle,\r
EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
Status = gBS->OpenProtocol (\r
ChildHandleBuffer[Index],\r
&gEfiWinNtIoProtocolGuid,\r
- &WinNtIo,\r
+ (VOID **) &WinNtIo,\r
This->DriverBindingHandle,\r
ControllerHandle,\r
EFI_OPEN_PROTOCOL_GET_PROTOCOL\r