mirror of
https://github.com/reactos/reactos.git
synced 2025-06-14 23:48:29 +00:00
[VCRUNTIME][VCSTARTUP] Add separate vcruntime and vcstartup lib
vcruntime contains the code that is linked into ucrtbase (in VS it is also provided as vcruntime140.dll) vcstartup contains the code that is statically linked into executables that link to ucrtbase.dll. In Visual Studio this is part of msvcrt.lib (the import library for msvcrt), similar to our current msvcrtex, and it gets linked when you link to ucrtbase as well. The name is based on the folder name in the library. Both libraries share some code, but each file is only compiled once.
This commit is contained in:
parent
2b2bdabe72
commit
9186b861a6
21 changed files with 79 additions and 26 deletions
85
sdk/lib/vcruntime/__security_init_cookie.c
Normal file
85
sdk/lib/vcruntime/__security_init_cookie.c
Normal file
|
@ -0,0 +1,85 @@
|
|||
//
|
||||
// __security_init_cookie.c
|
||||
//
|
||||
// Copyright (c) 2024 Timo Kreuzer
|
||||
//
|
||||
// Implementation of __security_init_cookie.
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
//
|
||||
|
||||
#include <internal_shared.h>
|
||||
|
||||
#ifdef _WIN64
|
||||
#define DEFAULT_SECURITY_COOKIE 0x00002B992DDFA232ull
|
||||
#define _rotlptr _rotl64
|
||||
#else
|
||||
#define DEFAULT_SECURITY_COOKIE 0xBB40E64E
|
||||
#define _rotlptr _rotl
|
||||
#endif
|
||||
|
||||
uintptr_t __security_cookie = DEFAULT_SECURITY_COOKIE;
|
||||
uintptr_t __security_cookie_complement = ~DEFAULT_SECURITY_COOKIE;
|
||||
|
||||
void __security_init_cookie(void)
|
||||
{
|
||||
LARGE_INTEGER performanceCounter;
|
||||
FILETIME fileTime;
|
||||
uintptr_t randomValue = (uintptr_t)0x27E30B2C16B07297ull;
|
||||
|
||||
#if defined(_M_IX86) || defined(_M_X64)
|
||||
if (IsProcessorFeaturePresent(PF_RDRAND_INSTRUCTION_AVAILABLE))
|
||||
{
|
||||
#ifdef _M_X64
|
||||
while (!_rdrand64_step(&randomValue))
|
||||
_mm_pause();
|
||||
#else
|
||||
while (!_rdrand32_step(&randomValue))
|
||||
_mm_pause();
|
||||
#endif
|
||||
}
|
||||
|
||||
if (IsProcessorFeaturePresent(PF_RDTSC_INSTRUCTION_AVAILABLE))
|
||||
{
|
||||
randomValue += __rdtsc();
|
||||
}
|
||||
#endif
|
||||
|
||||
randomValue += (uintptr_t)&randomValue;
|
||||
randomValue ^= GetTickCount();
|
||||
|
||||
QueryPerformanceCounter(&performanceCounter);
|
||||
#ifdef _WIN64
|
||||
randomValue ^= performanceCounter.QuadPart;
|
||||
#else
|
||||
randomValue ^= performanceCounter.LowPart;
|
||||
randomValue ^= performanceCounter.HighPart;
|
||||
#endif
|
||||
|
||||
randomValue += GetCurrentThreadId();
|
||||
randomValue = _rotlptr(randomValue, GetCurrentThreadId() >> 2);
|
||||
|
||||
#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8)
|
||||
GetSystemTimePreciseAsFileTime(&fileTime);
|
||||
#else
|
||||
GetSystemTimeAsFileTime(&fileTime);
|
||||
#endif
|
||||
randomValue += fileTime.dwLowDateTime;
|
||||
randomValue += fileTime.dwHighDateTime;
|
||||
|
||||
randomValue += GetCurrentProcessId();
|
||||
randomValue = _rotlptr(randomValue, GetCurrentProcessId() >> 2);
|
||||
|
||||
if (randomValue == DEFAULT_SECURITY_COOKIE)
|
||||
{
|
||||
randomValue++;
|
||||
}
|
||||
|
||||
#ifdef _WIN64
|
||||
/* Zero out highest 16 bits */
|
||||
randomValue &= 0x0000FFFFFFFFFFFFull;
|
||||
#endif
|
||||
|
||||
__security_cookie = randomValue;
|
||||
__security_cookie_complement = ~randomValue;
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue