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

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

icon_resをLOAD_LIBRARY_AS_DATAFILE付きで読み込むよう変更。icon_resプロジェクトをab.slnへ組み込んだ。

File size: 3.3 KB
Line 
1#include "stdafx.h"
2
3static OSVERSIONINFO GetVersionEx2()
4{
5 OSVERSIONINFO vi = {sizeof vi};
6 GetVersionEx(&vi);
7 return vi;
8}
9
10static OSVERSIONINFO const vi = GetVersionEx2();
11
12#define KERNEL32 (GetModuleHandle(TEXT("kernel32")))
13
14#define GET_PROC_ADDRESS(hmod, functionName) reinterpret_cast<decltype(functionName)*>(GetProcAddress((hmod), #functionName))
15
16extern "C"
17{
18 BOOL WINAPI IsDebuggerPresent_Helper()
19 {
20 if (auto IsDebuggerPresent_Real = GET_PROC_ADDRESS(KERNEL32, IsDebuggerPresent))
21 {
22 return IsDebuggerPresent_Real();
23 }
24 else
25 {
26 return FALSE;
27 }
28 }
29
30 void* WINAPI EncodePointer_Helper(void* p)
31 {
32 if (auto EncodePointer_Real = GET_PROC_ADDRESS(KERNEL32, EncodePointer))
33 {
34 return EncodePointer_Real(p);
35 }
36 else
37 {
38 return reinterpret_cast<void*>(reinterpret_cast<DWORD>(p) ^ GetCurrentProcessId());
39 }
40 }
41
42 void* WINAPI DecodePointer_Helper(void* p)
43 {
44 if (auto DecodePointer_Real = GET_PROC_ADDRESS(KERNEL32, DecodePointer))
45 {
46 return DecodePointer_Real(p);
47 }
48 else
49 {
50 return reinterpret_cast<void*>(reinterpret_cast<DWORD>(p) ^ GetCurrentProcessId());
51 }
52 }
53
54 BOOL WINAPI IsProcessorFeaturePresent_Helper(DWORD feture)
55 {
56 if (auto IsProcessorFeaturePresent_Real = GET_PROC_ADDRESS(KERNEL32, IsProcessorFeaturePresent))
57 {
58 return IsProcessorFeaturePresent_Real(feture);
59 }
60 else
61 {
62 assert(feture == PF_NX_ENABLED); // ATLから呼ばれる
63 return FALSE;
64 }
65 }
66
67 BOOL WINAPI HeapSetInformation_Helper(HANDLE hHeap, HEAP_INFORMATION_CLASS hic, void* information, SSIZE_T informationLength)
68 {
69 if (auto HeapSetInformation_Real = GET_PROC_ADDRESS(KERNEL32, HeapSetInformation))
70 {
71 return HeapSetInformation_Real(hHeap, hic, information, informationLength);
72 }
73 else
74 {
75 return TRUE;
76 }
77 }
78
79 BOOL WINAPI InitializeCriticalSectionAndSpinCount_Helper(LPCRITICAL_SECTION lpcs, DWORD spinCount)
80 {
81 __try
82 {
83 if (auto InitializeCriticalSectionAndSpinCount_Real = GET_PROC_ADDRESS(KERNEL32, InitializeCriticalSectionAndSpinCount))
84 {
85 OSVERSIONINFO vi = {sizeof vi};
86 ::GetVersionEx(&vi);
87 BOOL ret = InitializeCriticalSectionAndSpinCount_Real(lpcs, spinCount);
88 return vi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS
89 ? TRUE
90 : ret;
91 }
92 else
93 {
94 ::InitializeCriticalSection(lpcs);
95 return TRUE;
96 }
97 }
98 __except(EXCEPTION_EXECUTE_HANDLER)
99 {
100 }
101 return FALSE;
102 }
103
104 // Interlocked(Push|Pop)EntrySListは、NXが有効な場合のみ呼ばれる。
105 // Windows XP以前はNX対応していないためInterlocked(Push|Pop)EntrySListが呼ばれることはない。
106 // そのため、GET_PROC_ADDRESSがnullptrを返すことはないと仮定している。
107 // なお、Interlocked(Push|Pop)EntrySListもWindows XPから搭載されている。
108
109 PSLIST_ENTRY WINAPI InterlockedPushEntrySList_Helper(PSLIST_HEADER head, PSLIST_ENTRY entry)
110 {
111 auto InterlockedPushEntrySList_Real = GET_PROC_ADDRESS(KERNEL32, InterlockedPushEntrySList);
112 assert(InterlockedPushEntrySList_Real != nullptr);
113 return InterlockedPushEntrySList_Real(head, entry);
114 }
115
116 PSLIST_ENTRY WINAPI InterlockedPopEntrySList_Helper(PSLIST_HEADER head)
117 {
118 auto InterlockedPopEntrySList_Real = GET_PROC_ADDRESS(KERNEL32, InterlockedPopEntrySList);
119 assert(InterlockedPopEntrySList_Real != nullptr);
120 return InterlockedPopEntrySList_Real(head);
121 }
122}
Note: See TracBrowser for help on using the repository browser.