root/lang/c/GSD/trunk/hook.cpp @ 6959

Revision 6959, 11.2 kB (checked in by mosa, 6 years ago)

lang/c/GSD: Add API. (GSD_GetApiVersion)

Line 
1/*
2 * GSD
3 *
4 * Copyright (C) 2008 mosa ��e5bW6vDOJ. <pcyp4g@gmail.com>
5 *
6 * This is free software with ABSOLUTELY NO WARRANTY.
7 *
8 * You can redistribute it and/or modify it under the terms of
9 * the GNU Lesser General Public License.
10 *
11 */
12
13#include <windows.h>
14#include <stdio.h>
15
16#include "common.h"
17#include "tools.h"
18#include "version.h"
19#include "gsd.h"
20
21#include "hook.h"
22#include "hookd3d9.h"
23#include "hookd3d8.h"
24#include "hookogl.h"
25
26//-----------------------------------------------------------------------------
27
28#pragma data_seg(".sharedata")
29static HHOOK hHook = NULL;
30BOOL dllActive = FALSE;
31#pragma data_seg()
32
33//-----------------------------------------------------------------------------
34
35HINSTANCE g_hInstance = NULL;
36
37static bool hooked9 = false;
38static bool hooked8 = false;
39static bool hookedOGL = false;
40static DWORD dwCheckTimer = 0;
41
42static struct sLocal *lo = NULL;
43
44//-----------------------------------------------------------------------------
45
46typeSetWindowsHookExW extSetWindowsHookExW = NULL;
47void *addrSetWindowsHookExW = NULL;
48
49__declspec(naked) HHOOK WINAPI extSetWindowsHookExWXP(int idHook, HOOKPROC lpfn, HINSTANCE hmod, DWORD dwThreadId)
50{
51        __asm
52        {
53                push    ebp 
54                mov             ebp, esp
55                jmp             addrSetWindowsHookExW           
56        }
57}
58
59//-----------------------------------------------------------------------------
60
61bool InitSub();
62
63VOID CALLBACK CheckTimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
64{
65        if(!hooked9)
66        {
67                if(GetModuleHandle("d3d9.dll") != NULL)
68                {
69                        dprintf("Direct3D9 hook...");
70
71                        InitSub();
72
73                        SetHookD3D9();
74                        hooked9 = true;
75                }
76        }
77
78        if(!hooked8)
79        {
80                if(GetModuleHandle("d3d8.dll") != NULL)
81                {
82                        dprintf("Direct3D8 hook...");
83
84                        InitSub();
85
86                        SetHookD3D8();
87                        hooked8 = true;
88                }
89        }
90
91        if(!hookedOGL)
92        {
93                if(GetModuleHandle("opengl32.dll") != NULL)
94                {
95                        dprintf("OpenGL hook...");
96
97                        InitSub();
98
99                        SetHookOGL();
100                        hookedOGL = true;
101                }
102        }
103
104        if(hooked9)
105                CheckHookD3D9();
106        if(hooked8)
107                CheckHookD3D8();
108        if(hookedOGL)
109                CheckHookOGL();
110}
111
112//-----------------------------------------------------------------------------
113
114bool Init()
115{       // �v���Z�X�ɓǂݍ��܂ꂽ�Ƃ��Ăяo��������1��   bool succeed = false;
116
117        CheckTimerProc(NULL, 0, 0, 0);
118
119        do
120        {
121                dwCheckTimer = SetTimer(NULL, 0, 1000, CheckTimerProc);
122                if(dwCheckTimer == 0)
123                {
124                        dprintf("SetTimer() failed.");
125                        break;
126                }
127
128                succeed = true;
129
130        }while(false);
131
132        return succeed;
133}
134
135//-----------------------------------------------------------------------------
136
137bool InitSub()
138{       // Hook�����Ƃ��Ɍďo��������������        if(g == NULL)
139        {
140                g = new sGlobal;
141
142                CMicroTimer::calcError();
143        }
144
145        return true;
146}
147
148//-----------------------------------------------------------------------------
149
150void UninitSub()
151{       // Hook������ꂽ�Ƃ��Ɍďo���� (1��  if(g != NULL)
152                delete g;
153        g = NULL;
154}
155
156//-----------------------------------------------------------------------------
157
158void Uninit()
159{       // �v���Z�X���������[�h�����Ƃ��Ăяo���� (1��     KillTimer(NULL, dwCheckTimer);
160
161        if(hooked9 || hooked8|| hookedOGL)
162        {
163                if(hooked9)
164                        ResetHookD3D9();
165                if(hooked8)
166                        ResetHookD3D8();
167                if(hookedOGL)
168                        ResetHookOGL();
169
170                UninitSub();
171
172                hooked9 = false;
173                hooked8 = false;
174                hookedOGL = false;
175        }
176}
177
178//-----------------------------------------------------------------------------
179
180static bool initiated = false;
181
182BOOL APIENTRY DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
183{
184        OSVERSIONINFO ver;
185        void *baseAddr;
186
187        switch(dwReason)
188        {
189        case DLL_PROCESS_ATTACH:
190                g_hInstance = hInstance;
191                DisableThreadLibraryCalls(hInstance);
192
193                LoadLibrary("user32.dll");
194
195                baseAddr = GetProcAddress(GetModuleHandle("user32.dll"), "SetWindowsHookExW");
196
197                ver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
198                GetVersionEx(&ver);
199
200                if(ver.dwMajorVersion == 5)
201                {
202                        if(ver.dwMinorVersion > 0)
203                        {
204                                addrSetWindowsHookExW = (char *)baseAddr + 5;
205                                extSetWindowsHookExW = extSetWindowsHookExWXP;
206                        }
207                }
208
209                if(ver.dwMajorVersion == 6)
210                {
211                        addrSetWindowsHookExW = (char *)baseAddr + 5;
212                        extSetWindowsHookExW = extSetWindowsHookExWXP;
213                }
214               
215                if(extSetWindowsHookExW == NULL)
216                        extSetWindowsHookExW = (typeSetWindowsHookExW)baseAddr;
217
218                {
219                        bool pass = true;
220                        char sztemp[MAX_PATH*2], windir[MAX_PATH*2];
221
222                        GetWindowsDirectory(windir, MAX_PATH*2);
223                        GetModuleFileName(GetModuleHandle(NULL), sztemp, MAX_PATH*2);
224
225                        if(dllActive == FALSE)
226                                pass = false;
227
228                        if(strstr(sztemp, windir))
229                                pass = false;
230
231                        if(strstr(sztemp, "rrtest.exe"))
232                                pass = false;
233
234                        if(pass)
235                        {
236                                dprintf("Inject %s (%d)", sztemp, GetCurrentProcessId());
237
238                                Init();
239                                initiated = true;
240                        }
241                }
242                break;
243        case DLL_PROCESS_DETACH:
244
245                if(initiated)
246                        Uninit();
247
248                break;
249        }
250
251    return TRUE;
252}
253
254//-----------------------------------------------------------------------------
255
256LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)
257{
258        return CallNextHookEx(hHook, nCode, wParam, lParam);
259}
260
261//-----------------------------------------------------------------------------
262
263BOOL WINAPI GSD_Initialize()
264{
265        int n1 = 128, n2 = 128, n3 = 128;
266
267        if(lo)
268                return FALSE;
269
270        lo = new sLocal;
271
272        GetOffsetD3D9(&n1);
273        GetOffsetD3D8(&n2);
274        GetOffsetOGL(&n3);
275
276        lo->maxTextureSize = min(n1, min(n2, n3));
277
278        hHook = extSetWindowsHookExW(WH_CBT, HookProc, g_hInstance, 0);
279        if(!hHook)
280        {
281                dprintf("SetWindowsHook() failed.");
282
283                delete lo;
284                lo = NULL;
285
286                return FALSE;
287        }
288
289        dllActive = TRUE;
290
291        return TRUE;
292}
293
294//-----------------------------------------------------------------------------
295
296void WINAPI GSD_Finalize()
297{
298        dllActive = FALSE;
299
300        if(lo)
301        {
302                delete lo;
303                lo = NULL;
304        }
305
306        if(hHook)
307        {
308                UnhookWindowsHookEx(hHook);
309                hHook = NULL;
310        }
311}
312
313//-----------------------------------------------------------------------------
314
315int WINAPI GSD_GetMaxTextureNum()
316{
317        return MAX_TEXNUM;
318}
319
320//-----------------------------------------------------------------------------
321
322int WINAPI GSD_GetMaxTextureSize()
323{
324        if(!lo)
325                return 0;
326
327        return lo->maxTextureSize;
328}
329
330//-----------------------------------------------------------------------------
331
332DWORD WINAPI GSD_GetLastUpdate()
333{
334        if(!lo || !lo->settings)
335                return 0;
336
337        return lo->settings->lastUpdate;
338}
339
340//-----------------------------------------------------------------------------
341
342DWORD WINAPI GSD_GetVersion()
343{
344        sVersionInfo info;
345
346        if(ReadVersionModule(g_hInstance, &info))
347        {
348                DWORD out;
349
350                out = ((info.word.wVer1&0xff)<<24) | ((info.word.wVer2&0xff)<<16) | ((info.word.wVer3&0xff)<<8) | (info.word.wVer4&0xff);
351
352                return out;
353        }
354        else
355        {
356                return 0;
357        }
358}
359
360//-----------------------------------------------------------------------------
361
362DWORD WINAPI GSD_GetApiVersion()
363{
364        return GSD_APIVER;
365}
366
367//-----------------------------------------------------------------------------
368
369BOOL WINAPI GSD_InitTexture(const DWORD *size, int num)
370{
371        int i;
372        DWORD total;
373        char sztemp[256];
374
375        if(!lo || !lo->settings)
376                return FALSE;
377
378        if(!size || num < 1)
379                return FALSE;
380
381        lo->offsets[0] = 0;
382        lo->sizes[0] = size[0];
383
384        for(i=1; i<num; i++)
385        {
386                lo->offsets[i] = lo->offsets[i-1] + size[i-1];
387                lo->sizes[i] = size[i];
388        }
389
390        for(; i<MAX_TEXNUM; i++)
391        {
392                lo->offsets[i] = 0;
393                lo->sizes[i] = 0;
394        }
395
396        total = 0;
397        for(i=0; i<num; i++)
398                total += size[i];
399
400        lo->settings->pixelsRevision++;
401
402        sprintf(sztemp, "%s%d", SHARED_PIXELS, lo->settings->pixelsRevision);
403
404        if(lo->smPixels.create(sztemp, total))
405        {
406                lo->settings->pixelsDataSize = total;
407                lo->maxIndex = num;
408        }
409        else
410        {
411                lo->settings->pixelsDataSize = 0;
412                lo->maxIndex = 0;
413                return FALSE;
414        }
415
416        return TRUE;
417}
418
419//-----------------------------------------------------------------------------
420
421BOOL WINAPI GSD_SetTexture(int index, const struct GSD_TextureInfo *info)
422{
423        if(!lo || !lo->settings)
424                return FALSE;
425
426        if(!info || index >= MAX_TEXNUM)
427                return FALSE;
428
429        if(index >= lo->maxIndex && info->data)
430                return FALSE;
431
432        if(!lo->smPixels.getData() && info->data)
433                return FALSE;
434
435        lo->settings->texInfo[index].active = info->active;
436        lo->settings->texInfo[index].align = info->align;
437        lo->settings->texInfo[index].color = info->color;
438        lo->settings->texInfo[index].x = info->x;
439        lo->settings->texInfo[index].y = info->y;
440        lo->settings->texInfo[index].texSize = info->texSize;
441
442        if(info->data)
443        {
444                lo->settings->texInfo[index].offset = lo->offsets[index];
445                lo->settings->texInfo[index].revision++;
446
447                memcpy(lo->smPixels.getData() + lo->offsets[index], info->data, lo->sizes[index]);
448        }
449
450        return TRUE;
451}
452
453//-----------------------------------------------------------------------------
454
455BOOL WINAPI GSD_GetTexture(int index, struct GSD_TextureInfo *info)
456{
457        if(!lo || !lo->settings)
458                return FALSE;
459
460        if(!info || index >= MAX_TEXNUM)
461                return FALSE;
462
463        if(index >= lo->maxIndex && info->data)
464                return FALSE;
465
466        if(!lo->smPixels.getData() && info->data)
467                return FALSE;
468
469        info->active = lo->settings->texInfo[index].active;
470        info->align = lo->settings->texInfo[index].align;
471        info->color = lo->settings->texInfo[index].color;
472        info->x = lo->settings->texInfo[index].x;
473        info->y = lo->settings->texInfo[index].y;
474        info->texSize = lo->settings->texInfo[index].texSize;
475
476        if(info->data)
477                memcpy(info->data, lo->smPixels.getData() + lo->offsets[index], lo->sizes[index]);
478
479        return TRUE;
480}
481
482//-----------------------------------------------------------------------------
483
484void WINAPI GSD_DelTexture(int index)
485{
486        if(!lo || !lo->settings)
487                return;
488
489        if(index >= MAX_TEXNUM)
490                return;
491
492        lo->settings->texInfo[index].texSize = 0;
493}
494
495//-----------------------------------------------------------------------------
496
497void WINAPI GSD_SetTimerOrg(__int64 org)
498{
499        if(!lo || !lo->settings)
500                return;
501
502        lo->settings->orgTime = org;
503}
504
505//-----------------------------------------------------------------------------
506
507void WINAPI GSD_SetFpsLimit(double fps)
508{
509        if(!lo || !lo->settings)
510                return;
511
512        if(fps < 0.0)
513                return;
514
515        lo->settings->fpsLimit = fps;
516}
517
518//-----------------------------------------------------------------------------
519
520void WINAPI GSD_SetFpsAlign(DWORD align)
521{
522        if(!lo || !lo->settings)
523                return;
524
525        lo->settings->fpsAlign = align;
526}
527
528//-----------------------------------------------------------------------------
529
530void WINAPI GSD_ShowFps(BOOL show)
531{
532        if(!lo || !lo->settings)
533                return;
534
535        lo->settings->showFPS = show;
536}
537
538//-----------------------------------------------------------------------------
539
540void WINAPI GSD_UpdateOnActive(BOOL uoa)
541{
542        if(!lo || !lo->settings)
543                return;
544
545        lo->settings->updateOnActive = uoa;
546}
547
548//-----------------------------------------------------------------------------
549
550void WINAPI GSD_DataLock()
551{
552        if(!lo)
553                return;
554
555        lo->mutexSettings.lock();
556}
557
558//-----------------------------------------------------------------------------
559
560void WINAPI GSD_DataUnlock()
561{
562        if(!lo)
563                return;
564
565        lo->mutexSettings.unlock();
566}
567
568//-----------------------------------------------------------------------------
Note: See TracBrowser for help on using the browser.