// 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 // 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 /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 // \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 };