diff --git a/rEFIt_UEFI/Platform/BdsConnect.h b/rEFIt_UEFI/Platform/BdsConnect.h
new file mode 100644
index 000000000..ca0cf8cf8
--- /dev/null
+++ b/rEFIt_UEFI/Platform/BdsConnect.h
@@ -0,0 +1,126 @@
+/** @file
+ BDS Lib functions which relate with connect the device
+
+Copyright (c) 2004 - 2008, Intel Corporation. All rights reserved.
+This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution. The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#ifndef PLATFORM_BDSCONNECT_H_
+#define PLATFORM_BDSCONNECT_H_
+
+
+#include // Only use angled for Platform, else, xcode project won't compile
+//#include "../include/Handle.h"
+//#include "../Platform/Settings.h"
+
+
+/**
+ This function will create all handles associate with every device
+ path node. If the handle associate with one device path node can not
+ be created success, then still give one chance to do the dispatch,
+ which load the missing drivers if possible.
+
+ @param DevicePathToConnect The device path which will be connected, it can be
+ a multi-instance device path
+
+ @retval EFI_SUCCESS All handles associate with every device path node
+ have been created
+ @retval EFI_OUT_OF_RESOURCES There is no resource to create new handles
+ @retval EFI_NOT_FOUND Create the handle associate with one device path
+ node failed
+
+**/
+EFI_STATUS
+EFIAPI
+BdsLibConnectDevicePath (
+ IN EFI_DEVICE_PATH_PROTOCOL *DevicePathToConnect
+ );
+
+/**
+ This function will connect all current system handles recursively.
+
+ gBS->ConnectController() service is invoked for each handle exist in system handler buffer.
+ If the handle is bus type handler, all childrens also will be connected recursively
+ by gBS->ConnectController().
+
+ @retval EFI_SUCCESS All handles and it's child handle have been connected
+ @retval EFI_STATUS Error status returned by of gBS->LocateHandleBuffer().
+
+**/
+EFI_STATUS
+EFIAPI
+BdsLibConnectAllEfi (
+ void
+ );
+
+/**
+ This function will disconnect all current system handles.
+
+ gBS->DisconnectController() is invoked for each handle exists in system handle buffer.
+ If handle is a bus type handle, all childrens also are disconnected recursively by
+ gBS->DisconnectController().
+
+ @retval EFI_SUCCESS All handles have been disconnected
+ @retval EFI_STATUS Error status returned by of gBS->LocateHandleBuffer().
+
+**/
+EFI_STATUS
+EFIAPI
+BdsLibDisconnectAllEfi (
+ void
+ );
+
+EFI_STATUS ScanDeviceHandles(EFI_HANDLE ControllerHandle,
+ UINTN *HandleCount,
+ EFI_HANDLE **HandleBuffer,
+ UINT32 **HandleType);
+
+
+
+EFI_STATUS BdsLibConnectMostlyAllEfi();
+
+
+/**
+ Connects all drivers to all controllers.
+ This function make sure all the current system driver will manage
+ the corresponding controllers if have. And at the same time, make
+ sure all the system controllers have driver to manage it if have.
+
+**/
+void
+EFIAPI
+BdsLibConnectAllDriversToAllControllers (
+ void
+ );
+
+
+/**
+ Connect the specific Usb device which match the short form device path,
+ and whose bus is determined by Host Controller (Uhci or Ehci).
+
+ @param HostControllerPI Uhci (0x00) or Ehci (0x20) or Both uhci and ehci
+ (0xFF)
+ @param RemainingDevicePath a short-form device path that starts with the first
+ element being a USB WWID or a USB Class device
+ path
+
+ @return EFI_INVALID_PARAMETER RemainingDevicePath is NULL pointer.
+ RemainingDevicePath is not a USB device path.
+ Invalid HostControllerPI type.
+ @return EFI_SUCCESS Success to connect USB device
+ @return EFI_NOT_FOUND Fail to find handle for USB controller to connect.
+
+**/
+EFI_STATUS
+EFIAPI
+BdsLibConnectUsbDevByShortFormDP(
+ IN UINT8 HostControllerPI,
+ IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
+ );
diff --git a/rEFIt_UEFI/entry_scan/entry_scan.h b/rEFIt_UEFI/entry_scan/entry_scan.h
index 4c04e14ef..4d9aa0f5d 100644
--- a/rEFIt_UEFI/entry_scan/entry_scan.h
+++ b/rEFIt_UEFI/entry_scan/entry_scan.h
@@ -111,7 +111,7 @@ void *GetSignatureDatabase(const wchar_t* DatabaseName,
const EFI_GUID& DatabaseGuid,
OUT UINTN * DatabaseSize);
EFI_STATUS SetSignatureDatabase(const wchar_t* DatabaseName,
- const EFI_GUID& DatabaseGuid,
+ const GUID& DatabaseGuid,
IN void * Database,
IN UINTN DatabaseSize);
diff --git a/rEFIt_UEFI/entry_scan/secureboot.cpp b/rEFIt_UEFI/entry_scan/secureboot.cpp
index b7cd2d6ab..5a7c1d315 100644
--- a/rEFIt_UEFI/entry_scan/secureboot.cpp
+++ b/rEFIt_UEFI/entry_scan/secureboot.cpp
@@ -222,7 +222,7 @@ STATIC XBool EFIAPI
PrecheckSecureBootPolicy(IN OUT EFI_STATUS *AuthenticationStatus,
IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath)
{
- CHAR16 *DevicePathStr;
+ XStringW DevicePathStr;
UINTN Index;
if ((AuthenticationStatus == NULL) || (DevicePath == NULL)) {
return false;
@@ -235,13 +235,13 @@ PrecheckSecureBootPolicy(IN OUT EFI_STATUS *AuthenticationSt
case SECURE_BOOT_POLICY_WHITELIST:
// Check the white list for this image
- DevicePathStr = FileDevicePathToStr((EFI_DEVICE_PATH_PROTOCOL *)DevicePath);
- if (DevicePathStr == NULL) {
+ DevicePathStr = FileDevicePathToXStringW((EFI_DEVICE_PATH_PROTOCOL *)DevicePath);
+ if ( DevicePathStr.isEmpty() ) {
return false;
}
for (Index = 0; Index < gSettings.Boot.SecureBootWhiteList.size(); ++Index) {
- if ((gSettings.Boot.SecureBootWhiteList[Index].notEmpty()) &&
- (StriStr(DevicePathStr, gSettings.Boot.SecureBootWhiteList[Index].wc_str()) != NULL)) {
+ if ( gSettings.Boot.SecureBootWhiteList[Index].notEmpty() &&
+ DevicePathStr.contains(gSettings.Boot.SecureBootWhiteList[Index]) ) {
// White listed
*AuthenticationStatus = EFI_SUCCESS;
return true;
@@ -251,13 +251,13 @@ PrecheckSecureBootPolicy(IN OUT EFI_STATUS *AuthenticationSt
case SECURE_BOOT_POLICY_BLACKLIST:
// Check the black list for this image
- DevicePathStr = FileDevicePathToStr((EFI_DEVICE_PATH_PROTOCOL *)DevicePath);
- if (DevicePathStr == NULL) {
+ DevicePathStr = FileDevicePathToXStringW((EFI_DEVICE_PATH_PROTOCOL *)DevicePath);
+ if ( DevicePathStr.isEmpty() ) {
return false;
}
for (Index = 0; Index < gSettings.Boot.SecureBootBlackList.size(); ++Index) {
- if ((gSettings.Boot.SecureBootBlackList[Index].notEmpty()) &&
- (StriStr(DevicePathStr, gSettings.Boot.SecureBootBlackList[Index].wc_str()) != NULL)) {
+ if ( gSettings.Boot.SecureBootBlackList[Index].notEmpty() &&
+ DevicePathStr.contains(gSettings.Boot.SecureBootBlackList[Index]) ) {
// Black listed
return true;
}
@@ -266,22 +266,22 @@ PrecheckSecureBootPolicy(IN OUT EFI_STATUS *AuthenticationSt
return true;
case SECURE_BOOT_POLICY_USER:
- DevicePathStr = FileDevicePathToStr((EFI_DEVICE_PATH_PROTOCOL *)DevicePath);
- if (DevicePathStr == NULL) {
+ DevicePathStr = FileDevicePathToXStringW((EFI_DEVICE_PATH_PROTOCOL *)DevicePath);
+ if ( DevicePathStr.isEmpty() ) {
return false;
}
// Check the black list for this image
for (Index = 0; Index < gSettings.Boot.SecureBootBlackList.size(); ++Index) {
- if ((gSettings.Boot.SecureBootBlackList[Index].notEmpty()) &&
- (StriStr(DevicePathStr, gSettings.Boot.SecureBootBlackList[Index].wc_str()) != NULL)) {
+ if ( gSettings.Boot.SecureBootBlackList[Index].notEmpty() &&
+ DevicePathStr.contains(gSettings.Boot.SecureBootBlackList[Index]) ) {
// Black listed
return true;
}
}
// Check the white list for this image
for (Index = 0; Index < gSettings.Boot.SecureBootWhiteList.size(); ++Index) {
- if ((gSettings.Boot.SecureBootWhiteList[Index].notEmpty()) &&
- (StriStr(DevicePathStr, gSettings.Boot.SecureBootWhiteList[Index].wc_str()) != NULL)) {
+ if ( gSettings.Boot.SecureBootWhiteList[Index].notEmpty() &&
+ DevicePathStr.contains(gSettings.Boot.SecureBootWhiteList[Index]) ) {
// White listed
*AuthenticationStatus = EFI_SUCCESS;
return true;
@@ -360,10 +360,9 @@ InternalFileAuthentication(IN CONST EFI_SECURITY_ARCH_PROTOCOL *This,
}
}
if (EFI_ERROR(Status)) {
- CHAR16 *DevicePathStr = FileDevicePathToStr((EFI_DEVICE_PATH_PROTOCOL *)DevicePath);
- if (DevicePathStr) {
- DBG("VerifySecureBootImage(1): %s %ls\n", efiStrError(Status), DevicePathStr);
- FreePool(DevicePathStr);
+ XStringW DevicePathStr = FileDevicePathToXStringW((EFI_DEVICE_PATH_PROTOCOL *)DevicePath);
+ if ( DevicePathStr.notEmpty() ) {
+ DBG("VerifySecureBootImage(1): %s %ls\n", efiStrError(Status), DevicePathStr.wc_str());
}
}
return Status;
@@ -387,10 +386,9 @@ Internal2FileAuthentication(IN CONST EFI_SECURITY2_ARCH_PROTOCOL *This,
}
}
if (EFI_ERROR(Status)) {
- CHAR16 *DevicePathStr = FileDevicePathToStr((EFI_DEVICE_PATH_PROTOCOL *)DevicePath);
- if (DevicePathStr) {
- DBG("VerifySecureBootImage(2): %s %ls\n", efiStrError(Status), DevicePathStr);
- FreePool(DevicePathStr);
+ XStringW DevicePathStr = FileDevicePathToXStringW((EFI_DEVICE_PATH_PROTOCOL *)DevicePath);
+ if ( DevicePathStr.notEmpty() ) {
+ DBG("VerifySecureBootImage(2): %s %ls\n", efiStrError(Status), DevicePathStr.wc_str());
}
}
return Status;
@@ -406,10 +404,9 @@ EFI_STATUS VerifySecureBootImage(IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath)
}
}
if (EFI_ERROR(Status)) {
- CHAR16 *DevicePathStr = FileDevicePathToStr((EFI_DEVICE_PATH_PROTOCOL *)DevicePath);
- if (DevicePathStr) {
- DBG("VerifySecureBootImage: %s %ls\n", efiStrError(Status), DevicePathStr);
- FreePool(DevicePathStr);
+ XStringW DevicePathStr = FileDevicePathToXStringW((EFI_DEVICE_PATH_PROTOCOL *)DevicePath);
+ if ( DevicePathStr.notEmpty() ) {
+ DBG("VerifySecureBootImage: %s %ls\n", efiStrError(Status), DevicePathStr.wc_str());
}
}
return Status;
diff --git a/rEFIt_UEFI/entry_scan/securemenu.cpp b/rEFIt_UEFI/entry_scan/securemenu.cpp
index 5d68968b1..f74578c45 100644
--- a/rEFIt_UEFI/entry_scan/securemenu.cpp
+++ b/rEFIt_UEFI/entry_scan/securemenu.cpp
@@ -165,7 +165,7 @@ STATIC void *FindImageSignatureDatabase(IN CONST EFI_DEVICE_PATH_PROTOCOL *Devi
{
EFI_IMAGE_EXECUTION_INFO_TABLE *ImageExeInfoTable = NULL;
EFI_IMAGE_EXECUTION_INFO *ImageExeInfo;
- CHAR16 *FDP;
+ XStringW FDP;
UINT8 *Ptr;
UINTN Index;
// Check parameters
@@ -182,8 +182,8 @@ STATIC void *FindImageSignatureDatabase(IN CONST EFI_DEVICE_PATH_PROTOCOL *Devi
return NULL;
}
// Get device path string
- FDP = FileDevicePathToStr((EFI_DEVICE_PATH_PROTOCOL *)DevicePath);
- if (FDP == NULL) {
+ FDP = FileDevicePathToXStringW((EFI_DEVICE_PATH_PROTOCOL *)DevicePath);
+ if ( FDP.isEmpty() ) {
return NULL;
}
// Get the execution information
@@ -205,20 +205,16 @@ STATIC void *FindImageSignatureDatabase(IN CONST EFI_DEVICE_PATH_PROTOCOL *Devi
Offset += sizeof(CHAR16);
} while (*Name++);
// Compare the device paths
- Name = FileDevicePathToStr((EFI_DEVICE_PATH_PROTOCOL *)Offset);
- if (Name) {
- if (StrCmp(FDP, Name) == 0) {
+ XStringW Name2 = FileDevicePathToXStringW((EFI_DEVICE_PATH_PROTOCOL *)Offset);
+ if (Name2.notEmpty()) {
+ if ( FDP == Name2 ) {
// Get the signature list and size
Offset += GetDevicePathSize((EFI_DEVICE_PATH_PROTOCOL *)Offset);
*DatabaseSize = (ImageExeInfo->InfoSize - (Offset - Ptr));
- FreePool(Name);
- FreePool(FDP);
return Offset;
}
- FreePool(Name);
}
}
- FreePool(FDP);
// Not found
return NULL;
}
@@ -279,17 +275,16 @@ EFI_STATUS AppendImageToAuthorizedDatabase(IN CONST EFI_DEVICE_PATH_PROTOCOL *De
}
}
if (ErrorString.notEmpty()) {
- CHAR16 *DevicePathStr = FileDevicePathToStr((EFI_DEVICE_PATH_PROTOCOL *)DevicePath);
- if (DevicePathStr != NULL) {
+ XStringW DevicePathStr = FileDevicePathToXStringW((EFI_DEVICE_PATH_PROTOCOL *)DevicePath);
+ if (DevicePathStr.notEmpty()) {
XStringW FileDevicePathStr = FileDevicePathFileToXStringW((EFI_DEVICE_PATH_PROTOCOL *)DevicePath);
if (FileDevicePathStr.notEmpty()) {
- XStringW Str = SWPrintf("%ls\n%ls\n%ls", ErrorString.wc_str(), DevicePathStr, FileDevicePathStr.wc_str());
+ XStringW Str = SWPrintf("%ls\n%ls\n%ls", ErrorString.wc_str(), DevicePathStr.wc_str(), FileDevicePathStr.wc_str());
AlertMessage(L"Insert Image Authentication"_XSW, Str);
} else {
- XStringW Str = SWPrintf("%ls\n%ls", ErrorString.wc_str(), DevicePathStr);
+ XStringW Str = SWPrintf("%ls\n%ls", ErrorString.wc_str(), DevicePathStr.wc_str());
AlertMessage(L"Insert Image Authentication"_XSW, Str);
}
- FreePool(DevicePathStr);
} else {
AlertMessage(L"Insert Image Authentication"_XSW, ErrorString);
}
@@ -353,17 +348,16 @@ EFI_STATUS RemoveImageFromAuthorizedDatabase(IN CONST EFI_DEVICE_PATH_PROTOCOL *
}
}
if (ErrorString.notEmpty()) {
- CHAR16 *DevicePathStr = FileDevicePathToStr((EFI_DEVICE_PATH_PROTOCOL *)DevicePath);
- if (DevicePathStr != NULL) {
+ XStringW DevicePathStr = FileDevicePathToXStringW((EFI_DEVICE_PATH_PROTOCOL *)DevicePath);
+ if (DevicePathStr.notEmpty()) {
XStringW FileDevicePathStr = FileDevicePathFileToXStringW((EFI_DEVICE_PATH_PROTOCOL *)DevicePath);
if (FileDevicePathStr.notEmpty()) {
- XStringW Str = SWPrintf("%ls\n%ls\n%ls", ErrorString.wc_str(), DevicePathStr, FileDevicePathStr.wc_str());
+ XStringW Str = SWPrintf("%ls\n%ls\n%ls", ErrorString.wc_str(), DevicePathStr.wc_str(), FileDevicePathStr.wc_str());
AlertMessage(L"Remove Image Authentication"_XSW, Str);
} else {
- XStringW Str = SWPrintf("%ls\n%ls", ErrorString.wc_str(), DevicePathStr);
+ XStringW Str = SWPrintf("%ls\n%ls", ErrorString.wc_str(), DevicePathStr.wc_str());
AlertMessage(L"Remove Image Authentication"_XSW, Str);
}
- FreePool(DevicePathStr);
} else {
AlertMessage(L"Remove Image Authentication"_XSW, ErrorString);
}
diff --git a/rEFIt_UEFI/entry_scan/securevars.cpp b/rEFIt_UEFI/entry_scan/securevars.cpp
index 8c0f152e4..1488d179d 100644
--- a/rEFIt_UEFI/entry_scan/securevars.cpp
+++ b/rEFIt_UEFI/entry_scan/securevars.cpp
@@ -372,7 +372,7 @@ STATIC EFI_STATUS GetUTCTime(OUT EFI_TIME *Timestamp)
}
// Write signed variable
-EFI_STATUS SetSignedVariable(IN CHAR16 *DatabaseName,
+EFI_STATUS SetSignedVariable(const wchar_t* DatabaseName,
const EFI_GUID& DatabaseGuid,
IN UINT32 Attributes,
IN void *Database,
@@ -501,7 +501,7 @@ EFI_STATUS SetSignedVariable(IN CHAR16 *DatabaseName,
}
// Write signature database
-EFI_STATUS SetSignatureDatabase(IN CHAR16 *DatabaseName,
+EFI_STATUS SetSignatureDatabase(const wchar_t* DatabaseName,
const EFI_GUID& DatabaseGuid,
IN void *Database,
IN UINTN DatabaseSize)