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

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

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

File size: 4.5 KB
RevLine 
[778]1#include "stdafx.h"
[798]2#include "OSVersion.h"
[778]3
[787]4static HMODULE hmodKernel;
5
6static 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]21extern "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}
Note: See TracBrowser for help on using the repository browser.