root/lang/cplusplus/SleipnirGoogleSuggest/HookDll.cpp

Revision 14174, 4.2 kB (checked in by saturday06, 7 months ago)

アカウントもらった記念に今作ってるものを全部うp

Line 
1/**
2 *
3 */
4
5#include "StdAfx.h"
6#include "Common.h"
7
8namespace SleipnirGoogleSuggest {
9
10// �t�b�N�֘A�͓D�L���̂ł���namespace�lj�
11namespace Hook {
12
13#pragma section ("mysecdrfgsr",read,write,shared)
14#pragma data_seg("mysecdrfgsr")
15// DLL�����L�����O���[�o���ϐ�
16static struct {
17    HHOOK hHook;        // Hook()�̃n���h��
18    LONG  isHookBegan;  // �͂��߂��Ńt�b�N�v���V�[�W�����n�܂����B XXX �����K�v
19} shared_globals = {};
20#pragma data_seg()
21
22// �O���[�o���ϐ�
23static struct {
24    bool isHookCalled;        // Hook()�̃��C�����[�`������������s�������悤�ɂ�����
25    HMODULE hModule;          // DLL�̃��W���[���n���h��
26    WNDPROC DefaultEditProc;  // �T�u�N���X���ȑO�̃G�f�B�b�g�{�b�N�X�̃E�B���h�E�v���V�[�W��
27} globals = {};
28
29/**
30 * GoogleSuggest�@�\�̉�
31 */
32void Detach() {
33    HWND hWnd = GetSearchBarEdit();
34    SetWindowLongPtr(hWnd,GWLP_WNDPROC,(LONG_PTR)globals.DefaultEditProc);
35
36    // XXX �����댯���H
37    Debug("FreeLibrary()");
38    FreeLibrary(GetModuleHandle(NULL));
39    Debug("FreeLibrary() OK");
40}
41
42/**
43 * GoogleSuggest�@�\�����ꂽ�G�W�b�g�{�b�N�X�̃E�B���h�E�v���V�[�W��
44 */
45LRESULT CALLBACK SubclassedEditProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
46    if (msg == WM_KEYDOWN) {
47        MessageBox(NULL,_T("keydown"),_T(""),MB_OK);
48    }
49    if (msg == WM_LBUTTONDOWN) {
50        MessageBox(NULL,_T(""),_T(""),MB_OK);
51        Detach();
52    }
53    return globals.DefaultEditProc(hWnd,msg,wParam,lParam);
54}
55
56/**
57 * GoogleSuggest�@�\�̒lj�
58 * ���v���Z�X�Ŏ�s�����v������ */
59void Attach() {
60    HWND hWnd = GetSearchBarEdit();
61    globals.DefaultEditProc = (WNDPROC)GetWindowLongPtr(hWnd, GWLP_WNDPROC);
62    SetWindowLongPtr(hWnd,GWLP_WNDPROC,(LONG_PTR)SubclassedEditProc);
63}
64
65/**
66 * �T�u�N���X�����邽��leipnir�̃E�B���h�E�v���V�[�W���Ƀt�b�N������
67 */
68LRESULT CALLBACK Hook(int nCode,WPARAM wParam,LPARAM lParam) {
69    if (nCode < 0 || nCode != HC_ACTION || wParam != 0 || globals.isHookCalled) {
70        return CallNextHookEx(shared_globals.hHook, nCode, wParam, lParam);
71    }
72    globals.isHookCalled = true;
73
74    // �t�b�N�֐��n�܂�����m
75    InterlockedExchange(&shared_globals.isHookBegan,1);
76
77    Debug("start hHook: " << (int)shared_globals.hHook);
78
79    // Increase reference count via LoadLibrary
80    TCHAR lib_name[MAX_PATH];
81    if (!GetModuleFileName(globals.hModule, lib_name, MAX_PATH)) {
82        Debug("!GetModuleFileName()");
83        abort();
84    }
85    if (!LoadLibrary(lib_name)) {
86        Debug("!LoadLibrary()");
87        abort();
88    }
89    // �t�b�N��
90    if (!UnhookWindowsHookEx(shared_globals.hHook)) {
91        Debug("!UnhookWindowsHookEx()");
92        abort();
93    }
94
95    Debug("end");
96    Attach();
97    // XXX hHook�͖�����Ă��邩�������H�H�����̂��H�H
98    return CallNextHookEx(shared_globals.hHook, nCode, wParam, lParam);
99}
100
101/**
102 * GoogleSuggest�@�\��ݍ��ފ֐�
103 * �ʂ̃v���Z�X�����яo��
104 */
105__declspec(dllexport) bool CALLBACK AttachFromOtherProcess(DWORD SleipnirThreadId)
106{
107    if (shared_globals.hHook) {
108        Debug("already hooked");
109        return false;
110    }
111    shared_globals.hHook = SetWindowsHookEx(WH_CALLWNDPROCRET,Hook,globals.hModule,SleipnirThreadId);
112    if (!shared_globals.hHook) {
113        Debug("!SetWindowsHookEx()");
114        return false;
115    }
116
117    // �t�b�N�֐����n�܂��ő҂�
118    bool released = false;
119    for (int loop=0; loop<100; loop++) {
120        Sleep(1000);
121        // XXX �ǂݍ��݂̓�������ƃ_���H
122        if (shared_globals.isHookBegan) {
123            released = true;
124            break;
125        }
126    }
127    if (!released) {
128        Debug("timeout");
129        return false;
130    }
131
132    Debug("OK");
133    return true;
134}
135}
136}
137
138
139/**
140 * DllMain
141 */
142BOOL APIENTRY DllMain( HMODULE hModule,
143                       DWORD  ul_reason_for_call,
144                       LPVOID lpReserved
145                     )
146{
147    UNREFERENCED_PARAMETER(lpReserved);
148
149    switch (ul_reason_for_call)
150    {
151    case DLL_PROCESS_ATTACH:
152        SleipnirGoogleSuggest::Hook::globals.hModule = hModule;
153    case DLL_THREAD_ATTACH:
154    case DLL_THREAD_DETACH:
155    case DLL_PROCESS_DETACH:
156        break;
157    }
158    return TRUE;
159}
160
Note: See TracBrowser for help on using the browser.