source: dev/branches/egtra/ab5.0/abdev/OldWindowsHelperImpl.cpp@ 798

Last change on this file since 798 was 798, checked in by イグトランス (egtra), 13 years ago

PSAPIを使用している箇所について、Toolhelp32と選択するよう修正

File size: 4.5 KB
Line 
1#include "stdafx.h"
2#include "OSVersion.h"
3
4static HMODULE hmodKernel;
5
6static HMODULE GetKernelModule()
7{
8 if (hmodKernel == nullptr)
9 {
10 hmodKernel = GetModuleHandle(TEXT("kernel32"));
11 }
12 return hmodKernel;
13}
14
15#define KERNEL32 (GetKernelModule())
16
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
21extern "C"
22{
23 BOOL WINAPI IsDebuggerPresent_Helper()
24 {
25 DECLARE_REAL_HOLDER(IsDebuggerPresent);
26 static bool initialized;
27 if (!initialized)
28 {
29 auto IsDebuggerPresent_Real = GET_PROC_ADDRESS(KERNEL32, IsDebuggerPresent);
30 initialized = true;
31 }
32
33 if (IsDebuggerPresent_Real != nullptr)
34 {
35 return IsDebuggerPresent_Real();
36 }
37 else
38 {
39 return FALSE;
40 }
41 }
42
43 void* WINAPI EncodePointer_Helper(void* p)
44 {
45 DECLARE_REAL_HOLDER(EncodePointer);
46 static bool initialized;
47 if (!initialized)
48 {
49 auto EncodePointer_Real = GET_PROC_ADDRESS(KERNEL32, EncodePointer);
50 initialized = true;
51 }
52
53 if (EncodePointer_Real != nullptr)
54 {
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 {
65 DECLARE_REAL_HOLDER(DecodePointer);
66 static bool initialized;
67 if (!initialized)
68 {
69 auto DecodePointer_Real = GET_PROC_ADDRESS(KERNEL32, DecodePointer);
70 initialized = true;
71 }
72
73 if (DecodePointer_Real != nullptr)
74 {
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 {
85 DECLARE_REAL_HOLDER(IsProcessorFeaturePresent);
86 static bool initialized;
87 if (!initialized)
88 {
89 IsProcessorFeaturePresent_Real = GET_PROC_ADDRESS(KERNEL32, IsProcessorFeaturePresent);
90 initialized = true;
91 }
92
93 if (IsProcessorFeaturePresent_Real != nullptr)
94 {
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 {
106 DECLARE_REAL_HOLDER(HeapSetInformation);
107 static bool initialized;
108 if (!initialized)
109 {
110 HeapSetInformation_Real = GET_PROC_ADDRESS(KERNEL32, HeapSetInformation);
111 initialized = true;
112 }
113
114 if (HeapSetInformation_Real != nullptr)
115 {
116 return HeapSetInformation_Real(hHeap, hic, information, informationLength);
117 }
118 else
119 {
120 return TRUE;
121 }
122 }
123
124 BOOL WINAPI InitializeCriticalSectionAndSpinCount_Helper(LPCRITICAL_SECTION lpcs, DWORD spinCount)
125 {
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 }
133
134 __try
135 {
136 if (InitializeCriticalSectionAndSpinCount_Real != nullptr)
137 {
138 BOOL ret = InitializeCriticalSectionAndSpinCount_Real(lpcs, spinCount);
139 return ActiveBasic::Common::Is9x()
140 ? TRUE
141 : ret;
142 }
143 else
144 {
145 ::InitializeCriticalSection(lpcs);
146 return TRUE;
147 }
148 }
149 __except(EXCEPTION_EXECUTE_HANDLER)
150 {
151 }
152 return FALSE;
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 {
162 DECLARE_REAL_HOLDER(InterlockedPushEntrySList);
163 if (InterlockedPushEntrySList_Real == nullptr)
164 {
165 InterlockedPushEntrySList_Real = GET_PROC_ADDRESS(KERNEL32, InterlockedPushEntrySList);
166 }
167 assert(InterlockedPushEntrySList_Real != nullptr);
168 return InterlockedPushEntrySList_Real(head, entry);
169 }
170
171 PSLIST_ENTRY WINAPI InterlockedPopEntrySList_Helper(PSLIST_HEADER head)
172 {
173 DECLARE_REAL_HOLDER(InterlockedPopEntrySList);
174 if (InterlockedPopEntrySList_Real == nullptr)
175 {
176 InterlockedPopEntrySList_Real = GET_PROC_ADDRESS(KERNEL32, InterlockedPopEntrySList);
177 }
178 assert(InterlockedPopEntrySList_Real != nullptr);
179 return InterlockedPopEntrySList_Real(head);
180 }
181}
Note: See TracBrowser for help on using the repository browser.