From f866ab77f8fd0790f4d6628f54dcdf0bd66fccb6 Mon Sep 17 00:00:00 2001
From: Sean Hall <r.sean.hall@gmail.com>
Date: Fri, 10 Jul 2020 21:25:44 +1000
Subject: Change the DetectSHA2Support element to WindowsFeatureSearch. This
 will make it easier to add support for other Windows features in the future.

---
 src/be/detectsha2support.cpp |  8 ++++----
 src/be/detectsha2support.h   |  2 +-
 src/be/utilsearch.cpp        | 33 ++++++++++++++++++++++++++++-----
 src/be/utilsearch.h          | 15 ++++++++++++++-
 4 files changed, 47 insertions(+), 11 deletions(-)

(limited to 'src/be')

diff --git a/src/be/detectsha2support.cpp b/src/be/detectsha2support.cpp
index f1f3637e..90e349cd 100644
--- a/src/be/detectsha2support.cpp
+++ b/src/be/detectsha2support.cpp
@@ -3,7 +3,7 @@
 #include "precomp.h"
 
 // https://gist.github.com/navossoc/7572c7d82243e9f818989e2765e7793a
-HRESULT DetectSHA2Support(
+HRESULT DetectSHA2CodeSigning(
     __out BOOL* pfSupported
     )
 {
@@ -38,7 +38,7 @@ LExit:
     return hr;
 }
 
-HRESULT UtilPerformDetectSHA2Support(
+HRESULT UtilPerformDetectSHA2CodeSigning(
     __in LPCWSTR wzVariable,
     __in UTIL_SEARCH* /*pSearch*/,
     __in IBundleExtensionEngine* pEngine
@@ -47,8 +47,8 @@ HRESULT UtilPerformDetectSHA2Support(
     HRESULT hr = S_OK;
     BOOL fSupported = FALSE;
 
-    hr = DetectSHA2Support(&fSupported);
-    ExitOnFailure(hr, "DetectSHA2Support failed.");
+    hr = DetectSHA2CodeSigning(&fSupported);
+    ExitOnFailure(hr, "DetectSHA2CodeSigning failed.");
 
     hr = pEngine->SetVariableNumeric(wzVariable, fSupported ? 1 : 0);
     ExitOnFailure(hr, "Failed to set variable '%ls'", wzVariable);
diff --git a/src/be/detectsha2support.h b/src/be/detectsha2support.h
index 7f1f6031..c38a3d59 100644
--- a/src/be/detectsha2support.h
+++ b/src/be/detectsha2support.h
@@ -1,7 +1,7 @@
 #pragma once
 // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
 
-HRESULT UtilPerformDetectSHA2Support(
+HRESULT UtilPerformDetectSHA2CodeSigning(
     __in LPCWSTR wzVariable,
     __in UTIL_SEARCH* pSearch,
     __in IBundleExtensionEngine* pEngine
diff --git a/src/be/utilsearch.cpp b/src/be/utilsearch.cpp
index 4e9d86a1..7cd2ea09 100644
--- a/src/be/utilsearch.cpp
+++ b/src/be/utilsearch.cpp
@@ -13,9 +13,10 @@ STDMETHODIMP UtilSearchParseFromXml(
     IXMLDOMNode* pixnNode = NULL;
     DWORD cNodes = 0;
     BSTR bstrNodeName = NULL;
+    LPWSTR scz = NULL;
 
     // Select Util search nodes.
-    hr = XmlSelectNodes(pixnBundleExtension, L"WixDetectSHA2Support", &pixnNodes);
+    hr = XmlSelectNodes(pixnBundleExtension, L"WixWindowsFeatureSearch", &pixnNodes);
     ExitOnFailure(hr, "Failed to select Util search nodes.");
 
     // Get Util search node count.
@@ -46,9 +47,23 @@ STDMETHODIMP UtilSearchParseFromXml(
         ExitOnFailure(hr, "Failed to get @Id.");
 
         // Read type specific attributes.
-        if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, bstrNodeName, -1, L"WixDetectSHA2Support", -1))
+        if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, bstrNodeName, -1, L"WixWindowsFeatureSearch", -1))
         {
-            pSearch->Type = UTIL_SEARCH_TYPE_DETECT_SHA2_SUPPORT;
+            pSearch->Type = UTIL_SEARCH_TYPE_WINDOWS_FEATURE_SEARCH;
+
+            // @Type
+            hr = XmlGetAttributeEx(pixnNode, L"Type", &scz);
+            ExitOnFailure(hr, "Failed to get @Type.");
+
+            if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, scz, -1, L"sha2CodeSigning", -1))
+            {
+                pSearch->WindowsFeatureSearch.type = UTIL_WINDOWS_FEATURE_SEARCH_TYPE_SHA2_CODE_SIGNING;
+            }
+            else
+            {
+                hr = E_INVALIDARG;
+                ExitOnFailure(hr, "Invalid value for @Type: %ls", scz);
+            }
         }
         else
         {
@@ -62,6 +77,7 @@ STDMETHODIMP UtilSearchParseFromXml(
     }
 
 LExit:
+    ReleaseStr(scz);
     ReleaseBSTR(bstrNodeName);
     ReleaseObject(pixnNode);
     ReleaseObject(pixnNodes);
@@ -100,8 +116,15 @@ STDMETHODIMP UtilSearchExecute(
 
     switch (pSearch->Type)
     {
-    case UTIL_SEARCH_TYPE_DETECT_SHA2_SUPPORT:
-        hr = UtilPerformDetectSHA2Support(wzVariable, pSearch, pEngine);
+    case UTIL_SEARCH_TYPE_WINDOWS_FEATURE_SEARCH:
+        switch (pSearch->WindowsFeatureSearch.type)
+        {
+        case UTIL_WINDOWS_FEATURE_SEARCH_TYPE_SHA2_CODE_SIGNING:
+            hr = UtilPerformDetectSHA2CodeSigning(wzVariable, pSearch, pEngine);
+            break;
+        default:
+            hr = E_UNEXPECTED;
+        }
         break;
     default:
         hr = E_UNEXPECTED;
diff --git a/src/be/utilsearch.h b/src/be/utilsearch.h
index 1e0ca96d..deeab1f7 100644
--- a/src/be/utilsearch.h
+++ b/src/be/utilsearch.h
@@ -7,7 +7,13 @@
 enum UTIL_SEARCH_TYPE
 {
     UTIL_SEARCH_TYPE_NONE,
-    UTIL_SEARCH_TYPE_DETECT_SHA2_SUPPORT,
+    UTIL_SEARCH_TYPE_WINDOWS_FEATURE_SEARCH,
+};
+
+enum UTIL_WINDOWS_FEATURE_SEARCH_TYPE
+{
+    UTIL_WINDOWS_FEATURE_SEARCH_TYPE_NONE,
+    UTIL_WINDOWS_FEATURE_SEARCH_TYPE_SHA2_CODE_SIGNING,
 };
 
 
@@ -18,6 +24,13 @@ typedef struct _UTIL_SEARCH
     LPWSTR sczId;
 
     UTIL_SEARCH_TYPE Type;
+    union
+    {
+        struct
+        {
+            UTIL_WINDOWS_FEATURE_SEARCH_TYPE type;
+        } WindowsFeatureSearch;
+    };
 } UTIL_SEARCH;
 
 typedef struct _UTIL_SEARCHES
-- 
cgit v1.2.3-55-g6feb