Skip to content

Commit

Permalink
Add NativeMachine to Burn and WIX_NATIVE_MACHINE to UtilExtension
Browse files Browse the repository at this point in the history
  • Loading branch information
ericstj committed Aug 28, 2021
1 parent 58abd69 commit 75699d8
Show file tree
Hide file tree
Showing 19 changed files with 138 additions and 12 deletions.
25 changes: 25 additions & 0 deletions src/burn/engine/variable.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,10 @@ static HRESULT InitializeVariableVersionNT(
__in DWORD_PTR dwpData,
__inout BURN_VARIANT* pValue
);
static HRESULT InitializeVariableNativeMachine(
__in DWORD_PTR dwpData,
__inout BURN_VARIANT* pValue
);
static HRESULT InitializeVariableOsInfo(
__in DWORD_PTR dwpData,
__inout BURN_VARIANT* pValue
Expand Down Expand Up @@ -218,6 +222,7 @@ extern "C" HRESULT VariableInitialize(
{L"LocalAppDataFolder", InitializeVariableCsidlFolder, CSIDL_LOCAL_APPDATA},
{VARIABLE_LOGONUSER, InitializeVariableLogonUser, 0},
{L"MyPicturesFolder", InitializeVariableCsidlFolder, CSIDL_MYPICTURES},
{L"NativeMachine", InitializeVariableNativeMachine, 0},
{L"NTProductType", InitializeVariableOsInfo, OS_INFO_VARIABLE_NTProductType},
{L"NTSuiteBackOffice", InitializeVariableOsInfo, OS_INFO_VARIABLE_NTSuiteBackOffice},
{L"NTSuiteDataCenter", InitializeVariableOsInfo, OS_INFO_VARIABLE_NTSuiteDataCenter},
Expand Down Expand Up @@ -1802,6 +1807,26 @@ static HRESULT InitializeVariableSystemInfo(
return hr;
}

static HRESULT InitializeVariableNativeMachine(
__in DWORD_PTR dwpData,
__inout BURN_VARIANT* pValue
)
{
UNREFERENCED_PARAMETER(dwpData);

HRESULT hr = S_OK;
USHORT usNativeMachine = IMAGE_FILE_MACHINE_UNKNOWN;

hr = ProcNativeMachine(::GetCurrentProcess(), &usNativeMachine);
ExitOnFailure(hr, "Failed to get native machine value.");

hr = BVariantSetNumeric(pValue, usNativeMachine);
ExitOnFailure(hr, "Failed to set variant value.");

LExit:
return hr;
}

static HRESULT InitializeVariableComputerName(
__in DWORD_PTR dwpData,
__inout BURN_VARIANT* pValue
Expand Down
1 change: 1 addition & 0 deletions src/chm/documents/bundle/bundle_built_in_variables.html.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ The Burn engine offers a set of commonly-used variables so you can use them with
* LocalAppDataFolder - gets the well-known folder for CSIDL\_LOCAL\_APPDATA.
* LogonUser - gets the current user name.
* MyPicturesFolder - gets the well-known folder for CSIDL\_MYPICTURES.
* NativeMachine - gets the [Image File Machine value](https://docs.microsoft.com/en-us/windows/win32/sysinfo/image-file-machine-constants) representing the native architecture of the machine. This property is only set on Windows 10, version 1511 (TH2) and higher.
* NTProductType - numeric product type from OS version information.
* NTSuiteBackOffice - non-zero if OS version suite is Back Office.
* NTSuiteDataCenter - non-zero if OS version suite is Datacenter.
Expand Down
16 changes: 15 additions & 1 deletion src/chm/documents/customactions/osinfo.html.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ after: using_standard_customactions
---
# OSInfo custom actions

The WixQueryOsInfo, WixQueryOsDirs, and WixQueryOsDriverInfo custom actions in wixca (part of WixUtilExtension) set properties over and above the MSI set for OS product/suite detection and standard directories. The WixQueryOsWellKnownSID custom action sets properties for the localized names of some built in Windows users and groups.
The WixQueryOsInfo, WixQueryOsDirs, WixQueryOsDriverInfo, and WixQueryNativeMachine custom actions in wixca (part of WixUtilExtension) set properties over and above the MSI set for OS product/suite detection, architecture, and standard directories. The WixQueryOsWellKnownSID custom action sets properties for the localized names of some built in Windows users and groups.

To use these custom actions you simply need to add a [<PropertyRef>](~/xsd/wix/propertyref.html) to the property you want to use and then include WixUtilExtensions when linking. For example:

Expand Down Expand Up @@ -549,3 +549,17 @@ WixUtilExtension will automatically schedule the custom actions as needed after
<td>Set to 1 if the target machine has composition enabled. This property is only set on machines running Windows Vista or higher.</td>
</tr>
</table>

<h2>WixQueryNativeMachine properties</h2>

<table>
<tr>
<td valign="top">
<p>WIX_NATIVE_MACHINE</p>
</td>

<td>
<p>Set to an [Image File Machine value](https://docs.microsoft.com/en-us/windows/win32/sysinfo/image-file-machine-constants) representing the native architecture of the machine. This property is only set on Windows 10, version 1511 (TH2) and higher.</p>
</td>
</tr>
</table>
5 changes: 5 additions & 0 deletions src/ext/UtilExtension/wixlib/UtilExtension.wxs
Original file line number Diff line number Diff line change
Expand Up @@ -277,6 +277,11 @@
<CustomActionRef Id="WixQueryOsDriverInfo" />
</Fragment>

<Fragment>
<Property Id="WIX_NATIVE_MACHINE" Secure="yes" />
<CustomActionRef Id="WixQueryNativeMachine" />
</Fragment>

<!-- ShellExec custom actions (for when only one is needed; multiple executions need their own IDs) -->
<Fragment>
<PropertyRef Id="WixShellExecBinaryId" />
Expand Down
12 changes: 12 additions & 0 deletions src/ext/UtilExtension/wixlib/UtilExtension_Platform.wxi
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,18 @@
<Custom Action="WixQueryOsDriverInfo$(var.Suffix)" After="AppSearch" Overridable="yes">VersionNT &gt; 400 OR (VersionNT = 400 AND ServicePackLevel &gt; 3)</Custom>
</InstallUISequence>
</Fragment>

<Fragment>
<CustomAction Id="WixQueryNativeMachine$(var.Suffix)" BinaryKey="WixCA$(var.Suffix)" DllEntry="WixQueryNativeMachine" Execute="firstSequence" Return="check" SuppressModularization="yes" />

<InstallExecuteSequence>
<Custom Action="WixQueryNativeMachine$(var.Suffix)" After="AppSearch" Overridable="yes">VersionNT &gt; 602</Custom>
</InstallExecuteSequence>

<InstallUISequence>
<Custom Action="WixQueryNativeMachine$(var.Suffix)" After="AppSearch" Overridable="yes">VersionNT &gt; 602</Custom>
</InstallUISequence>
</Fragment>

<Fragment>
<CustomAction Id="WixFailWhenDeferred$(var.Suffix)" BinaryKey="WixCA$(var.Suffix)" DllEntry="WixFailWhenDeferred" Execute="deferred" Return="check" SuppressModularization="yes" />
Expand Down
28 changes: 28 additions & 0 deletions src/ext/ca/wixca/dll/OsInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -487,3 +487,31 @@ extern "C" UINT __stdcall WixQueryOsDriverInfo(
}
return WcaFinalize(er);
}

/********************************************************************
WixQueryNativeMachine - entry point for WixQueryNativeMachine custom action
Called as Type 1 custom action (DLL from the Binary table) from
Windows Installer to set properties that indicates the native machine architecture
********************************************************************/
extern "C" UINT __stdcall WixQueryNativeMachine(
__in MSIHANDLE hInstall
)
{
HRESULT hr = S_OK;
USHORT usNativeMachine = IMAGE_FILE_MACHINE_UNKNOWN;
DWORD er = ERROR_SUCCESS;

hr = WcaInitialize(hInstall, "WixQueryNativeMachine");
ExitOnFailure(hr, "WixQueryNativeMachine failed to initialize");

hr = ::ProcNativeMachine(::GetCurrentProcess(), &usNativeMachine);
ExitOnFailure(hr, "Failed to get native machine value.");

WcaSetIntProperty(L"WIX_NATIVE_MACHINE", usNativeMachine);

LExit:
if (FAILED(hr))
er = ERROR_INSTALL_FAILURE;
return WcaFinalize(er);
}
1 change: 1 addition & 0 deletions src/ext/ca/wixca/dll/wixca.def
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ EXPORTS
WixQueryOsDirs
WixQueryOsWellKnownSID
WixQueryOsDriverInfo
WixQueryNativeMachine
; netshortcuts.cpp
WixSchedInternetShortcuts
WixCreateInternetShortcuts
Expand Down
4 changes: 4 additions & 0 deletions src/libs/dutil/inc/procutil.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,10 @@ HRESULT DAPI ProcWow64(
__in HANDLE hProcess,
__out BOOL* pfWow64
);
HRESULT DAPI ProcNativeMachine(
__in HANDLE hProcess,
__out USHORT* pusNativeMachine
);
HRESULT DAPI ProcDisableWowFileSystemRedirection(
__in PROC_FILESYSTEMREDIRECTION* pfsr
);
Expand Down
29 changes: 26 additions & 3 deletions src/libs/dutil/procutil.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -76,13 +76,13 @@ extern "C" HRESULT DAPI ProcWow64(

if (pfnIsWow64Process2)
{
USHORT pProcessMachine = IMAGE_FILE_MACHINE_UNKNOWN;
if (!pfnIsWow64Process2(hProcess, &pProcessMachine, nullptr))
USHORT usProcessMachine = IMAGE_FILE_MACHINE_UNKNOWN;
if (!pfnIsWow64Process2(hProcess, &usProcessMachine, NULL))
{
ExitWithLastError(hr, "Failed to check WOW64 process - IsWow64Process2.");
}

if (pProcessMachine != IMAGE_FILE_MACHINE_UNKNOWN)
if (usProcessMachine != IMAGE_FILE_MACHINE_UNKNOWN)
{
fIsWow64 = TRUE;
}
Expand All @@ -107,6 +107,29 @@ extern "C" HRESULT DAPI ProcWow64(
return hr;
}

extern "C" HRESULT DAPI ProcNativeMachine(
__in HANDLE hProcess,
__out USHORT* pusNativeMachine
)
{
HRESULT hr = S_OK;

typedef BOOL(WINAPI* LPFN_ISWOW64PROCESS2)(HANDLE, USHORT *, USHORT *);
LPFN_ISWOW64PROCESS2 pfnIsWow64Process2 = (LPFN_ISWOW64PROCESS2)::GetProcAddress(::GetModuleHandleW(L"kernel32"), "IsWow64Process2");

if (pfnIsWow64Process2)
{
USHORT usProcessMachineUnused = IMAGE_FILE_MACHINE_UNKNOWN;
if (!pfnIsWow64Process2(hProcess, &usProcessMachineUnused, pusNativeMachine))
{
ExitWithLastError(hr, "Failed to check WOW64 process - IsWow64Process2.");
}
}

LExit:
return hr;
}

extern "C" HRESULT DAPI ProcDisableWowFileSystemRedirection(
__in PROC_FILESYSTEMREDIRECTION* pfsr
)
Expand Down
1 change: 1 addition & 0 deletions src/tools/wix/CompilerCore.cs
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,7 @@ public sealed class CompilerCore : IMessageHandler
"LocalAppDataFolder",
"LogonUser",
"MyPicturesFolder",
"NativeMachine",
"NTProductType",
"NTSuiteBackOffice",
"NTSuiteDataCenter",
Expand Down
6 changes: 5 additions & 1 deletion test/data/Extensions/UtilExtension/PropertyTests/product.wxs
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,11 @@
<!-- Set to 1 if the video card driver on the target machine is a WDDM driver. This property is only set on machines running Windows Vista or higher.-->

<PropertyRef Id="WIX_DWM_COMPOSITION_ENABLED" />
<!-- Set to 1 if the target machine has composition enabled. This property is only set on machines running Windows Vista or higher."-->
<!-- Set to 1 if the target machine has composition enabled. This property is only set on machines running Windows Vista or higher.-->

<PropertyRef Id="WIX_NATIVE_MACHINE" />
<!-- Set to an Image File Machine value representing the native architecture of the machine. https://docs.microsoft.com/en-us/windows/win32/sysinfo/image-file-machine-constants
This property is only set on Windows 10, version 1511 (TH2) and higher.-->

<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder" Name="PFiles">
Expand Down
1 change: 1 addition & 0 deletions test/src/UnitTests/Burn/VariableTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -420,6 +420,7 @@ namespace Bootstrapper
Assert::Equal(E_INVALIDARG, hr);
Assert::False(EvaluateConditionHelper(&variables, L"VersionNT = \"VAL\""));

VariableGetNumericHelper(&variables, L"NativeMachine");
VariableGetNumericHelper(&variables, L"NTProductType");
VariableGetNumericHelper(&variables, L"NTSuiteBackOffice");
VariableGetNumericHelper(&variables, L"NTSuiteDataCenter");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,13 @@ public void Property_Install()
VerifyPropery(logFile, "WIX_ACCOUNT_USERS", UserVerifier.GetLocalUserNameFromSID(UserVerifier.SIDStrings.BUILTIN_USERS));
VerifyPropery(logFile, "WIX_ACCOUNT_GUESTS", UserVerifier.GetLocalUserNameFromSID(UserVerifier.SIDStrings.BUILTIN_GUESTS));

if (Environment.OSVersion.Version >= new Version(10, 0, 10586, 0))
{
Assert.True(
LogVerifier.MessageInLogFileRegex(logFile, "Property(S): WIX_NATIVE_MACHINE = [1-9]\\d*"),
String.Format("Property 'WIX_NATIVE_MACHINE' with with positive non-zero value was not found in the log file: '{0}'", logFile));
}

MSIExec.UninstallProduct(msiFile, MSIExec.MSIExecReturnCode.SUCCESS);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ public void ComponentSearchInvalidProductCode()
[Trait("Bug Link", "https://sourceforge.net/tracker/?func=detail&atid=642714&aid=2980329&group_id=105970")]
public void ComponentSearchPredefinedVariable()
{
string expectedErrorMessage = @"The util:ComponentSearch/@Variable attribute's value, 'ProgramFilesFolder', is one of the illegal options: 'AdminToolsFolder', 'AppDataFolder', 'CommonAppDataFolder', 'CommonFilesFolder', 'CompatibilityMode', 'DesktopFolder', 'FavoritesFolder', 'FontsFolder', 'LocalAppDataFolder', 'MyPicturesFolder', 'NTProductType', 'NTSuiteBackOffice', 'NTSuiteDataCenter', 'NTSuiteEnterprise', 'NTSuitePersonal', 'NTSuiteSmallBusiness', 'NTSuiteSmallBusinessRestricted', 'NTSuiteWebServer', 'PersonalFolder', 'Privileged', 'ProgramFilesFolder', 'ProgramMenuFolder', 'SendToFolder', 'StartMenuFolder', 'StartupFolder', 'SystemFolder', 'TempFolder', 'TemplateFolder', 'VersionMsi', 'VersionNT', 'VersionNT64', 'WindowsFolder', or 'WindowsVolume'.";
string expectedErrorMessage = @"The util:ComponentSearch/@Variable attribute's value, 'ProgramFilesFolder', is one of the illegal options: 'AdminToolsFolder', 'AppDataFolder', 'CommonAppDataFolder', 'CommonFilesFolder', 'CompatibilityMode', 'DesktopFolder', 'FavoritesFolder', 'FontsFolder', 'LocalAppDataFolder', 'MyPicturesFolder', 'NativeMachine', 'NTProductType', 'NTSuiteBackOffice', 'NTSuiteDataCenter', 'NTSuiteEnterprise', 'NTSuitePersonal', 'NTSuiteSmallBusiness', 'NTSuiteSmallBusinessRestricted', 'NTSuiteWebServer', 'PersonalFolder', 'Privileged', 'ProgramFilesFolder', 'ProgramMenuFolder', 'SendToFolder', 'StartMenuFolder', 'StartupFolder', 'SystemFolder', 'TempFolder', 'TemplateFolder', 'VersionMsi', 'VersionNT', 'VersionNT64', 'WindowsFolder', or 'WindowsVolume'.";

Candle candle = new Candle();
candle.SourceFiles.Add(Path.Combine(ComponentSearchTests.TestDataDirectory, @"ComponentSearchPredefinedVariable\Product.wxs"));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ public void DirectorySearchInvalidPath()
[Trait("Bug Link", "https://sourceforge.net/tracker/?func=detail&atid=642714&aid=2980329&group_id=105970")]
public void DirectorySearchPredefinedVariable()
{
string expectedErrorMessage = @"The util:DirectorySearch/@Variable attribute's value, 'AdminToolsFolder', is one of the illegal options: 'AdminToolsFolder', 'AppDataFolder', 'CommonAppDataFolder', 'CommonFilesFolder', 'CompatibilityMode', 'DesktopFolder', 'FavoritesFolder', 'FontsFolder', 'LocalAppDataFolder', 'MyPicturesFolder', 'NTProductType', 'NTSuiteBackOffice', 'NTSuiteDataCenter', 'NTSuiteEnterprise', 'NTSuitePersonal', 'NTSuiteSmallBusiness', 'NTSuiteSmallBusinessRestricted', 'NTSuiteWebServer', 'PersonalFolder', 'Privileged', 'ProgramFilesFolder', 'ProgramMenuFolder', 'SendToFolder', 'StartMenuFolder', 'StartupFolder', 'SystemFolder', 'TempFolder', 'TemplateFolder', 'VersionMsi', 'VersionNT', 'VersionNT64', 'WindowsFolder', or 'WindowsVolume'.";
string expectedErrorMessage = @"The util:DirectorySearch/@Variable attribute's value, 'AdminToolsFolder', is one of the illegal options: 'AdminToolsFolder', 'AppDataFolder', 'CommonAppDataFolder', 'CommonFilesFolder', 'CompatibilityMode', 'DesktopFolder', 'FavoritesFolder', 'FontsFolder', 'LocalAppDataFolder', 'MyPicturesFolder', 'NativeMachine', 'NTProductType', 'NTSuiteBackOffice', 'NTSuiteDataCenter', 'NTSuiteEnterprise', 'NTSuitePersonal', 'NTSuiteSmallBusiness', 'NTSuiteSmallBusinessRestricted', 'NTSuiteWebServer', 'PersonalFolder', 'Privileged', 'ProgramFilesFolder', 'ProgramMenuFolder', 'SendToFolder', 'StartMenuFolder', 'StartupFolder', 'SystemFolder', 'TempFolder', 'TemplateFolder', 'VersionMsi', 'VersionNT', 'VersionNT64', 'WindowsFolder', or 'WindowsVolume'.";

Candle candle = new Candle();
candle.SourceFiles.Add(Path.Combine(DirectorySearchTests.TestDataDirectory, @"DirectorySearchPredefinedVariable\Product.wxs"));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ public void FileSearchInvalidPath()
[Trait("Bug Link", "https://sourceforge.net/tracker/?func=detail&atid=642714&aid=2980329&group_id=105970")]
public void FileSearchPredefinedVariable()
{
string expectedErrorMessage = @"The util:FileSearch/@Variable attribute's value, 'AdminToolsFolder', is one of the illegal options: 'AdminToolsFolder', 'AppDataFolder', 'CommonAppDataFolder', 'CommonFilesFolder', 'CompatibilityMode', 'DesktopFolder', 'FavoritesFolder', 'FontsFolder', 'LocalAppDataFolder', 'MyPicturesFolder', 'NTProductType', 'NTSuiteBackOffice', 'NTSuiteDataCenter', 'NTSuiteEnterprise', 'NTSuitePersonal', 'NTSuiteSmallBusiness', 'NTSuiteSmallBusinessRestricted', 'NTSuiteWebServer', 'PersonalFolder', 'Privileged', 'ProgramFilesFolder', 'ProgramMenuFolder', 'SendToFolder', 'StartMenuFolder', 'StartupFolder', 'SystemFolder', 'TempFolder', 'TemplateFolder', 'VersionMsi', 'VersionNT', 'VersionNT64', 'WindowsFolder', or 'WindowsVolume'.";
string expectedErrorMessage = @"The util:FileSearch/@Variable attribute's value, 'AdminToolsFolder', is one of the illegal options: 'AdminToolsFolder', 'AppDataFolder', 'CommonAppDataFolder', 'CommonFilesFolder', 'CompatibilityMode', 'DesktopFolder', 'FavoritesFolder', 'FontsFolder', 'LocalAppDataFolder', 'MyPicturesFolder', 'NativeMachine', 'NTProductType', 'NTSuiteBackOffice', 'NTSuiteDataCenter', 'NTSuiteEnterprise', 'NTSuitePersonal', 'NTSuiteSmallBusiness', 'NTSuiteSmallBusinessRestricted', 'NTSuiteWebServer', 'PersonalFolder', 'Privileged', 'ProgramFilesFolder', 'ProgramMenuFolder', 'SendToFolder', 'StartMenuFolder', 'StartupFolder', 'SystemFolder', 'TempFolder', 'TemplateFolder', 'VersionMsi', 'VersionNT', 'VersionNT64', 'WindowsFolder', or 'WindowsVolume'.";

Candle candle = new Candle();
candle.SourceFiles.Add(Path.Combine(FileSearchTests.TestDataDirectory, @"FileSearchPredefinedVariable\Product.wxs"));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ public void ProductSearchInvalidGuid()
[Trait("Bug Link", "https://sourceforge.net/tracker/?func=detail&atid=642714&aid=2980329&group_id=105970")]
public void ProductSearchPredefinedVariable()
{
string expectedErrorMessage = @"The util:ProductSearch/@Variable attribute's value, 'ProgramFilesFolder', is one of the illegal options: 'AdminToolsFolder', 'AppDataFolder', 'CommonAppDataFolder', 'CommonFilesFolder', 'CompatibilityMode', 'DesktopFolder', 'FavoritesFolder', 'FontsFolder', 'LocalAppDataFolder', 'MyPicturesFolder', 'NTProductType', 'NTSuiteBackOffice', 'NTSuiteDataCenter', 'NTSuiteEnterprise', 'NTSuitePersonal', 'NTSuiteSmallBusiness', 'NTSuiteSmallBusinessRestricted', 'NTSuiteWebServer', 'PersonalFolder', 'Privileged', 'ProgramFilesFolder', 'ProgramMenuFolder', 'SendToFolder', 'StartMenuFolder', 'StartupFolder', 'SystemFolder', 'TempFolder', 'TemplateFolder', 'VersionMsi', 'VersionNT', 'VersionNT64', 'WindowsFolder', or 'WindowsVolume'.";
string expectedErrorMessage = @"The util:ProductSearch/@Variable attribute's value, 'ProgramFilesFolder', is one of the illegal options: 'AdminToolsFolder', 'AppDataFolder', 'CommonAppDataFolder', 'CommonFilesFolder', 'CompatibilityMode', 'DesktopFolder', 'FavoritesFolder', 'FontsFolder', 'LocalAppDataFolder', 'MyPicturesFolder', 'NativeMachine', 'NTProductType', 'NTSuiteBackOffice', 'NTSuiteDataCenter', 'NTSuiteEnterprise', 'NTSuitePersonal', 'NTSuiteSmallBusiness', 'NTSuiteSmallBusinessRestricted', 'NTSuiteWebServer', 'PersonalFolder', 'Privileged', 'ProgramFilesFolder', 'ProgramMenuFolder', 'SendToFolder', 'StartMenuFolder', 'StartupFolder', 'SystemFolder', 'TempFolder', 'TemplateFolder', 'VersionMsi', 'VersionNT', 'VersionNT64', 'WindowsFolder', or 'WindowsVolume'.";

Candle candle = new Candle();
candle.SourceFiles.Add(Path.Combine(ProductSearchTests.TestDataDirectory, @"ProductSearchPredefinedVariable\Product.wxs"));
Expand Down
Loading

0 comments on commit 75699d8

Please sign in to comment.