| Index: chrome/app/chrome_exe_load_config_win.cc
|
| diff --git a/chrome/app/chrome_exe_load_config_win.cc b/chrome/app/chrome_exe_load_config_win.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..0fcd87a5dae76b036dbfff0373cd85b411b1001c
|
| --- /dev/null
|
| +++ b/chrome/app/chrome_exe_load_config_win.cc
|
| @@ -0,0 +1,114 @@
|
| +// Copyright (c) 2015 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include <windows.h>
|
| +
|
| +// The whole object of this file is to define |_load_config_used| which
|
| +// is a weakly-linked symbol that the linker knows about. The crt defines
|
| +// it as well it but this one will be used if present.
|
| +//
|
| +// The _load_config_used appears in the exe as a special member of the PE
|
| +// image format: the load config directory. This structure controls
|
| +// global parameters which are hard or impossible to set otherwise. This
|
| +// MSDN page https://goo.gl/zsGeVY documents some of the members.
|
| +//
|
| +// When making a changes to this stucture the only practical way to make
|
| +// sure they are honored is to run dumpbin.exe <exe-file> /loadconfig
|
| +// and inspect the results.
|
| +
|
| +#if defined(_WIN64)
|
| +typedef struct {
|
| + DWORD Size;
|
| + DWORD TimeDateStamp;
|
| + WORD MajorVersion;
|
| + WORD MinorVersion;
|
| + DWORD GlobalFlagsClear;
|
| + DWORD GlobalFlagsSet;
|
| + DWORD CriticalSectionDefaultTimeout;
|
| + ULONGLONG DeCommitFreeBlockThreshold;
|
| + ULONGLONG DeCommitTotalFreeThreshold;
|
| + ULONGLONG LockPrefixTable;
|
| + ULONGLONG MaximumAllocationSize;
|
| + ULONGLONG VirtualMemoryThreshold;
|
| + ULONGLONG ProcessAffinityMask;
|
| + DWORD ProcessHeapFlags;
|
| + WORD CSDVersion;
|
| + WORD Reserved1;
|
| + ULONGLONG EditList;
|
| + ULONGLONG SecurityCookie;
|
| + ULONGLONG SEHandlerTable;
|
| + ULONGLONG SEHandlerCount;
|
| +} IMAGE_LOAD_CONFIG_DIRECTORY64_2;
|
| +typedef IMAGE_LOAD_CONFIG_DIRECTORY64_2 IMAGE_LOAD_CONFIG_DIRECTORY_2;
|
| +#else
|
| +typedef struct {
|
| + DWORD Size;
|
| + DWORD TimeDateStamp;
|
| + WORD MajorVersion;
|
| + WORD MinorVersion;
|
| + DWORD GlobalFlagsClear;
|
| + DWORD GlobalFlagsSet;
|
| + DWORD CriticalSectionDefaultTimeout;
|
| + DWORD DeCommitFreeBlockThreshold;
|
| + DWORD DeCommitTotalFreeThreshold;
|
| + DWORD LockPrefixTable;
|
| + DWORD MaximumAllocationSize;
|
| + DWORD VirtualMemoryThreshold;
|
| + DWORD ProcessHeapFlags;
|
| + DWORD ProcessAffinityMask;
|
| + WORD CSDVersion;
|
| + WORD Reserved1;
|
| + DWORD EditList;
|
| + PUINT_PTR SecurityCookie;
|
| + PVOID *SEHandlerTable;
|
| + DWORD SEHandlerCount;
|
| +} IMAGE_LOAD_CONFIG_DIRECTORY32_2;
|
| +typedef IMAGE_LOAD_CONFIG_DIRECTORY32_2 IMAGE_LOAD_CONFIG_DIRECTORY_2;
|
| +#endif
|
| +
|
| +// What follows, except as indicated is verbatim (including casts) from
|
| +// <visual studio path>\VC\crt\src\intel\loadcfg.c. The default values
|
| +// are all 0 except for the last 3 members. See
|
| +// https://msdn.microsoft.com/en-us/library/9a89h429.aspx for an
|
| +// explanation of these members.
|
| +extern "C" UINT_PTR __security_cookie;
|
| +extern "C" PVOID __safe_se_handler_table[];
|
| +extern "C" BYTE __safe_se_handler_count;
|
| +
|
| +// DeCommitTotalFreeThreshold: increase the decomit free threshold for
|
| +// the process heap, which is documented as "The size of the minimum
|
| +// total memory that must be freed in the process heap before it is
|
| +// freed (de-committed) in bytes".
|
| +//
|
| +// Set at 2 MiB what this does is prevent a lot of VirtualFree plus the
|
| +// following VirtualAlloc because the default value makes the heap too
|
| +// conservative on the ammount of memory it keeps for future allocations.
|
| +
|
| +extern "C"
|
| +const IMAGE_LOAD_CONFIG_DIRECTORY_2 _load_config_used = {
|
| + sizeof(IMAGE_LOAD_CONFIG_DIRECTORY_2),
|
| + 0, // TimeDateStamp.
|
| + 0, // MajorVersion.
|
| + 0, // MinorVersion.
|
| + 0, // GlobalFlagsClear.
|
| + 0, // GlobalFlagsSet.
|
| + 0, // CriticalSectionDefaultTimeout.
|
| + 0, // DeCommitFreeBlockThreshold.
|
| + 2 * 1024 * 1024, // DeCommitTotalFreeThreshold.
|
| + 0, // LockPrefixTable.
|
| + 0, // MaximumAllocationSize.
|
| + 0, // VirtualMemoryThreshold.
|
| + 0, // ProcessHeapFlags.
|
| + 0, // ProcessAffinityMask.
|
| + 0, // CSDVersion.
|
| + 0, // Reserved1.
|
| + 0 , // EditList.
|
| +#ifdef _WIN64
|
| + (ULONGLONG)&__security_cookie,
|
| +#else
|
| + &__security_cookie,
|
| + __safe_se_handler_table,
|
| + (DWORD)(DWORD_PTR)&__safe_se_handler_count
|
| +#endif
|
| +};
|
|
|