0000: 2f 2f 20 74 72 61 70 73 2e 68 70 70 0d 0a 2f 2a // traps.hpp../*
0010: 0d 0a 28 63 29 20 c0 eb e5 ea f1 e0 ed e4 f0 20 ..(c) .........
0020: ce f0 e5 f4 ea ee e2 20 74 65 6c 65 70 61 74 40 ....... telepat@
0030: 69 6e 62 6f 78 2e 72 75 0d 0a cd e0 e1 ee f0 20 inbox.ru.......
0040: ea eb e0 f1 f1 ee e2 20 e4 eb ff 20 ef e5 f0 e5 ....... ... ....
0050: f5 e2 e0 f2 e0 20 f4 f3 ed ea f6 e8 e9 2e 0d 0a ..... ..........
0060: 2a 2f 0d 0a 23 70 72 61 67 6d 61 20 6f 6e 63 65 */..#pragma once
0070: 0d 0a 0d 0a 2f 2f 20 d4 f3 ed ea f6 e8 ff 20 e4 ....// ....... .
0080: eb ff 20 f0 e5 e8 ed f2 e5 f0 ef f0 e5 f2 20 ea .. ........... .
0090: e0 f1 f2 e0 20 e0 e4 f0 e5 f1 ee e2 20 ec e5 f2 .... ....... ...
00a0: ee e4 ee e2 20 ea eb e0 f1 f1 ee e2 0d 0a 2f 2f .... .........//
00b0: 20 c8 f1 ef ee eb fc e7 ee e2 e0 ed e8 e5 3a 0d .............:.
00c0: 0a 2f 2f 20 ca e0 f1 f2 20 f3 ea e0 e7 e0 f2 e5 .// .... .......
00d0: eb ff 20 ed e0 20 ec e5 f2 ee e4 20 e2 20 ef f0 .. .. ..... . ..
00e0: ee f1 f2 ee e9 20 f2 e8 ef 0d 0a 2f 2f 20 44 57 ..... .....// DW
00f0: 4f 52 44 2a 20 70 46 75 6e 63 20 3d 20 6d 66 5f ORD* pFunc = mf_
0100: 63 61 73 74 3c 44 57 4f 52 44 2a 3e 28 26 43 6c cast<DWORD*>(&Cl
0110: 61 73 73 3a 3a 4d 65 74 68 6f 64 29 3b 0d 0a 2f ass::Method);../
0120: 2f 20 ca e0 f1 f2 20 ef f0 ee f1 f2 ee e3 ee 20 / .... ........
0130: f2 e8 ef e0 20 e2 20 f3 ea e0 e7 e0 f2 e5 eb fc .... . .........
0140: 20 ed e0 20 ec e5 f2 ee e4 0d 0a 2f 2f 20 69 6e .. .......// in
0150: 74 28 43 6c 61 73 73 3a 3a 2a 70 4d 65 6d 46 75 t(Class::*pMemFu
0160: 6e 63 29 28 69 6e 74 2c 20 69 6e 74 29 20 3d 20 nc)(int, int) =
0170: 6d 66 5f 63 61 73 74 3c 69 6e 74 28 43 6c 61 73 mf_cast<int(Clas
0180: 73 3a 3a 2a 29 28 69 6e 74 2c 20 69 6e 74 29 3e s::*)(int, int)>
0190: 28 70 74 72 29 3b 0d 0a 74 65 6d 70 6c 61 74 65 (ptr);..template
01a0: 3c 74 79 70 65 6e 61 6d 65 20 54 2c 20 74 79 70 <typename T, typ
01b0: 65 6e 61 6d 65 20 4b 3e 0d 0a 5f 5f 66 6f 72 63 ename K>..__forc
01c0: 65 69 6e 6c 69 6e 65 20 73 74 61 74 69 63 20 54 einline static T
01d0: 20 6d 66 5f 63 61 73 74 28 63 6f 6e 73 74 20 4b mf_cast(const K
01e0: 26 20 70 74 72 29 0d 0a 7b 0d 0a 09 72 65 74 75 & ptr)..{...retu
01f0: 72 6e 20 2a 72 65 69 6e 74 65 72 70 72 65 74 5f rn *reinterpret_
0200: 63 61 73 74 3c 54 2a 3e 28 26 63 6f 6e 73 74 5f cast<T*>(&const_
0210: 63 61 73 74 3c 4b 26 3e 28 70 74 72 29 29 3b 0d cast<K&>(ptr));.
0220: 0a 7d 0d 0a 0d 0a 2f 2f 20 ca eb e0 f1 f1 20 e4 .}....// ..... .
0230: eb ff 20 ef ee e4 ec e5 ed fb 20 e0 e4 f0 e5 f1 .. ....... .....
0240: e0 20 e2 20 f2 e0 e1 eb e8 f6 e5 20 e2 e8 f0 f2 . . ....... ....
0250: f3 e0 eb fc ed fb f5 20 f4 f3 ed ea f6 e8 e9 0d ....... ........
0260: 0a 63 6c 61 73 73 20 43 54 72 61 70 56 69 72 74 .class CTrapVirt
0270: 75 61 6c 0d 0a 7b 0d 0a 70 75 62 6c 69 63 3a 0d ual..{..public:.
0280: 0a 09 2f 2f 43 54 72 61 70 56 69 72 74 75 61 6c ..//CTrapVirtual
0290: 28 29 3a 09 6d 5f 70 56 74 61 62 6c 65 28 4e 55 ():.m_pVtable(NU
02a0: 4c 4c 29 2c 20 6d 5f 64 77 52 65 61 6c 41 64 72 LL), m_dwRealAdr
02b0: 65 73 73 28 30 29 7b 7d 0d 0a 09 2f 2f 7e 43 54 ess(0){}...//~CT
02c0: 72 61 70 56 69 72 74 75 61 6c 28 29 7b 55 6e 54 rapVirtual(){UnT
02d0: 72 61 70 28 29 3b 7d 0d 0a 09 0d 0a 09 2f 2f 20 rap();}......//
02e0: d3 f1 f2 e0 ed ee e2 ea e0 20 ef e5 f0 e5 f5 e2 ......... ......
02f0: e0 f2 e0 2e 0d 0a 09 2f 2f 20 cd e0 20 e2 f5 ee .......// .. ...
0300: e4 20 ef ee e4 e0 e5 ec 20 f3 ea e0 e7 e0 f2 e5 . ...... .......
0310: eb fc 20 ed e0 20 ee e1 fa e5 ea f2 2c 20 e2 e8 .. .. ......, ..
0320: f0 f2 f3 e0 eb fc ed f3 fe 20 f2 e0 e1 eb e8 f6 ......... ......
0330: f3 20 ea ee f2 ee f0 ee e3 ee 20 e1 f3 e4 e5 ec . ........ .....
0340: 20 e8 f1 ef f0 e0 e2 eb ff f2 fc 2c 0d 0a 09 2f ..........,.../
0350: 2f 20 ed ee ec e5 f0 20 f4 f3 ed ea f6 e8 e8 20 / ..... .......
0360: e2 20 f2 e0 e1 eb e8 f6 e5 2c 20 e8 20 e0 e4 f0 . ......., . ...
0370: e5 f1 20 ed ee e2 ee e9 20 f4 f3 ed ea f6 e8 e8 .. ..... .......
0380: 2e 0d 0a 09 2f 2f 20 c2 c8 d0 d2 d3 c0 cb dc cd ....// .........
0390: c0 df 20 d2 c0 c1 cb c8 d6 c0 20 ce c4 cd c0 20 .. ....... ....
03a0: cd c0 20 ca cb c0 d1 d1 2e 20 cf c5 d0 c5 d5 c2 .. ...... ......
03b0: c0 d2 20 c4 c5 c9 d1 d2 c2 d3 c5 d2 20 cd c0 20 .. ......... ..
03c0: c2 d1 c5 20 ce c1 da c5 ca d2 db 20 dd d2 ce c3 ... ....... ....
03d0: ce 20 ca cb c0 d1 d1 c0 2e 0d 0a 09 74 65 6d 70 . ..........temp
03e0: 6c 61 74 65 3c 74 79 70 65 6e 61 6d 65 20 54 3e late<typename T>
03f0: 0d 0a 09 76 6f 69 64 20 53 65 74 54 72 61 70 28 ...void SetTrap(
0400: 76 6f 69 64 2a 20 70 4f 62 6a 65 63 74 2c 20 69 void* pObject, i
0410: 6e 74 20 6f 66 66 73 65 74 2c 20 54 20 70 46 75 nt offset, T pFu
0420: 6e 63 29 0d 0a 09 7b 0d 0a 09 09 5f 53 65 74 54 nc)...{...._SetT
0430: 72 61 70 28 70 4f 62 6a 65 63 74 2c 20 6f 66 66 rap(pObject, off
0440: 73 65 74 2c 20 2a 72 65 69 6e 74 65 72 70 72 65 set, *reinterpre
0450: 74 5f 63 61 73 74 3c 44 57 4f 52 44 2a 3e 28 26 t_cast<DWORD*>(&
0460: 70 46 75 6e 63 29 29 3b 0d 0a 09 7d 0d 0a 0d 0a pFunc));...}....
0470: 09 74 65 6d 70 6c 61 74 65 3c 74 79 70 65 6e 61 .template<typena
0480: 6d 65 20 54 3e 0d 0a 09 76 6f 69 64 20 47 65 74 me T>...void Get
0490: 41 64 64 72 65 73 73 28 54 26 20 74 29 7b 74 3d Address(T& t){t=
04a0: 2a 72 65 69 6e 74 65 72 70 72 65 74 5f 63 61 73 *reinterpret_cas
04b0: 74 3c 54 2a 3e 28 26 6d 5f 64 77 52 65 61 6c 41 t<T*>(&m_dwRealA
04c0: 64 72 65 73 73 29 3b 7d 0d 0a 09 0d 0a 09 2f 2f dress);}......//
04d0: 20 d1 ed ff f2 e8 e5 20 ef e5 f0 e5 f5 e2 e0 f2 ...... ........
04e0: e0 2e 0d 0a 09 76 6f 69 64 20 55 6e 54 72 61 70 .....void UnTrap
04f0: 28 29 0d 0a 09 7b 0d 0a 09 09 69 66 28 6d 5f 70 ()...{....if(m_p
0500: 56 74 61 62 6c 65 29 0d 0a 09 09 7b 0d 0a 09 09 Vtable)....{....
0510: 09 2a 6d 5f 70 56 74 61 62 6c 65 3d 6d 5f 64 77 .*m_pVtable=m_dw
0520: 52 65 61 6c 41 64 72 65 73 73 3b 0d 0a 09 09 09 RealAdress;.....
0530: 6d 5f 70 56 74 61 62 6c 65 3d 4e 55 4c 4c 3b 0d m_pVtable=NULL;.
0540: 0a 09 09 7d 0d 0a 09 7d 0d 0a 0d 0a 09 76 6f 69 ...}...}.....voi
0550: 64 20 5f 53 65 74 54 72 61 70 28 76 6f 69 64 2a d _SetTrap(void*
0560: 20 70 4f 62 6a 65 63 74 2c 20 69 6e 74 20 6f 66 pObject, int of
0570: 66 73 65 74 2c 20 44 57 4f 52 44 20 64 77 46 75 fset, DWORD dwFu
0580: 6e 63 74 69 6f 6e 29 0d 0a 09 7b 0d 0a 09 09 6d nction)...{....m
0590: 5f 70 56 74 61 62 6c 65 20 3d 2a 72 65 69 6e 74 _pVtable =*reint
05a0: 65 72 70 72 65 74 5f 63 61 73 74 3c 44 57 4f 52 erpret_cast<DWOR
05b0: 44 2a 2a 3e 28 70 4f 62 6a 65 63 74 29 3b 0d 0a D**>(pObject);..
05c0: 09 09 6d 5f 70 56 74 61 62 6c 65 2b 3d 6f 66 66 ..m_pVtable+=off
05d0: 73 65 74 3b 0d 0a 09 09 44 57 4f 52 44 20 6f 6c set;....DWORD ol
05e0: 64 3b 0d 0a 09 09 56 69 72 74 75 61 6c 50 72 6f d;....VirtualPro
05f0: 74 65 63 74 28 6d 5f 70 56 74 61 62 6c 65 2c 34 tect(m_pVtable,4
0600: 2c 50 41 47 45 5f 45 58 45 43 55 54 45 5f 52 45 ,PAGE_EXECUTE_RE
0610: 41 44 57 52 49 54 45 2c 26 6f 6c 64 29 3b 0d 0a ADWRITE,&old);..
0620: 09 09 6d 5f 64 77 52 65 61 6c 41 64 72 65 73 73 ..m_dwRealAdress
0630: 3d 2a 6d 5f 70 56 74 61 62 6c 65 3b 0d 0a 09 09 =*m_pVtable;....
0640: 2a 6d 5f 70 56 74 61 62 6c 65 3d 64 77 46 75 6e *m_pVtable=dwFun
0650: 63 74 69 6f 6e 3b 0d 0a 09 7d 0d 0a 09 44 57 4f ction;...}...DWO
0660: 52 44 2a 20 6d 5f 70 56 74 61 62 6c 65 3b 0d 0a RD* m_pVtable;..
0670: 09 44 57 4f 52 44 20 20 6d 5f 64 77 52 65 61 6c .DWORD m_dwReal
0680: 41 64 72 65 73 73 3b 0d 0a 7d 3b 0d 0a 0d 0a 74 Adress;..};....t
0690: 79 70 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20 ypedef unsigned
06a0: 5f 5f 69 6e 74 36 34 20 75 69 36 34 3b 0d 0a 0d __int64 ui64;...
06b0: 0a 2f 2f 20 ca eb e0 f1 f1 20 e4 eb ff 20 ef e5 .// ..... ... ..
06c0: f0 e5 f5 e2 e0 f2 e0 20 f4 f3 ed ea f6 e8 e9 20 ....... .......
06d0: ef f3 f2 e5 ec 20 f3 f1 f2 e0 ed ee e2 ea e8 20 ..... .........
06e0: ef e5 f0 e5 f5 ee e4 ed e8 ea e0 20 e2 20 ed e0 ........... . ..
06f0: f7 e0 eb ee 20 f4 f3 ed ea f6 e8 e8 2e 0d 0a 63 .... ..........c
0700: 6c 61 73 73 20 43 54 72 61 70 53 77 61 70 0d 0a lass CTrapSwap..
0710: 7b 0d 0a 70 75 62 6c 69 63 3a 0d 0a 09 2f 2f 43 {..public:...//C
0720: 54 72 61 70 53 77 61 70 28 29 3a 6d 5f 70 46 75 TrapSwap():m_pFu
0730: 6e 63 28 4e 55 4c 4c 29 2c 20 6d 5f 53 77 61 70 nc(NULL), m_Swap
0740: 42 75 66 28 30 29 7b 7d 0d 0a 09 0d 0a 09 74 65 Buf(0){}......te
0750: 6d 70 6c 61 74 65 3c 74 79 70 65 6e 61 6d 65 20 mplate<typename
0760: 54 3e 0d 0a 09 76 6f 69 64 20 53 65 74 54 72 61 T>...void SetTra
0770: 70 42 79 4e 61 6d 65 28 48 49 4e 53 54 41 4e 43 pByName(HINSTANC
0780: 45 20 68 44 6c 6c 2c 20 4c 50 43 53 54 52 20 73 E hDll, LPCSTR s
0790: 74 72 46 75 6e 63 4e 61 6d 65 2c 20 54 20 6e 65 trFuncName, T ne
07a0: 77 46 75 6e 63 29 0d 0a 09 7b 0d 0a 09 09 44 57 wFunc)...{....DW
07b0: 4f 52 44 2a 20 70 46 75 6e 63 3d 72 65 69 6e 74 ORD* pFunc=reint
07c0: 65 72 70 72 65 74 5f 63 61 73 74 3c 44 57 4f 52 erpret_cast<DWOR
07d0: 44 2a 3e 28 47 65 74 50 72 6f 63 41 64 64 72 65 D*>(GetProcAddre
07e0: 73 73 28 68 44 6c 6c 2c 20 73 74 72 46 75 6e 63 ss(hDll, strFunc
07f0: 4e 61 6d 65 29 29 3b 0d 0a 09 09 44 57 4f 52 44 Name));....DWORD
0800: 20 70 4e 65 77 46 75 6e 63 3d 2a 72 65 69 6e 74 pNewFunc=*reint
0810: 65 72 70 72 65 74 5f 63 61 73 74 3c 44 57 4f 52 erpret_cast<DWOR
0820: 44 2a 3e 28 26 6e 65 77 46 75 6e 63 29 3b 0d 0a D*>(&newFunc);..
0830: 09 09 5f 53 65 74 54 72 61 70 28 70 46 75 6e 63 .._SetTrap(pFunc
0840: 2c 20 70 4e 65 77 46 75 6e 63 29 3b 0d 0a 09 7d , pNewFunc);...}
0850: 0d 0a 09 0d 0a 09 74 65 6d 70 6c 61 74 65 3c 74 ......template<t
0860: 79 70 65 6e 61 6d 65 20 54 3e 0d 0a 09 76 6f 69 ypename T>...voi
0870: 64 20 53 65 74 54 72 61 70 42 79 4e 61 6d 65 28 d SetTrapByName(
0880: 4c 50 43 53 54 52 20 73 74 72 44 6c 6c 2c 20 4c LPCSTR strDll, L
0890: 50 43 53 54 52 20 73 74 72 46 75 6e 63 4e 61 6d PCSTR strFuncNam
08a0: 65 2c 20 54 20 6e 65 77 46 75 6e 63 29 0d 0a 09 e, T newFunc)...
08b0: 7b 0d 0a 09 09 53 65 74 54 72 61 70 42 79 4e 61 {....SetTrapByNa
08c0: 6d 65 28 47 65 74 4d 6f 64 75 6c 65 48 61 6e 64 me(GetModuleHand
08d0: 6c 65 28 73 74 72 44 6c 6c 29 2c 20 73 74 72 46 le(strDll), strF
08e0: 75 6e 63 4e 61 6d 65 2c 20 6e 65 77 46 75 6e 63 uncName, newFunc
08f0: 29 3b 0d 0a 09 7d 0d 0a 0d 0a 09 74 65 6d 70 6c );...}.....templ
0900: 61 74 65 3c 74 79 70 65 6e 61 6d 65 20 54 3e 0d ate<typename T>.
0910: 0a 09 76 6f 69 64 20 53 65 74 54 72 61 70 42 79 ..void SetTrapBy
0920: 41 64 64 72 65 73 73 28 44 57 4f 52 44 2a 20 70 Address(DWORD* p
0930: 46 75 6e 63 41 64 64 72 65 73 73 2c 20 54 20 6e FuncAddress, T n
0940: 65 77 46 75 6e 63 29 0d 0a 09 7b 0d 0a 09 09 44 ewFunc)...{....D
0950: 57 4f 52 44 2a 20 70 46 75 6e 63 20 3d 20 70 46 WORD* pFunc = pF
0960: 75 6e 63 41 64 64 72 65 73 73 3b 0d 0a 09 09 44 uncAddress;....D
0970: 57 4f 52 44 20 70 4e 65 77 46 75 6e 63 3d 2a 72 WORD pNewFunc=*r
0980: 65 69 6e 74 65 72 70 72 65 74 5f 63 61 73 74 3c einterpret_cast<
0990: 44 57 4f 52 44 2a 3e 28 26 6e 65 77 46 75 6e 63 DWORD*>(&newFunc
09a0: 29 3b 0d 0a 09 09 5f 53 65 74 54 72 61 70 28 70 );...._SetTrap(p
09b0: 46 75 6e 63 2c 20 70 4e 65 77 46 75 6e 63 29 3b Func, pNewFunc);
09c0: 0d 0a 09 7d 0d 0a 0d 0a 09 74 65 6d 70 6c 61 74 ...}.....templat
09d0: 65 3c 74 79 70 65 6e 61 6d 65 20 54 2c 20 74 79 e<typename T, ty
09e0: 70 65 6e 61 6d 65 20 4d 3e 0d 0a 09 76 6f 69 64 pename M>...void
09f0: 20 53 65 74 54 72 61 70 4f 6e 49 6d 70 6f 72 74 SetTrapOnImport
0a00: 46 75 6e 63 28 54 20 6f 6c 64 46 75 6e 63 2c 20 Func(T oldFunc,
0a10: 4d 20 6e 65 77 46 75 6e 63 29 0d 0a 09 7b 0d 0a M newFunc)...{..
0a20: 09 09 42 59 54 45 2a 20 70 74 72 3d 2a 72 65 69 ..BYTE* ptr=*rei
0a30: 6e 74 65 72 70 72 65 74 5f 63 61 73 74 3c 42 59 nterpret_cast<BY
0a40: 54 45 2a 2a 3e 28 26 6f 6c 64 46 75 6e 63 29 3b TE**>(&oldFunc);
0a50: 0d 0a 09 09 70 74 72 2b 3d 32 3b 0d 0a 09 09 44 ....ptr+=2;....D
0a60: 57 4f 52 44 2a 20 70 46 75 6e 63 3d 2a 2a 72 65 WORD* pFunc=**re
0a70: 69 6e 74 65 72 70 72 65 74 5f 63 61 73 74 3c 44 interpret_cast<D
0a80: 57 4f 52 44 2a 2a 2a 3e 28 70 74 72 29 3b 0d 0a WORD***>(ptr);..
0a90: 09 09 44 57 4f 52 44 20 70 4e 65 77 46 75 6e 63 ..DWORD pNewFunc
0aa0: 3d 2a 72 65 69 6e 74 65 72 70 72 65 74 5f 63 61 =*reinterpret_ca
0ab0: 73 74 3c 44 57 4f 52 44 2a 3e 28 26 6e 65 77 46 st<DWORD*>(&newF
0ac0: 75 6e 63 29 3b 0d 0a 09 09 5f 53 65 74 54 72 61 unc);...._SetTra
0ad0: 70 28 70 46 75 6e 63 2c 20 70 4e 65 77 46 75 6e p(pFunc, pNewFun
0ae0: 63 29 3b 0d 0a 09 7d 0d 0a 0d 0a 09 74 65 6d 70 c);...}.....temp
0af0: 6c 61 74 65 3c 74 79 70 65 6e 61 6d 65 20 54 2c late<typename T,
0b00: 20 74 79 70 65 6e 61 6d 65 20 4d 3e 0d 0a 09 76 typename M>...v
0b10: 6f 69 64 20 53 65 74 54 72 61 70 4f 6e 44 65 63 oid SetTrapOnDec
0b20: 6c 49 6d 70 6f 72 74 46 75 6e 63 28 54 20 6f 6c lImportFunc(T ol
0b30: 64 46 75 6e 63 2c 20 4d 20 6e 65 77 46 75 6e 63 dFunc, M newFunc
0b40: 29 0d 0a 09 7b 0d 0a 09 09 44 57 4f 52 44 2a 20 )...{....DWORD*
0b50: 70 46 75 6e 63 3d 2a 72 65 69 6e 74 65 72 70 72 pFunc=*reinterpr
0b60: 65 74 5f 63 61 73 74 3c 44 57 4f 52 44 2a 2a 3e et_cast<DWORD**>
0b70: 28 26 6f 6c 64 46 75 6e 63 29 3b 0d 0a 09 09 44 (&oldFunc);....D
0b80: 57 4f 52 44 20 70 4e 65 77 46 75 6e 63 3d 2a 72 WORD pNewFunc=*r
0b90: 65 69 6e 74 65 72 70 72 65 74 5f 63 61 73 74 3c einterpret_cast<
0ba0: 44 57 4f 52 44 2a 3e 28 26 6e 65 77 46 75 6e 63 DWORD*>(&newFunc
0bb0: 29 3b 0d 0a 09 09 5f 53 65 74 54 72 61 70 28 70 );...._SetTrap(p
0bc0: 46 75 6e 63 2c 20 70 4e 65 77 46 75 6e 63 29 3b Func, pNewFunc);
0bd0: 0d 0a 09 7d 0d 0a 0d 0a 09 76 6f 69 64 20 53 77 ...}.....void Sw
0be0: 61 70 28 29 0d 0a 09 7b 0d 0a 09 09 75 69 36 34 ap()...{....ui64
0bf0: 20 74 3d 2a 6d 5f 70 46 75 6e 63 3b 0d 0a 09 09 t=*m_pFunc;....
0c00: 2a 6d 5f 70 46 75 6e 63 3d 6d 5f 53 77 61 70 42 *m_pFunc=m_SwapB
0c10: 75 66 3b 0d 0a 09 09 6d 5f 53 77 61 70 42 75 66 uf;....m_SwapBuf
0c20: 3d 74 3b 0d 0a 09 7d 0d 0a 09 76 6f 69 64 20 5f =t;...}...void _
0c30: 53 65 74 54 72 61 70 28 44 57 4f 52 44 2a 20 70 SetTrap(DWORD* p
0c40: 46 75 6e 63 2c 20 44 57 4f 52 44 20 70 4e 65 77 Func, DWORD pNew
0c50: 46 75 6e 63 29 0d 0a 09 7b 0d 0a 09 09 6d 5f 70 Func)...{....m_p
0c60: 46 75 6e 63 3d 72 65 69 6e 74 65 72 70 72 65 74 Func=reinterpret
0c70: 5f 63 61 73 74 3c 75 69 36 34 2a 3e 28 70 46 75 _cast<ui64*>(pFu
0c80: 6e 63 29 3b 0d 0a 09 09 44 57 4f 52 44 20 6f 6c nc);....DWORD ol
0c90: 64 3b 0d 0a 09 09 56 69 72 74 75 61 6c 50 72 6f d;....VirtualPro
0ca0: 74 65 63 74 28 70 46 75 6e 63 2c 20 38 2c 20 50 tect(pFunc, 8, P
0cb0: 41 47 45 5f 45 58 45 43 55 54 45 5f 52 45 41 44 AGE_EXECUTE_READ
0cc0: 57 52 49 54 45 2c 20 26 6f 6c 64 29 3b 0d 0a 09 WRITE, &old);...
0cd0: 09 2f 2f 20 d4 ee f0 ec e8 f0 f3 e5 ec 20 e4 e6 .// ......... ..
0ce0: e0 ec ef 20 ed e0 20 e0 e4 f0 e5 f1 20 ed ee e2 ... .. ..... ...
0cf0: ee e9 20 f4 f3 ed ea f6 e8 e8 0d 0a 09 09 6d 5f .. ...........m_
0d00: 53 77 61 70 42 75 66 20 3d 20 28 73 74 61 74 69 SwapBuf = (stati
0d10: 63 5f 63 61 73 74 3c 75 69 36 34 3e 28 70 4e 65 c_cast<ui64>(pNe
0d20: 77 46 75 6e 63 20 2d 20 72 65 69 6e 74 65 72 70 wFunc - reinterp
0d30: 72 65 74 5f 63 61 73 74 3c 44 57 4f 52 44 3e 28 ret_cast<DWORD>(
0d40: 70 46 75 6e 63 29 2d 35 29 3c 3c 38 29 20 7c 20 pFunc)-5)<<8) |
0d50: 30 78 45 39 3b 0d 0a 09 09 2f 2f 20 c8 20 e2 ef 0xE9;....// . ..
0d60: e8 f1 fb e2 e0 e5 ec 20 e2 20 ed e0 f7 e0 eb ee ....... . ......
0d70: 20 f4 f3 ed ea f6 e8 e8 20 f1 f4 ee f0 ec e8 f0 ....... .......
0d80: ee e2 e0 ed ed fb e9 20 e4 e6 e0 ec ef 0d 0a 09 ....... ........
0d90: 09 53 77 61 70 28 29 3b 0d 0a 09 09 46 6c 75 73 .Swap();....Flus
0da0: 68 49 6e 73 74 72 75 63 74 69 6f 6e 43 61 63 68 hInstructionCach
0db0: 65 28 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 e(GetCurrentProc
0dc0: 65 73 73 28 29 2c 20 6d 5f 70 46 75 6e 63 2c 20 ess(), m_pFunc,
0dd0: 38 29 3b 0d 0a 09 7d 0d 0a 09 75 69 36 34 2a 20 8);...}...ui64*
0de0: 6d 5f 70 46 75 6e 63 3b 0d 0a 09 75 69 36 34 20 m_pFunc;...ui64
0df0: 6d 5f 53 77 61 70 42 75 66 3b 0d 0a 7d 3b 0d 0a m_SwapBuf;..};..
0e00: 0d 0a 0d 0a 73 74 72 75 63 74 20 74 72 61 70 73 ....struct traps
0e10: 77 61 70 65 72 0d 0a 7b 0d 0a 09 43 54 72 61 70 waper..{...CTrap
0e20: 53 77 61 70 26 20 74 72 61 70 3b 0d 0a 09 74 72 Swap& trap;...tr
0e30: 61 70 73 77 61 70 65 72 28 43 54 72 61 70 53 77 apswaper(CTrapSw
0e40: 61 70 26 20 74 29 3a 74 72 61 70 28 74 29 7b 74 ap& t):trap(t){t
0e50: 72 61 70 2e 53 77 61 70 28 29 3b 7d 0d 0a 09 7e rap.Swap();}...~
0e60: 74 72 61 70 73 77 61 70 65 72 28 29 7b 74 72 61 trapswaper(){tra
0e70: 70 2e 53 77 61 70 28 29 3b 7d 0d 0a 7d 3b 0d 0a p.Swap();}..};..
0e80: 0d 0a 0d 0a 2f 2f 57 69 6e 64 6f 77 20 73 75 62 ....//Window sub
0e90: 63 6c 61 73 73 69 6e 67 0d 0a 73 74 72 75 63 74 classing..struct
0ea0: 20 57 6e 64 53 75 62 63 6c 61 73 73 65 72 0d 0a WndSubclasser..
0eb0: 7b 0d 0a 09 23 70 72 61 67 6d 61 20 70 61 63 6b {...#pragma pack
0ec0: 28 70 75 73 68 2c 31 29 0d 0a 09 73 74 72 75 63 (push,1)...struc
0ed0: 74 20 5f 54 68 75 6e 6b 0d 0a 09 7b 0d 0a 09 09 t _Thunk...{....
0ee0: 44 57 4f 52 44 20 20 20 6d 5f 6d 6f 76 3b 20 20 DWORD m_mov;
0ef0: 20 20 20 20 20 20 20 20 2f 2f 20 6d 6f 76 20 64 // mov d
0f00: 77 6f 72 64 20 70 74 72 20 5b 65 73 70 2b 30 78 word ptr [esp+0x
0f10: 34 5d 2c 20 70 54 68 69 73 20 28 65 73 70 2b 30 4], pThis (esp+0
0f20: 78 34 20 69 73 20 68 57 6e 64 29 0d 0a 09 09 44 x4 is hWnd)....D
0f30: 57 4f 52 44 20 20 20 6d 5f 74 68 69 73 3b 20 20 WORD m_this;
0f40: 20 20 20 20 20 20 20 2f 2f 0d 0a 09 09 42 59 54 //....BYT
0f50: 45 20 20 20 20 6d 5f 6a 6d 70 3b 20 20 20 20 20 E m_jmp;
0f60: 20 20 20 20 20 2f 2f 20 6a 6d 70 20 57 6e 64 50 // jmp WndP
0f70: 72 6f 63 0d 0a 09 09 44 57 4f 52 44 20 20 20 6d roc....DWORD m
0f80: 5f 72 65 6c 70 72 6f 63 3b 20 20 20 20 20 20 2f _relproc; /
0f90: 2f 20 72 65 6c 61 74 69 76 65 20 6a 6d 70 0d 0a / relative jmp..
0fa0: 09 7d 20 74 68 75 6e 6b 3b 0d 0a 09 23 70 72 61 .} thunk;...#pra
0fb0: 67 6d 61 20 70 61 63 6b 28 70 6f 70 29 0d 0a 09 gma pack(pop)...
0fc0: 48 57 4e 44 20 6d 5f 68 57 6e 64 3b 0d 0a 09 57 HWND m_hWnd;...W
0fd0: 4e 44 50 52 4f 43 20 6d 5f 70 66 57 6e 64 50 72 NDPROC m_pfWndPr
0fe0: 6f 63 3b 0d 0a 0d 0a 09 74 65 6d 70 6c 61 74 65 oc;.....template
0ff0: 3c 74 79 70 65 6e 61 6d 65 20 54 3e 0d 0a 09 57 <typename T>...W
1000: 6e 64 53 75 62 63 6c 61 73 73 65 72 28 54 2a 20 ndSubclasser(T*
1010: 70 74 72 2c 20 4c 52 45 53 55 4c 54 20 28 43 41 ptr, LRESULT (CA
1020: 4c 4c 42 41 43 4b 20 2a 70 46 75 6e 63 29 28 54 LLBACK *pFunc)(T
1030: 2a 2c 55 49 4e 54 2c 57 50 41 52 41 4d 2c 4c 50 *,UINT,WPARAM,LP
1040: 41 52 41 4d 29 2c 20 48 57 4e 44 20 68 57 69 6e ARAM), HWND hWin
1050: 64 6f 77 29 0d 0a 09 7b 0d 0a 09 09 74 68 75 6e dow)...{....thun
1060: 6b 2e 6d 5f 6d 6f 76 20 3d 20 30 78 30 34 32 34 k.m_mov = 0x0424
1070: 34 34 43 37 3b 20 20 2f 2f 43 37 20 34 34 20 32 44C7; //C7 44 2
1080: 34 20 30 43 0d 0a 09 09 74 68 75 6e 6b 2e 6d 5f 4 0C....thunk.m_
1090: 74 68 69 73 20 3d 20 72 65 69 6e 74 65 72 70 72 this = reinterpr
10a0: 65 74 5f 63 61 73 74 3c 44 57 4f 52 44 3e 28 70 et_cast<DWORD>(p
10b0: 74 72 29 3b 0d 0a 09 09 74 68 75 6e 6b 2e 6d 5f tr);....thunk.m_
10c0: 6a 6d 70 20 3d 20 30 78 45 39 3b 0d 0a 09 09 74 jmp = 0xE9;....t
10d0: 68 75 6e 6b 2e 6d 5f 72 65 6c 70 72 6f 63 20 3d hunk.m_relproc =
10e0: 20 28 69 6e 74 29 70 46 75 6e 63 20 2d 20 28 28 (int)pFunc - ((
10f0: 69 6e 74 29 26 74 68 75 6e 6b 2b 73 69 7a 65 6f int)&thunk+sizeo
1100: 66 28 74 68 75 6e 6b 29 29 3b 0d 0a 09 09 6d 5f f(thunk));....m_
1110: 68 57 6e 64 20 3d 20 68 57 69 6e 64 6f 77 3b 0d hWnd = hWindow;.
1120: 0a 09 09 6d 5f 70 66 57 6e 64 50 72 6f 63 20 3d ...m_pfWndProc =
1130: 20 28 57 4e 44 50 52 4f 43 29 20 53 65 74 57 69 (WNDPROC) SetWi
1140: 6e 64 6f 77 4c 6f 6e 67 28 6d 5f 68 57 6e 64 2c ndowLong(m_hWnd,
1150: 20 47 57 4c 5f 57 4e 44 50 52 4f 43 2c 20 28 4c GWL_WNDPROC, (L
1160: 4f 4e 47 29 74 68 69 73 29 3b 0d 0a 09 7d 0d 0a ONG)this);...}..
1170: 0d 0a 09 74 65 6d 70 6c 61 74 65 3c 74 79 70 65 ...template<type
1180: 6e 61 6d 65 20 54 3e 0d 0a 09 73 74 72 75 63 74 name T>...struct
1190: 20 6a 75 6d 70 65 72 0d 0a 09 7b 0d 0a 09 09 73 jumper...{....s
11a0: 74 61 74 69 63 20 4c 52 45 53 55 4c 54 20 43 41 tatic LRESULT CA
11b0: 4c 4c 42 41 43 4b 20 57 6e 64 50 72 6f 63 28 54 LLBACK WndProc(T
11c0: 2a 20 70 54 68 69 73 2c 20 55 49 4e 54 20 6d 73 * pThis, UINT ms
11d0: 67 2c 20 57 50 41 52 41 4d 20 77 2c 20 4c 50 41 g, WPARAM w, LPA
11e0: 52 41 4d 20 6c 29 0d 0a 09 09 7b 0d 0a 09 09 09 RAM l)....{.....
11f0: 72 65 74 75 72 6e 20 70 54 68 69 73 2d 3e 57 6e return pThis->Wn
1200: 64 50 72 6f 63 28 6d 73 67 2c 20 77 2c 20 6c 29 dProc(msg, w, l)
1210: 3b 0d 0a 09 09 7d 0d 0a 09 7d 3b 0d 0a 09 74 65 ;....}...};...te
1220: 6d 70 6c 61 74 65 3c 74 79 70 65 6e 61 6d 65 20 mplate<typename
1230: 54 3e 0d 0a 09 57 6e 64 53 75 62 63 6c 61 73 73 T>...WndSubclass
1240: 65 72 28 54 2a 20 70 74 72 2c 20 48 57 4e 44 20 er(T* ptr, HWND
1250: 68 57 69 6e 64 6f 77 29 0d 0a 09 7b 0d 0a 09 09 hWindow)...{....
1260: 74 68 75 6e 6b 2e 6d 5f 6d 6f 76 20 3d 20 30 78 thunk.m_mov = 0x
1270: 30 34 32 34 34 34 43 37 3b 20 20 2f 2f 43 37 20 042444C7; //C7
1280: 34 34 20 32 34 20 30 43 0d 0a 09 09 74 68 75 6e 44 24 0C....thun
1290: 6b 2e 6d 5f 74 68 69 73 20 3d 20 72 65 69 6e 74 k.m_this = reint
12a0: 65 72 70 72 65 74 5f 63 61 73 74 3c 44 57 4f 52 erpret_cast<DWOR
12b0: 44 3e 28 70 74 72 29 3b 0d 0a 09 09 74 68 75 6e D>(ptr);....thun
12c0: 6b 2e 6d 5f 6a 6d 70 20 3d 20 30 78 45 39 3b 0d k.m_jmp = 0xE9;.
12d0: 0a 09 09 74 68 75 6e 6b 2e 6d 5f 72 65 6c 70 72 ...thunk.m_relpr
12e0: 6f 63 20 3d 20 28 69 6e 74 29 26 6a 75 6d 70 65 oc = (int)&jumpe
12f0: 72 3c 54 3e 3a 3a 57 6e 64 50 72 6f 63 20 2d 20 r<T>::WndProc -
1300: 28 28 69 6e 74 29 26 74 68 75 6e 6b 2b 73 69 7a ((int)&thunk+siz
1310: 65 6f 66 28 74 68 75 6e 6b 29 29 3b 0d 0a 09 09 eof(thunk));....
1320: 6d 5f 68 57 6e 64 20 3d 20 68 57 69 6e 64 6f 77 m_hWnd = hWindow
1330: 3b 0d 0a 09 09 6d 5f 70 66 57 6e 64 50 72 6f 63 ;....m_pfWndProc
1340: 20 3d 20 28 57 4e 44 50 52 4f 43 29 20 53 65 74 = (WNDPROC) Set
1350: 57 69 6e 64 6f 77 4c 6f 6e 67 28 6d 5f 68 57 6e WindowLong(m_hWn
1360: 64 2c 20 47 57 4c 5f 57 4e 44 50 52 4f 43 2c 20 d, GWL_WNDPROC,
1370: 28 4c 4f 4e 47 29 74 68 69 73 29 3b 0d 0a 09 7d (LONG)this);...}
1380: 0d 0a 0d 0a 09 73 74 61 74 69 63 20 4c 52 45 53 .....static LRES
1390: 55 4c 54 20 43 41 4c 4c 42 41 43 4b 20 4d 79 57 ULT CALLBACK MyW
13a0: 6e 64 50 72 6f 63 28 57 6e 64 53 75 62 63 6c 61 ndProc(WndSubcla
13b0: 73 73 65 72 2a 20 70 54 68 69 73 2c 20 55 49 4e sser* pThis, UIN
13c0: 54 20 6e 4d 65 73 73 61 67 65 2c 20 57 50 41 52 T nMessage, WPAR
13d0: 41 4d 20 77 2c 20 4c 50 41 52 41 4d 20 6c 29 0d AM w, LPARAM l).
13e0: 0a 09 7b 0d 0a 09 09 4c 52 45 53 55 4c 54 20 72 ..{....LRESULT r
13f0: 65 73 20 3d 20 43 61 6c 6c 57 69 6e 64 6f 77 50 es = CallWindowP
1400: 72 6f 63 28 70 54 68 69 73 2d 3e 6d 5f 70 66 57 roc(pThis->m_pfW
1410: 6e 64 50 72 6f 63 2c 20 70 54 68 69 73 2d 3e 6d ndProc, pThis->m
1420: 5f 68 57 6e 64 2c 20 6e 4d 65 73 73 61 67 65 2c _hWnd, nMessage,
1430: 20 77 2c 20 6c 29 3b 0d 0a 09 09 69 66 28 6e 4d w, l);....if(nM
1440: 65 73 73 61 67 65 3d 3d 57 4d 5f 4e 43 44 45 53 essage==WM_NCDES
1450: 54 52 4f 59 29 0d 0a 09 09 09 64 65 6c 65 74 65 TROY).....delete
1460: 20 70 54 68 69 73 3b 0d 0a 09 09 72 65 74 75 72 pThis;....retur
1470: 6e 20 72 65 73 3b 0d 0a 09 7d 0d 0a 0d 0a 09 76 n res;...}.....v
1480: 6f 69 64 20 44 65 74 61 63 68 28 29 0d 0a 09 7b oid Detach()...{
1490: 0d 0a 09 09 69 66 20 28 28 4c 4f 4e 47 29 20 74 ....if ((LONG) t
14a0: 68 69 73 20 3d 3d 20 47 65 74 57 69 6e 64 6f 77 his == GetWindow
14b0: 4c 6f 6e 67 28 6d 5f 68 57 6e 64 2c 20 47 57 4c Long(m_hWnd, GWL
14c0: 5f 57 4e 44 50 52 4f 43 29 29 0d 0a 09 09 7b 0d _WNDPROC))....{.
14d0: 0a 09 09 09 53 65 74 57 69 6e 64 6f 77 4c 6f 6e ....SetWindowLon
14e0: 67 28 6d 5f 68 57 6e 64 2c 20 47 57 4c 5f 57 4e g(m_hWnd, GWL_WN
14f0: 44 50 52 4f 43 2c 20 28 4c 4f 4e 47 29 6d 5f 70 DPROC, (LONG)m_p
1500: 66 57 6e 64 50 72 6f 63 29 3b 0d 0a 09 09 09 64 fWndProc);.....d
1510: 65 6c 65 74 65 20 74 68 69 73 3b 0d 0a 09 09 7d elete this;....}
1520: 0d 0a 09 09 65 6c 73 65 0d 0a 09 09 7b 0d 0a 09 ....else....{...
1530: 09 09 74 68 75 6e 6b 2e 6d 5f 74 68 69 73 20 3d ..thunk.m_this =
1540: 20 72 65 69 6e 74 65 72 70 72 65 74 5f 63 61 73 reinterpret_cas
1550: 74 3c 44 57 4f 52 44 3e 28 74 68 69 73 29 3b 0d t<DWORD>(this);.
1560: 0a 09 09 09 74 68 75 6e 6b 2e 6d 5f 72 65 6c 70 ....thunk.m_relp
1570: 72 6f 63 20 3d 20 28 69 6e 74 29 4d 79 57 6e 64 roc = (int)MyWnd
1580: 50 72 6f 63 20 2d 20 28 28 69 6e 74 29 26 74 68 Proc - ((int)&th
1590: 75 6e 6b 2b 73 69 7a 65 6f 66 28 74 68 75 6e 6b unk+sizeof(thunk
15a0: 29 29 3b 0d 0a 09 09 7d 0d 0a 09 7d 0d 0a 7d 3b ));....}...}..};
15b0: 0d 0a 0d 0a 2f 2a 20 55 53 49 4e 47 20 57 6e 64 ..../* USING Wnd
15c0: 53 75 62 63 6c 61 73 73 65 72 0d 0a 73 74 72 75 Subclasser..stru
15d0: 63 74 20 57 53 5f 43 6c 69 65 6e 74 0d 0a 7b 0d ct WS_Client..{.
15e0: 0a 09 57 53 5f 43 6c 69 65 6e 74 28 29 20 3a 20 ..WS_Client() :
15f0: 70 57 6e 64 53 75 62 63 6c 61 73 73 49 6e 66 6f pWndSubclassInfo
1600: 28 4e 55 4c 4c 29 7b 7d 0d 0a 09 7e 57 53 5f 43 (NULL){}...~WS_C
1610: 6c 69 65 6e 74 28 29 0d 0a 09 7b 0d 0a 09 09 69 lient()...{....i
1620: 66 28 70 57 6e 64 53 75 62 63 6c 61 73 73 49 6e f(pWndSubclassIn
1630: 66 6f 29 0d 0a 09 09 09 70 57 6e 64 53 75 62 63 fo).....pWndSubc
1640: 6c 61 73 73 49 6e 66 6f 2d 3e 44 65 74 61 63 68 lassInfo->Detach
1650: 28 29 3b 0d 0a 09 7d 0d 0a 09 57 6e 64 53 75 62 ();...}...WndSub
1660: 63 6c 61 73 73 65 72 2a 20 70 57 6e 64 53 75 62 classer* pWndSub
1670: 63 6c 61 73 73 49 6e 66 6f 3b 0d 0a 09 0d 0a 09 classInfo;......
1680: 76 6f 69 64 20 41 74 74 61 63 68 54 6f 57 6e 64 void AttachToWnd
1690: 28 48 57 4e 44 20 68 57 6e 64 29 0d 0a 09 7b 0d (HWND hWnd)...{.
16a0: 0a 09 09 69 66 28 70 57 6e 64 53 75 62 63 6c 61 ...if(pWndSubcla
16b0: 73 73 49 6e 66 6f 29 0d 0a 09 09 09 70 57 6e 64 ssInfo).....pWnd
16c0: 53 75 62 63 6c 61 73 73 49 6e 66 6f 2d 3e 44 65 SubclassInfo->De
16d0: 74 61 63 68 28 29 3b 0d 0a 09 09 70 57 6e 64 53 tach();....pWndS
16e0: 75 62 63 6c 61 73 73 49 6e 66 6f 20 3d 20 6e 65 ubclassInfo = ne
16f0: 77 20 57 6e 64 53 75 62 63 6c 61 73 73 65 72 28 w WndSubclasser(
1700: 74 68 69 73 2c 20 26 57 53 5f 43 6c 69 65 6e 74 this, &WS_Client
1710: 3a 3a 4d 79 57 6e 64 50 72 6f 63 2c 20 68 57 6e ::MyWndProc, hWn
1720: 64 29 3b 0d 0a 09 7d 0d 0a 0d 0a 09 4c 52 45 53 d);...}.....LRES
1730: 55 4c 54 20 43 6c 61 73 73 57 6e 64 50 72 6f 63 ULT ClassWndProc
1740: 28 55 49 4e 54 20 6d 73 67 2c 20 57 50 41 52 41 (UINT msg, WPARA
1750: 4d 20 77 2c 20 4c 50 41 52 41 4d 20 6c 29 0d 0a M w, LPARAM l)..
1760: 09 7b 0d 0a 09 09 72 65 74 75 72 6e 20 43 61 6c .{....return Cal
1770: 6c 57 69 6e 64 6f 77 50 72 6f 63 28 70 57 6e 64 lWindowProc(pWnd
1780: 53 75 62 63 6c 61 73 73 49 6e 66 6f 2d 3e 6d 5f SubclassInfo->m_
1790: 70 66 57 6e 64 50 72 6f 63 2c 20 70 57 6e 64 53 pfWndProc, pWndS
17a0: 75 62 63 6c 61 73 73 49 6e 66 6f 2d 3e 6d 5f 68 ubclassInfo->m_h
17b0: 57 6e 64 2c 20 6d 73 67 2c 20 77 2c 20 6c 29 3b Wnd, msg, w, l);
17c0: 0d 0a 09 7d 0d 0a 0d 0a 09 73 74 61 74 69 63 20 ...}.....static
17d0: 4c 52 45 53 55 4c 54 20 43 41 4c 4c 42 41 43 4b LRESULT CALLBACK
17e0: 20 4d 79 57 6e 64 50 72 6f 63 28 57 53 5f 43 6c MyWndProc(WS_Cl
17f0: 69 65 6e 74 2a 20 70 74 72 2c 20 55 49 4e 54 20 ient* ptr, UINT
1800: 6d 73 67 2c 20 57 50 41 52 41 4d 20 77 2c 20 4c msg, WPARAM w, L
1810: 50 41 52 41 4d 20 6c 29 0d 0a 09 7b 0d 0a 09 09 PARAM l)...{....
1820: 72 65 74 75 72 6e 20 70 74 72 2d 3e 43 6c 61 73 return ptr->Clas
1830: 73 57 6e 64 50 72 6f 63 28 6d 73 67 2c 20 77 2c sWndProc(msg, w,
1840: 20 6c 29 3b 0d 0a 09 7d 0d 0a 7d 3b 0d 0a 2a 2f l);...}..};..*/
1850: 0d 0a 0d 0a 2f 2a 0d 0a cf e5 f0 e5 f5 e2 e0 f2 ..../*..........
1860: 20 6d 73 67 6d 61 70 20 e2 f1 e5 f5 20 ee ea ee msgmap .... ...
1870: ed 20 ee e4 ed ee e3 ee 20 ea eb e0 f1 f1 e0 2e . ...... .......
1880: 0d 0a c4 eb ff 20 fd f2 ee e3 ee 20 e2 ee e7 fc ..... ..... ....
1890: ec e5 ec 20 ea e0 f0 f2 f3 20 ee f1 ed ee e2 ed ... ..... ......
18a0: ee e3 ee 20 ee ea ed e0 2c 20 f1 e2 ee fe 20 ea ... ...., .... .
18b0: e0 f0 f2 f3 2c 20 e8 20 ef e5 f0 e5 f1 f2 e0 e2 ...., . ........
18c0: e8 ec 0d 0a e2 20 ed e8 f5 20 6c 70 45 6e 74 72 ..... ... lpEntr
18d0: 69 65 73 2e 20 d2 e0 ea e6 e5 20 70 66 6e 47 65 ies. ..... pfnGe
18e0: 74 42 61 73 65 4d 61 70 20 e8 e7 20 ea e0 f0 f2 tBaseMap .. ....
18f0: fb 20 ee f1 ed ee e2 ed ee e3 ee 20 ee ea ed e0 . ......... ....
1900: 0d 0a ef e5 f0 e5 ef e8 f8 e5 ec 20 e2 20 f1 e2 ........... . ..
1910: ee fe 20 ea e0 f0 f2 f3 2c 20 e0 20 e2 20 ee f1 .. ....., . . ..
1920: ed ee e2 ed ee ec 20 ee ea ed e5 20 e2 ec e5 f1 ...... .... ....
1930: f2 ee 20 ed e5 e5 20 ef f0 ee ef e8 f8 e5 ec 20 .. ... ........
1940: e0 e4 f0 e5 f1 0d 0a f4 f3 ed ea f6 e8 e8 2c 20 ..............,
1950: e2 ee e7 f0 e0 f9 e0 fe f9 e5 e9 20 ed e0 f8 f3 ........... ....
1960: 20 ea e0 f0 f2 f3 2e 0d 0a 2a 2f 0d 0a 0d 0a 63 ........*/....c
1970: 6c 61 73 73 20 43 4d 73 67 4d 61 70 54 72 61 70 lass CMsgMapTrap
1980: 42 61 73 65 09 2f 2f 20 c1 e0 e7 ee e2 fb e9 20 Base.// .......
1990: ea eb e0 f1 f1 20 e4 eb ff 20 f8 e0 e1 eb ee ed ..... ... ......
19a0: ed fb f5 20 ea eb e0 f1 f1 ee e2 0d 0a 7b 0d 0a ... .........{..
19b0: 70 72 6f 74 65 63 74 65 64 3a 0d 0a 09 73 74 61 protected:...sta
19c0: 74 69 63 20 76 6f 69 64 20 5f 53 65 74 54 72 61 tic void _SetTra
19d0: 70 28 41 46 58 5f 4d 53 47 4d 41 50 2a 20 70 54 p(AFX_MSGMAP* pT
19e0: 72 61 70 4d 61 70 2c 20 41 46 58 5f 4d 53 47 4d rapMap, AFX_MSGM
19f0: 41 50 2a 20 70 4e 65 77 4d 61 70 2c 20 63 6f 6e AP* pNewMap, con
1a00: 73 74 20 41 46 58 5f 4d 53 47 4d 41 50 2a 20 28 st AFX_MSGMAP* (
1a10: 50 41 53 43 41 4c 2a 20 70 66 6e 47 65 74 42 61 PASCAL* pfnGetBa
1a20: 73 65 4d 61 70 29 28 29 29 0d 0a 09 7b 0d 0a 09 seMap)())...{...
1a30: 09 44 57 4f 52 44 20 6f 6c 64 3b 0d 0a 09 09 56 .DWORD old;....V
1a40: 69 72 74 75 61 6c 50 72 6f 74 65 63 74 28 70 54 irtualProtect(pT
1a50: 72 61 70 4d 61 70 2c 20 73 69 7a 65 6f 66 28 41 rapMap, sizeof(A
1a60: 46 58 5f 4d 53 47 4d 41 50 29 2c 20 50 41 47 45 FX_MSGMAP), PAGE
1a70: 5f 45 58 45 43 55 54 45 5f 52 45 41 44 57 52 49 _EXECUTE_READWRI
1a80: 54 45 2c 20 26 6f 6c 64 29 3b 0d 0a 09 09 56 69 TE, &old);....Vi
1a90: 72 74 75 61 6c 50 72 6f 74 65 63 74 28 70 4e 65 rtualProtect(pNe
1aa0: 77 4d 61 70 2c 20 20 73 69 7a 65 6f 66 28 41 46 wMap, sizeof(AF
1ab0: 58 5f 4d 53 47 4d 41 50 29 2c 20 50 41 47 45 5f X_MSGMAP), PAGE_
1ac0: 45 58 45 43 55 54 45 5f 52 45 41 44 57 52 49 54 EXECUTE_READWRIT
1ad0: 45 2c 20 26 6f 6c 64 29 3b 0d 0a 09 09 41 46 58 E, &old);....AFX
1ae0: 5f 4d 53 47 4d 41 50 5f 45 4e 54 52 59 2a 20 70 _MSGMAP_ENTRY* p
1af0: 54 65 6d 70 20 3d 20 28 41 46 58 5f 4d 53 47 4d Temp = (AFX_MSGM
1b00: 41 50 5f 45 4e 54 52 59 2a 29 20 70 54 72 61 70 AP_ENTRY*) pTrap
1b10: 4d 61 70 2d 3e 6c 70 45 6e 74 72 69 65 73 3b 0d Map->lpEntries;.
1b20: 0a 09 09 70 54 72 61 70 4d 61 70 2d 3e 6c 70 45 ...pTrapMap->lpE
1b30: 6e 74 72 69 65 73 20 3d 20 70 4e 65 77 4d 61 70 ntries = pNewMap
1b40: 2d 3e 6c 70 45 6e 74 72 69 65 73 3b 0d 0a 09 09 ->lpEntries;....
1b50: 70 4e 65 77 4d 61 70 2d 3e 6c 70 45 6e 74 72 69 pNewMap->lpEntri
1b60: 65 73 20 3d 20 70 54 65 6d 70 3b 0d 0a 09 09 70 es = pTemp;....p
1b70: 4e 65 77 4d 61 70 2d 3e 70 66 6e 47 65 74 42 61 NewMap->pfnGetBa
1b80: 73 65 4d 61 70 20 3d 20 70 54 72 61 70 4d 61 70 seMap = pTrapMap
1b90: 2d 3e 70 66 6e 47 65 74 42 61 73 65 4d 61 70 3b ->pfnGetBaseMap;
1ba0: 0d 0a 09 09 70 54 72 61 70 4d 61 70 2d 3e 70 66 ....pTrapMap->pf
1bb0: 6e 47 65 74 42 61 73 65 4d 61 70 20 3d 20 70 66 nGetBaseMap = pf
1bc0: 6e 47 65 74 42 61 73 65 4d 61 70 3b 0d 0a 09 7d nGetBaseMap;...}
1bd0: 0d 0a 09 73 74 61 74 69 63 20 41 46 58 5f 50 4d ...static AFX_PM
1be0: 53 47 20 46 69 6e 64 52 65 61 6c 48 61 6e 64 6c SG FindRealHandl
1bf0: 65 72 28 55 49 4e 54 20 6e 4d 65 73 73 61 67 65 er(UINT nMessage
1c00: 2c 20 41 46 58 5f 4d 53 47 4d 41 50 2a 20 70 4d , AFX_MSGMAP* pM
1c10: 61 70 29 0d 0a 09 7b 0d 0a 09 09 41 46 58 5f 4d ap)...{....AFX_M
1c20: 53 47 4d 41 50 5f 45 4e 54 52 59 2a 20 70 45 6e SGMAP_ENTRY* pEn
1c30: 74 72 79 3b 0d 0a 09 09 77 68 69 6c 65 28 70 4d try;....while(pM
1c40: 61 70 29 0d 0a 09 09 7b 0d 0a 09 09 09 70 45 6e ap)....{.....pEn
1c50: 74 72 79 3d 28 41 46 58 5f 4d 53 47 4d 41 50 5f try=(AFX_MSGMAP_
1c60: 45 4e 54 52 59 2a 29 70 4d 61 70 2d 3e 6c 70 45 ENTRY*)pMap->lpE
1c70: 6e 74 72 69 65 73 3b 0d 0a 09 09 09 77 68 69 6c ntries;.....whil
1c80: 65 28 70 45 6e 74 72 79 2d 3e 6e 4d 65 73 73 61 e(pEntry->nMessa
1c90: 67 65 29 0d 0a 09 09 09 7b 0d 0a 09 09 09 09 69 ge).....{......i
1ca0: 66 28 70 45 6e 74 72 79 2d 3e 6e 4d 65 73 73 61 f(pEntry->nMessa
1cb0: 67 65 3d 3d 6e 4d 65 73 73 61 67 65 29 0d 0a 09 ge==nMessage)...
1cc0: 09 09 09 09 72 65 74 75 72 6e 20 70 45 6e 74 72 ....return pEntr
1cd0: 79 2d 3e 70 66 6e 3b 0d 0a 09 09 09 09 70 45 6e y->pfn;......pEn
1ce0: 74 72 79 2b 2b 3b 0d 0a 09 09 09 7d 0d 0a 09 09 try++;.....}....
1cf0: 09 70 4d 61 70 3d 28 41 46 58 5f 4d 53 47 4d 41 .pMap=(AFX_MSGMA
1d00: 50 2a 29 70 4d 61 70 2d 3e 70 66 6e 47 65 74 42 P*)pMap->pfnGetB
1d10: 61 73 65 4d 61 70 28 29 3b 0d 0a 09 09 7d 0d 0a aseMap();....}..
1d20: 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0d 0a ..return NULL;..
1d30: 09 7d 0d 0a 09 73 74 61 74 69 63 20 41 46 58 5f .}...static AFX_
1d40: 50 4d 53 47 20 46 69 6e 64 52 65 61 6c 48 61 6e PMSG FindRealHan
1d50: 64 6c 65 72 28 55 49 4e 54 20 6e 4d 65 73 73 61 dler(UINT nMessa
1d60: 67 65 2c 20 55 49 4e 54 20 6e 43 6f 64 65 2c 20 ge, UINT nCode,
1d70: 55 49 4e 54 20 6e 49 44 2c 20 55 49 4e 54 20 6e UINT nID, UINT n
1d80: 4c 61 73 74 49 44 2c 20 41 46 58 5f 4d 53 47 4d LastID, AFX_MSGM
1d90: 41 50 2a 20 70 4d 61 70 29 0d 0a 09 7b 0d 0a 09 AP* pMap)...{...
1da0: 09 41 46 58 5f 4d 53 47 4d 41 50 5f 45 4e 54 52 .AFX_MSGMAP_ENTR
1db0: 59 2a 20 70 45 6e 74 72 79 3b 0d 0a 09 09 77 68 Y* pEntry;....wh
1dc0: 69 6c 65 28 70 4d 61 70 29 0d 0a 09 09 7b 0d 0a ile(pMap)....{..
1dd0: 09 09 09 70 45 6e 74 72 79 3d 28 41 46 58 5f 4d ...pEntry=(AFX_M
1de0: 53 47 4d 41 50 5f 45 4e 54 52 59 2a 29 70 4d 61 SGMAP_ENTRY*)pMa
1df0: 70 2d 3e 6c 70 45 6e 74 72 69 65 73 3b 0d 0a 09 p->lpEntries;...
1e00: 09 09 77 68 69 6c 65 28 70 45 6e 74 72 79 2d 3e ..while(pEntry->
1e10: 6e 4d 65 73 73 61 67 65 29 0d 0a 09 09 09 7b 0d nMessage).....{.
1e20: 0a 09 09 09 09 69 66 28 70 45 6e 74 72 79 2d 3e .....if(pEntry->
1e30: 6e 4d 65 73 73 61 67 65 3d 3d 6e 4d 65 73 73 61 nMessage==nMessa
1e40: 67 65 20 26 26 20 70 45 6e 74 72 79 2d 3e 6e 43 ge && pEntry->nC
1e50: 6f 64 65 20 3d 3d 20 6e 43 6f 64 65 0d 0a 09 09 ode == nCode....
1e60: 09 09 09 26 26 20 70 45 6e 74 72 79 2d 3e 6e 49 ...&& pEntry->nI
1e70: 44 20 3e 3d 20 6e 49 44 20 26 26 20 70 45 6e 74 D >= nID && pEnt
1e80: 72 79 2d 3e 6e 4c 61 73 74 49 44 20 3c 3d 20 6e ry->nLastID <= n
1e90: 4c 61 73 74 49 44 29 0d 0a 09 09 09 09 09 72 65 LastID).......re
1ea0: 74 75 72 6e 20 70 45 6e 74 72 79 2d 3e 70 66 6e turn pEntry->pfn
1eb0: 3b 0d 0a 09 09 09 09 70 45 6e 74 72 79 2b 2b 3b ;......pEntry++;
1ec0: 0d 0a 09 09 09 7d 0d 0a 09 09 09 70 4d 61 70 3d .....}.....pMap=
1ed0: 28 41 46 58 5f 4d 53 47 4d 41 50 2a 29 70 4d 61 (AFX_MSGMAP*)pMa
1ee0: 70 2d 3e 70 66 6e 47 65 74 42 61 73 65 4d 61 70 p->pfnGetBaseMap
1ef0: 28 29 3b 0d 0a 09 09 7d 0d 0a 09 7d 0d 0a 7d 3b ();....}...}..};
1f00: 0d 0a 0d 0a 74 65 6d 70 6c 61 74 65 3c 74 79 70 ....template<typ
1f10: 65 6e 61 6d 65 20 54 3e 0d 0a 63 6c 61 73 73 20 ename T>..class
1f20: 43 4d 73 67 4d 61 70 54 72 61 70 20 3a 20 70 75 CMsgMapTrap : pu
1f30: 62 6c 69 63 20 43 4d 73 67 4d 61 70 54 72 61 70 blic CMsgMapTrap
1f40: 42 61 73 65 0d 0a 7b 0d 0a 70 72 6f 74 65 63 74 Base..{..protect
1f50: 65 64 3a 0d 0a 09 73 74 72 75 63 74 20 77 6e 64 ed:...struct wnd
1f60: 5f 67 65 74 5f 6d 61 70 20 3a 20 70 75 62 6c 69 _get_map : publi
1f70: 63 20 54 0d 0a 09 7b 0d 0a 09 09 41 46 58 5f 4d c T...{....AFX_M
1f80: 53 47 4d 41 50 2a 20 47 65 74 4d 61 70 28 29 20 SGMAP* GetMap()
1f90: 7b 72 65 74 75 72 6e 20 63 6f 6e 73 74 5f 63 61 {return const_ca
1fa0: 73 74 3c 41 46 58 5f 4d 53 47 4d 41 50 2a 3e 28 st<AFX_MSGMAP*>(
1fb0: 47 65 74 4d 65 73 73 61 67 65 4d 61 70 28 29 29 GetMessageMap())
1fc0: 3b 7d 0d 0a 09 09 73 74 61 74 69 63 20 41 46 58 ;}....static AFX
1fd0: 5f 4d 53 47 4d 41 50 2a 20 47 65 74 54 4d 61 70 _MSGMAP* GetTMap
1fe0: 28 29 7b 72 65 74 75 72 6e 20 63 6f 6e 73 74 5f (){return const_
1ff0: 63 61 73 74 3c 41 46 58 5f 4d 53 47 4d 41 50 2a cast<AFX_MSGMAP*
2000: 3e 28 26 54 3a 3a 6d 65 73 73 61 67 65 4d 61 70 >(&T::messageMap
2010: 29 3b 7d 0d 0a 09 7d 3b 0d 0a 09 73 74 61 74 69 );}...};...stati
2020: 63 20 63 6f 6e 73 74 20 41 46 58 5f 4d 53 47 4d c const AFX_MSGM
2030: 41 50 2a 20 50 41 53 43 41 4c 20 47 65 74 42 61 AP* PASCAL GetBa
2040: 73 65 28 29 20 7b 20 72 65 74 75 72 6e 20 77 6e se() { return wn
2050: 64 5f 67 65 74 5f 6d 61 70 3a 3a 47 65 74 54 4d d_get_map::GetTM
2060: 61 70 28 29 3b 20 7d 0d 0a 70 75 62 6c 69 63 3a ap(); }..public:
2070: 0d 0a 09 73 74 61 74 69 63 20 76 6f 69 64 20 53 ...static void S
2080: 65 74 54 72 61 70 28 43 57 6e 64 2a 20 70 57 6e etTrap(CWnd* pWn
2090: 64 29 0d 0a 09 7b 0d 0a 09 09 5f 53 65 74 54 72 d)...{...._SetTr
20a0: 61 70 28 73 74 61 74 69 63 5f 63 61 73 74 3c 77 ap(static_cast<w
20b0: 6e 64 5f 67 65 74 5f 6d 61 70 2a 3e 28 70 57 6e nd_get_map*>(pWn
20c0: 64 29 2d 3e 47 65 74 4d 61 70 28 29 2c 20 77 6e d)->GetMap(), wn
20d0: 64 5f 67 65 74 5f 6d 61 70 3a 3a 47 65 74 54 4d d_get_map::GetTM
20e0: 61 70 28 29 2c 0d 0a 09 09 09 26 43 4d 73 67 4d ap(),.....&CMsgM
20f0: 61 70 54 72 61 70 3c 54 3e 3a 3a 47 65 74 42 61 apTrap<T>::GetBa
2100: 73 65 29 3b 0d 0a 09 7d 0d 0a 09 74 65 6d 70 6c se);...}...templ
2110: 61 74 65 3c 74 79 70 65 6e 61 6d 65 20 4b 3e 0d ate<typename K>.
2120: 0a 09 73 74 61 74 69 63 20 76 6f 69 64 20 46 69 ..static void Fi
2130: 6e 64 48 61 6e 64 6c 65 72 28 55 49 4e 54 20 6e ndHandler(UINT n
2140: 4d 65 73 73 61 67 65 2c 20 4b 26 20 70 48 61 6e Message, K& pHan
2150: 64 6c 65 72 29 0d 0a 09 7b 0d 0a 09 09 41 46 58 dler)...{....AFX
2160: 5f 50 4d 53 47 20 70 4d 73 67 20 3d 20 46 69 6e _PMSG pMsg = Fin
2170: 64 52 65 61 6c 48 61 6e 64 6c 65 72 28 6e 4d 65 dRealHandler(nMe
2180: 73 73 61 67 65 2c 20 77 6e 64 5f 67 65 74 5f 6d ssage, wnd_get_m
2190: 61 70 3a 3a 47 65 74 54 4d 61 70 28 29 29 3b 0d ap::GetTMap());.
21a0: 0a 09 09 70 48 61 6e 64 6c 65 72 20 3d 20 2a 72 ...pHandler = *r
21b0: 65 69 6e 74 65 72 70 72 65 74 5f 63 61 73 74 3c einterpret_cast<
21c0: 4b 2a 3e 28 26 70 4d 73 67 29 3b 0d 0a 09 7d 0d K*>(&pMsg);...}.
21d0: 0a 09 74 65 6d 70 6c 61 74 65 3c 74 79 70 65 6e ..template<typen
21e0: 61 6d 65 20 4b 3e 0d 0a 09 73 74 61 74 69 63 20 ame K>...static
21f0: 76 6f 69 64 20 46 69 6e 64 48 61 6e 64 6c 65 72 void FindHandler
2200: 28 55 49 4e 54 20 6e 4d 65 73 73 61 67 65 2c 20 (UINT nMessage,
2210: 55 49 4e 54 20 6e 43 6f 64 65 2c 20 55 49 4e 54 UINT nCode, UINT
2220: 20 6e 49 44 2c 20 55 49 4e 54 20 6e 4c 61 73 74 nID, UINT nLast
2230: 49 44 2c 20 4b 26 20 70 48 61 6e 64 6c 65 72 29 ID, K& pHandler)
2240: 0d 0a 09 7b 0d 0a 09 09 70 48 61 6e 64 6c 65 72 ...{....pHandler
2250: 20 3d 20 2a 72 65 69 6e 74 65 72 70 72 65 74 5f = *reinterpret_
2260: 63 61 73 74 3c 4b 2a 3e 28 46 69 6e 64 52 65 61 cast<K*>(FindRea
2270: 6c 48 61 6e 64 6c 65 72 28 6e 4d 65 73 73 61 67 lHandler(nMessag
2280: 65 2c 20 6e 43 6f 64 65 2c 20 6e 49 44 2c 20 6e e, nCode, nID, n
2290: 4c 61 73 74 49 44 2c 20 77 6e 64 5f 67 65 74 5f LastID, wnd_get_
22a0: 6d 61 70 3a 3a 47 65 74 54 4d 61 70 28 29 29 29 map::GetTMap()))
22b0: 3b 0d 0a 09 7d 0d 0a 7d 3b 0d 0a 0d 0a 0d 0a 0d ;...}..};.......
22c0: 0a 2f 2a 0d 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ./*..///////////
22d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
22e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
22f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
2300: 2f 2f 2f 2f 2f 2f 2f 0d 0a 54 52 41 50 5f 48 45 ///////..TRAP_HE
2310: 41 44 45 52 28 43 53 68 65 65 74 56 69 65 77 5f ADER(CSheetView_
2320: 4f 6e 4c 42 75 74 74 6f 6e 44 62 6c 43 6c 6b 2c OnLButtonDblClk,
2330: 20 43 56 37 54 61 62 6c 65 44 6f 63 4d 61 6e 61 CV7TableDocMana
2340: 67 65 72 2c 20 43 53 68 65 65 74 44 6f 63 2c 20 ger, CSheetDoc,
2350: 22 6d 6f 78 65 6c 2e 64 6c 6c 22 2c 20 22 3f 4f "moxel.dll", "?O
2360: 6e 4c 42 75 74 74 6f 6e 44 62 6c 43 6c 6b 40 43 nLButtonDblClk@C
2370: 53 68 65 65 74 56 69 65 77 40 40 49 41 45 58 49 SheetView@@IAEXI
2380: 56 43 50 6f 69 6e 74 40 40 40 5a 22 2c 20 76 6f VCPoint@@@Z", vo
2390: 69 64 29 28 55 49 4e 54 2c 20 43 50 6f 69 6e 74 id)(UINT, CPoint
23a0: 29 3b 0d 0a 2f 2f 20 c4 ee f1 f2 f3 ef 20 ea 20 );..// ...... .
23b0: ef e5 f0 e5 f5 e2 e0 f2 f7 e8 ea f3 20 e8 20 f2 ............ . .
23c0: ef 0d 0a 43 53 68 65 65 74 56 69 65 77 4f 6e 4c ...CSheetViewOnL
23d0: 42 75 74 74 6f 6e 44 6f 77 6e 3a 3a 74 72 61 70 ButtonDown::trap
23e0: 70 65 72 28 29 0d 0a 43 53 68 65 65 74 56 69 65 per()..CSheetVie
23f0: 77 4f 6e 4c 42 75 74 74 6f 6e 44 6f 77 6e 3a 3a wOnLButtonDown::
2400: 6d 61 70 70 65 72 28 29 0d 0a 43 53 68 65 65 74 mapper()..CSheet
2410: 56 69 65 77 4f 6e 4c 42 75 74 74 6f 6e 44 6f 77 ViewOnLButtonDow
2420: 6e 3a 3a 69 73 54 72 61 70 28 29 0d 0a 2a 2f 0d n::isTrap()..*/.
2430: 0a 23 64 65 66 69 6e 65 20 54 52 41 50 5f 48 45 .#define TRAP_HE
2440: 41 44 45 52 28 66 75 6e 63 4e 61 6d 65 2c 20 54 ADER(funcName, T
2450: 68 69 73 54 79 70 65 5f 6d 61 70 4b 45 59 2c 20 hisType_mapKEY,
2460: 6d 61 70 56 41 4c 2c 20 64 6c 6c 4e 61 6d 65 2c mapVAL, dllName,
2470: 20 64 65 63 6f 72 4e 61 6d 65 2c 20 72 65 74 54 decorName, retT
2480: 79 70 65 29 5c 0d 0a 73 74 72 75 63 74 20 66 75 ype)\..struct fu
2490: 6e 63 4e 61 6d 65 7b 5c 0d 0a 09 74 79 70 65 64 ncName{\...typed
24a0: 65 66 20 43 4d 61 70 3c 54 68 69 73 54 79 70 65 ef CMap<ThisType
24b0: 5f 6d 61 70 4b 45 59 2a 2c 20 54 68 69 73 54 79 _mapKEY*, ThisTy
24c0: 70 65 5f 6d 61 70 4b 45 59 2a 2c 20 6d 61 70 56 pe_mapKEY*, mapV
24d0: 41 4c 2a 2c 20 6d 61 70 56 41 4c 2a 3e 20 74 72 AL*, mapVAL*> tr
24e0: 61 70 6d 61 70 3b 5c 0d 0a 09 73 74 61 74 69 63 apmap;\...static
24f0: 20 43 54 72 61 70 53 77 61 70 26 20 20 74 72 61 CTrapSwap& tra
2500: 70 70 65 72 28 29 7b 73 74 61 74 69 63 20 43 54 pper(){static CT
2510: 72 61 70 53 77 61 70 20 74 72 3b 20 72 65 74 75 rapSwap tr; retu
2520: 72 6e 20 74 72 3b 7d 5c 0d 0a 09 73 74 61 74 69 rn tr;}\...stati
2530: 63 20 74 72 61 70 6d 61 70 26 20 6d 61 70 70 65 c trapmap& mappe
2540: 72 28 29 7b 73 74 61 74 69 63 20 74 72 61 70 6d r(){static trapm
2550: 61 70 20 6d 3b 72 65 74 75 72 6e 20 6d 3b 7d 5c ap m;return m;}\
2560: 0d 0a 09 73 74 61 74 69 63 20 42 4f 4f 4c 26 20 ...static BOOL&
2570: 69 73 54 72 61 70 28 29 7b 73 74 61 74 69 63 20 isTrap(){static
2580: 42 4f 4f 4c 20 66 3b 72 65 74 75 72 6e 20 66 3b BOOL f;return f;
2590: 7d 5c 0d 0a 09 73 74 61 74 69 63 20 76 6f 69 64 }\...static void
25a0: 20 57 72 61 70 28 54 68 69 73 54 79 70 65 5f 6d Wrap(ThisType_m
25b0: 61 70 4b 45 59 2a 20 70 4b 65 79 2c 20 6d 61 70 apKEY* pKey, map
25c0: 56 41 4c 2a 20 70 56 61 6c 29 7b 5c 0d 0a 09 09 VAL* pVal){\....
25d0: 69 66 28 21 69 73 54 72 61 70 28 29 29 7b 5c 0d if(!isTrap()){\.
25e0: 0a 09 09 09 74 72 61 70 70 65 72 28 29 2e 53 65 ....trapper().Se
25f0: 74 54 72 61 70 42 79 4e 61 6d 65 28 64 6c 6c 4e tTrapByName(dllN
2600: 61 6d 65 2c 20 64 65 63 6f 72 4e 61 6d 65 2c 20 ame, decorName,
2610: 26 54 68 69 73 54 79 70 65 5f 6d 61 70 4b 45 59 &ThisType_mapKEY
2620: 3a 3a 23 23 66 75 6e 63 4e 61 6d 65 29 3b 5c 0d ::##funcName);\.
2630: 0a 09 09 09 69 73 54 72 61 70 28 29 20 3d 20 54 ....isTrap() = T
2640: 52 55 45 3b 7d 5c 0d 0a 09 09 6d 61 70 70 65 72 RUE;}\....mapper
2650: 28 29 5b 70 4b 65 79 5d 20 3d 20 70 56 61 6c 3b ()[pKey] = pVal;
2660: 7d 5c 0d 0a 09 73 74 61 74 69 63 20 76 6f 69 64 }\...static void
2670: 20 55 6e 57 72 61 70 28 54 68 69 73 54 79 70 65 UnWrap(ThisType
2680: 5f 6d 61 70 4b 45 59 2a 20 70 4b 65 79 29 7b 6d _mapKEY* pKey){m
2690: 61 70 70 65 72 28 29 2e 52 65 6d 6f 76 65 4b 65 apper().RemoveKe
26a0: 79 28 70 4b 65 79 29 3b 7d 3b 5c 0d 0a 7d 3b 5c y(pKey);};\..};\
26b0: 0d 0a 66 72 69 65 6e 64 20 73 74 72 75 63 74 20 ..friend struct
26c0: 66 75 6e 63 4e 61 6d 65 3b 5c 0d 0a 72 65 74 54 funcName;\..retT
26d0: 79 70 65 20 66 75 6e 63 4e 61 6d 65 0d 0a ype funcName..