aboutsummaryrefslogtreecommitdiff
path: root/src/stub/stub.cpp
blob: d3ace1f3fa34e4308d3ea89de3c7def421fef30f (plain)
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);
    }
}