Isle
Loading...
Searching...
No Matches
detectdx5.cpp
Go to the documentation of this file.
1#include "detectdx5.h"
2
3#include <ddraw.h>
4#include <dinput.h>
5
6typedef HRESULT WINAPI DirectDrawCreate_fn(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnknown FAR* pUnkOuter);
7typedef HRESULT WINAPI
8DirectInputCreateA_fn(HINSTANCE hinst, DWORD dwVersion, LPDIRECTINPUTA* ppDI, LPUNKNOWN punkOuter);
9
10// FUNCTION: CONFIG 0x004048f0
12{
13 unsigned int version;
14 BOOL found;
15 DetectDirectX(&version, &found);
16 return version >= 0x500;
17}
18
19// FUNCTION: CONFIG 0x00404920
20void DetectDirectX(unsigned int* p_version, BOOL* p_found)
21{
22 OSVERSIONINFOA os_version;
23
24 os_version.dwOSVersionInfoSize = sizeof(os_version);
25 if (!GetVersionExA(&os_version)) {
26 *p_version = 0;
27 *p_found = 0;
28 return;
29 }
30 if (os_version.dwPlatformId == 2) {
31 *p_found = 2;
32 if (os_version.dwMajorVersion < 4) {
33 *p_found = 0;
34 return;
35 }
36 if (os_version.dwMajorVersion != 4) {
37 *p_version = 0x501;
38 return;
39 }
40 *p_version = 0x200;
41 HMODULE dinput_module = LoadLibraryA("DINPUT.DLL");
42 if (!dinput_module) {
43 OutputDebugStringA("Couldn't LoadLibrary DInput\r\n");
44 return;
45 }
46 DirectInputCreateA_fn* func_DirectInputCreateA =
47 (DirectInputCreateA_fn*) GetProcAddress(dinput_module, "DirectInputCreateA");
48 FreeLibrary(dinput_module);
49 if (!func_DirectInputCreateA) {
50 OutputDebugStringA("Couldn't GetProcAddress DInputCreate\r\n");
51 return;
52 }
53 *p_version = 0x300;
54 return;
55 }
56 *p_found = 1;
57 if (LOWORD(os_version.dwBuildNumber) >= 0x550) {
58 *p_version = 0x501;
59 return;
60 }
61 HMODULE ddraw_module = LoadLibraryA("DDRAW.DLL");
62 if (!ddraw_module) {
63 *p_version = 0;
64 *p_found = 0;
65 FreeLibrary(ddraw_module);
66 return;
67 }
68 DirectDrawCreate_fn* func_DirectDrawCreate =
69 (DirectDrawCreate_fn*) GetProcAddress(ddraw_module, "DirectDrawCreate");
70 if (!func_DirectDrawCreate) {
71 *p_version = 0;
72 *p_found = 0;
73 FreeLibrary(ddraw_module);
74 OutputDebugStringA("Couldn't LoadLibrary DDraw\r\n");
75 return;
76 }
77 LPDIRECTDRAW ddraw;
78 if (FAILED(func_DirectDrawCreate(NULL, &ddraw, NULL))) {
79 *p_version = 0;
80 *p_found = 0;
81 FreeLibrary(ddraw_module);
82 OutputDebugStringA("Couldn't create DDraw\r\n");
83 return;
84 }
85 *p_version = 0x100;
86 LPDIRECTDRAW2 ddraw2;
87 if (FAILED(ddraw->QueryInterface(IID_IDirectDraw2, (LPVOID*) &ddraw2))) {
88 ddraw->Release();
89 FreeLibrary(ddraw_module);
90 OutputDebugStringA("Couldn't QI DDraw2\r\n");
91 return;
92 }
93 ddraw->Release();
94 *p_version = 0x200;
95 HMODULE dinput_module = LoadLibraryA("DINPUT.DLL");
96 if (!dinput_module) {
97 OutputDebugStringA("Couldn't LoadLibrary DInput\r\n");
98 ddraw2->Release();
99 FreeLibrary(ddraw_module);
100 return;
101 }
102 DirectInputCreateA_fn* func_DirectInputCreateA =
103 (DirectInputCreateA_fn*) GetProcAddress(dinput_module, "DirectInputCreateA");
104 FreeLibrary(dinput_module);
105 if (!func_DirectInputCreateA) {
106 FreeLibrary(ddraw_module);
107 ddraw2->Release();
108 OutputDebugStringA("Couldn't GetProcAddress DInputCreate\r\n");
109 return;
110 }
111 *p_version = 0x300;
112 DDSURFACEDESC surface_desc;
113 memset(&surface_desc, 0, sizeof(surface_desc));
114 surface_desc.dwSize = sizeof(surface_desc);
115 surface_desc.dwFlags = DDSD_CAPS;
117 if (FAILED(ddraw2->SetCooperativeLevel(NULL, DISCL_BACKGROUND))) {
118 ddraw2->Release();
119 FreeLibrary(ddraw_module);
120 *p_version = 0;
121 OutputDebugStringA("Couldn't Set coop level\r\n");
122 return;
123 }
124 LPDIRECTDRAWSURFACE surface;
125 if (FAILED(ddraw2->CreateSurface(&surface_desc, &surface, NULL))) {
126 ddraw2->Release();
127 FreeLibrary(ddraw_module);
128 *p_version = 0;
129 OutputDebugStringA("Couldn't CreateSurface\r\n");
130 return;
131 }
132 LPDIRECTDRAWSURFACE3 surface3;
133 if (FAILED(surface->QueryInterface(IID_IDirectDrawSurface3, (LPVOID*) &surface3))) {
134 ddraw2->Release();
135 FreeLibrary(ddraw_module);
136 return;
137 }
138 *p_version = 0x500;
139 surface3->Release();
140 ddraw2->Release();
141 FreeLibrary(ddraw_module);
142}
LPSTR LPSTR LPVOID
Definition: d3dcaps.h:216
#define IUnknown
Definition: ddraw.h:28
struct IDirectDraw2 FAR * LPDIRECTDRAW2
Definition: ddraw.h:73
struct IDirectDrawSurface3 FAR * LPDIRECTDRAWSURFACE3
Definition: ddraw.h:76
struct IDirectDrawSurface FAR * LPDIRECTDRAWSURFACE
Definition: ddraw.h:74
#define DDCAPS2_NONLOCALVIDMEM
Definition: ddraw.h:1776
typedef DWORD(FAR PASCAL *LPCLIPPERCALLBACK)(LPDIRECTDRAWCLIPPER lpDDClipper
long HRESULT
Definition: ddraw.h:115
struct IDirectDraw FAR * LPDIRECTDRAW
Definition: ddraw.h:72
#define DDSD_CAPS
Definition: ddraw.h:1164
void DetectDirectX(unsigned int *p_version, BOOL *p_found)
[AI] Detects the version of DirectX installed and indicates if it is present.
Definition: detectdx5.cpp:20
HRESULT WINAPI DirectDrawCreate_fn(GUID FAR *lpGUID, LPDIRECTDRAW FAR *lplpDD, IUnknown FAR *pUnkOuter)
Definition: detectdx5.cpp:6
BOOL DetectDirectX5()
[AI] Checks whether DirectX 5 or a later version is present and available on the system.
Definition: detectdx5.cpp:11
HRESULT WINAPI DirectInputCreateA_fn(HINSTANCE hinst, DWORD dwVersion, LPDIRECTINPUTA *ppDI, LPUNKNOWN punkOuter)
Definition: detectdx5.cpp:8
typedef BOOL(FAR PASCAL *LPDIENUMDEVICEOBJECTSCALLBACKA)(LPCDIDEVICEOBJECTINSTANCEA
#define DISCL_BACKGROUND
Definition: dinput.h:625
struct IDirectInputA * LPDIRECTINPUTA
Definition: dinput.h:1370
#define NULL
[AI] Null pointer value (C/C++ semantics).
Definition: legotypes.h:26
DWORD dwCaps
Definition: ddraw.h:196
DDSCAPS ddsCaps
Definition: ddraw.h:1158
DWORD dwSize
Definition: ddraw.h:1134
DWORD dwFlags
Definition: ddraw.h:1135