[778] | 1 | #include "stdafx.h"
|
---|
[798] | 2 | #include "OSVersion.h"
|
---|
[778] | 3 |
|
---|
[787] | 4 | static HMODULE hmodKernel;
|
---|
| 5 |
|
---|
| 6 | static HMODULE GetKernelModule()
|
---|
[785] | 7 | {
|
---|
[787] | 8 | if (hmodKernel == nullptr)
|
---|
| 9 | {
|
---|
| 10 | hmodKernel = GetModuleHandle(TEXT("kernel32"));
|
---|
| 11 | }
|
---|
| 12 | return hmodKernel;
|
---|
[785] | 13 | }
|
---|
[778] | 14 |
|
---|
[787] | 15 | #define KERNEL32 (GetKernelModule())
|
---|
[778] | 16 |
|
---|
[787] | 17 | #define GET_PROC_ADDRESS(hmod, functionName) reinterpret_cast<decltype(functionName)*>(GetProcAddress((hmod), #functionName))
|
---|
| 18 |
|
---|
| 19 | #define DECLARE_REAL_HOLDER(name) static decltype(name)* name ## _Real
|
---|
| 20 |
|
---|
[778] | 21 | extern "C"
|
---|
| 22 | {
|
---|
| 23 | BOOL WINAPI IsDebuggerPresent_Helper()
|
---|
| 24 | {
|
---|
[787] | 25 | DECLARE_REAL_HOLDER(IsDebuggerPresent);
|
---|
| 26 | static bool initialized;
|
---|
| 27 | if (!initialized)
|
---|
[778] | 28 | {
|
---|
[787] | 29 | auto IsDebuggerPresent_Real = GET_PROC_ADDRESS(KERNEL32, IsDebuggerPresent);
|
---|
| 30 | initialized = true;
|
---|
| 31 | }
|
---|
| 32 |
|
---|
| 33 | if (IsDebuggerPresent_Real != nullptr)
|
---|
| 34 | {
|
---|
[778] | 35 | return IsDebuggerPresent_Real();
|
---|
| 36 | }
|
---|
| 37 | else
|
---|
| 38 | {
|
---|
| 39 | return FALSE;
|
---|
| 40 | }
|
---|
| 41 | }
|
---|
| 42 |
|
---|
| 43 | void* WINAPI EncodePointer_Helper(void* p)
|
---|
| 44 | {
|
---|
[787] | 45 | DECLARE_REAL_HOLDER(EncodePointer);
|
---|
| 46 | static bool initialized;
|
---|
| 47 | if (!initialized)
|
---|
[778] | 48 | {
|
---|
[787] | 49 | auto EncodePointer_Real = GET_PROC_ADDRESS(KERNEL32, EncodePointer);
|
---|
| 50 | initialized = true;
|
---|
| 51 | }
|
---|
| 52 |
|
---|
| 53 | if (EncodePointer_Real != nullptr)
|
---|
| 54 | {
|
---|
[778] | 55 | return EncodePointer_Real(p);
|
---|
| 56 | }
|
---|
| 57 | else
|
---|
| 58 | {
|
---|
| 59 | return reinterpret_cast<void*>(reinterpret_cast<DWORD>(p) ^ GetCurrentProcessId());
|
---|
| 60 | }
|
---|
| 61 | }
|
---|
| 62 |
|
---|
| 63 | void* WINAPI DecodePointer_Helper(void* p)
|
---|
| 64 | {
|
---|
[787] | 65 | DECLARE_REAL_HOLDER(DecodePointer);
|
---|
| 66 | static bool initialized;
|
---|
| 67 | if (!initialized)
|
---|
[778] | 68 | {
|
---|
[787] | 69 | auto DecodePointer_Real = GET_PROC_ADDRESS(KERNEL32, DecodePointer);
|
---|
| 70 | initialized = true;
|
---|
| 71 | }
|
---|
| 72 |
|
---|
| 73 | if (DecodePointer_Real != nullptr)
|
---|
| 74 | {
|
---|
[778] | 75 | return DecodePointer_Real(p);
|
---|
| 76 | }
|
---|
| 77 | else
|
---|
| 78 | {
|
---|
| 79 | return reinterpret_cast<void*>(reinterpret_cast<DWORD>(p) ^ GetCurrentProcessId());
|
---|
| 80 | }
|
---|
| 81 | }
|
---|
| 82 |
|
---|
| 83 | BOOL WINAPI IsProcessorFeaturePresent_Helper(DWORD feture)
|
---|
| 84 | {
|
---|
[787] | 85 | DECLARE_REAL_HOLDER(IsProcessorFeaturePresent);
|
---|
| 86 | static bool initialized;
|
---|
| 87 | if (!initialized)
|
---|
[778] | 88 | {
|
---|
[787] | 89 | IsProcessorFeaturePresent_Real = GET_PROC_ADDRESS(KERNEL32, IsProcessorFeaturePresent);
|
---|
| 90 | initialized = true;
|
---|
| 91 | }
|
---|
| 92 |
|
---|
| 93 | if (IsProcessorFeaturePresent_Real != nullptr)
|
---|
| 94 | {
|
---|
[778] | 95 | return IsProcessorFeaturePresent_Real(feture);
|
---|
| 96 | }
|
---|
| 97 | else
|
---|
| 98 | {
|
---|
| 99 | assert(feture == PF_NX_ENABLED); // ATLから呼ばれる
|
---|
| 100 | return FALSE;
|
---|
| 101 | }
|
---|
| 102 | }
|
---|
| 103 |
|
---|
| 104 | BOOL WINAPI HeapSetInformation_Helper(HANDLE hHeap, HEAP_INFORMATION_CLASS hic, void* information, SSIZE_T informationLength)
|
---|
| 105 | {
|
---|
[787] | 106 | DECLARE_REAL_HOLDER(HeapSetInformation);
|
---|
| 107 | static bool initialized;
|
---|
| 108 | if (!initialized)
|
---|
[778] | 109 | {
|
---|
[787] | 110 | HeapSetInformation_Real = GET_PROC_ADDRESS(KERNEL32, HeapSetInformation);
|
---|
| 111 | initialized = true;
|
---|
| 112 | }
|
---|
| 113 |
|
---|
| 114 | if (HeapSetInformation_Real != nullptr)
|
---|
| 115 | {
|
---|
[778] | 116 | return HeapSetInformation_Real(hHeap, hic, information, informationLength);
|
---|
| 117 | }
|
---|
| 118 | else
|
---|
| 119 | {
|
---|
| 120 | return TRUE;
|
---|
| 121 | }
|
---|
| 122 | }
|
---|
| 123 |
|
---|
[787] | 124 | BOOL WINAPI InitializeCriticalSectionAndSpinCount_Helper(LPCRITICAL_SECTION lpcs, DWORD spinCount)
|
---|
[778] | 125 | {
|
---|
[787] | 126 | DECLARE_REAL_HOLDER(InitializeCriticalSectionAndSpinCount);
|
---|
| 127 | static bool initialized;
|
---|
| 128 | if (!initialized)
|
---|
| 129 | {
|
---|
| 130 | InitializeCriticalSectionAndSpinCount_Real = GET_PROC_ADDRESS(KERNEL32, InitializeCriticalSectionAndSpinCount);
|
---|
| 131 | initialized = true;
|
---|
| 132 | }
|
---|
[785] | 133 |
|
---|
[787] | 134 | __try
|
---|
[778] | 135 | {
|
---|
[787] | 136 | if (InitializeCriticalSectionAndSpinCount_Real != nullptr)
|
---|
[778] | 137 | {
|
---|
[787] | 138 | BOOL ret = InitializeCriticalSectionAndSpinCount_Real(lpcs, spinCount);
|
---|
[798] | 139 | return ActiveBasic::Common::Is9x()
|
---|
[787] | 140 | ? TRUE
|
---|
| 141 | : ret;
|
---|
[778] | 142 | }
|
---|
[787] | 143 | else
|
---|
[778] | 144 | {
|
---|
[787] | 145 | ::InitializeCriticalSection(lpcs);
|
---|
| 146 | return TRUE;
|
---|
[778] | 147 | }
|
---|
| 148 | }
|
---|
[787] | 149 | __except(EXCEPTION_EXECUTE_HANDLER)
|
---|
| 150 | {
|
---|
| 151 | }
|
---|
| 152 | return FALSE;
|
---|
[778] | 153 | }
|
---|
| 154 |
|
---|
| 155 | // Interlocked(Push|Pop)EntrySListは、NXが有効な場合のみ呼ばれる。
|
---|
| 156 | // Windows XP以前はNX対応していないためInterlocked(Push|Pop)EntrySListが呼ばれることはない。
|
---|
| 157 | // そのため、GET_PROC_ADDRESSがnullptrを返すことはないと仮定している。
|
---|
| 158 | // なお、Interlocked(Push|Pop)EntrySListもWindows XPから搭載されている。
|
---|
| 159 |
|
---|
| 160 | PSLIST_ENTRY WINAPI InterlockedPushEntrySList_Helper(PSLIST_HEADER head, PSLIST_ENTRY entry)
|
---|
| 161 | {
|
---|
[787] | 162 | DECLARE_REAL_HOLDER(InterlockedPushEntrySList);
|
---|
| 163 | if (InterlockedPushEntrySList_Real == nullptr)
|
---|
| 164 | {
|
---|
| 165 | InterlockedPushEntrySList_Real = GET_PROC_ADDRESS(KERNEL32, InterlockedPushEntrySList);
|
---|
| 166 | }
|
---|
[778] | 167 | assert(InterlockedPushEntrySList_Real != nullptr);
|
---|
| 168 | return InterlockedPushEntrySList_Real(head, entry);
|
---|
| 169 | }
|
---|
| 170 |
|
---|
| 171 | PSLIST_ENTRY WINAPI InterlockedPopEntrySList_Helper(PSLIST_HEADER head)
|
---|
| 172 | {
|
---|
[787] | 173 | DECLARE_REAL_HOLDER(InterlockedPopEntrySList);
|
---|
| 174 | if (InterlockedPopEntrySList_Real == nullptr)
|
---|
| 175 | {
|
---|
| 176 | InterlockedPopEntrySList_Real = GET_PROC_ADDRESS(KERNEL32, InterlockedPopEntrySList);
|
---|
| 177 | }
|
---|
[778] | 178 | assert(InterlockedPopEntrySList_Real != nullptr);
|
---|
| 179 | return InterlockedPopEntrySList_Real(head);
|
---|
| 180 | }
|
---|
| 181 | }
|
---|