aboutsummaryrefslogtreecommitdiff
path: root/src/burn/stub/stub.cpp
blob: 339a54da3d5ac0c220f03d02bfa41b07aff6a038 (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
// 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"


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().
    };

    // 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);


    return FAILED(hr) ? (int)hr : (int)dwExitCode;
}