Hex Artifact Content Вы: nobody
Вход

Artifact e6b2abf970570629f6dd7078c435a3d2b1af9e33:


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..