1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
// 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.
#include "precomp.h"
static void CALLBACK BurnTraceError(
__in_z LPCSTR szFile,
__in int iLine,
__in REPORT_LEVEL rl,
__in UINT source,
__in HRESULT hrError,
__in_z __format_string LPCSTR szFormat,
__in va_list args
);
int WINAPI wWinMain(
__in HINSTANCE hInstance,
__in_opt HINSTANCE /* hPrevInstance */,
__in_z_opt LPWSTR lpCmdLine,
__in int nCmdShow
)
{
HRESULT hr = S_OK;
DWORD dwExitCode = 0;
LPWSTR sczPath = NULL;
HANDLE hEngineFile = INVALID_HANDLE_VALUE;
LPCWSTR rgsczSafelyLoadSystemDlls[] =
{
L"cabinet.dll", // required by Burn.
L"msi.dll", // required by Burn.
L"version.dll", // required by Burn.
L"wininet.dll", // required by Burn.
L"comres.dll", // required by CLSIDFromProgID() when loading clbcatq.dll.
L"clbcatq.dll", // required by CLSIDFromProgID() when loading msxml?.dll.
L"msasn1.dll", // required by DecryptFile() when loading crypt32.dll.
L"crypt32.dll", // required by DecryptFile() when loading feclient.dll.
L"feclient.dll", // unsafely loaded by DecryptFile().
};
DutilInitialize(&BurnTraceError);
// Best effort attempt to get our file handle as soon as possible.
hr = PathForCurrentProcess(&sczPath, NULL);
if (SUCCEEDED(hr))
{
hEngineFile = ::CreateFileW(sczPath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
}
// If the engine is in the clean room, we'll do the unsafe initialization
// because some systems in Windows (namely GDI+) will fail when run in
// a process that protects against DLL hijacking. Since we know the clean
// room is in a clean folder and not subject to DLL hijacking we won't
// make ourselves perfectly secure so that we can load BAs that still
// depend on those parts of Windows that are insecure to DLL hijacking.
if (EngineInCleanRoom(lpCmdLine))
{
AppInitializeUnsafe();
}
else
{
AppInitialize(rgsczSafelyLoadSystemDlls, countof(rgsczSafelyLoadSystemDlls));
}
// call run
hr = EngineRun(hInstance, hEngineFile, lpCmdLine, nCmdShow, &dwExitCode);
ExitOnFailure(hr, "Failed to run application.");
LExit:
ReleaseFileHandle(hEngineFile);
ReleaseStr(sczPath);
DutilUninitialize();
return FAILED(hr) ? (int)hr : (int)dwExitCode;
}
static void CALLBACK BurnTraceError(
__in_z LPCSTR /*szFile*/,
__in int /*iLine*/,
__in REPORT_LEVEL /*rl*/,
__in UINT source,
__in HRESULT hrError,
__in_z __format_string LPCSTR szFormat,
__in va_list args
)
{
if (DUTIL_SOURCE_DEFAULT == source)
{
LogErrorStringArgs(hrError, szFormat, args);
}
}
|