TSHookFuntion.h 130 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019
  1. /*
  2. 本源码由TC简单软件科技有限公司开源,功能可以自由修改、发布、
  3. 长沙简单软件科技有限公司对于源码不做后期维护,,请大家在使用过程中遵循开源协议
  4. */
  5. #pragma once
  6. #include <Windows.h>
  7. #include "TSRuntime.h"
  8. #include "d3d9.h"
  9. #include "D3dx9tex.h"
  10. #include <dinput.h>
  11. #include <Ddraw.h>
  12. #include <D3D10.h>
  13. #include <wingdi.h>
  14. #include "TSFindPicture.h"
  15. #include <Dbghelp.h>
  16. #pragma comment ( lib, "Dbghelp.lib" )
  17. #include <psapi.h>
  18. #pragma comment ( lib, "psapi.lib" )
  19. #pragma comment(lib, "D3dx9.lib") //
  20. #pragma comment(lib, "D3D9.lib")
  21. #pragma comment(lib, "gdi32.lib")
  22. #include "TsMessage.h"
  23. #include "TSMyKernel32DllFuntion.h"
  24. #include "TSVIPHookFuntion.h"
  25. bool g_isSetKeyDown = false; //记录GetKeyStateEvent中是否有按键按下动作
  26. HWND g_InjectHWND = 0; //注入方进程窗口句柄
  27. DWORD InternalCallWinProc_Offset = 0;//InternalCallWinProc函数的地址偏移
  28. DWORD GetDeviceStateOBJMouse_Offset = 0;
  29. DWORD GetDeviceStateOBJKbd_Offset = 0;
  30. HANDLE HookKbdMouse_Thread = NULL;
  31. extern HANDLE g_hthread; //卸载线程句柄
  32. extern HMODULE g_hInstance;//当前自身DLL模块
  33. extern myVirtualProtect my_VirtualProtect;
  34. //extern mySendMessage my_SendMessage;
  35. //extern myPostMessage my_PostMessage;
  36. DWORD dwMoveGetKeyboardState = 0; //GetKeyboardState 赋值指令
  37. DWORD HookGetKeyboardStateRet = 0;
  38. DWORD HookGetCaptureRet = 0;
  39. DWORD HookGetAsyncKeyStateRet = 0;
  40. DWORD HookIsIconicRet = 0;
  41. DWORD HookImmGetCompositionStringARet = 0;
  42. DWORD HookImmGetCompositionStringWRet = 0;
  43. DWORD HookGetDeviceStateRet = 0; //HOOk:Dinput8:GetDeviceState的返回地址
  44. DWORD HookInternalCallWinProcRet = 0; //HOOk:USER32InternalCallWinProc的返回地址
  45. DWORD HookGetCursorPosRet = 0; //HOOk:USER32GetCursorPos的返回地址
  46. DWORD HookSetCursorPosRet = 0; //HOOk:USER32SetCursorPos的返回地址
  47. DWORD HookScreenToClientRet = 0; //HOOk:USER32ScreenToClient的返回地址
  48. DWORD HookD3D9PresentRet = 0; //HOOk:D3D9PresentRet的返回地址
  49. DWORD HookGetDeviceStateKbdRet = 0; //HOOk:GetDeviceStateKbdRet的返回地址
  50. DWORD HookGetDeviceStateMouseRet = 0; //HOOk:GetDeviceStateMouseRet的返回地址
  51. BYTE UnhookGetDeviceStateKbd[5] = { 0 };
  52. BYTE UnhookGetDeviceStateMouse[5] = { 0 };
  53. BYTE UnhookInternalCallWinProc[5] = { 0 };
  54. BYTE UnhookGetTopWindow[5] = { 0 };
  55. BYTE UnhookGetActiveWindow[7] = { 0 }; //记录保存原来函数GetActiveWindow的前7个字节
  56. BYTE UnhookGetFocus[7] = { 0 }; //记录保存原来函数GetFocus的前7个字节
  57. BYTE UnhookGetMessagePos[7] = { 0 };
  58. BYTE UnhookWindowFromPoint[5] = { 0 }; //记录保存原来函数WindowFromPoint的前5个字节
  59. BYTE UnhookGetForegroundWindow[5] = { 0 }; //记录保存原来函数GetForegroundWindow的前5个字节
  60. BYTE UnhookGetKeyboardState[5] = { 0 };
  61. BYTE UnhookScreenToClientRet[7] = { 0 }; //HOOk:USER32ScreenToClient的返回地址
  62. BYTE UnhookSetCursor[5] = { 0 }; //HOOk:USER32SetCursor的返回地址
  63. BYTE UnhookPeekMessage[5] = { 0 };
  64. DWORD HookPeekMessageARet = 0;
  65. DWORD HookPeekMessageWRet = 0;
  66. DWORD HookSetCursorRet = 0;
  67. DWORD HookGetKeyStateRet = 0; //HOOk:USER32GetKeyState的返回地址
  68. DWORD HookUserCallWinProcRet = 0;
  69. BYTE UnhookUserCallWinProc[7] = { 0 }; //记录保存原来函数GetActiveWindow的前7个字节
  70. DWORD HookGetTopWindowRet = 0;
  71. DWORD HookGetActiveWindowRet = 0;
  72. DWORD HookGetFocusRet = 0;
  73. DWORD HookGetForegroundWindowRet = 0;
  74. DWORD HookWindowFromPointRet = 0;
  75. DWORD HookIsWindowEnabledRet = 0;
  76. DWORD HookGetMessagePosRet = 0;
  77. DWORD HookGetRawInputDataRet = 0;
  78. DWORD HookSendMessageRet = 0;
  79. DWORD HookPostMessageRet = 0;
  80. DWORD SendMessageWAddr = 0;
  81. DWORD PostMessageWAddr = 0;
  82. DWORD GetRegisteredRawInputDevicesAddr = 0;
  83. typedef UINT(__stdcall* MyGetRegisteredRawInputDevices)(PRAWINPUTDEVICE pRawInputDevices, PUINT puiNumDevices, UINT cbSize);
  84. MyGetRegisteredRawInputDevices My_GetRegisteredRawInputDevices;
  85. HWND g_hwndRawInput = NULL;//RawInput的目标窗口
  86. bool isnotRawInput = false;//判断是否RawInput检测键鼠
  87. DWORD g_dinput8_KbdHOOKaddr = 0; //处理DNF钩子的内部HOOK
  88. DWORD g_dinput8_MOUSEHOOKaddr = 0;
  89. //bool g_IsGetDeviceStatehook=false; //GetDeviceStatehook
  90. //bool g_IsGetCursorPoschook=false; //GetCursorPos
  91. //bool g_IsScreenToClienthook=false; //ScreenToClient
  92. bool g_LockInput_kdb = true;//记录封锁外部键盘输入,默认封锁
  93. bool g_LockInput_mouse = true; //记录封锁外部鼠标输入,默认封锁
  94. bool IsSendstrIme = false;//通知用户调用了SendstrIme函数;
  95. bool IsWin7X64 = false;
  96. bool IsWin8 = false;
  97. bool IsWin7 = false;
  98. bool IsWinxp = false;
  99. bool IsWin2003 = false;
  100. bool IsWin8X64 = false;
  101. bool IsNpProtect = false;
  102. bool IsInternalCallWinProc = false;
  103. bool IsGetDeviceStateMouse = false;
  104. bool IsGetDeviceStateKbd = false;
  105. int SySTpye = 0;
  106. DWORD sleeptime = 0;
  107. LPDIDEVICEOBJECTDATA g_rgdod;
  108. DIMOUSESTATE* g_mousestate = 0;
  109. HWND g_currentHwnd = 0;
  110. MSG* GameMsg = NULL;
  111. LPPOINT g_lpPoint = NULL;//GetCursorPos的指针
  112. int g_NowDictIndex = 0;//记录SetDict时候的字库下标
  113. //记录上一次鼠标移动的位置
  114. int g_x = -1, g_y = -1;
  115. //记录鼠标移动的位置
  116. bool g_keymouseevent = false;
  117. bool g_mouseDevice = false;
  118. bool g_kbdDevice = false;
  119. bool g_keyboardstate = false;
  120. bool g_kbdDevice_mouse = false;
  121. bool g_GetKeyState = false;
  122. bool g_GetRawInputDatahook = false;
  123. //bool g_GetForegroundWindow=false;
  124. UINT g_GetRawInputKeyDataSize = sizeof(RAWKEYBOARD) + sizeof(RAWINPUTHEADER); //记录键盘数据结构体返回值大小
  125. UINT g_GetRawInputMouDataSize = sizeof(RAWMOUSE) + sizeof(RAWINPUTHEADER); //记录鼠标数据结构体返回值大小
  126. bool g_Unbind = false;
  127. int g_message = 0; //记录当前键盘消息
  128. int g_wParam = 0; //记录当前VK键值
  129. bool ismousedown = false;
  130. LPDIRECTINPUTDEVICE8 g_RealKeyBoardDevice = NULL;//记录DX键盘设备指针
  131. DWORD g_dwOfs = NULL;
  132. DWORD g_dwData = NULL;
  133. HCURSOR g_bkmouseshape = NULL; //记录全局HCURSOR,后台鼠标特征码
  134. DWORD g_OriSetCursor = 0;//xp:0x11FF,2003:0x11fd,
  135. DWORD g_GetRawInputData = 0;//xp:0x11ac,2003:,win7:
  136. bool IsVIPHookandUnhookAPI = false;
  137. void HookandUnhookAPI(void* para);//声明HOOK函数
  138. HRESULT __stdcall MyGetDeviceStateMouse(
  139. LPDIRECTINPUTDEVICE8 m_pMouse, //当前设备指针
  140. DWORD cbObjectData,
  141. LPDIDEVICEOBJECTDATA rgdod,
  142. LPDWORD pdwInOut,
  143. DWORD dwFlags); //声明HOOK函数
  144. HRESULT __stdcall MyGetDeviceStateKbd(
  145. LPDIRECTINPUTDEVICE8 m_pKeyboard, //当前设备指针
  146. DWORD cbData, //缓冲区字节大小
  147. LPVOID lpvData //缓冲区指针
  148. ); //声明HOOK函数
  149. BOOL __stdcall MyPeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin,
  150. UINT wMsgFilterMax, UINT wRemoveMsg);
  151. BOOL __stdcall MyPeekMessageW(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin,
  152. UINT wMsgFilterMax, UINT wRemoveMsg);
  153. DWORD Ntdll_ProtectVirtual = 0;
  154. DWORD Ntdll_ProtectVirtualEax = 0;
  155. __declspec(naked) NTSTATUS WINAPI MyZwProtectVirtualMemory(IN HANDLE ProcessHandle,
  156. IN PVOID* BaseAddress,
  157. IN SIZE_T* NumberOfBytesToProtect,
  158. IN ULONG NewAccessProtection,
  159. OUT PULONG OldAccessProtection)
  160. {
  161. _asm
  162. {
  163. //mov eax,0x4d ;//WIN7X64 偏移
  164. mov eax, Ntdll_ProtectVirtualEax;
  165. push Ntdll_ProtectVirtual;
  166. ret;
  167. }
  168. }
  169. //卸载线程
  170. void UnLoadDLLThread(void* para)
  171. {
  172. while (1)
  173. {
  174. if (g_Unbind == true) //等待窗口解绑
  175. {
  176. FreeLibraryAndExitThread(g_hInstance, 0); //卸载DLL
  177. return;
  178. }
  179. //如果注入方进程异常退出,自我解绑,卸载DLL
  180. if (::IsWindow(g_InjectHWND) == false && g_InjectHWND != NULL)
  181. {
  182. //通知自身窗口解绑
  183. SendMessage(g_currentHwnd, TS_UNBIND, 0, 0);
  184. FreeLibraryAndExitThread(g_hInstance, 0); //卸载DLL
  185. return;
  186. }
  187. Sleep(10);
  188. }
  189. }
  190. __declspec(naked) BOOL __stdcall User32PeekMessageW(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin,
  191. UINT wMsgFilterMax, UINT wRemoveMsg)
  192. {
  193. _asm
  194. {
  195. mov edi, edi //恢复前5个字节,在跳回原函数后5字节,WIN7下7个字节为2个完整指令,所以多预留2个NOP指令为2个字节
  196. push ebp
  197. mov ebp, esp
  198. jmp HookPeekMessageWRet
  199. ret;
  200. }
  201. }
  202. __declspec(naked) BOOL __stdcall User32PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin,
  203. UINT wMsgFilterMax, UINT wRemoveMsg)
  204. {
  205. _asm
  206. {
  207. mov edi, edi //恢复前5个字节,在跳回原函数后5字节,WIN7下7个字节为2个完整指令,所以多预留2个NOP指令为2个字节
  208. push ebp
  209. mov ebp, esp
  210. jmp HookPeekMessageARet
  211. ret;
  212. }
  213. }
  214. void IATMess(HINSTANCE hand, LPSTR name, DWORD addrs, DWORD fromaddrs)//IATHOOK
  215. {
  216. DWORD size;
  217. PIMAGE_IMPORT_DESCRIPTOR import = (PIMAGE_IMPORT_DESCRIPTOR)ImageDirectoryEntryToData(hand, TRUE, IMAGE_DIRECTORY_ENTRY_IMPORT, &size);
  218. char buf[20] = { 0 };
  219. while (import->Name != NULL)
  220. {
  221. LPSTR dllname = (LPSTR)((DWORD)hand + import->Name);
  222. //wsprintf(buf,"%s\n",dllname);
  223. //MessageBoxA(NULL,dllname,NULL,MB_OK);
  224. if (stricmp(dllname, name) == 0)
  225. {
  226. //TSRuntime::add_log( "找到dllname:%s",dllname);
  227. //MessageBoxA(NULL,"找到user32.dll",NULL,MB_OK);
  228. break;
  229. }
  230. import++;
  231. }
  232. PIMAGE_THUNK_DATA pdata = (PIMAGE_THUNK_DATA)((DWORD)hand + import->FirstThunk);
  233. while (pdata->u1.Function != NULL)
  234. {
  235. DWORD* func = (DWORD*)&pdata->u1.Function;
  236. if (*func == addrs)
  237. {
  238. MEMORY_BASIC_INFORMATION mbi;
  239. ::VirtualQuery(func, &mbi, sizeof(MEMORY_BASIC_INFORMATION));
  240. // In order to provide writable access to this part of the
  241. // memory we need to change the memory protection
  242. if (FALSE == ::VirtualProtect(
  243. mbi.BaseAddress,
  244. mbi.RegionSize,
  245. PAGE_READWRITE,
  246. &mbi.Protect)
  247. )
  248. break;
  249. // Hook the function.
  250. *func = fromaddrs;
  251. // Restore the protection back
  252. DWORD dwOldProtect;
  253. ::VirtualProtect(
  254. mbi.BaseAddress,
  255. mbi.RegionSize,
  256. mbi.Protect,
  257. &dwOldProtect
  258. );
  259. break;
  260. }
  261. pdata++;
  262. }
  263. }
  264. //BYTE oriapi[]={0x8b,0xff,0x55,0x8b,0xec};//8B FF 55 8B EC
  265. //检测SendMessageW,和PostMessageW是否被HOOK
  266. __declspec(naked) LRESULT __stdcall MySendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
  267. {
  268. _asm
  269. {
  270. mov edi, edi //恢复前5个字节,在跳回原函数后5字节
  271. push ebp
  272. mov ebp, esp
  273. jmp HookSendMessageRet
  274. ret
  275. }
  276. }
  277. __declspec(naked) BOOL __stdcall MyPostMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
  278. {
  279. _asm
  280. {
  281. mov edi, edi //恢复前5个字节,在跳回原函数后5字节
  282. push ebp
  283. mov ebp, esp
  284. jmp HookPostMessageRet
  285. ret
  286. }
  287. }
  288. bool HookMessageAPI()
  289. {
  290. if (SendMessageWAddr == 0)
  291. {
  292. SendMessageWAddr = (DWORD)GetProcAddress(GetModuleHandle(L"user32.dll"), "SendMessageW");
  293. }
  294. if (PostMessageWAddr == 0)
  295. {
  296. PostMessageWAddr = (DWORD)GetProcAddress(GetModuleHandle(L"user32.dll"), "PostMessageW");
  297. }
  298. BYTE checkbyteS = *(BYTE*)SendMessageWAddr;
  299. BYTE checkbyteP = *(BYTE*)PostMessageWAddr;
  300. if (checkbyteS == 0XE9 || checkbyteP == 0XE9)
  301. {
  302. if (checkbyteS == 0XE9)
  303. {
  304. HookSendMessageRet = SendMessageWAddr + 5;
  305. }
  306. if (checkbyteP == 0XE9)
  307. {
  308. HookPostMessageRet = PostMessageWAddr + 5;
  309. }
  310. }
  311. //TSRuntime::add_log("checkbyteS:%x,checkbyteP:%x,OpenProcessAddr:%x",checkbyteS,checkbyteP,OpenProcessAddr);
  312. return true;
  313. }
  314. void DetourFunc(BYTE* src, const BYTE* dst, BYTE* retdest, int len, DWORD& HookFunRet, bool IsHook) //HOOK函数
  315. {
  316. if (IsHook)
  317. {
  318. //(DWORD)MyGetDeviceStateMouse
  319. BYTE* jmp = (BYTE*)malloc(len);
  320. DWORD dwback;
  321. DWORD dwmyback;
  322. if (src[0] == 0xe9 && ((DWORD)dst == (DWORD)MyGetDeviceStateKbd/*||(DWORD)dst==(DWORD)MyGetDeviceStateMouse*/)) //针对DNF对dinput8.dll的2个函数钩子做特殊处理
  323. {
  324. if ((DWORD)dst == (DWORD)MyGetDeviceStateKbd)
  325. {
  326. g_dinput8_KbdHOOKaddr = (DWORD)src + (*(DWORD*)(src + 1)) + 5;
  327. src = (BYTE*)g_dinput8_KbdHOOKaddr;
  328. HookFunRet = g_dinput8_KbdHOOKaddr + 6;
  329. //src=src+5;
  330. //HookFunRet=(DWORD)src+6;
  331. len = 6;
  332. }
  333. //else if((DWORD)dst==(DWORD)MyGetDeviceStateMouse)
  334. // {
  335. // g_dinput8_MOUSEHOOKaddr=(DWORD)src+(*(DWORD*)(src+1))+5;
  336. // src=(BYTE *)g_dinput8_MOUSEHOOKaddr;
  337. // HookFunRet=g_dinput8_MOUSEHOOKaddr+5;
  338. // len=5;
  339. // }
  340. }
  341. else if (src[0] == 0xe9) //判断如果是原来的被HOOK就放弃HOOK
  342. {
  343. HookFunRet = -1; //重置返回地址为-1,标志没有HOOK,方便后面卸载的时候判断
  344. //TSRuntime::add_log( "src[0]==0xe9");
  345. return;
  346. }
  347. if (retdest)
  348. {
  349. DWORD dwback;
  350. VirtualProtect(retdest, len, PAGE_EXECUTE_READWRITE, &dwback);
  351. memcpy(jmp, src, len);
  352. memcpy(retdest, jmp, len);
  353. VirtualProtect(retdest, len, dwback, &dwback);
  354. }
  355. memset(jmp, 0, len);
  356. if (IsGetDeviceStateMouse || IsGetDeviceStateKbd)
  357. {
  358. *(DWORD*)jmp = (DWORD)dst;
  359. }
  360. else
  361. {
  362. if (IsInternalCallWinProc)
  363. jmp[0] = 0xE8;
  364. else
  365. jmp[0] = 0xE9;
  366. *(DWORD*)(jmp + 1) = (DWORD)(dst - src) - 5;
  367. }
  368. bool succ = false;
  369. succ = VirtualProtect(src, len, PAGE_EXECUTE_READWRITE, &dwback);
  370. if (succ == false)
  371. {
  372. if (IsWin7X64 && TSRuntime::pData->IsNpProtect)
  373. {
  374. if (Ntdll_ProtectVirtual == 0)
  375. {
  376. Ntdll_ProtectVirtual = (DWORD)GetProcAddress(GetModuleHandle(L"ntdll.dll"), "ZwProtectVirtualMemory");
  377. Ntdll_ProtectVirtual += 5;
  378. }
  379. if (Ntdll_ProtectVirtual)
  380. {
  381. PVOID Addr = (PVOID)src;
  382. DWORD length = len;
  383. MyZwProtectVirtualMemory((HANDLE)0xffffffff, &Addr, &length, PAGE_EXECUTE_READWRITE, &dwback);
  384. succ = true;
  385. }
  386. //bool bret=My_VirtualProtect(src,len,PAGE_EXECUTE_READWRITE,&dwback);
  387. //TSRuntime::add_log( "VirtualProtect,dwback:%x,bret:%d",dwback,succ);
  388. }
  389. else if (TSRuntime::pData->IsNpProtect && IsNpProtect)
  390. succ = true;
  391. }
  392. //TSRuntime::add_log( "VirtualProtect,succ:%d,dwback:%d,src:%x",succ,dwback,src);
  393. if (succ == 1)
  394. memcpy(src, jmp, len);
  395. VirtualProtect(src, len, dwback, &dwback);
  396. free(jmp);
  397. FlushInstructionCache(GetCurrentProcess(), src, len);
  398. }
  399. else//解绑,卸载钩子
  400. {
  401. if ((src[0] == 0xe9 || src[0] == 0xe8 || IsGetDeviceStateMouse || IsGetDeviceStateKbd) && HookFunRet != -1) //判断第一个字节是否是JMP,通常被HOOK的函数的第一个字节都是JMP==0xe9指令
  402. {
  403. if ((DWORD)dst == (DWORD)MyGetDeviceStateKbd && (g_dinput8_KbdHOOKaddr != 0))
  404. {
  405. src = (BYTE*)g_dinput8_KbdHOOKaddr;
  406. len = 6;
  407. }
  408. //else if((DWORD)dst==(DWORD)MyGetDeviceStateMouse&&g_dinput8_MOUSEHOOKaddr!=0)
  409. // {
  410. // src=(BYTE *)g_dinput8_MOUSEHOOKaddr;
  411. // len=5;
  412. // }
  413. DWORD dwback;
  414. BYTE* unhook = (BYTE*)malloc(len);
  415. memcpy(unhook, retdest, len); //将返回函数前N个字节保存
  416. VirtualProtect(src, len, PAGE_EXECUTE_READWRITE, &dwback);
  417. memcpy(src, unhook, len);
  418. VirtualProtect(src, len, dwback, &dwback);
  419. //delete []unhook;
  420. free(unhook);
  421. FlushInstructionCache(GetCurrentProcess(), src, len);
  422. }
  423. }
  424. }
  425. DWORD GetHookModFuntion(TCHAR* ModName, char* FunName, DWORD FuntionOffsec, DWORD HookFunction, DWORD RetFunction, DWORD& HookFunRet, bool IsHook) //FuntionOffsec!=0:HOOK指定模块的未导出函数,FuntionOffsec=0HOOK指定模块导出函数
  426. {
  427. HMODULE hMod = 0;
  428. DWORD addr = 0;
  429. if (TSRuntime::IsVirtualProtectEx) ////是否驱动模式远程修改注入进程的页面保护属性
  430. {
  431. //USES_CONVERSION;
  432. //TSRuntime::add_log( "TSRuntime::IsVirtualProtectEx,FunName:%s",FunName);
  433. DWORD pid = 0;
  434. DWORD dwback = 0;
  435. GetWindowThreadProcessId(TSRuntime::hookHwnd, &pid);
  436. TSRuntime::EnablePrivilege(L"SeDebugPrivilege", true);
  437. HANDLE hprocess = OpenProcess(PROCESS_ALL_ACCESS, false, pid);
  438. DWORD lasserr = ::GetLastError();
  439. //TSRuntime::add_log("pid:%d,lasserr:%d",pid,lasserr);
  440. if (hprocess)
  441. {
  442. //hMod= TSRuntime::GetRemoteModuleHandle(L"user32.dll",pid);
  443. hMod = TSRuntime::GetRemoteModuleHandle(ModName, pid);
  444. if (hMod != 0 && FuntionOffsec != 0)
  445. {
  446. addr = (DWORD)hMod + FuntionOffsec;
  447. }
  448. else if (hMod != 0 && FunName != NULL)
  449. {
  450. addr = (DWORD)TSRuntime::GetRemoteProcAddress(ModName, FunName, pid);
  451. }
  452. if (SendMessageWAddr == 0)
  453. {
  454. SendMessageWAddr = (DWORD)TSRuntime::GetRemoteProcAddress(L"user32.dll", "SendMessageW", pid);
  455. VirtualProtectEx(hprocess, (LPVOID)SendMessageWAddr, 7, PAGE_EXECUTE_READWRITE, &dwback);
  456. }
  457. if (PostMessageWAddr == 0)
  458. {
  459. PostMessageWAddr = (DWORD)TSRuntime::GetRemoteProcAddress(L"user32.dll", "PostMessageW", pid);
  460. VirtualProtectEx(hprocess, (LPVOID)SendMessageWAddr, 7, PAGE_EXECUTE_READWRITE, &dwback);
  461. }
  462. //MEMORY_BASIC_INFORMATION mbi_thunk;
  463. ////查询页信息。
  464. //VirtualQueryEx(hprocess,(LPVOID)addr, &mbi_thunk, sizeof(MEMORY_BASIC_INFORMATION));
  465. ////改变页保护属性为读写。
  466. //VirtualProtectEx(hprocess,mbi_thunk.BaseAddress,mbi_thunk.RegionSize,PAGE_EXECUTE_READWRITE,&mbi_thunk.Protect);
  467. bool succ = VirtualProtectEx(hprocess, (LPVOID)addr, 7, PAGE_EXECUTE_READWRITE, &dwback);
  468. //TSRuntime::add_log( "VirtualProtectEx,succ:%d,dwback:%d,pid:%x",succ,dwback,pid);
  469. }
  470. return 0;
  471. }
  472. else////否则进入hook功能代码
  473. {
  474. //hMod = LoadLibrary(ModName);
  475. //TSRuntime::add_log( "GetHookModFuntion-start");
  476. hMod = ::GetModuleHandle(ModName);
  477. //TSRuntime::add_log( "hMod:%x",hMod);
  478. if (hMod == NULL)
  479. return 0;
  480. if (hMod != 0 && FuntionOffsec != 0)
  481. {
  482. addr = (DWORD)hMod + FuntionOffsec;
  483. }
  484. else if (hMod != 0 && FunName != NULL)
  485. {
  486. addr = (DWORD)::GetProcAddress(hMod, FunName);
  487. }
  488. if (SySTpye == 1 && (strcmp("GetFocus", FunName) == 0 || strcmp("GetActiveWindow", FunName) == 0) || strcmp("GetMessagePos", FunName) == 0)//XP系统,要HOOK前7字节GetFocus
  489. {
  490. if (IsHook) //HOOK,备份前7个字节
  491. {
  492. HookFunRet = addr + 7;
  493. BYTE* jmp = (BYTE*)RetFunction;
  494. memcpy(jmp, (void*)addr, 7);
  495. DetourFunc((BYTE*)addr, (BYTE*)HookFunction, NULL, 7, HookFunRet, IsHook);
  496. }
  497. else
  498. DetourFunc((BYTE*)addr, (BYTE*)HookFunction, (BYTE*)RetFunction, 7, HookFunRet, IsHook); //卸载,还原
  499. //TSRuntime::add_log( "FunName:%s,addr:%x,RetFunction:%x",FunName,addr,RetFunction);
  500. return addr;
  501. }
  502. else if ((SySTpye == 4 || IsWin8X64) && strcmp("ScreenToClient", FunName) == 0) //如果是win7下HOOK的函数是ScreenToClient时候,HookFunRet=+7
  503. {
  504. if (IsHook)
  505. HookFunRet = addr + 7;
  506. DetourFunc((BYTE*)addr, (BYTE*)HookFunction, (BYTE*)RetFunction, 7, HookFunRet, IsHook);
  507. //TSRuntime::add_log( "FunName:%s,addr:%x,RetFunction:%x",FunName,addr,RetFunction);
  508. return addr;
  509. }
  510. else if ((strcmp("GetDeviceState", FunName) == 0))
  511. {
  512. int len = 0;
  513. if (IsGetDeviceStateMouse)
  514. {
  515. if (IsHook)
  516. HookFunRet = (DWORD)hMod + GetDeviceStateOBJMouse_Offset + 5;
  517. len = 4;
  518. }
  519. else if (IsGetDeviceStateKbd)
  520. {
  521. if (IsHook)
  522. HookFunRet = (DWORD)hMod + GetDeviceStateOBJKbd_Offset + 5;
  523. len = 4;
  524. }
  525. else
  526. {
  527. if (IsHook)
  528. HookFunRet = addr + 5;
  529. len = 5;
  530. }
  531. //TSRuntime::add_log( "FunName:%s,addr:%x,RetFunction:%x,IsHook:%d",FunName,addr,RetFunction,IsHook);
  532. DetourFunc((BYTE*)addr, (BYTE*)HookFunction, (BYTE*)RetFunction, 5, HookFunRet, IsHook);
  533. return addr;
  534. }
  535. else if ((strcmp("InternalCallWinProc", FunName) == 0))
  536. {
  537. if (IsInternalCallWinProc)
  538. {
  539. if (IsHook)
  540. HookFunRet = (DWORD)hMod + InternalCallWinProc_Offset + 5;
  541. }
  542. else
  543. {
  544. if (IsHook)
  545. HookFunRet = addr + 5;
  546. }
  547. DetourFunc((BYTE*)addr, (BYTE*)HookFunction, (BYTE*)RetFunction, 5, HookFunRet, IsHook);
  548. return addr;
  549. }
  550. else if ((strcmp("GetForegroundWindow", FunName) == 0))
  551. {
  552. addr += 5;
  553. if (IsHook)
  554. HookFunRet = addr + 5;
  555. DetourFunc((BYTE*)addr, (BYTE*)HookFunction, UnhookGetForegroundWindow, 5, HookFunRet, IsHook);
  556. return addr;
  557. }
  558. else if ((strcmp("SetCursor", FunName) == 0))
  559. {
  560. if (IsHook)
  561. HookFunRet = addr + 5;
  562. DetourFunc((BYTE*)addr, (BYTE*)HookFunction, UnhookSetCursor, 5, HookFunRet, IsHook);
  563. return addr;
  564. }
  565. else if ((strcmp("NtUserCallOneParam", FunName) == 0) ||
  566. (strcmp("NtUserCallTwoParam", FunName) == 0) ||
  567. (strcmp("NtUserGetThreadState", FunName) == 0) ||
  568. (strcmp("NtUserGetKeyState", FunName) == 0) ||
  569. (strcmp("NtUserGetAsyncKeyState", FunName) == 0))
  570. {
  571. BYTE* paddr = (BYTE*)addr;
  572. BYTE unhookbyte[5] = { 0 };
  573. if (strcmp("NtUserCallOneParam", FunName) == 0)
  574. {
  575. if (EAX_NtUserCallOneParam == 0)
  576. {
  577. memcpy(NtUserCallOneParamUnhookByte, (BYTE*)addr, 5);
  578. EAX_NtUserCallOneParam = *(DWORD*)(paddr + 1);
  579. }
  580. else if (!IsHook)
  581. memcpy(unhookbyte, NtUserCallOneParamUnhookByte, 5);
  582. }
  583. else if (strcmp("NtUserCallTwoParam", FunName) == 0)
  584. {
  585. if (EAX_NtUserCallTwoParam == 0)
  586. {
  587. memcpy(NtUserCallTwoParamUnhookByte, (BYTE*)addr, 5);
  588. EAX_NtUserCallTwoParam = *(DWORD*)(paddr + 1);
  589. }
  590. else if (!IsHook)
  591. memcpy(unhookbyte, NtUserCallTwoParamUnhookByte, 5);
  592. }
  593. else if (strcmp("NtUserGetThreadState", FunName) == 0)
  594. {
  595. if (EAX_NtUserGetThreadState == 0)
  596. {
  597. memcpy(NtUserGetThreadStateUnhookByte, (BYTE*)addr, 5);
  598. EAX_NtUserGetThreadState = *(DWORD*)(paddr + 1);
  599. }
  600. else if (!IsHook)
  601. memcpy(unhookbyte, NtUserGetThreadStateUnhookByte, 5);
  602. }
  603. else if (strcmp("NtUserGetKeyState", FunName) == 0)
  604. {
  605. if (EAX_NtUserGetKeyState == 0)
  606. {
  607. memcpy(NtUserGetKeyStateUnhookByte, (BYTE*)addr, 5);
  608. EAX_NtUserGetKeyState = *(DWORD*)(paddr + 1);
  609. }
  610. else if (!IsHook)
  611. memcpy(unhookbyte, NtUserGetKeyStateUnhookByte, 5);
  612. }
  613. else if (strcmp("NtUserGetAsyncKeyState", FunName) == 0)
  614. {
  615. if (EAX_NtUserGetAsyncKeyState == 0)
  616. {
  617. memcpy(NtUserGetAsyncKeyStateUnhookByte, (BYTE*)addr, 5);
  618. EAX_NtUserGetAsyncKeyState = *(DWORD*)(paddr + 1);
  619. }
  620. else if (!IsHook)
  621. memcpy(unhookbyte, NtUserGetAsyncKeyStateUnhookByte, 5);
  622. }
  623. //TSRuntime::add_log( "FunName:%s,addr:%x,NtUserCallOneParamUnhookByte:%x",FunName,addr,*(DWORD*)NtUserCallOneParamUnhookByte);
  624. if (IsHook)
  625. {
  626. HookFunRet = addr + 5;
  627. DetourFunc((BYTE*)addr, (BYTE*)HookFunction, (BYTE*)RetFunction, 5, HookFunRet, IsHook);
  628. }
  629. else
  630. DetourFunc((BYTE*)addr, (BYTE*)HookFunction, unhookbyte, 5, HookFunRet, IsHook);
  631. return addr;
  632. }
  633. if (IsHook)
  634. HookFunRet = addr + 5;
  635. DetourFunc((BYTE*)addr, (BYTE*)HookFunction, (BYTE*)RetFunction, 5, HookFunRet, IsHook);
  636. //TSRuntime::add_log( "FunName:%s,addr:%x,RetFunction:%x",FunName,addr,RetFunction);
  637. return addr;
  638. }
  639. }
  640. void SetKeyDown(BYTE vk, char* g_pKetState)
  641. {
  642. g_pKetState[vk] = 0x80;
  643. //大小写转换
  644. //if(vk>='A' && vk<='Z')
  645. //{
  646. // vk|=0x20;
  647. //}
  648. //for(int cnt=0;cnt<0x100;cnt++)
  649. //{
  650. // if(TSRuntime::keyMap[cnt])
  651. // {
  652. // if(TSRuntime::keyMap[cnt]==vk)
  653. // {
  654. // g_pKetState[cnt]=0x80;
  655. // //TSRuntime::add_log("SetKeyDown:key:%x,keyMap:%x",vk,cnt);
  656. // break;
  657. // }
  658. // }
  659. //}
  660. }
  661. void SetKeyUp(BYTE vk, char* g_pKetState)
  662. {
  663. g_pKetState[vk] = 0;
  664. //ZeroMemory(g_pKetState,0x100);
  665. //大小写转换
  666. //if(vk>='A' && vk<='Z')
  667. //{
  668. // vk|=0x20;
  669. //}
  670. //for(int cnt=0;cnt<0x100;cnt++)
  671. //{
  672. // if(TSRuntime::keyMap[cnt])
  673. // {
  674. // if(TSRuntime::keyMap[cnt]==vk)
  675. // {
  676. // g_pKetState[cnt]=0;
  677. // break;
  678. // }
  679. // }
  680. //}
  681. }
  682. BOOL __stdcall MyPeekMessageW(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin,
  683. UINT wMsgFilterMax, UINT wRemoveMsg)
  684. {
  685. if (GameMsg == NULL)
  686. {
  687. if (lpMsg != NULL)
  688. {
  689. if (lpMsg->hwnd == g_currentHwnd)
  690. {
  691. GameMsg = lpMsg;
  692. ////卸载钩子
  693. //GetHookModFuntion(L"user32.dll","PeekMessageA",0,(DWORD)MyPeekMessageA,(DWORD)UnhookPeekMessage,HookPeekMessageARet,false);
  694. //GetHookModFuntion(L"user32.dll","PeekMessageW",0,(DWORD)MyPeekMessageW,(DWORD)UnhookPeekMessage,HookPeekMessageWRet,false);
  695. //TSRuntime::add_log( "MyPeekMessageW:GameMsg:%x",lpMsg);
  696. }
  697. }
  698. }
  699. bool bret = User32PeekMessageW(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg);
  700. return bret;
  701. }
  702. BOOL __stdcall MyPeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin,
  703. UINT wMsgFilterMax, UINT wRemoveMsg)
  704. {
  705. if (GameMsg == NULL)
  706. {
  707. if (lpMsg != NULL)
  708. {
  709. if (lpMsg->hwnd == g_currentHwnd)
  710. {
  711. GameMsg = lpMsg;
  712. //////卸载钩子
  713. //GetHookModFuntion(L"user32.dll","PeekMessageA",0,(DWORD)MyPeekMessageA,(DWORD)UnhookPeekMessage,HookPeekMessageARet,false);
  714. //GetHookModFuntion(L"user32.dll","PeekMessageW",0,(DWORD)MyPeekMessageW,(DWORD)UnhookPeekMessage,HookPeekMessageWRet,false);
  715. //TSRuntime::add_log( "MyPeekMessageA:GameMsg:%x",lpMsg);
  716. }
  717. }
  718. }
  719. bool bret = User32PeekMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg);
  720. return bret;
  721. }
  722. __declspec(naked)bool __stdcall USER32IsWindowEnabled(HWND hwnd)
  723. {
  724. _asm {
  725. mov edi, edi //恢复前5个字节,在跳回原函数后5字节,WIN7下7个字节为2个完整指令,所以多预留2个NOP指令为2个字节
  726. push ebp
  727. mov ebp, esp
  728. jmp HookIsWindowEnabledRet
  729. ret
  730. }
  731. }
  732. __declspec(naked) UINT __stdcall USER32GetRawInputData(HRAWINPUT hRawInput,
  733. UINT uiCommand,
  734. LPVOID pData,
  735. PUINT pcbSize,
  736. UINT cbSizeHeader)
  737. {
  738. _asm {
  739. mov eax, g_GetRawInputData //恢复前5个字节,在跳回原函数后5字节
  740. jmp HookGetRawInputDataRet
  741. ret
  742. }
  743. }
  744. __declspec(naked) HCURSOR __stdcall USER32SetCursor(HCURSOR hCursor)
  745. {
  746. _asm {
  747. mov eax, g_OriSetCursor //恢复前5个字节,在跳回原函数后5字节
  748. jmp HookSetCursorRet
  749. ret
  750. }
  751. }
  752. __declspec(naked) HWND __stdcall USER32WindowFromPoint(POINT Point)
  753. {
  754. _asm {
  755. mov edi, edi //恢复前5个字节,在跳回原函数后5字节,WIN7下7个字节为2个完整指令,所以多预留2个NOP指令为2个字节
  756. push ebp
  757. mov ebp, esp
  758. jmp HookWindowFromPointRet
  759. ret
  760. }
  761. }
  762. //__declspec(naked) HWND __stdcall USER32GetTopWindow(HWND hWnd)
  763. // {
  764. // _asm{
  765. // mov edi,edi //恢复前5个字节,在跳回原函数后5字节,WIN7下7个字节为2个完整指令,所以多预留2个NOP指令为2个字节
  766. // push ebp
  767. // mov ebp,esp
  768. // jmp HookGetTopWindowRet
  769. // ret
  770. // }
  771. // }
  772. __declspec(naked) DWORD __stdcall USER32GetMessagePos()
  773. {
  774. _asm {
  775. NOP
  776. NOP
  777. NOP
  778. NOP
  779. NOP
  780. NOP
  781. NOP
  782. jmp HookGetMessagePosRet
  783. ret
  784. }
  785. }
  786. __declspec(naked) HWND __stdcall USER32GetForegroundWindow()
  787. {
  788. _asm {
  789. mov edi, edi
  790. push ebp
  791. mov ebp, esp
  792. jmp HookGetForegroundWindowRet
  793. ret
  794. }
  795. }
  796. __declspec(naked) HWND __stdcall USER32GetActiveWindow()
  797. {
  798. _asm {
  799. //mov edi,edi //恢复前5个字节,在跳回原函数后5字节,WIN7下7个字节为2个完整指令,所以多预留2个NOP指令为2个字节
  800. //push ebp
  801. //mov ebp,esp
  802. NOP
  803. NOP
  804. NOP
  805. NOP
  806. NOP
  807. NOP
  808. NOP
  809. jmp HookGetActiveWindowRet
  810. ret
  811. }
  812. }
  813. __declspec(naked) HWND __stdcall USER32GetFocus()
  814. {
  815. _asm {
  816. NOP
  817. NOP
  818. NOP
  819. NOP
  820. NOP
  821. NOP
  822. NOP
  823. jmp HookGetFocusRet
  824. ret
  825. }
  826. }
  827. __declspec(naked) SHORT __stdcall USER32GetKeyState(int nVirtKey)
  828. {
  829. _asm {
  830. mov edi, edi //恢复前5个字节,在跳回原函数后5字节,WIN7下7个字节为2个完整指令,所以多预留2个NOP指令为2个字节
  831. push ebp
  832. mov ebp, esp
  833. jmp HookGetKeyStateRet
  834. ret
  835. }
  836. }
  837. //APIENTRY
  838. __declspec(naked) HRESULT __stdcall GetDeviceStateKbd(
  839. LPDIRECTINPUTDEVICE8 m_pKeyboard, //当前设备指针
  840. DWORD cbData, //缓冲区字节大小
  841. LPVOID lpvData) //缓冲区指针)//键盘DXINPUT
  842. {
  843. _asm
  844. {
  845. mov edi, edi //恢复前5个字节,在跳回原函数后5字节
  846. push ebp
  847. mov ebp, esp
  848. NOP
  849. jmp HookGetDeviceStateKbdRet
  850. ret
  851. }
  852. }
  853. __declspec(naked) HRESULT __stdcall GetDeviceStateMouse(
  854. LPDIRECTINPUTDEVICE8 m_pMouse,
  855. DWORD cbObjectData,
  856. LPDIDEVICEOBJECTDATA rgdod,
  857. LPDWORD pdwInOut,
  858. DWORD dwFlags) //鼠标DXINPUT
  859. {
  860. _asm {
  861. mov edi, edi //恢复前5个字节,在跳回原函数后5字节
  862. push ebp
  863. mov ebp, esp
  864. jmp HookGetDeviceStateMouseRet
  865. ret
  866. }
  867. }
  868. __declspec(naked) HRESULT __stdcall D3D9Present(LPDIRECT3DDEVICE9 pDxdevice,//类的this指针
  869. CONST RECT* pSourceRect,//此参数请参考dx sdk
  870. CONST RECT* pDestRect,//同上
  871. HWND hDestWindowOverride,//同上
  872. CONST RGNDATA* pDirtyRegion)//同上 )
  873. {
  874. _asm {
  875. mov edi, edi //恢复前5个字节,在跳回原函数后5字节
  876. push ebp
  877. mov ebp, esp
  878. jmp HookD3D9PresentRet
  879. ret
  880. }
  881. }
  882. __declspec(naked) BOOL __stdcall USER32ScreenToClient(HWND hWnd, LPPOINT lpPoint) // screen coordinates
  883. {
  884. _asm {
  885. mov edi, edi //恢复前5个字节,在跳回原函数后5字节,WIN7下7个字节为2个完整指令,所以多预留2个NOP指令为2个字节
  886. push ebp
  887. mov ebp, esp
  888. NOP
  889. NOP
  890. jmp HookScreenToClientRet
  891. ret
  892. }
  893. }
  894. __declspec(naked) BOOL __stdcall USER32GetCursorPos(LPPOINT lpPoint)
  895. {
  896. _asm {
  897. mov edi, edi //恢复前5个字节,在跳回原函数后5字节
  898. push ebp
  899. mov ebp, esp
  900. jmp HookGetCursorPosRet
  901. ret
  902. }
  903. }
  904. __declspec(naked) BOOL __stdcall USER32SetCursorPos(int x, int y)
  905. {
  906. _asm {
  907. mov edi, edi //恢复前5个字节,在跳回原函数后5字节
  908. push ebp
  909. mov ebp, esp
  910. jmp HookSetCursorPosRet
  911. ret
  912. }
  913. }
  914. //
  915. __declspec(naked) LRESULT __stdcall USER32InternalCallWinProc(DWORD fAnsi, HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  916. {
  917. _asm {
  918. push EBP
  919. Mov EBP, ESP
  920. push ESI
  921. push EDI
  922. jmp HookInternalCallWinProcRet
  923. ret
  924. }
  925. }
  926. __declspec(naked) HRESULT APIENTRY kdbGetDeviceState(DWORD OBJDeviceAddr, LPVOID lpvData)
  927. {
  928. _asm
  929. {
  930. mov edi, edi //恢复前5个字节,在跳回原函数后5字节
  931. push ebp
  932. mov ebp, esp
  933. jmp HookGetDeviceStateRet
  934. ret
  935. }
  936. }
  937. __declspec(naked) LONG __stdcall IMM32ImmGetCompositionStringA(HIMC hIMC,
  938. DWORD dwIndex,
  939. LPVOID lpBuf,
  940. DWORD dwBufLen)
  941. {
  942. _asm
  943. {
  944. mov edi, edi //恢复前5个字节,在跳回原函数后5字节
  945. push ebp
  946. mov ebp, esp
  947. jmp HookImmGetCompositionStringARet
  948. ret
  949. }
  950. }
  951. __declspec(naked) LONG __stdcall IMM32ImmGetCompositionStringW(HIMC hIMC,
  952. DWORD dwIndex,
  953. LPVOID lpBuf,
  954. DWORD dwBufLen)
  955. {
  956. _asm
  957. {
  958. mov edi, edi //恢复前5个字节,在跳回原函数后5字节
  959. push ebp
  960. mov ebp, esp
  961. jmp HookImmGetCompositionStringWRet
  962. ret
  963. }
  964. }
  965. __declspec(naked) bool __stdcall USER32IsIconic(HWND hWnd)
  966. {
  967. _asm
  968. {
  969. mov edi, edi //恢复前5个字节,在跳回原函数后5字节
  970. push ebp
  971. mov ebp, esp
  972. jmp HookIsIconicRet
  973. ret
  974. }
  975. }
  976. __declspec(naked) SHORT __stdcall USER32GetAsyncKeyState(int vKey)
  977. {
  978. _asm
  979. {
  980. mov edi, edi //恢复前5个字节,在跳回原函数后5字节
  981. push ebp
  982. mov ebp, esp
  983. jmp HookGetAsyncKeyStateRet
  984. ret
  985. }
  986. }
  987. DWORD dwGetCapture = 0;
  988. __declspec(naked) HWND __stdcall USER32GetCapture()
  989. {
  990. _asm
  991. {
  992. mov eax, [dwGetCapture] //恢复前5个字节,在跳回原函数后5字节
  993. jmp HookGetCaptureRet
  994. ret
  995. }
  996. }
  997. __declspec(naked) HWND __stdcall USER32GetKeyboardState(PBYTE pbKeyState)
  998. {
  999. _asm
  1000. {
  1001. mov eax, dwMoveGetKeyboardState //恢复前5个字节,在跳回原函数后5字节
  1002. jmp HookGetKeyboardStateRet
  1003. ret
  1004. }
  1005. }
  1006. bool __stdcall MyIsIconic(HWND hWnd)
  1007. {
  1008. if (hWnd == g_currentHwnd)
  1009. return 0;
  1010. else
  1011. return USER32IsIconic(hWnd);
  1012. }
  1013. BOOL __stdcall MyGetKeyboardState(PBYTE pbKeyState)
  1014. {
  1015. //if(g_message==WM_KEYDOWN||g_message==WM_SYSKEYDOWN||g_message==WM_KEYUP||g_message==WM_SYSKEYUP)
  1016. // TSRuntime::add_log("MyGetKeyboardState:g_message:%x,pbKeyState:%x,g_wParam:%x",g_message,pbKeyState,g_wParam);
  1017. if ((g_message == WM_KEYDOWN || g_message == WM_SYSKEYDOWN) && g_keyboardstate)
  1018. {
  1019. for (int i = 0; i < 0x100; i++)
  1020. {
  1021. if (1 == TSRuntime::KeyPressMap[i])
  1022. {
  1023. //pbKeyState[i] |= 0x80;
  1024. //int key=TSRuntime::VirtualToASCIIMap[i];
  1025. int key = MapVirtualKey(i, 0);
  1026. if (i == VK_LEFT)
  1027. key = DIK_LEFT;
  1028. else if (i == VK_RIGHT)
  1029. key = DIK_RIGHT;
  1030. else if (i == VK_DOWN)
  1031. key = DIK_DOWN;
  1032. else if (i == VK_UP)
  1033. key = DIK_UP;
  1034. //pbKeyState[key] |= 0x80;
  1035. SetKeyDown(key, (char*)pbKeyState);
  1036. return true;
  1037. }
  1038. }
  1039. //TSRuntime::add_log("SetKeyDown:g_message:%x,lpvData:%x,Key.vk:%x",g_message,pbKeyState,g_wParam);
  1040. }
  1041. else if ((g_message == WM_KEYUP || g_message == WM_SYSKEYUP) && g_keyboardstate)
  1042. {
  1043. int key = 0;
  1044. for (int i = 0; i < 0x100; i++)
  1045. {
  1046. if (1 == TSRuntime::KeyPressMap[i] && i == g_wParam)
  1047. {
  1048. //pbKeyState[i]= 0;
  1049. //int key=TSRuntime::VirtualToASCIIMap[i];
  1050. key = MapVirtualKey(i, 0);
  1051. if (i == VK_LEFT)
  1052. key = DIK_LEFT;
  1053. else if (i == VK_RIGHT)
  1054. key = DIK_RIGHT;
  1055. else if (i == VK_DOWN)
  1056. key = DIK_DOWN;
  1057. else if (i == VK_UP)
  1058. key = DIK_UP;
  1059. SetKeyUp(key, (char*)pbKeyState);
  1060. //pbKeyState[key] = 0;
  1061. TSRuntime::KeyPressMap[i] = 0;
  1062. }
  1063. }
  1064. //TSRuntime::add_log("MyGetKeyboardState:g_message:%x,key:%x,g_wParam:%x",g_message,key,g_wParam);
  1065. g_isSetKeyDown = false;//重置按键标记
  1066. g_keyboardstate = false;
  1067. return true;
  1068. }
  1069. else if (g_kbdDevice == false)
  1070. {
  1071. if (g_LockInput_kdb) //是否锁定键盘
  1072. {
  1073. DWORD cbData = sizeof(pbKeyState);
  1074. ZeroMemory(pbKeyState, cbData);
  1075. }
  1076. }
  1077. bool bret = USER32GetKeyboardState(pbKeyState);
  1078. return bret;
  1079. }
  1080. SHORT __stdcall MyGetAsyncKeyState(int vKey)
  1081. {
  1082. SHORT sret = USER32GetAsyncKeyState(vKey);
  1083. //TSRuntime::add_log("MyGetAsyncKeyState:sret:%d,vKey:%d",sret,vKey);
  1084. if (g_kbdDevice || g_mouseDevice)
  1085. {
  1086. if ((g_message == WM_LBUTTONDOWN && vKey == VK_LBUTTON)
  1087. || (g_message == WM_RBUTTONDOWN && vKey == VK_RBUTTON)
  1088. || (g_message == WM_MBUTTONDOWN && vKey == VK_MBUTTON))
  1089. {
  1090. sret = 0x8000;
  1091. return sret;
  1092. }
  1093. else if ((g_message == WM_LBUTTONUP && vKey == VK_LBUTTON)
  1094. || (g_message == WM_RBUTTONUP && vKey == VK_LBUTTON)
  1095. || (g_message == WM_MBUTTONUP && vKey == VK_MBUTTON))
  1096. {
  1097. sret = 0;
  1098. g_mouseDevice = false;
  1099. }
  1100. else if (g_message == WM_KEYDOWN || g_message == WM_KEYUP || g_message == WM_SYSKEYDOWN || g_message == WM_SYSKEYUP)
  1101. {
  1102. bool iskeyevent = false;
  1103. for (int i = 0; i < 0x100; i++)
  1104. {
  1105. if (1 == TSRuntime::KeyPressMap[i])
  1106. {
  1107. //int key=TSRuntime::VirtualToASCIIMap[i];
  1108. if (vKey == i)
  1109. {
  1110. if ((g_message == WM_KEYUP || g_message == WM_SYSKEYUP) && i == g_wParam)
  1111. TSRuntime::KeyPressMap[i] = 0;
  1112. else if (i != g_wParam)
  1113. return 0x8000;
  1114. iskeyevent = true;
  1115. break;
  1116. }
  1117. }
  1118. }
  1119. //TSRuntime::add_log("MyGetAsyncKeyState:iskeyevent:%d,vKey:%d,g_message:%x",iskeyevent,vKey,g_message);
  1120. if (iskeyevent && (g_message == WM_KEYDOWN || g_message == WM_SYSKEYDOWN))
  1121. {
  1122. sret = 0x8000;
  1123. //TSRuntime::add_log("iskeyevent:MyGetAsyncKeyState:sret:%d,vKey:%d",sret,vKey);
  1124. return sret;
  1125. }
  1126. else if (iskeyevent && (g_message == WM_KEYUP || g_message == WM_SYSKEYUP))
  1127. {
  1128. //g_keydown=0xFFFF8001;//重置
  1129. sret = 0;
  1130. g_mouseDevice = false;
  1131. }
  1132. }
  1133. }
  1134. if (g_LockInput_kdb || g_LockInput_mouse) //封锁外部键盘鼠标
  1135. {
  1136. if (g_LockInput_mouse)
  1137. {
  1138. if (vKey == VK_LBUTTON || vKey == VK_RBUTTON || vKey == VK_MBUTTON)
  1139. sret = 0;
  1140. }
  1141. else if (g_LockInput_kdb)
  1142. {
  1143. sret = 0;
  1144. }
  1145. }
  1146. //TSRuntime::add_log("MyGetAsyncKeyState:sret:%d,vKey:%d",sret,vKey);
  1147. return sret;
  1148. }
  1149. LONG __stdcall MyIMM32ImmGetCompositionStringA(HIMC hIMC,
  1150. DWORD dwIndex,
  1151. LPVOID lpBuf,
  1152. DWORD dwBufLen)
  1153. {
  1154. ULONG nret = 0;
  1155. if (dwIndex == GCS_RESULTSTR && IsSendstrIme == true)
  1156. {
  1157. int len = strlen(TSRuntime::pData->pmsg);
  1158. char* strbuf = new char[len + 1];
  1159. memset(strbuf, 0, len);
  1160. strcpy(strbuf, TSRuntime::pData->pmsg);
  1161. dwBufLen = len;
  1162. if (lpBuf != NULL)
  1163. {
  1164. strcpy((char*)lpBuf, strbuf);
  1165. dwBufLen = strlen((char*)lpBuf);
  1166. IsSendstrIme = false;
  1167. }
  1168. delete[]strbuf;
  1169. return dwBufLen;
  1170. }
  1171. nret = IMM32ImmGetCompositionStringA(hIMC, dwIndex, lpBuf, dwBufLen);
  1172. return nret;
  1173. }
  1174. LONG __stdcall MyIMM32ImmGetCompositionStringW(HIMC hIMC,
  1175. DWORD dwIndex,
  1176. LPVOID lpBuf,
  1177. DWORD dwBufLen)
  1178. {
  1179. ULONG nret = 0;
  1180. if (dwIndex == GCS_RESULTSTR && IsSendstrIme == true)
  1181. {
  1182. USES_CONVERSION;
  1183. int len = strlen(TSRuntime::pData->pmsg) * 2;
  1184. wchar_t* strbuf = new wchar_t[len + 1];
  1185. memset(strbuf, 0, len);
  1186. wcscpy(strbuf, A2W(TSRuntime::pData->pmsg));
  1187. dwBufLen = len;
  1188. if (lpBuf != NULL)
  1189. {
  1190. wcscpy((wchar_t*)lpBuf, strbuf);
  1191. dwBufLen = wcslen((wchar_t*)lpBuf);
  1192. IsSendstrIme = false;
  1193. }
  1194. delete[]strbuf;
  1195. return dwBufLen;
  1196. }
  1197. nret = IMM32ImmGetCompositionStringW(hIMC, dwIndex, lpBuf, dwBufLen);
  1198. return nret;
  1199. }
  1200. UINT __stdcall MyGetRawInputData(HRAWINPUT hRawInput,
  1201. UINT uiCommand,
  1202. LPVOID pData,
  1203. PUINT pcbSize,
  1204. UINT cbSizeHeader
  1205. )
  1206. {
  1207. UINT nret = 0;
  1208. RAWINPUT* raw = NULL;
  1209. if (TSRuntime::pData)
  1210. TSRuntime::pData->iskeyboardhook = true;
  1211. //TSRuntime::add_log("MyGetRawInputData:pData:%x",(DWORD)pData);
  1212. if (pData)
  1213. {
  1214. raw = (RAWINPUT*)pData;
  1215. if (g_GetRawInputDatahook)
  1216. {
  1217. if (g_message == WM_KEYDOWN || g_message == WM_KEYUP || g_message == WM_SYSKEYDOWN || g_message == WM_SYSKEYUP)
  1218. {
  1219. raw->header.dwType = RIM_TYPEKEYBOARD;
  1220. raw->header.dwSize = sizeof(RAWINPUTHEADER);
  1221. //raw->header.hDevice
  1222. raw->data.keyboard.Message = g_message;//TSRuntime::pData->message;
  1223. if (g_message == WM_KEYUP || g_message == WM_SYSKEYUP)//弹起
  1224. raw->data.keyboard.Flags = RI_KEY_BREAK;
  1225. else//按下
  1226. raw->data.keyboard.Flags = RI_KEY_MAKE;
  1227. raw->data.keyboard.ExtraInformation = (ULONG)GetMessageExtraInfo();
  1228. for (int i = 0; i < 0x100; i++)
  1229. {
  1230. if (1 == TSRuntime::RawInputKeyPressMap[i])
  1231. {
  1232. raw->data.keyboard.VKey = i;
  1233. int key = MapVirtualKey(i, 0);
  1234. raw->data.keyboard.MakeCode = key;
  1235. }
  1236. }
  1237. if (g_message == WM_KEYUP || g_message == WM_SYSKEYUP)
  1238. {
  1239. for (int i = 0; i < 0x100; i++)
  1240. {
  1241. if (1 == TSRuntime::KeyPressMap[i] && i == g_wParam)
  1242. {
  1243. TSRuntime::RawInputKeyPressMap[i] = 0;
  1244. raw->data.keyboard.VKey = i;
  1245. int key = MapVirtualKey(i, 0);
  1246. raw->data.keyboard.MakeCode = key;
  1247. }
  1248. }
  1249. g_GetRawInputDatahook = false;
  1250. }
  1251. *pcbSize = g_GetRawInputKeyDataSize;
  1252. return g_GetRawInputKeyDataSize;//返回键盘数据结构大小
  1253. }
  1254. else//鼠标操作
  1255. {
  1256. raw->header.dwType = RIM_TYPEMOUSE;
  1257. raw->header.dwSize = sizeof(RAWINPUTHEADER);
  1258. raw->data.mouse.lLastX = g_x;
  1259. raw->data.mouse.lLastX = g_y;
  1260. if (g_message == WM_MOUSEMOVE)
  1261. raw->data.mouse.usFlags = MOUSE_MOVE_ABSOLUTE;
  1262. else if (g_message == WM_LBUTTONDOWN)
  1263. raw->data.mouse.usButtonFlags = RI_MOUSE_LEFT_BUTTON_DOWN;//,RI_MOUSE_BUTTON_1_DOWN
  1264. else if (g_message == WM_LBUTTONUP)
  1265. raw->data.mouse.usButtonFlags = RI_MOUSE_LEFT_BUTTON_UP;//,RI_MOUSE_BUTTON_1_UP
  1266. else if (g_message == WM_RBUTTONDOWN)
  1267. raw->data.mouse.usButtonFlags = RI_MOUSE_RIGHT_BUTTON_DOWN;//,RI_MOUSE_BUTTON_2_DOWN
  1268. else if (g_message == WM_RBUTTONUP)
  1269. raw->data.mouse.usButtonFlags = RI_MOUSE_RIGHT_BUTTON_UP;//,RI_MOUSE_BUTTON_2_UP
  1270. else if (g_message == WM_MBUTTONDOWN)
  1271. raw->data.mouse.usButtonFlags = RI_MOUSE_MIDDLE_BUTTON_DOWN;//,RI_MOUSE_BUTTON_3_DOWN
  1272. else if (g_message == WM_MBUTTONUP)
  1273. raw->data.mouse.usButtonFlags = RI_MOUSE_MIDDLE_BUTTON_UP;//,RI_MOUSE_BUTTON_3_UP
  1274. else if (g_message == WM_MOUSEWHEEL)
  1275. {
  1276. raw->data.mouse.usButtonFlags = RI_MOUSE_WHEEL;
  1277. raw->data.mouse.usButtonData = g_dwData;
  1278. }
  1279. raw->data.mouse.ulExtraInformation = (ULONG)GetMessageExtraInfo();
  1280. *pcbSize = g_GetRawInputMouDataSize;
  1281. g_GetRawInputDatahook = false;
  1282. return g_GetRawInputMouDataSize;
  1283. }
  1284. }
  1285. }
  1286. else if (g_message == WM_KEYDOWN || g_message == WM_KEYUP || g_message == WM_SYSKEYDOWN || g_message == WM_SYSKEYUP)//键盘
  1287. {
  1288. *pcbSize = g_GetRawInputKeyDataSize;
  1289. return g_GetRawInputKeyDataSize;//返回键盘数据结构大小
  1290. }
  1291. else//鼠标
  1292. {
  1293. *pcbSize = g_GetRawInputMouDataSize;
  1294. return g_GetRawInputMouDataSize;
  1295. }
  1296. nret = USER32GetRawInputData(hRawInput, uiCommand, pData, pcbSize, cbSizeHeader);
  1297. ////if(pData==NULL)
  1298. ////{
  1299. //// g_GetRawInputDataRetSize=*pcbSize;
  1300. // TSRuntime::add_log("g_GetRawInputDataRetSize:%x",g_GetRawInputDataRetSize);
  1301. ////}
  1302. //if(pData)
  1303. // {
  1304. // raw = (RAWINPUT*)pData;
  1305. // //if(raw->data.keyboard.Message==WM_KEYDOWN||raw->data.keyboard.Message==WM_KEYUP)
  1306. // {
  1307. // TSRuntime::add_log("MyGetRawInputData:pData:%x,VKey:%x,Message:%x,Flags:%x,ExtraInformation:%x,MakeCode:%x,Reserved:%x,nret:%x,",pData,raw->data.keyboard.VKey,raw->data.keyboard.Message,raw->data.keyboard.Flags,raw->data.keyboard.ExtraInformation,raw->data.keyboard.MakeCode,raw->data.keyboard.Reserved,nret);
  1308. // //TSRuntime::add_log("lLastX:%d,lLastY:%d,ulButtons:%x,ulExtraInformation:%x,ulRawButtons:%x,usButtonData:%x,usButtonFlags:%x,usFlags:%x",raw->data.mouse.lLastX,raw->data.mouse.lLastY,raw->data.mouse.ulButtons,raw->data.mouse.ulExtraInformation,raw->data.mouse.ulRawButtons,raw->data.mouse.usButtonData,raw->data.mouse.usButtonFlags,raw->data.mouse.usFlags);
  1309. //
  1310. // //TSRuntime::add_log("dwSize:%x,dwType:%x,hDevice:%x,wParam:%x",raw->header.dwSize,raw->header.dwType,raw->header.hDevice,raw->header.wParam);
  1311. // }
  1312. // }
  1313. //else
  1314. //if(pData==NULL&&pcbSize)
  1315. // {
  1316. // g_GetRawInputDataRetSize=0x20;
  1317. // }
  1318. //if(pData&&nret==0x20)
  1319. // {
  1320. // raw = (RAWINPUT*)pData;
  1321. // TSRuntime::add_log("MyGetRawInputData:pData:%x,VKey:%x,Message:%x,Flags:%x,ExtraInformation:%x,MakeCode:%x,Reserved:%x,nret:%x,",pData,raw->data.keyboard.VKey,raw->data.keyboard.Message,raw->data.keyboard.Flags,raw->data.keyboard.ExtraInformation,raw->data.keyboard.MakeCode,raw->data.keyboard.Reserved,nret);
  1322. // }
  1323. return nret;
  1324. }
  1325. DWORD __stdcall MyGetMessagePos()
  1326. {
  1327. //DWORD ret=USER32GetMessagePos();
  1328. POINT xy;
  1329. GetCursorPos(&xy);
  1330. return (DWORD)MAKELPARAM(xy.x, xy.y);
  1331. }
  1332. HCURSOR __stdcall MySetCursor(HCURSOR hCursor)
  1333. {
  1334. HCURSOR rethCursor = USER32SetCursor(hCursor);
  1335. g_bkmouseshape = hCursor; //记录游戏鼠标hCursor
  1336. //TSRuntime::add_log("MySetCursor:%x",g_bkmouseshape);
  1337. return rethCursor;
  1338. }
  1339. bool __stdcall MyIsWindowEnabled(HWND hWnd)
  1340. {
  1341. //bool bret=USER32IsWindowEnabled(hWnd);
  1342. bool bret = false;
  1343. if (hWnd == g_currentHwnd)
  1344. bret = true;
  1345. //TSRuntime::add_log("MyIsWindowEnabled");
  1346. return bret;
  1347. }
  1348. HWND __stdcall MyWindowFromPoint(POINT Point)
  1349. {
  1350. //HWND hwnd=USER32WindowFromPoint(Point);
  1351. HWND hwnd;
  1352. //if(g_keymouseevent)
  1353. hwnd = g_currentHwnd;
  1354. //else
  1355. //hwnd=g_InjectHWND;
  1356. //TSRuntime::add_log("MyWindowFromPoint");
  1357. return hwnd;
  1358. }
  1359. HWND __stdcall MyGetTopWindow(HWND hWnd)
  1360. {
  1361. //HWND rethwnd=USER32GetTopWindow(hWnd);
  1362. //if(g_currentHwnd)
  1363. HWND rethwnd;
  1364. //if(g_keymouseevent)
  1365. rethwnd = g_currentHwnd;
  1366. //else
  1367. //rethwnd=g_InjectHWND;
  1368. //TSRuntime::add_log("MyGetTopWindow");
  1369. return rethwnd;
  1370. }
  1371. HWND __stdcall MyGetForegroundWindow()
  1372. {
  1373. HWND hwnd;
  1374. //if(g_keymouseevent)
  1375. hwnd = g_currentHwnd;
  1376. //else
  1377. //hwnd=g_InjectHWND;
  1378. return hwnd;
  1379. }
  1380. HWND __stdcall MyGetFocus()
  1381. {
  1382. //HWND hwnd=USER32GetFocus();
  1383. //HWND hwnd=g_currentHwnd;
  1384. //TSRuntime::add_log("MyGetFocus");
  1385. HWND hwnd;
  1386. //if(g_keymouseevent)
  1387. hwnd = g_currentHwnd;
  1388. //else
  1389. //hwnd=g_InjectHWND;
  1390. return hwnd;
  1391. }
  1392. HWND __stdcall MyGetCapture()
  1393. {
  1394. return g_currentHwnd;
  1395. }
  1396. HWND __stdcall MyGetActiveWindow()
  1397. {
  1398. //HWND hwnd=USER32GetActiveWindow();
  1399. //HWND hwnd=g_currentHwnd;
  1400. //TSRuntime::add_log("MyGetActiveWindow");
  1401. HWND hwnd;
  1402. //if(g_keymouseevent)
  1403. hwnd = g_currentHwnd;
  1404. //else
  1405. //hwnd=g_InjectHWND;
  1406. return hwnd;
  1407. }
  1408. COLORREF** pWndBmpBuffer = NULL;
  1409. short** pWndBmpStrxy = NULL;
  1410. BYTE* pBuffer = NULL;
  1411. //int addd=0;
  1412. bool UnhookPresent = false;
  1413. DWORD DxdeviceAddr = 0;
  1414. DWORD Ori_DxdeviceAddr = 0;//原始DX地址;
  1415. HRESULT __stdcall MyD3D9Present(LPDIRECT3DDEVICE9 pDxdevice,//类的this指针
  1416. CONST RECT* pSourceRect,//此参数请参考dx sdk
  1417. CONST RECT* pDestRect,//同上
  1418. HWND hDestWindowOverride,//同上
  1419. CONST RGNDATA* pDirtyRegion)//同上 )
  1420. {
  1421. TSRuntime::pData->ispichook = true;
  1422. if (DxdeviceAddr == 0 && TSRuntime::pData->isgraphicprotect)
  1423. {
  1424. DxdeviceAddr = *(DWORD*)pDxdevice;
  1425. DxdeviceAddr += 0x44;//偏移0x44取DX真正函数的地址
  1426. }
  1427. if (sleeptime != 0)
  1428. Sleep(sleeptime);
  1429. wchar_t pszEventName[MAX_PATH] = { 0 };
  1430. ::wsprintf(pszEventName, L"%s%d", TS_EVENT_NAME, ::GetCurrentProcessId());
  1431. HANDLE hEvent = OpenEvent(EVENT_ALL_ACCESS, FALSE, pszEventName);
  1432. //TSRuntime::add_log( "dx:MyD3D9Present");
  1433. if (hEvent)
  1434. {
  1435. //TSRuntime::add_log( "MyD3D9PresentHOOK:event:%d name %s",hEvent,pszEventName);
  1436. IDirect3DSurface9* pSourceSurface = NULL;
  1437. D3DLOCKED_RECT d3drect;
  1438. D3DSURFACE_DESC surfaceDesc;
  1439. IDirect3DSurface9* MySurface = NULL;
  1440. int wide = 0;
  1441. int hight = 0;
  1442. if (D3D_OK == pDxdevice->GetRenderTarget(0, &pSourceSurface)) //得到当前游戏缓存数据对象指针
  1443. {
  1444. //TSRuntime::add_log( "dx:GetRenderTarget");
  1445. RECT rect;
  1446. HDC myDc;
  1447. HRESULT hret;
  1448. if (D3D_OK == pSourceSurface->GetDesc(&surfaceDesc)) //获取当游戏前缓存数据的属性,主要是获取surfaceDesc.Format格式
  1449. {
  1450. //TSRuntime::add_log( "dx:GetDesc");
  1451. if (GetClientRect(g_currentHwnd, &rect)) //获取当前游戏窗口的大小
  1452. {
  1453. wide = rect.right - rect.left;
  1454. hight = rect.bottom - rect.top;
  1455. if (surfaceDesc.Height > hight || surfaceDesc.Width > wide)
  1456. {
  1457. wide = surfaceDesc.Width;
  1458. hight = surfaceDesc.Height;
  1459. }
  1460. if (D3D_OK == pDxdevice->CreateOffscreenPlainSurface(wide, hight, surfaceDesc.Format, D3DPOOL_SYSTEMMEM, &MySurface, 0)) //创建自己的D3DPOOL=D3DPOOL_SYSTEMMEM的缓存数据对象指针
  1461. {
  1462. if (D3D_OK == pDxdevice->GetRenderTargetData(pSourceSurface, MySurface)) //拷贝当前游戏缓存数据对象给我们自己创建的缓存数据对象
  1463. {
  1464. //hret=MySurface->LockRect(&d3drect,&rect,D3DLOCK_READONLY); //锁定缓存数据得到图色数据指针
  1465. //TSRuntime::add_log( "dx:LockRect");
  1466. //转换数据
  1467. D3DSURFACE_DESC surfaceDesc;
  1468. if (D3D_OK == MySurface->GetDesc(&surfaceDesc))
  1469. {
  1470. wide = surfaceDesc.Width;
  1471. hight = surfaceDesc.Height;
  1472. //TSRuntime::add_log( "surfaceDesc.Width:%d,surfaceDesc.Height:%d",surfaceDesc.Width,surfaceDesc.Height);
  1473. }
  1474. MyFindPictureClass fpic;
  1475. if (wcslen(TSRuntime::SetPath) > 0)
  1476. {
  1477. wcscpy(fpic.SetPath, TSRuntime::SetPath);
  1478. }
  1479. ST_TSFINDPIC* spic = (ST_TSFINDPIC*)TSRuntime::pData->pmsg;
  1480. RECT pSrcRect;
  1481. pSrcRect.top = spic->top;
  1482. pSrcRect.left = spic->left;
  1483. pSrcRect.right = spic->right;
  1484. pSrcRect.bottom = spic->bottom;
  1485. //TSRuntime::add_log( "pSrcRect.top:%d,pSrcRect.left:%d,pSrcRect.right:%d,pSrcRect.bottom:%d",pSrcRect.top,pSrcRect.left,pSrcRect.right,pSrcRect.bottom);
  1486. HDC mydc = NULL, hMemDC;
  1487. MySurface->GetDC(&mydc);
  1488. //TSRuntime::add_log( "MySurface->GetDC,mydc:%x",(DWORD)mydc);
  1489. HBITMAP hBitmap, hOldBitmap;
  1490. if (mydc != NULL)
  1491. {
  1492. int xc = 0;
  1493. int cx = 0;
  1494. int cy = 0;
  1495. //判断边境值
  1496. if (pSrcRect.right <= 0)
  1497. pSrcRect.right = wide - 1;
  1498. if (pSrcRect.bottom <= 0)
  1499. pSrcRect.bottom = hight - 1;
  1500. if (pSrcRect.bottom > hight)
  1501. pSrcRect.bottom = hight - 1;
  1502. if (pSrcRect.right > wide)
  1503. pSrcRect.right = wide - 1;
  1504. //TSRuntime::add_log( "wide:%d,hight:%d",wide,hight);
  1505. //为DX设备描述表创建兼容的内存设备描述表
  1506. hMemDC = CreateCompatibleDC(mydc);
  1507. // 创建一个与屏幕设备描述表兼容的位图
  1508. int picwide = (pSrcRect.right - pSrcRect.left);
  1509. int pichight = (pSrcRect.bottom - pSrcRect.top);
  1510. hBitmap = CreateCompatibleBitmap(mydc, picwide, pichight);
  1511. // 把新位图选到内存设备描述表中
  1512. hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);
  1513. // 把屏幕设备描述表拷贝到内存设备描述表中
  1514. //if(TSRuntime::pData->type==TS_CAPTURE||TSRuntime::pData->type==TS_GETSCREENDATA)
  1515. BitBlt(hMemDC, 0, 0, picwide, pichight, mydc, cx + pSrcRect.left, xc + cy + pSrcRect.top, CAPTUREBLT | SRCCOPY);
  1516. //得到屏幕位图的句柄
  1517. hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);
  1518. switch (TSRuntime::pData->type)
  1519. {
  1520. case TS_CAPTURE:
  1521. {
  1522. wchar_t savepath[MAX_PATH] = { 0 };
  1523. wchar_t* findpath = wcsstr(spic->path, L":");
  1524. if (wcslen(TSRuntime::SetPath) > 1 && findpath == NULL)
  1525. {
  1526. swprintf(savepath, L"%s\\%s", TSRuntime::SetPath, spic->path);
  1527. }
  1528. else
  1529. {
  1530. swprintf(savepath, L"%s", spic->path);
  1531. }
  1532. //HRESULT hsret=D3DXSaveSurfaceToFile(spic->path,(D3DXIMAGE_FILEFORMAT)spic->pictype,pSourceSurface,NULL,&pSrcRect);
  1533. //spic->ret=(int)hsret;
  1534. if (spic->pictype == D3DXIFF_JPG || spic->pictype == D3DXIFF_PNG)
  1535. {
  1536. wchar_t temppath[MAX_PATH] = { 0 };
  1537. wchar_t path[MAX_PATH] = { 0 };
  1538. GetTempPath(MAX_PATH, temppath);
  1539. swprintf(path, L"%s\\TEMPBMP%d.BMP", temppath, ::GetCurrentProcessId());
  1540. if (fpic.SaveBitmapToFile(hBitmap, path))
  1541. {
  1542. if (spic->pictype == D3DXIFF_JPG)
  1543. spic->ret = fpic.BMP2JPG(path, savepath);
  1544. else if (spic->pictype == D3DXIFF_PNG)
  1545. spic->ret = fpic.BMP2PNG(path, savepath);
  1546. DeleteFile(path);
  1547. }
  1548. }
  1549. else if (spic->pictype == D3DXIFF_BMP)
  1550. {
  1551. spic->ret = fpic.SaveBitmapToFile(hBitmap, savepath);
  1552. }
  1553. break;
  1554. }
  1555. case TS_GETSCREENDATA:
  1556. {
  1557. // 24位图的BITMAPINFO
  1558. //memset(TSRuntime::pData->ColorDataInfo,0,sizeof(TSRuntime::pData->ColorDataInfo));
  1559. BITMAPINFO* pBITMAPINFO = (BITMAPINFO*)malloc(sizeof(BITMAPINFOHEADER));
  1560. memset(pBITMAPINFO, 0, sizeof(BITMAPINFOHEADER));
  1561. BITMAPINFOHEADER* pInfo_Header = (BITMAPINFOHEADER*)pBITMAPINFO;
  1562. pInfo_Header->biSize = sizeof(BITMAPINFOHEADER);
  1563. pInfo_Header->biWidth = pSrcRect.right - pSrcRect.left;
  1564. pInfo_Header->biHeight = pSrcRect.bottom - pSrcRect.top;
  1565. pInfo_Header->biPlanes = 1;
  1566. pInfo_Header->biBitCount = 24;
  1567. pInfo_Header->biCompression = BI_RGB;
  1568. // 获得数据buf
  1569. DWORD bufSize = (pInfo_Header->biWidth * 3 + 3) / 4 * 4 * pInfo_Header->biHeight;
  1570. BYTE* pBuffer = new BYTE[bufSize];
  1571. int aHeight = pInfo_Header->biHeight;
  1572. if (::GetDIBits(hMemDC, hBitmap, 0, aHeight, pBuffer, pBITMAPINFO, DIB_RGB_COLORS) == 0)
  1573. {
  1574. free(pBITMAPINFO);
  1575. delete[] pBuffer;
  1576. break;
  1577. }
  1578. int wndWidth = pBITMAPINFO->bmiHeader.biWidth;
  1579. int wndHeight = pBITMAPINFO->bmiHeader.biHeight;
  1580. //HDC dd = ::GetWindowDC(::GetDesktopWindow());
  1581. COLORREF helpcolor = 0;
  1582. int pitch = wndWidth % 4;
  1583. for (int i = 0; i < wndHeight; i++)
  1584. {
  1585. int realPitch = i * pitch;
  1586. for (int j = 0; j < wndWidth; j++)
  1587. {
  1588. UCHAR b = pBuffer[(i * wndWidth + j) * 3 + realPitch];
  1589. UCHAR g = pBuffer[(i * wndWidth + j) * 3 + 1 + realPitch];
  1590. UCHAR r = pBuffer[(i * wndWidth + j) * 3 + 2 + realPitch];
  1591. helpcolor = RGB(r, g, b);
  1592. //TSRuntime::add_log( "TS_GETSCREENDATA:%x",TSRuntime::pData->ColorDataInfo);
  1593. TSRuntime::pData->ColorDataInfo[wndHeight - i - 1][j] = helpcolor;
  1594. //pColorBuffer[wndHeight-i-1][j]=helpcolor;
  1595. //::SetPixel(dd,wndHeight-i-1,j,helpcolor);
  1596. }
  1597. }
  1598. //TSRuntime::add_log( "TS_GETSCREENDATA:%x,wndWidth:%d,wndHeight:%d",TSRuntime::pData->ColorDataInfo,wndWidth,wndHeight);
  1599. free(pBITMAPINFO);
  1600. delete[] pBuffer;
  1601. break;
  1602. }
  1603. }
  1604. DeleteDC(hMemDC);
  1605. DeleteObject(hOldBitmap);
  1606. DeleteObject(hBitmap);
  1607. }
  1608. MySurface->ReleaseDC(mydc);;
  1609. }
  1610. MySurface->Release(); //释放自身缓存对象
  1611. }
  1612. }
  1613. }
  1614. pSourceSurface->Release(); //释放当前游戏缓存数据对象
  1615. }
  1616. //TSRuntime::pData->ispichook=false;
  1617. SetEvent(hEvent);
  1618. ::CloseHandle(hEvent);
  1619. }
  1620. HRESULT rett = D3D9Present(pDxdevice, pSourceRect, pDestRect, hDestWindowOverride, pDirtyRegion);
  1621. //TSRuntime::add_log( "MyD3D9PresentHOOK:pDxdevice:%x,pSourceRect:%x,pDestRect:%x,hDestWindowOverride:%x,pDirtyRegion:%x",pDxdevice,pSourceRect,pDestRect,hDestWindowOverride,pDirtyRegion);
  1622. return rett;
  1623. }
  1624. SHORT __stdcall MyGetKeyState(int nVirtKey)
  1625. {
  1626. //TSRuntime::add_log("NtUserGetKeyState--nVirtKey:%x",nVirtKey);
  1627. ULONG sret = 0;
  1628. if (g_GetKeyState || g_mouseDevice)
  1629. {
  1630. DWORD ALT_KEYCODE = 0;
  1631. bool iskeyevent = false;
  1632. for (int i = 0; i < 0x100; i++)
  1633. {
  1634. if (1 == TSRuntime::KeyPressMap[i])
  1635. {
  1636. if (nVirtKey == i)
  1637. {
  1638. iskeyevent = true;
  1639. break;
  1640. }
  1641. else if ((i == VK_MENU && (nVirtKey == VK_LMENU || nVirtKey == VK_RMENU)) || (i == VK_SHIFT && (nVirtKey == VK_LSHIFT || nVirtKey == VK_RSHIFT))
  1642. || (i == VK_CONTROL && (nVirtKey == VK_LCONTROL || nVirtKey == VK_RCONTROL)))
  1643. {
  1644. iskeyevent = true;
  1645. break;
  1646. }
  1647. }
  1648. }
  1649. if (g_message == WM_LBUTTONDOWN || g_message == WM_RBUTTONDOWN || g_message == WM_MBUTTONDOWN
  1650. || g_message == WM_LBUTTONUP || g_message == WM_RBUTTONUP || g_message == WM_MBUTTONUP)
  1651. {
  1652. if (nVirtKey == VK_LBUTTON || nVirtKey == VK_RBUTTON || nVirtKey == VK_MBUTTON)
  1653. {
  1654. iskeyevent = true;
  1655. if (g_message == WM_LBUTTONDOWN || g_message == WM_RBUTTONDOWN || g_message == WM_MBUTTONDOWN)
  1656. ismousedown = true;
  1657. //TSRuntime::add_log( "MyGetKeyState-1:g_message:%x,nVirtKey:%x,ismousedown:%d",g_message,nVirtKey,ismousedown);
  1658. }
  1659. if (g_message == WM_LBUTTONUP || g_message == WM_RBUTTONUP || g_message == WM_MBUTTONUP)
  1660. {
  1661. ismousedown = false;
  1662. g_mouseDevice = false;
  1663. }
  1664. //TSRuntime::add_log( "MyGetKeyState:g_message:%x,nVirtKey:%x,ismousedown:%d",g_message,nVirtKey,ismousedown);
  1665. }
  1666. //if((g_message==WM_KEYDOWN&&g_wParam==nVirtKey)||(g_message==WM_SYSKEYDOWN&&nVirtKey==VK_MENU)||(g_message==WM_SYSKEYDOWN&&nVirtKey==VK_LMENU) )
  1667. if ((((g_message == WM_KEYDOWN) || (g_message == WM_SYSKEYDOWN)
  1668. || (g_message == WM_LBUTTONDOWN)
  1669. || (g_message == WM_RBUTTONDOWN)
  1670. || (g_message == WM_MBUTTONDOWN)) && iskeyevent) || ((nVirtKey == VK_LBUTTON || nVirtKey == VK_RBUTTON || nVirtKey == VK_MBUTTON) && ismousedown))
  1671. {
  1672. sret = 0xffffff80;
  1673. //TSRuntime::add_log( "MyGetKeyState-WM_SYSKEYDOWN:g_message:%x,nVirtKey:%x,ismousedown:%d",g_message,nVirtKey,ismousedown);
  1674. //返回负数说明该键被按下
  1675. }
  1676. //else if((g_message==WM_KEYUP||g_message==WM_SYSKEYUP)&&g_wParam==nVirtKey)
  1677. else if (((g_message == WM_KEYUP || g_message == WM_SYSKEYUP)
  1678. || (g_message == WM_LBUTTONUP)
  1679. || (g_message == WM_RBUTTONUP)
  1680. || (g_message == WM_MBUTTONUP)) && iskeyevent)
  1681. {
  1682. //TSRuntime::add_log( "MyGetKeyState-WM_SYSKEYUP:g_message:%x,nVirtKey:%x,ismousedown:%d",g_message,nVirtKey,ismousedown);
  1683. sret = 1; //返回正数说明该键被弹起
  1684. g_GetKeyState = false;
  1685. TSRuntime::KeyPressMap[nVirtKey] = 0;
  1686. //g_wParam=0;
  1687. }
  1688. //TSRuntime::add_log( "GetKeyState:nVirtKey:%x,sret:%x,g_message:%x",nVirtKey,sret,g_message);
  1689. //TSRuntime::add_log( "MyGetKeyState:nVirtKey:%x",nVirtKey);
  1690. return sret;
  1691. }
  1692. sret = USER32GetKeyState(nVirtKey);
  1693. return sret;
  1694. }
  1695. bool UnhookKbd_DeviceState = false;
  1696. DWORD Kbd_DeviceStateAddr = 0;
  1697. DWORD Ori_Kbd_DeviceState = 0;//原始DX地址;__stdcall
  1698. //偏移0x24
  1699. HRESULT __stdcall MyGetDeviceStateKbd(
  1700. LPDIRECTINPUTDEVICE8 m_pKeyboard, //当前设备指针
  1701. DWORD cbData, //缓冲区字节大小
  1702. LPVOID lpvData //缓冲区指针
  1703. )
  1704. {
  1705. HRESULT hret;
  1706. //TSRuntime::add_log("MyGetDeviceStateKbd");
  1707. hret = GetDeviceStateKbd(m_pKeyboard, cbData, lpvData);
  1708. if (Kbd_DeviceStateAddr == 0)
  1709. {
  1710. DWORD dwback;
  1711. Kbd_DeviceStateAddr = *(DWORD*)m_pKeyboard;
  1712. Kbd_DeviceStateAddr += 0x24;
  1713. }
  1714. //EVENT_GETKEYSTATE_NAME
  1715. DIDEVCAPS Caps;
  1716. Caps.dwSize = sizeof(DIDEVCAPS);
  1717. if (m_pKeyboard->GetCapabilities(&Caps) == S_OK)
  1718. {
  1719. if (g_kbdDevice && cbData == 0x100)
  1720. {
  1721. if (Caps.dwDevType == 1043 && (g_RealKeyBoardDevice == m_pKeyboard))//dwDevType==274鼠标设备对象 ,dwDevType==1043键盘设备对象
  1722. {
  1723. if (g_message == WM_KEYDOWN || g_message == WM_SYSKEYDOWN)
  1724. {
  1725. for (int i = 0; i < 0x100; i++)
  1726. {
  1727. if (1 == TSRuntime::KeyPressMap[i])
  1728. {
  1729. //i=TSRuntime::VirtualToASCIIMap[i];
  1730. //SetKeyDown(i,(char*)lpvData);
  1731. //int key=TSRuntime::VirtualToASCIIMap[i];
  1732. int key = MapVirtualKey(i, 0);
  1733. if (i == VK_LEFT)
  1734. key = DIK_LEFT;
  1735. else if (i == VK_RIGHT)
  1736. key = DIK_RIGHT;
  1737. else if (i == VK_DOWN)
  1738. key = DIK_DOWN;
  1739. else if (i == VK_UP)
  1740. key = DIK_UP;
  1741. SetKeyDown(key, (char*)lpvData);
  1742. //TSRuntime::add_log("SetKeyDown:key:%x,i:%x",key,i);
  1743. g_isSetKeyDown = true;//标记有按键按下
  1744. }
  1745. }
  1746. //TSRuntime::add_log("VirtualToASCIIMap:g_wParam:%x",g_wParam);
  1747. //g_wParam=TSRuntime::VirtualToASCIIMap[g_wParam];
  1748. //g_wParam=::MapVirtualKey(g_wParam,0);
  1749. //SetKeyDown(g_wParam,(char*)lpvData);
  1750. //g_isSetKeyDown=true;//标记有按键按下
  1751. //TSRuntime::add_log("SetKeyDown:g_message:%x,lpvData:%x,Key.vk:%x",g_message,lpvData,g_wParam);
  1752. }
  1753. else if (g_message == WM_KEYUP || g_message == WM_SYSKEYUP)
  1754. {
  1755. for (int i = 0; i < 0x100; i++)
  1756. {
  1757. if (1 == TSRuntime::KeyPressMap[i] && i == g_wParam)
  1758. {
  1759. //int key=TSRuntime::VirtualToASCIIMap[i];
  1760. int key = MapVirtualKey(i, 0);
  1761. if (i == VK_LEFT)
  1762. key = DIK_LEFT;
  1763. else if (i == VK_RIGHT)
  1764. key = DIK_RIGHT;
  1765. else if (i == VK_DOWN)
  1766. key = DIK_DOWN;
  1767. else if (i == VK_UP)
  1768. key = DIK_UP;
  1769. SetKeyUp(key, (char*)lpvData);
  1770. //TSRuntime::add_log("SetKeyUp:i:%x",key);
  1771. TSRuntime::KeyPressMap[i] = 0;
  1772. //i=TSRuntime::VirtualToASCIIMap[i];
  1773. //SetKeyUp(i,(char*)lpvData);
  1774. //TSRuntime::add_log("SetKeyUp:key:%x,i:%x",key,i);
  1775. }
  1776. }
  1777. //TSRuntime::add_log("SetKeyUp:g_message:%x,lpvData:%x,Key.vk:%x",g_message,lpvData,g_wParam);
  1778. //g_wParam=TSRuntime::VirtualToASCIIMap[g_wParam];
  1779. ////g_wParam=::MapVirtualKey(g_wParam,0);
  1780. //SetKeyUp(g_wParam,(char*)lpvData);
  1781. g_isSetKeyDown = false;//重置按键标记
  1782. g_kbdDevice = false;
  1783. }
  1784. //TSRuntime::add_log("SetKeyUp:g_message:%x,lpvData:%x,Key.vk:%x",g_message,lpvData,g_wParam);
  1785. return S_OK;
  1786. }
  1787. }
  1788. else if (g_mouseDevice && cbData == 0x14)
  1789. {
  1790. if (Caps.dwDevType == 274) //鼠标事件
  1791. {
  1792. g_mousestate = (DIMOUSESTATE*)lpvData;
  1793. if (g_message == WM_LBUTTONDOWN)
  1794. g_mousestate->rgbButtons[0] = 0x80;//左键单击
  1795. else if (g_message == WM_LBUTTONUP)
  1796. g_mousestate->rgbButtons[0] = 0;//左键单击
  1797. else if (g_message == WM_RBUTTONDOWN)
  1798. g_mousestate->rgbButtons[1] = 0x80;//右键单击
  1799. else if (g_message == WM_RBUTTONUP)
  1800. g_mousestate->rgbButtons[1] = 0;//右键单击
  1801. else if (g_message == WM_MBUTTONDOWN)
  1802. g_mousestate->rgbButtons[2] = 0x80;//中键单击
  1803. else if (g_message == WM_MBUTTONUP)
  1804. g_mousestate->rgbButtons[2] = 0;//中键单击
  1805. else if (g_message == WM_MOUSEWHEEL)
  1806. g_mousestate->rgbButtons[3] = g_dwData;//上滚/下滚
  1807. g_mouseDevice = false;
  1808. return S_OK;
  1809. }
  1810. }
  1811. else if (cbData == 0x100)
  1812. {
  1813. if (Caps.dwDevType == 1043)
  1814. {
  1815. if (g_RealKeyBoardDevice)
  1816. {
  1817. if (g_RealKeyBoardDevice != m_pKeyboard)//要排除多余的键盘设备,真正的键盘设备指针比多余的键盘设备指针要小
  1818. {
  1819. if ((DWORD)g_RealKeyBoardDevice > (DWORD)m_pKeyboard)
  1820. g_RealKeyBoardDevice = m_pKeyboard;
  1821. //TSRuntime::add_log("SetKeyUp:g_RealKeyBoardDevice:%x,lpvData:%x",g_RealKeyBoardDevice,lpvData);
  1822. }
  1823. }
  1824. if (g_RealKeyBoardDevice == NULL)
  1825. g_RealKeyBoardDevice = m_pKeyboard;
  1826. }
  1827. }
  1828. }
  1829. //TSRuntime::add_log("SetDXKey:cbData:%x,lpvData:%x",cbData,lpvData);
  1830. if (g_isSetKeyDown)
  1831. hret = S_OK;
  1832. if (g_LockInput_kdb && Caps.dwDevType == 1043) //dwDevType==274鼠标设备对象 ,dwDevType==1043键盘设备对象
  1833. {
  1834. ZeroMemory(lpvData, cbData);
  1835. hret = S_FALSE; //封锁外部键盘事件
  1836. }
  1837. if (g_LockInput_mouse && Caps.dwDevType == 274)
  1838. {
  1839. ZeroMemory(lpvData, cbData);
  1840. hret = S_FALSE; //封锁外部鼠标事件
  1841. }
  1842. // TSRuntime::add_log("SetKeyUp:cbData:%x,lpvData:%x",cbData,lpvData);
  1843. return hret;
  1844. }
  1845. bool UnhookMouse_DeviceState = false;
  1846. DWORD Mouse_DeviceStateAddr = 0;
  1847. DWORD Ori_Mouse_DeviceState = 0;//原始DX地址;
  1848. //偏移0x28
  1849. HRESULT __stdcall MyGetDeviceStateMouse(
  1850. LPDIRECTINPUTDEVICE8 m_pMouse, //当前设备指针
  1851. DWORD cbObjectData,
  1852. LPDIDEVICEOBJECTDATA rgdod,
  1853. LPDWORD pdwInOut,
  1854. DWORD dwFlags)
  1855. {
  1856. HRESULT hret;
  1857. hret = GetDeviceStateMouse(m_pMouse, cbObjectData, rgdod, pdwInOut, dwFlags);
  1858. //if(UnhookMouse_DeviceState==false)
  1859. //{
  1860. // TSRuntime::add_log("MyGetDeviceStateMouse:%x",(DWORD)MyGetDeviceStateMouse);
  1861. // UnhookMouse_DeviceState=true;
  1862. //}
  1863. if (Mouse_DeviceStateAddr == 0)
  1864. {
  1865. Mouse_DeviceStateAddr = *(DWORD*)m_pMouse;
  1866. Mouse_DeviceStateAddr += 0x28;
  1867. //*(DWORD*)Mouse_DeviceStateAddr=(DWORD)MyGetDeviceStateMouse;
  1868. //return hret;
  1869. }
  1870. if (rgdod)
  1871. g_rgdod = rgdod;
  1872. else
  1873. rgdod = g_rgdod;
  1874. DIDEVCAPS Caps;
  1875. if (m_pMouse)
  1876. {
  1877. Caps.dwSize = sizeof(DIDEVCAPS);
  1878. if (m_pMouse->GetCapabilities(&Caps) == S_OK)
  1879. {
  1880. if (Caps.dwDevType == 274 && g_mouseDevice) //dwDevType==274鼠标设备对象 ,dwDevType==1043键盘设备对象 g_kbdDevice
  1881. {
  1882. rgdod->dwOfs = g_dwOfs;
  1883. rgdod->dwData = g_dwData;
  1884. rgdod->dwTimeStamp = GetTickCount();
  1885. *pdwInOut = 1; //当有键盘鼠标事件时候,*pdwInOut=1,记录了事件缓存
  1886. g_mouseDevice = false;
  1887. //TSRuntime::add_log( "cbObjectData:%x,rgdod->dwOfs:%x,rgdod->dwData:%x,pdwInOut:%x,dwFlags:%x",cbObjectData,rgdod->dwOfs,rgdod->dwData,*pdwInOut,dwFlags);
  1888. return S_OK;
  1889. }
  1890. else if (Caps.dwDevType == 1043 && g_kbdDevice_mouse) //dwDevType==274鼠标设备对象 ,dwDevType==1043键盘设备对象
  1891. {
  1892. //g_wParam=TSRuntime::VirtualToASCIIMap[g_wParam];
  1893. int key = 0;
  1894. for (int i = 0; i < 0x100; i++)
  1895. {
  1896. if (1 == TSRuntime::KeyPressMap_Mouse[i])
  1897. {
  1898. key = TSRuntime::VirtualToASCIIMap[i];
  1899. //key=MapVirtualKey(i,0);
  1900. //rgdod->dwOfs=key;
  1901. for (int cnt = 0; cnt < 0x100; cnt++)
  1902. {
  1903. if (TSRuntime::keyMap[cnt])
  1904. {
  1905. if (TSRuntime::keyMap[cnt] == key)
  1906. {
  1907. rgdod->dwOfs = cnt;
  1908. //TSRuntime::add_log("SetKeyDown:key:%x,i:%x",cnt,cnt);
  1909. break;
  1910. }
  1911. }
  1912. }
  1913. g_isSetKeyDown = true;//标记有按键按下
  1914. }
  1915. }
  1916. rgdod->dwData = g_dwData;
  1917. rgdod->dwTimeStamp = GetTickCount();
  1918. *pdwInOut = 1; //当有键盘鼠标事件时候,*pdwInOut=1,记录了事件缓存
  1919. if (g_message == WM_KEYUP || g_message == WM_SYSKEYUP)
  1920. TSRuntime::KeyPressMap_Mouse[g_wParam] = 0;
  1921. g_kbdDevice_mouse = false;
  1922. //TSRuntime::add_log( "g_message:%x,g_wParam:%x,g_isSetKeyDown:%d",g_message,g_wParam,g_isSetKeyDown);
  1923. //TSRuntime::add_log( "rgdod->uAppData:%x,rgdod->dwTimeStamp:%x,rgdod->dwSequence:%x,rgdod->dwOfs:%x,rgdod->dwData:%x,pdwInOut:%x,dwFlags:%x",rgdod->uAppData,rgdod->dwTimeStamp,rgdod->dwSequence,rgdod->dwOfs,rgdod->dwData,*pdwInOut,dwFlags);
  1924. //TSRuntime::add_log( "m_pMouse:%x,hret:%x,rgdod->dwOfs:%x,rgdod->dwData:%x,pdwInOut:%x,dwFlags:%x",m_pMouse,S_OK,rgdod->dwOfs,rgdod->dwData,*pdwInOut,dwFlags);
  1925. return S_OK;
  1926. }
  1927. if ((Caps.dwDevType == 274) && (g_LockInput_mouse)) //锁定鼠标
  1928. {
  1929. rgdod->dwOfs = 0;
  1930. rgdod->dwData = 0;
  1931. *pdwInOut = 0;
  1932. //return DIERR_INPUTLOST;
  1933. }
  1934. if (Caps.dwDevType == 1043 && g_LockInput_kdb) //锁键盘
  1935. {
  1936. rgdod->dwOfs = 0;
  1937. rgdod->dwData = 0;
  1938. *pdwInOut = 0;
  1939. //return DIERR_INPUTLOST;
  1940. }
  1941. }
  1942. } //hret
  1943. //TSRuntime::add_log( "hret:%x",hret);
  1944. //if(*pdwInOut!=0&&Caps.dwDevType==1043)
  1945. //TSRuntime::add_log( "rgdod->dwTimeStamp:%x,rgdod->dwSequence:%x,rgdod->dwOfs:%x,rgdod->dwData:%x,pdwInOut:%x,dwFlags:%x",rgdod->dwTimeStamp,rgdod->dwSequence,rgdod->dwOfs,rgdod->dwData,*pdwInOut,dwFlags);
  1946. //hret= S_OK;
  1947. return hret;
  1948. }
  1949. BOOL __stdcall MyScreenToClient(HWND hWnd, LPPOINT lpPoint)
  1950. {
  1951. //bool ret=USER32ScreenToClient(hWnd,lpPoint);
  1952. lpPoint->x = g_x;
  1953. lpPoint->y = g_y;
  1954. //TSRuntime::add_log( "MyScreenToClient:x:%d, y: %d ",lpPoint->x,lpPoint->y);
  1955. return true;
  1956. }
  1957. BOOL __stdcall MyGetCursorPos(LPPOINT lpPoint) //g_IsGetCursorPoschook
  1958. {
  1959. bool ret = USER32GetCursorPos(lpPoint);
  1960. g_lpPoint = lpPoint;
  1961. lpPoint->x = g_x;
  1962. lpPoint->y = g_y;
  1963. ::ClientToScreen(g_currentHwnd, lpPoint);
  1964. return ret;
  1965. }
  1966. BOOL __stdcall MySetCursorPos(int x, int y) //防止外部鼠标漂移
  1967. {
  1968. //USER32SetCursorPos(lpPoint);
  1969. return true;
  1970. }
  1971. //{0, WM_LBUTTONDOWN, irr::EMIE_LMOUSE_PRESSED_DOWN},
  1972. //{1, WM_LBUTTONUP, irr::EMIE_LMOUSE_LEFT_UP},
  1973. //{0, WM_RBUTTONDOWN, irr::EMIE_RMOUSE_PRESSED_DOWN},
  1974. //{1, WM_RBUTTONUP, irr::EMIE_RMOUSE_LEFT_UP},
  1975. //{0, WM_MBUTTONDOWN, irr::EMIE_MMOUSE_PRESSED_DOWN},
  1976. //{1, WM_MBUTTONUP, irr::EMIE_MMOUSE_LEFT_UP},
  1977. //{2, WM_MOUSEMOVE, irr::EMIE_MOUSE_MOVED},
  1978. //{3, WM_MOUSEWHEEL, irr::EMIE_MOUSE_WHEEL},
  1979. //{-1, 0, 0}
  1980. typedef LRESULT(__stdcall* My_InternalCallWinProc)(DWORD fAnsi, HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
  1981. My_InternalCallWinProc f_My_InternalCallWinProc;
  1982. typedef LRESULT(__stdcall* InjectWinProc)(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
  1983. InjectWinProc f_InjectWinProc;
  1984. void CALLBACK MyTimerProc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime)
  1985. {
  1986. return;
  1987. }
  1988. DWORD UnHookKbdMouse_time = 0;
  1989. void UnHookKbdMouse()//还原DX钩子,防检测
  1990. {
  1991. //还原DX钩子,防检测
  1992. //修改成我们的地址后,我们就可以恢复DX图色钩子了,这样可以达到防止DX图色被检测
  1993. if (SySTpye == 1)//XP
  1994. GetHookModFuntion(L"dinput8.dll", "GetDeviceState", GetDeviceStateOBJkeyboardXPoffse, (DWORD)MyGetDeviceStateKbd, (DWORD)GetDeviceStateKbd, HookGetDeviceStateKbdRet, false); //xp
  1995. else if (SySTpye == 2)//win2003
  1996. GetHookModFuntion(L"dinput8.dll", "GetDeviceState", GetDeviceStateOBJkeyboardXPoffse, (DWORD)MyGetDeviceStateKbd, (DWORD)GetDeviceStateKbd, HookGetDeviceStateKbdRet, false); //win2003
  1997. else if (SySTpye == 4)//win7
  1998. GetHookModFuntion(L"dinput8.dll", "GetDeviceState", GetDeviceStateOBJkeyboardWin7offse, (DWORD)MyGetDeviceStateKbd, (DWORD)GetDeviceStateKbd, HookGetDeviceStateKbdRet, false);//win7
  1999. else if (SySTpye == 5)//win8
  2000. GetHookModFuntion(L"dinput8.dll", "GetDeviceState", GetDeviceStateOBJkeyboardWin8offse, (DWORD)MyGetDeviceStateKbd, (DWORD)GetDeviceStateKbd, HookGetDeviceStateKbdRet, false); //win8
  2001. //还原DX钩子,防检测
  2002. if (SySTpye == 1)//XP
  2003. GetHookModFuntion(L"dinput8.dll", "GetDeviceState", GetDeviceStateOBJMouseXPoffse, (DWORD)MyGetDeviceStateMouse, (DWORD)GetDeviceStateMouse, HookGetDeviceStateMouseRet, false);//HOOK:XP系统下的:dinput8.dll的GetDeviceState函数 //xp
  2004. else if (SySTpye == 2)//win2003
  2005. GetHookModFuntion(L"dinput8.dll", "GetDeviceState", GetDeviceStateOBJMouseXPoffse, (DWORD)MyGetDeviceStateMouse, (DWORD)GetDeviceStateMouse, HookGetDeviceStateMouseRet, false); //win2003
  2006. else if (SySTpye == 4)//win7
  2007. GetHookModFuntion(L"dinput8.dll", "GetDeviceState", GetDeviceStateOBJMouseWin7offse, (DWORD)MyGetDeviceStateMouse, (DWORD)GetDeviceStateMouse, HookGetDeviceStateMouseRet, false);//win7
  2008. else if (SySTpye == 5)//win8
  2009. GetHookModFuntion(L"dinput8.dll", "GetDeviceState", GetDeviceStateOBJMouseWin8offse, (DWORD)MyGetDeviceStateMouse, (DWORD)GetDeviceStateMouse, HookGetDeviceStateMouseRet, false); //win8
  2010. }
  2011. void HookKbdMouse()//隐藏DX键鼠钩子,防DX键鼠钩子检测盾
  2012. {
  2013. DWORD dwback = 0, dwwrite = 0, time1 = 0;
  2014. //TSRuntime::add_log("HookKbdMouse,Kbd_DeviceStateAddr:%x,Mouse_DeviceStateAddr:%x",Kbd_DeviceStateAddr,Mouse_DeviceStateAddr);
  2015. if (Kbd_DeviceStateAddr != 0 || Mouse_DeviceStateAddr != 0)
  2016. {
  2017. if (Kbd_DeviceStateAddr)
  2018. {
  2019. if (!UnhookKbd_DeviceState)
  2020. {
  2021. ::VirtualProtect((void*)Kbd_DeviceStateAddr, 5, PAGE_EXECUTE_READWRITE, &dwback);
  2022. Ori_Kbd_DeviceState = *(DWORD*)Kbd_DeviceStateAddr;
  2023. *(DWORD*)Kbd_DeviceStateAddr = (DWORD)MyGetDeviceStateKbd;
  2024. ::VirtualProtect((void*)Kbd_DeviceStateAddr, 5, dwback, &dwback);
  2025. UnhookKbd_DeviceState = true;
  2026. UnHookKbdMouse();
  2027. }
  2028. }
  2029. if (Mouse_DeviceStateAddr)
  2030. {
  2031. if (!UnhookMouse_DeviceState)
  2032. {
  2033. ::VirtualProtect((void*)Mouse_DeviceStateAddr, 5, PAGE_EXECUTE_READWRITE, &dwback);
  2034. Ori_Mouse_DeviceState = *(DWORD*)Mouse_DeviceStateAddr;
  2035. *(DWORD*)Mouse_DeviceStateAddr = (DWORD)MyGetDeviceStateMouse;
  2036. ::VirtualProtect((void*)Mouse_DeviceStateAddr, 5, dwback, &dwback);
  2037. UnhookMouse_DeviceState = true;
  2038. UnHookKbdMouse();
  2039. }
  2040. //TSRuntime::add_log("HookKbdMouse,Mouse_DeviceStateAddr:%x",Mouse_DeviceStateAddr);
  2041. }
  2042. }
  2043. }
  2044. void InitRawInputDevices()
  2045. {
  2046. if (GetRegisteredRawInputDevicesAddr == 0)
  2047. {
  2048. GetRegisteredRawInputDevicesAddr = (DWORD)::GetProcAddress(::GetModuleHandle(L"user32.dll"), "GetRegisteredRawInputDevices");
  2049. My_GetRegisteredRawInputDevices = (MyGetRegisteredRawInputDevices)GetRegisteredRawInputDevicesAddr;
  2050. }
  2051. if (g_hwndRawInput == NULL && isnotRawInput == false)
  2052. {
  2053. UINT numberDevices = 10;
  2054. RAWINPUTDEVICE Rid[10];
  2055. memset(Rid, 0, sizeof(Rid));
  2056. UINT uret = My_GetRegisteredRawInputDevices(Rid, &numberDevices, sizeof(RAWINPUTDEVICE));
  2057. //ERROR_INSUFFICIENT_BUFFER
  2058. g_hwndRawInput = Rid[0].hwndTarget;
  2059. isnotRawInput = true;
  2060. }
  2061. }
  2062. MyFindPictureClass pic;
  2063. LRESULT __stdcall MyInternalCallWinProc(DWORD fAnsi, HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  2064. {
  2065. LRESULT lret = 0;
  2066. switch (message) //WM_ACTIVATEAPP
  2067. {
  2068. case WM_CAPTURECHANGED:
  2069. {
  2070. if (g_currentHwnd == (HWND)lParam)
  2071. {
  2072. lParam = 0;
  2073. return 0;
  2074. }
  2075. break;
  2076. }
  2077. case WM_WINDOWPOSCHANGING:
  2078. {
  2079. //if(GameMsg==NULL)
  2080. // GameMsg=(LPMSG)lParam;//获取游戏内部PeekMessage中的MSG指针
  2081. //lret=USER32InternalCallWinProc(fAnsi,hWnd,message,wParam,lParam);
  2082. //TSRuntime::add_log("WM_WINDOWPOSCHANGING:lParam:%x,lret:%x",lParam,lret);
  2083. //return lret;
  2084. //wp = *(LPWINDOWPOS)lParam;
  2085. //WINDOWPOS* wndPos =&wp;
  2086. //if(wndPos->hwnd==g_currentHwnd)
  2087. //{
  2088. // wndPos->flags=0x3;
  2089. // return 0;
  2090. //}
  2091. //TSRuntime::add_log("WM_WINDOWPOSCHANGING:hwnd:%x,hwndInsertAfter:%x,flags:%x,myhwnd:%x",wndPos->hwnd,wndPos->hwndInsertAfter,wndPos->flags,g_currentHwnd);
  2092. break;
  2093. }
  2094. case WM_WINDOWPOSCHANGED:
  2095. {
  2096. //if(GameMsg==NULL)
  2097. // GameMsg=(LPMSG)lParam;//获取游戏内部PeekMessage中的MSG指针
  2098. //
  2099. //lret=USER32InternalCallWinProc(fAnsi,hWnd,message,wParam,lParam);
  2100. //TSRuntime::add_log("WM_WINDOWPOSCHANGING:lParam:%x,lret:%x",lParam,lret);
  2101. //return lret;
  2102. //WINDOWPOS wp = *(LPWINDOWPOS)lParam;
  2103. //WINDOWPOS* wndPos =&wp;
  2104. //if(wndPos->hwnd==g_currentHwnd)
  2105. //{
  2106. // wndPos->flags=0x1803;
  2107. // return 0;
  2108. //}
  2109. //TSRuntime::add_log("WM_WINDOWPOSCHANGED:hwnd:%x,hwndInsertAfter:%x,flags:%x,myhwnd:%x",wndPos->hwnd,wndPos->hwndInsertAfter,wndPos->flags,g_currentHwnd);
  2110. break;
  2111. }
  2112. case WM_ACTIVATEAPP: //伪激活
  2113. {
  2114. if (wParam == 0)
  2115. {
  2116. wParam = 1;
  2117. return 0;
  2118. }
  2119. //WINDOWPOS wp;
  2120. break;
  2121. }
  2122. case WM_ACTIVATE:
  2123. {
  2124. if (LOWORD(wParam) == WA_INACTIVE)//失去焦点时候
  2125. {
  2126. wParam = MAKEWPARAM(WA_ACTIVE, 0);
  2127. return 0;
  2128. }
  2129. break;
  2130. }
  2131. case WM_KILLFOCUS: //SWP_NOMOVE | SWP_NOSIZE
  2132. {
  2133. if (g_LockInput_mouse == true)
  2134. {
  2135. wParam = (WPARAM)g_currentHwnd;
  2136. }
  2137. break;
  2138. }
  2139. case WM_NCHITTEST://dx.mouse.position.lock.message
  2140. {
  2141. if (g_LockInput_mouse == true)
  2142. {
  2143. DWORD ret = DefWindowProcA(hWnd, message, wParam, lParam);
  2144. if (ret == HTCAPTION)
  2145. {
  2146. //TSRuntime::add_log("WM_NCHITTESTret:%x",ret);
  2147. return HTCAPTION;
  2148. }
  2149. return HTNOWHERE;
  2150. }
  2151. else
  2152. {
  2153. if (wParam == 0x8000)
  2154. wParam = 0;
  2155. }
  2156. break;
  2157. }
  2158. case WM_NCACTIVATE:
  2159. {
  2160. //TSRuntime::add_log("hWnd:%x",hWnd);
  2161. if (hWnd == g_currentHwnd && wParam == 0 && g_LockInput_mouse == true)
  2162. {
  2163. wParam = 1;
  2164. return 0;
  2165. }
  2166. else if (wParam == 0)
  2167. {
  2168. wParam = 1;
  2169. return 1;
  2170. }
  2171. break;
  2172. }
  2173. case TS_BIND:
  2174. {
  2175. g_currentHwnd = (HWND)wParam;//TSRuntime::GetProcessMainWnd((DWORD)lParam);//获取注入方进程窗口句柄
  2176. IsNpProtect = (BOOLEAN)lParam;//接收是否开启NP特殊处理
  2177. if (TSRuntime::pData->NowUsingDictIndex != -1)
  2178. SendMessage(g_currentHwnd, TS_SETDICT, 0, 0);
  2179. if (TSRuntime::pData->InjectType == 103)
  2180. TSRuntime::pData->InjectType = 101;
  2181. if (wcslen(TSRuntime::pData->SetPicPwdString) > 0)
  2182. wcscpy(TSRuntime::SetPicPwdString, TSRuntime::pData->SetPicPwdString);
  2183. return TRUE;
  2184. break;
  2185. }
  2186. case TS_UNBIND:
  2187. {
  2188. //TSRuntime::add_log( "%x,%x,%x,%x",::GetActiveWindow(),::GetFocus(),::GetTopWindow(g_currentHwnd),GetForegroundWindow());
  2189. //TSRuntime::add_log("ScreenToClient-,lpPoint:x:%d,lpPoint:y:%d",po.x,po.y);
  2190. GameMsg = NULL;
  2191. if (Ori_DxdeviceAddr != 0)
  2192. {
  2193. //TSRuntime::add_log("TS_UNBIND-start,DxdeviceAddr:%x,Ori_DxdeviceAddr:%x,MyD3D9Present:%x",*(DWORD*)DxdeviceAddr,Ori_DxdeviceAddr,(DWORD)MyD3D9Present);
  2194. if (*(DWORD*)DxdeviceAddr == (DWORD)MyD3D9Present)
  2195. {
  2196. DWORD dwback = 0;
  2197. ::VirtualProtect((void*)DxdeviceAddr, 5, PAGE_EXECUTE_READWRITE, &dwback);
  2198. *(DWORD*)DxdeviceAddr = Ori_DxdeviceAddr;//把我们的函数地址修改到真正的函数地址
  2199. ::VirtualProtect((void*)DxdeviceAddr, 5, dwback, &dwback);
  2200. }
  2201. UnhookPresent = false;
  2202. //TSRuntime::add_log( "TS_ISGRAPHICPROTECT:UnhookPresent:%x,ORI:%x",Ori_DxdeviceAddr,*(DWORD*)DxdeviceAddr);
  2203. }
  2204. if (Ori_Kbd_DeviceState != 0)
  2205. {
  2206. if (*(DWORD*)Kbd_DeviceStateAddr == (DWORD)MyGetDeviceStateKbd)
  2207. {
  2208. DWORD dwback = 0;
  2209. //TSRuntime::add_log("Ori_Kbd_DeviceState:%x",Ori_Kbd_DeviceState);
  2210. ::VirtualProtect((void*)Kbd_DeviceStateAddr, 5, PAGE_EXECUTE_READWRITE, &dwback);
  2211. *(DWORD*)Kbd_DeviceStateAddr = Ori_Kbd_DeviceState;//把我们的函数地址修改到真正的函数地址
  2212. ::VirtualProtect((void*)Kbd_DeviceStateAddr, 5, dwback, &dwback);
  2213. }
  2214. UnhookKbd_DeviceState = false;
  2215. }
  2216. if (Ori_Mouse_DeviceState != 0)
  2217. {
  2218. if (*(DWORD*)Mouse_DeviceStateAddr == (DWORD)MyGetDeviceStateMouse)
  2219. {
  2220. DWORD dwback = 0;
  2221. //TSRuntime::add_log("Ori_Mouse_DeviceState:%x",Ori_Kbd_DeviceState);
  2222. ::VirtualProtect((void*)Mouse_DeviceStateAddr, 5, PAGE_EXECUTE_READWRITE, &dwback);
  2223. *(DWORD*)Mouse_DeviceStateAddr = Ori_Mouse_DeviceState;//把我们的函数地址修改到真正的函数地址
  2224. ::VirtualProtect((void*)Mouse_DeviceStateAddr, 5, dwback, &dwback);
  2225. }
  2226. UnhookMouse_DeviceState = false;
  2227. }
  2228. if (TSRuntime::pData->Isdxkmprotect)
  2229. VIPHookandUnhookAPI((void*)false);
  2230. else
  2231. HookandUnhookAPI((void*)false);
  2232. if (TSRuntime::MyDictCount[TSRuntime::NowUsingDictIndex] != NULL)
  2233. delete[] TSRuntime::MyDictCount[TSRuntime::NowUsingDictIndex];
  2234. g_Unbind = true;
  2235. TSRuntime::pData->NowUsingDictIndex = -1;
  2236. if (TSRuntime::pData->InjectType == 101)
  2237. if (IsWindow(g_InjectHWND) == true)
  2238. TSRuntime::pData->InjectType = 102;
  2239. //if(TSRuntime::pData->InjectType==205)//203绑定
  2240. //{
  2241. // if(TSRuntime::pData->RemodeDLLMode!=NULL)//释放上一次加载的DLL模块,因为不能自己释放自己,否则会引起异常
  2242. // MemoryFreeLibrary(TSRuntime::pData->RemodeDLLMode);
  2243. // TSRuntime::pData->RemodeDLLMode=g_hInstance;
  2244. //}
  2245. //TSRuntime::add_log("TS_UNBIND--GetForegroundWindow:%d,GetFocus:%d,GetActiveWindow:%d",GetForegroundWindow(),GetFocus(),GetActiveWindow());
  2246. //TSRuntime::add_log("TS_UNBIND-end");
  2247. //解绑操作
  2248. return TRUE;
  2249. break;
  2250. }
  2251. case TS_KEYDOWN:
  2252. {
  2253. if (wParam == VK_MENU)////WM_SYSKEYDOWN
  2254. {
  2255. TSRuntime::g_IsSYSKEY = true;
  2256. TSRuntime::KeyPressMap[0xA4] = 1;//左Alt键
  2257. TSRuntime::KeyPressMap_Mouse[0xA4] = 1;//左Alt键
  2258. }
  2259. if (TSRuntime::g_IsSYSKEY && lParam == 0)
  2260. message = WM_SYSKEYDOWN;
  2261. else
  2262. message = WM_KEYDOWN;
  2263. if (wParam == VK_CONTROL)
  2264. {
  2265. TSRuntime::KeyPressMap[0xA2] = 1;//左Ctrl键
  2266. TSRuntime::KeyPressMap_Mouse[0xA2] = 1;
  2267. }
  2268. else if (wParam == VK_SHIFT)
  2269. {
  2270. TSRuntime::KeyPressMap[0xA0] = 1;//左Shift键
  2271. TSRuntime::KeyPressMap_Mouse[0xA0] = 1;//左Shift键
  2272. }
  2273. g_dwData = 0x80;
  2274. g_keymouseevent = true;
  2275. g_message = message;
  2276. g_wParam = wParam;
  2277. TSRuntime::KeyPressMap[wParam] = 1;
  2278. TSRuntime::KeyPressMap_Mouse[wParam] = 1;
  2279. TSRuntime::RawInputKeyPressMap[wParam] = 1;
  2280. g_kbdDevice = true;
  2281. g_keyboardstate = true;
  2282. g_kbdDevice_mouse = true;
  2283. g_GetKeyState = true;
  2284. g_GetRawInputDatahook = true;
  2285. //if(message==WM_KEYDOWN)
  2286. lParam = TSRuntime::retrunLparamDown(wParam);
  2287. if (message == WM_SYSKEYDOWN && wParam == VK_MENU)
  2288. lParam = 0x4000000 | lParam;
  2289. else if (message == WM_SYSKEYDOWN)
  2290. lParam = 0x4000000 | 0x20000000 | TSRuntime::retrunLparamDown(wParam);
  2291. hWnd = g_currentHwnd;
  2292. if (IsNpProtect)
  2293. HookMessageAPI();
  2294. //"dx.keypad.state.api"//EM_SETMARGINS,(WPARAM)GetCurrentProcessId(),1
  2295. ::PostThreadMessageA(0x80000000, EM_GETMARGINS, (WPARAM)GetCurrentProcessId(), (LPARAM)(0x8000 | ::MapVirtualKeyEx(g_wParam, 0, GetKeyboardLayout(0))));
  2296. //if(wParam!=13) //等于wParam=13回车键的时候放行
  2297. // wParam=0x8000|wParam;
  2298. //TSRuntime::add_log("TS_KEYDOWN:message:%x,wParam:%x",message,wParam);//TSRuntime::VirtualToASCIIMap[wParam]
  2299. if (TSRuntime::g_IsSYSKEY && wParam != VK_MENU)
  2300. {
  2301. if (HookPostMessageRet != 0)
  2302. MyPostMessage(g_currentHwnd, message, wParam, lParam);
  2303. else
  2304. ::PostMessage(g_currentHwnd, message, wParam, lParam);
  2305. }
  2306. else//
  2307. {
  2308. if (HookPostMessageRet != 0)
  2309. MyPostMessage(g_currentHwnd, message, wParam, lParam);
  2310. else
  2311. ::PostMessage(g_currentHwnd, message, wParam, lParam);
  2312. }
  2313. InitRawInputDevices();
  2314. if (g_hwndRawInput != NULL)
  2315. PostMessageA(g_hwndRawInput, WM_INPUT, 0, 0x12345678);
  2316. if (GameMsg)
  2317. {
  2318. GameMsg->hwnd = g_currentHwnd;
  2319. GameMsg->message = message;
  2320. GameMsg->wParam = wParam;
  2321. GameMsg->lParam = lParam;
  2322. }
  2323. message = TS_KEYDOWN;
  2324. //TSRuntime::add_log("message:%x,wParam:%x,lParam:%x",message,wParam,lParam);
  2325. //TSRuntime::add_log("hwndTarget:%d,uret:%d,GetLastError:%d",hwndTarget,uret,GetLastError());
  2326. //MessageBoxA(NULL,"aa","ts",NULL);
  2327. return 1;
  2328. break;
  2329. }
  2330. case TS_KEYUP:
  2331. {
  2332. if (TSRuntime::g_IsSYSKEY && lParam == 0)
  2333. message = WM_SYSKEYUP;
  2334. else
  2335. message = WM_KEYUP;
  2336. g_dwData = 0;
  2337. g_message = message;
  2338. g_wParam = wParam;
  2339. g_GetKeyState = true;
  2340. g_keyboardstate = true;
  2341. g_keymouseevent = true;
  2342. g_kbdDevice_mouse = true;
  2343. g_kbdDevice = true;
  2344. //TSRuntime::KeyPressMap[wParam]=0;
  2345. if (wParam == VK_MENU)
  2346. lParam = 0XC0380001;
  2347. else if (message == WM_KEYUP)
  2348. lParam = 0xC0000000 | TSRuntime::retrunLparamDown(wParam);
  2349. else if (message == WM_SYSKEYUP)
  2350. lParam = 0xE0000000 | TSRuntime::retrunLparamDown(wParam);
  2351. hWnd = g_currentHwnd;
  2352. //"dx.keypad.state.api"
  2353. ::PostThreadMessageA(0x80000000, EM_GETMARGINS, (WPARAM)GetCurrentProcessId(), (LPARAM)::MapVirtualKeyEx(g_wParam, 0, GetKeyboardLayout(0)));
  2354. //if(wParam!=13) //等于wParam=13回车键的时候放行
  2355. // wParam=0x8000|wParam;
  2356. if (IsNpProtect)
  2357. HookMessageAPI();
  2358. if (HookPostMessageRet != 0)
  2359. MyPostMessage(g_currentHwnd, message, wParam, lParam);
  2360. else
  2361. ::PostMessage(g_currentHwnd, message, wParam, lParam);
  2362. if (wParam == VK_MENU)////WM_SYSKEYDOWN
  2363. {
  2364. TSRuntime::KeyPressMap[0xA4] = 0;//左Alt键
  2365. TSRuntime::KeyPressMap_Mouse[0xA4] = 0;//左Alt键
  2366. }
  2367. else if (wParam == VK_CONTROL)
  2368. {
  2369. TSRuntime::KeyPressMap[0xA2] = 0;//左Ctrl键
  2370. TSRuntime::KeyPressMap_Mouse[0xA2] = 0;//左Alt键
  2371. }
  2372. else if (wParam == VK_SHIFT)
  2373. {
  2374. TSRuntime::KeyPressMap[0xA0] = 0;//左Shift键
  2375. TSRuntime::KeyPressMap_Mouse[0xA0] = 0;//左Alt键
  2376. }
  2377. TSRuntime::g_IsSYSKEY = false;
  2378. //TSRuntime::add_log("TS_KEYUP:message:%x,wParam:%x",message,wParam);
  2379. if (GetRegisteredRawInputDevicesAddr == 0)
  2380. {
  2381. GetRegisteredRawInputDevicesAddr = (DWORD)::GetProcAddress(::GetModuleHandle(L"user32.dll"), "GetRegisteredRawInputDevices");
  2382. My_GetRegisteredRawInputDevices = (MyGetRegisteredRawInputDevices)GetRegisteredRawInputDevicesAddr;
  2383. }
  2384. InitRawInputDevices();
  2385. if (g_hwndRawInput != NULL)
  2386. PostMessageA(g_hwndRawInput, WM_INPUT, 0, 0x12345678);
  2387. if (GameMsg)
  2388. {
  2389. GameMsg->hwnd = g_currentHwnd;
  2390. GameMsg->message = message;
  2391. GameMsg->wParam = wParam;
  2392. GameMsg->lParam = lParam;
  2393. }
  2394. message = TS_KEYUP;
  2395. return 1;
  2396. break;
  2397. }
  2398. case TS_CHAR:
  2399. {
  2400. //TSRuntime::pData->tt="abcddddee";
  2401. message = WM_CHAR;
  2402. lParam = TSRuntime::retrunLparamDown(wParam);
  2403. hWnd = g_currentHwnd;
  2404. g_wParam = wParam;
  2405. //wParam=wParam|0x8000;
  2406. if (IsNpProtect)
  2407. HookMessageAPI();
  2408. if (HookPostMessageRet != 0)
  2409. MyPostMessage(g_currentHwnd, message, wParam, lParam);
  2410. else
  2411. ::PostMessage(g_currentHwnd, message, wParam, lParam);
  2412. message = TS_CHAR;
  2413. return true;
  2414. break;
  2415. }
  2416. case TS_MOUSEMOVE:
  2417. {
  2418. g_dwOfs = 4;
  2419. g_dwData = 0xfffffffe;
  2420. g_mouseDevice = true;
  2421. g_keymouseevent = true;
  2422. g_x = (short)LOWORD(lParam);
  2423. g_y = (short)HIWORD(lParam);
  2424. message = WM_MOUSEMOVE;
  2425. g_message = message;
  2426. g_GetRawInputDatahook = true;
  2427. POINT Point;
  2428. Point.x = g_x;
  2429. Point.y = g_y;
  2430. ::ClientToScreen(hWnd, &Point);
  2431. LPARAM lparam = MAKELPARAM(Point.x, Point.y);
  2432. if (IsNpProtect)
  2433. HookMessageAPI();
  2434. if (HookSendMessageRet != 0)
  2435. {
  2436. MySendMessage(g_currentHwnd, WM_NCHITTEST, 0, lparam);
  2437. MySendMessage(g_currentHwnd, WM_SETCURSOR, (WPARAM)g_currentHwnd, MAKELPARAM(HTCLIENT, WM_MOUSEMOVE));
  2438. }
  2439. else
  2440. {
  2441. SendMessage(g_currentHwnd, WM_NCHITTEST, 0, lparam);
  2442. //TSRuntime::add_log("TS_MOUSEMOVE");
  2443. SendMessage(g_currentHwnd, WM_SETCURSOR, (WPARAM)g_currentHwnd, MAKELPARAM(HTCLIENT, WM_MOUSEMOVE));
  2444. }
  2445. //::PostMessage(g_currentHwnd,message,0x8000,lParam);
  2446. if (HookPostMessageRet != 0)
  2447. MyPostMessage(g_currentHwnd, message, 0, lParam);
  2448. else
  2449. ::PostMessage(g_currentHwnd, message, 0, lParam);
  2450. InitRawInputDevices();
  2451. if (g_hwndRawInput != NULL)
  2452. PostMessageA(g_hwndRawInput, WM_INPUT, 0, 0x12345678);
  2453. if (GameMsg)
  2454. {
  2455. GameMsg->hwnd = g_currentHwnd;
  2456. GameMsg->message = message;
  2457. GameMsg->wParam = wParam;
  2458. GameMsg->lParam = lParam;
  2459. GameMsg->pt = Point;
  2460. }
  2461. //TSRuntime::add_log("GameMsg:%x",GameMsg);
  2462. message = TS_MOUSEMOVE;
  2463. return 1;
  2464. //hWnd=g_currentHwnd;
  2465. break;
  2466. }
  2467. case TS_MOUSER:
  2468. {
  2469. g_dwOfs = 4;
  2470. g_dwData = 0xfffffffe;
  2471. g_mouseDevice = true;
  2472. g_keymouseevent = true;
  2473. g_x = g_x + (short)LOWORD(lParam);
  2474. g_y = g_y + (short)HIWORD(lParam);
  2475. lParam = MAKELPARAM(g_x, g_y);
  2476. message = WM_MOUSEMOVE;
  2477. g_message = message;
  2478. g_GetRawInputDatahook = true;
  2479. hWnd = g_currentHwnd;
  2480. POINT Point;
  2481. Point.x = g_x;
  2482. Point.y = g_y;
  2483. ::ClientToScreen(hWnd, &Point);
  2484. LPARAM lparam = MAKELPARAM(Point.x, Point.y);
  2485. if (IsNpProtect)
  2486. HookMessageAPI();
  2487. if (HookSendMessageRet != 0)
  2488. {
  2489. MySendMessage(g_currentHwnd, WM_NCHITTEST, 0, lparam);
  2490. MySendMessage(g_currentHwnd, WM_SETCURSOR, (WPARAM)g_currentHwnd, MAKELPARAM(HTCLIENT, WM_MOUSEMOVE));
  2491. }
  2492. else
  2493. {
  2494. SendMessage(g_currentHwnd, WM_NCHITTEST, 0, lparam);
  2495. //TSRuntime::add_log("TS_MOUSEMOVE");
  2496. SendMessage(g_currentHwnd, WM_SETCURSOR, (WPARAM)g_currentHwnd, MAKELPARAM(HTCLIENT, WM_MOUSEMOVE));
  2497. }
  2498. //::PostMessage(g_currentHwnd,message,0x8000,lParam);
  2499. if (HookPostMessageRet != 0)
  2500. MyPostMessage(g_currentHwnd, message, 0, lParam);
  2501. else
  2502. ::PostMessage(g_currentHwnd, message, 0, lParam);
  2503. InitRawInputDevices();
  2504. if (g_hwndRawInput != NULL)
  2505. PostMessageA(g_hwndRawInput, WM_INPUT, 0, 0x12345678);
  2506. if (GameMsg)
  2507. {
  2508. GameMsg->hwnd = g_currentHwnd;
  2509. GameMsg->message = message;
  2510. GameMsg->wParam = wParam;
  2511. GameMsg->lParam = lParam;
  2512. GameMsg->pt = Point;
  2513. }
  2514. message = TS_MOUSEMOVE;
  2515. return 1;
  2516. break;
  2517. }
  2518. case TS_MOUSEMOVEOVER:
  2519. {
  2520. g_dwOfs = 0;
  2521. g_dwData = 0xfffffffe;
  2522. g_message = 0;
  2523. g_mouseDevice = true;
  2524. return 1;
  2525. break;
  2526. }
  2527. case TS_LBUTTONDOWN:
  2528. {
  2529. POINT Point;
  2530. Point.x = g_x;
  2531. Point.y = g_y;
  2532. ::ClientToScreen(hWnd, &Point);
  2533. LPARAM lparam = MAKELPARAM(Point.x, Point.y);
  2534. if (IsNpProtect)
  2535. HookMessageAPI();
  2536. g_dwOfs = 0xc;
  2537. g_dwData = 0x80;
  2538. g_mouseDevice = true;
  2539. g_keymouseevent = true;
  2540. g_GetRawInputDatahook = true;
  2541. g_message = WM_LBUTTONDOWN;
  2542. message = WM_LBUTTONDOWN;
  2543. lParam = MAKELPARAM(g_x, g_y);
  2544. hWnd = g_currentHwnd;
  2545. if (wParam == (WPARAM)WM_LBUTTONDBLCLK)
  2546. {
  2547. message = WM_LBUTTONDBLCLK;
  2548. g_message = WM_LBUTTONDBLCLK;
  2549. g_dwOfs = 0xf;
  2550. wParam = 1;
  2551. }
  2552. //"dx.keypad.state.api"//,(WPARAM)GetCurrentProcessId(),
  2553. ::PostThreadMessageA(0x80000000, EM_SETMARGINS, (WPARAM)GetCurrentProcessId(), 1);
  2554. if (HookSendMessageRet != 0)
  2555. MySendMessage(g_currentHwnd, WM_NCHITTEST, 0, lparam);
  2556. else
  2557. SendMessage(g_currentHwnd, WM_NCHITTEST, 0, lparam);
  2558. if (HookPostMessageRet != 0)
  2559. MyPostMessage(g_currentHwnd, message, 1, lParam);
  2560. else
  2561. ::PostMessage(g_currentHwnd, message, 1, lParam);
  2562. //::PostMessage(g_currentHwnd,message,1,lParam);
  2563. InitRawInputDevices();
  2564. if (g_hwndRawInput != NULL)
  2565. PostMessageA(g_hwndRawInput, WM_INPUT, 0, 0x12345678);
  2566. if (GameMsg)
  2567. {
  2568. GameMsg->hwnd = g_currentHwnd;
  2569. GameMsg->message = message;
  2570. GameMsg->wParam = wParam;
  2571. GameMsg->lParam = lParam;
  2572. GameMsg->pt = Point;
  2573. }
  2574. message = TS_LBUTTONDOWN;
  2575. return true;
  2576. break;
  2577. }
  2578. case TS_LBUTTOUP:
  2579. {
  2580. POINT Point;
  2581. Point.x = g_x;
  2582. Point.y = g_y;
  2583. ::ClientToScreen(hWnd, &Point);
  2584. LPARAM lparam = MAKELPARAM(Point.x, Point.y);
  2585. if (IsNpProtect)
  2586. HookMessageAPI();
  2587. //SendMessage(g_currentHwnd,WM_NCHITTEST,0x8000,lparam);
  2588. g_dwOfs = 0xc;
  2589. g_dwData = 0;
  2590. g_mouseDevice = true;
  2591. g_keymouseevent = true;
  2592. g_GetRawInputDatahook = true;
  2593. message = WM_LBUTTONUP;
  2594. g_message = message;
  2595. lParam = MAKELPARAM(g_x, g_y);
  2596. hWnd = g_currentHwnd;
  2597. ::PostThreadMessageA(0x80000000, EM_SETMARGINS, (WPARAM)GetCurrentProcessId(), 0);
  2598. if (HookSendMessageRet != 0)
  2599. MySendMessage(g_currentHwnd, WM_NCHITTEST, 0, lparam);
  2600. else
  2601. SendMessage(g_currentHwnd, WM_NCHITTEST, 0, lparam);
  2602. if (HookPostMessageRet != 0)
  2603. MyPostMessage(g_currentHwnd, message, 0, lParam);
  2604. else
  2605. ::PostMessage(g_currentHwnd, message, 0, lParam);
  2606. //::PostMessage(g_currentHwnd,message,0,lParam);
  2607. InitRawInputDevices();
  2608. if (g_hwndRawInput != NULL)
  2609. PostMessageA(g_hwndRawInput, WM_INPUT, 0, 0x12345678);
  2610. if (GameMsg)
  2611. {
  2612. GameMsg->hwnd = g_currentHwnd;
  2613. GameMsg->message = message;
  2614. GameMsg->wParam = wParam;
  2615. GameMsg->lParam = lParam;
  2616. GameMsg->pt = Point;
  2617. }
  2618. message = TS_LBUTTOUP;
  2619. return true;
  2620. break;
  2621. }
  2622. case TS_RBUTTONDOWN:
  2623. {
  2624. POINT Point;
  2625. Point.x = g_x;
  2626. Point.y = g_y;
  2627. ::ClientToScreen(hWnd, &Point);
  2628. LPARAM lparam = MAKELPARAM(Point.x, Point.y);
  2629. if (IsNpProtect)
  2630. HookMessageAPI();
  2631. //SendMessage(g_currentHwnd,WM_NCHITTEST,0x8000,lparam);
  2632. g_dwOfs = 0xd;
  2633. g_dwData = 0x80;
  2634. g_mouseDevice = true;
  2635. g_keymouseevent = true;
  2636. g_GetRawInputDatahook = true;
  2637. message = WM_RBUTTONDOWN;
  2638. g_message = message;
  2639. lParam = MAKELPARAM(g_x, g_y);
  2640. hWnd = g_currentHwnd;
  2641. ::PostThreadMessageA(0x80000000, EM_SETMARGINS, (WPARAM)GetCurrentProcessId(), 1);
  2642. if (HookSendMessageRet != 0)
  2643. MySendMessage(g_currentHwnd, WM_NCHITTEST, 0, lparam);
  2644. else
  2645. SendMessage(g_currentHwnd, WM_NCHITTEST, 0, lparam);
  2646. if (HookPostMessageRet != 0)
  2647. MyPostMessage(g_currentHwnd, message, 1, lParam);
  2648. else
  2649. ::PostMessage(g_currentHwnd, message, 1, lParam);
  2650. //::PostMessage(g_currentHwnd,message,1,lParam);
  2651. InitRawInputDevices();
  2652. if (g_hwndRawInput != NULL)
  2653. PostMessageA(g_hwndRawInput, WM_INPUT, 0, 0x12345678);
  2654. if (GameMsg)
  2655. {
  2656. GameMsg->hwnd = g_currentHwnd;
  2657. GameMsg->message = message;
  2658. GameMsg->wParam = wParam;
  2659. GameMsg->lParam = lParam;
  2660. GameMsg->pt = Point;
  2661. }
  2662. message = TS_RBUTTONDOWN;
  2663. return true;
  2664. break;
  2665. }
  2666. case TS_RBUTTONUP:
  2667. {
  2668. POINT Point;
  2669. Point.x = g_x;
  2670. Point.y = g_y;
  2671. ::ClientToScreen(hWnd, &Point);
  2672. LPARAM lparam = MAKELPARAM(Point.x, Point.y);
  2673. if (IsNpProtect)
  2674. HookMessageAPI();
  2675. //SendMessage(g_currentHwnd,WM_NCHITTEST,0x8000,lparam);
  2676. g_dwOfs = 0xd;
  2677. g_dwData = 0;
  2678. g_mouseDevice = true;
  2679. g_keymouseevent = true;
  2680. g_GetRawInputDatahook = true;
  2681. message = WM_RBUTTONUP;
  2682. g_message = message;
  2683. lParam = MAKELPARAM(g_x, g_y);
  2684. hWnd = g_currentHwnd;
  2685. ::PostThreadMessageA(0x80000000, EM_SETMARGINS, (WPARAM)GetCurrentProcessId(), 0);
  2686. if (HookSendMessageRet != 0)
  2687. MySendMessage(g_currentHwnd, WM_NCHITTEST, 0, lparam);
  2688. else
  2689. SendMessage(g_currentHwnd, WM_NCHITTEST, 0, lparam);
  2690. if (HookPostMessageRet != 0)
  2691. MyPostMessage(g_currentHwnd, message, 0, lParam);
  2692. else
  2693. ::PostMessage(g_currentHwnd, message, 0, lParam);
  2694. //::PostMessage(g_currentHwnd,message,0,lParam);
  2695. InitRawInputDevices();
  2696. if (g_hwndRawInput != NULL)
  2697. PostMessageA(g_hwndRawInput, WM_INPUT, 0, 0x12345678);
  2698. if (GameMsg)
  2699. {
  2700. GameMsg->hwnd = g_currentHwnd;
  2701. GameMsg->message = message;
  2702. GameMsg->wParam = wParam;
  2703. GameMsg->lParam = lParam;
  2704. GameMsg->pt = Point;
  2705. }
  2706. message = TS_RBUTTONUP;
  2707. return true;
  2708. break;
  2709. }
  2710. case TS_MBUTTONDOWN:
  2711. {
  2712. POINT Point;
  2713. Point.x = g_x;
  2714. Point.y = g_y;
  2715. ::ClientToScreen(hWnd, &Point);
  2716. LPARAM lparam = MAKELPARAM(Point.x, Point.y);
  2717. if (IsNpProtect)
  2718. HookMessageAPI();
  2719. //SendMessage(g_currentHwnd,WM_NCHITTEST,0,lparam);
  2720. g_dwOfs = 0xe;
  2721. g_dwData = 0x80;
  2722. g_mouseDevice = true;
  2723. g_keymouseevent = true;
  2724. g_GetRawInputDatahook = true;
  2725. message = WM_MBUTTONDOWN;
  2726. g_message = message;
  2727. lParam = MAKELPARAM(g_x, g_y);
  2728. hWnd = g_currentHwnd;
  2729. ::PostThreadMessageA(0x80000000, EM_SETMARGINS, (WPARAM)GetCurrentProcessId(), 1);
  2730. if (HookSendMessageRet != 0)
  2731. MySendMessage(g_currentHwnd, WM_NCHITTEST, 0, lparam);
  2732. else
  2733. SendMessage(g_currentHwnd, WM_NCHITTEST, 0, lparam);
  2734. if (HookPostMessageRet != 0)
  2735. MyPostMessage(g_currentHwnd, message, 1, lParam);
  2736. else
  2737. ::PostMessage(g_currentHwnd, message, 1, lParam);
  2738. //::PostMessage(g_currentHwnd,message,1,lParam);
  2739. InitRawInputDevices();
  2740. if (g_hwndRawInput != NULL)
  2741. PostMessageA(g_hwndRawInput, WM_INPUT, 0, 0x12345678);
  2742. if (GameMsg)
  2743. {
  2744. GameMsg->hwnd = g_currentHwnd;
  2745. GameMsg->message = message;
  2746. GameMsg->wParam = wParam;
  2747. GameMsg->lParam = lParam;
  2748. GameMsg->pt = Point;
  2749. }
  2750. message = TS_MBUTTONDOWN;
  2751. return true;
  2752. break;
  2753. }
  2754. case TS_MBUTTONUP:
  2755. {
  2756. POINT Point;
  2757. Point.x = g_x;
  2758. Point.y = g_y;
  2759. ::ClientToScreen(hWnd, &Point);
  2760. LPARAM lparam = MAKELPARAM(Point.x, Point.y);
  2761. if (IsNpProtect)
  2762. HookMessageAPI();
  2763. //SendMessage(g_currentHwnd,WM_NCHITTEST,0x8000,lparam);
  2764. g_dwOfs = 0xe;
  2765. g_dwData = 0;
  2766. g_mouseDevice = true;
  2767. g_keymouseevent = true;
  2768. g_GetRawInputDatahook = true;
  2769. message = WM_MBUTTONUP;
  2770. g_message = message;
  2771. lParam = MAKELPARAM(g_x, g_y);
  2772. hWnd = g_currentHwnd;
  2773. ::PostThreadMessageA(0x80000000, EM_SETMARGINS, (WPARAM)GetCurrentProcessId(), 0);
  2774. if (HookSendMessageRet != 0)
  2775. MySendMessage(g_currentHwnd, WM_NCHITTEST, 0, lparam);
  2776. else
  2777. SendMessage(g_currentHwnd, WM_NCHITTEST, 0, lparam);
  2778. if (HookPostMessageRet != 0)
  2779. MyPostMessage(g_currentHwnd, message, 0, lParam);
  2780. else
  2781. ::PostMessage(g_currentHwnd, message, 0, lParam);
  2782. //::PostMessage(g_currentHwnd,message,0,lParam);
  2783. InitRawInputDevices();
  2784. if (g_hwndRawInput != NULL)
  2785. PostMessageA(g_hwndRawInput, WM_INPUT, 0, 0x12345678);
  2786. if (GameMsg)
  2787. {
  2788. GameMsg->hwnd = g_currentHwnd;
  2789. GameMsg->message = message;
  2790. GameMsg->wParam = wParam;
  2791. GameMsg->lParam = lParam;
  2792. GameMsg->pt = Point;
  2793. }
  2794. message = TS_MBUTTONUP;
  2795. return true;
  2796. break;
  2797. }
  2798. case TS_GETMOUSESHARE:
  2799. {
  2800. if (g_bkmouseshape)
  2801. {
  2802. return pic.GetBkMouseShape(g_bkmouseshape);
  2803. }
  2804. //TSRuntime::add_log("GetBkMouseShape:%x",g_bkmouseshape);
  2805. return false;
  2806. break;
  2807. }
  2808. case TS_SETPATH:
  2809. {
  2810. memset(TSRuntime::SetPath, 0, MAX_PATH);
  2811. wcscpy(TSRuntime::SetPath, TSRuntime::pData->setpath);
  2812. return true;
  2813. break;
  2814. }
  2815. case TS_GETCURSORPOS:
  2816. {
  2817. LONG lparam = MAKELPARAM(g_x, g_y);
  2818. return lparam;
  2819. break;
  2820. }
  2821. case TS_MOUSEWHEEL:// 向上wParam=0x780000,向下wParam=0xff880000
  2822. {
  2823. g_GetRawInputDatahook = true;
  2824. POINT Point;
  2825. Point.x = g_x;
  2826. Point.y = g_y;
  2827. ::ClientToScreen(hWnd, &Point);
  2828. LPARAM lparam = MAKELPARAM(Point.x, Point.y);
  2829. if (IsNpProtect)
  2830. HookMessageAPI();
  2831. //SendMessage(g_currentHwnd,WM_NCHITTEST,0x8000,lparam);
  2832. g_dwOfs = 8;
  2833. if (wParam == 0xff880000)//向下
  2834. {
  2835. g_dwData = 0xffffff88;
  2836. }
  2837. else if (wParam == 0x780000) //向上
  2838. {
  2839. g_dwData = 0x78;
  2840. }
  2841. wParam = MAKEWPARAM(0x8000, g_dwData);
  2842. g_mouseDevice = true;
  2843. g_keymouseevent = true;
  2844. lParam = MAKELPARAM(g_x, g_y);
  2845. message = WM_MOUSEWHEEL;
  2846. g_message = message;
  2847. ::PostThreadMessageA(0x80000000, EM_SETMARGINS, (WPARAM)GetCurrentProcessId(), 1);
  2848. if (HookSendMessageRet != 0)
  2849. MySendMessage(g_currentHwnd, WM_NCHITTEST, 0, lparam);
  2850. else
  2851. SendMessage(g_currentHwnd, WM_NCHITTEST, 0, lparam);
  2852. if (HookPostMessageRet != 0)
  2853. MyPostMessage(g_currentHwnd, message, wParam, lParam);
  2854. else
  2855. ::PostMessage(g_currentHwnd, message, wParam, lParam);
  2856. InitRawInputDevices();
  2857. if (g_hwndRawInput != NULL)
  2858. PostMessageA(g_hwndRawInput, WM_INPUT, 0, 0x12345678);
  2859. if (GameMsg)
  2860. {
  2861. GameMsg->hwnd = g_currentHwnd;
  2862. GameMsg->message = message;
  2863. GameMsg->wParam = wParam;
  2864. GameMsg->lParam = lParam;
  2865. GameMsg->pt = Point;
  2866. }
  2867. message = TS_MOUSEWHEEL;
  2868. //PostMessage(g_currentHwnd,message,wParam,lparam);
  2869. //hWnd=g_currentHwnd;
  2870. return 1;
  2871. break;
  2872. }
  2873. case TS_SETDICT:
  2874. {
  2875. //如果已经注入成功,者需拷贝一份字库信息到共享内存
  2876. if (TSRuntime::MyDictCount[TSRuntime::NowUsingDictIndex] != NULL)
  2877. delete[] TSRuntime::MyDictCount[TSRuntime::NowUsingDictIndex];
  2878. TSRuntime::NowUsingDictIndex = TSRuntime::pData->NowUsingDictIndex;
  2879. DWORD MyDictCountaddr = (DWORD)TSRuntime::pData->MyDictCount[TSRuntime::NowUsingDictIndex];
  2880. int ndictsize = TSRuntime::pData->nMyDictCountsize[TSRuntime::NowUsingDictIndex];
  2881. TSRuntime::nMyDictCountsize[TSRuntime::NowUsingDictIndex] = ndictsize;
  2882. TSRuntime::nMaxStrHight[TSRuntime::NowUsingDictIndex] = TSRuntime::pData->nMaxStrHight[TSRuntime::NowUsingDictIndex];
  2883. pMyDictInfo mydict = new MYDICTINFO[ndictsize + 1];
  2884. TSRuntime::MyDictCount[TSRuntime::NowUsingDictIndex] = mydict;
  2885. TSRuntime::EnablePrivilege(L"SeDebugPrivilege", true);
  2886. DWORD injectpid = 0;
  2887. ::GetWindowThreadProcessId(TSRuntime::pData->InjectHwnd, &injectpid);
  2888. HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, false, injectpid);
  2889. if (handle == NULL)
  2890. {
  2891. if (handle == NULL)
  2892. delete[] mydict;
  2893. }
  2894. bool si = ReadProcessMemory(handle, (void*)MyDictCountaddr, mydict, ndictsize * sizeof(MYDICTINFO), NULL);
  2895. if (!si)
  2896. {
  2897. delete[] mydict;
  2898. }
  2899. return true;
  2900. break;
  2901. }
  2902. case TS_USEDICT:
  2903. {
  2904. if (TSRuntime::MyDictCount[TSRuntime::NowUsingDictIndex] != NULL)
  2905. delete[] TSRuntime::MyDictCount[TSRuntime::NowUsingDictIndex];
  2906. TSRuntime::NowUsingDictIndex = TSRuntime::pData->NowUsingDictIndex;
  2907. DWORD MyDictCountaddr = (DWORD)TSRuntime::pData->MyDictCount[TSRuntime::NowUsingDictIndex];
  2908. int ndictsize = TSRuntime::pData->nMyDictCountsize[TSRuntime::NowUsingDictIndex];
  2909. TSRuntime::nMyDictCountsize[TSRuntime::NowUsingDictIndex] = ndictsize;
  2910. TSRuntime::nMaxStrHight[TSRuntime::NowUsingDictIndex] = TSRuntime::pData->nMaxStrHight[TSRuntime::NowUsingDictIndex];
  2911. pMyDictInfo mydict = new MYDICTINFO[ndictsize + 1];
  2912. TSRuntime::MyDictCount[TSRuntime::NowUsingDictIndex] = mydict;
  2913. TSRuntime::EnablePrivilege(L"SeDebugPrivilege", true);
  2914. HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, false, (DWORD)wParam);
  2915. if (handle == NULL)
  2916. {
  2917. if (handle == NULL)
  2918. delete[] mydict;
  2919. }
  2920. bool si = ReadProcessMemory(handle, (void*)MyDictCountaddr, mydict, ndictsize * sizeof(MYDICTINFO), NULL);
  2921. if (!si)
  2922. {
  2923. delete[] mydict;
  2924. }
  2925. return true;
  2926. break;
  2927. }
  2928. case TS_LOCKINPUT:
  2929. {
  2930. if (wParam == 0)//1 开启锁定(键盘鼠标都锁定), 0关闭锁定,2 只锁定鼠标,3 只锁定键盘
  2931. {
  2932. g_LockInput_kdb = false;
  2933. g_LockInput_mouse = false;
  2934. }
  2935. else if (wParam == 1)
  2936. {
  2937. g_LockInput_kdb = true;
  2938. g_LockInput_mouse = true;
  2939. }
  2940. else if (wParam == 2)
  2941. {
  2942. g_LockInput_kdb = false;
  2943. g_LockInput_mouse = true;
  2944. }
  2945. else if (wParam == 3)
  2946. {
  2947. g_LockInput_kdb = true;
  2948. g_LockInput_mouse = false;
  2949. }
  2950. return true;
  2951. break;
  2952. }
  2953. case TS_DOWNCPU:
  2954. {
  2955. sleeptime = wParam;
  2956. return true;
  2957. break;
  2958. }
  2959. case TS_SENDSTRINGIME:
  2960. {
  2961. IsSendstrIme = true;
  2962. lParam = (lParam | GCS_RESULTSTR);
  2963. SendMessage(g_currentHwnd, WM_IME_COMPOSITION, wParam, lParam);
  2964. return true;
  2965. break;
  2966. }
  2967. case TS_SETPICPWD:
  2968. {
  2969. wcscpy(TSRuntime::SetPicPwdString, TSRuntime::pData->SetPicPwdString);
  2970. return true;
  2971. }
  2972. case TS_ISGRAPHICPROTECT://开启防图色检测
  2973. {
  2974. //TSRuntime::add_log( "TS_ISGRAPHICPROTECT:DxdeviceAddr:%x",DxdeviceAddr);
  2975. if (wParam == 1 && TSRuntime::pData->isgraphicprotect == true && DxdeviceAddr != 0)
  2976. {
  2977. Ori_DxdeviceAddr = *(DWORD*)DxdeviceAddr;
  2978. *(DWORD*)DxdeviceAddr = (DWORD)MyD3D9Present;//把真正的函数地址修改到我们的函数地址,
  2979. //TSRuntime::add_log( "TS_ISGRAPHICPROTECT:Ori_DxdeviceAddr:%x,DxdeviceAddr:%x",Ori_DxdeviceAddr,*(DWORD*)DxdeviceAddr);
  2980. if (UnhookPresent == false)
  2981. {
  2982. //修改成我们的地址后,我们就可以恢复DX图色钩子了,这样可以达到防止DX图色被检测
  2983. if (SySTpye == 1)//XP
  2984. GetHookModFuntion(L"d3d9.dll", "Present", D3D9PresentXPoffse, (DWORD)MyD3D9Present, (DWORD)D3D9Present, HookD3D9PresentRet, false); //xp
  2985. else if (SySTpye == 2)//win2003
  2986. GetHookModFuntion(L"d3d9.dll", "Present", D3D9PresentWin2003offse, (DWORD)MyD3D9Present, (DWORD)D3D9Present, HookD3D9PresentRet, false); //win2003
  2987. else if (SySTpye == 4)//win7
  2988. GetHookModFuntion(L"d3d9.dll", "Present", D3D9PresentWin7offse, (DWORD)MyD3D9Present, (DWORD)D3D9Present, HookD3D9PresentRet, false);//win7
  2989. else if (SySTpye == 5)//win8
  2990. GetHookModFuntion(L"d3d9.dll", "Present", D3D9PresentWin8offse, (DWORD)MyD3D9Present, (DWORD)D3D9Present, HookD3D9PresentRet, false); //win8
  2991. UnhookPresent = true;
  2992. }
  2993. }
  2994. else if (Ori_DxdeviceAddr != 0)
  2995. {
  2996. if (*(DWORD*)DxdeviceAddr == (DWORD)MyD3D9Present)
  2997. *(DWORD*)DxdeviceAddr = Ori_DxdeviceAddr;//把我们的函数地址修改到真正的函数地址
  2998. //TSRuntime::add_log( "TS_ISGRAPHICPROTECT:UnhookPresent:%x,ORI:%x",Ori_DxdeviceAddr,*(DWORD*)DxdeviceAddr);
  2999. }
  3000. return true;
  3001. }
  3002. default:
  3003. //TSRuntime::pData->isInject=true;
  3004. break;
  3005. }
  3006. if (TSRuntime::pData)
  3007. {
  3008. if (UnhookPresent)
  3009. {
  3010. if ((DWORD)MyD3D9Present != *(DWORD*)DxdeviceAddr)
  3011. UnhookPresent = false;
  3012. }
  3013. if (TSRuntime::pData->isgraphicprotect == true && UnhookPresent == false && TSRuntime::pData->ispichook == true)
  3014. ::SendMessage(g_currentHwnd, TS_ISGRAPHICPROTECT, 1, 0);
  3015. //if((!UnhookKbd_DeviceState&&!UnhookMouse_DeviceState)&&IsVIPHookandUnhookAPI)
  3016. //{
  3017. // HookKbdMouse();
  3018. // if(UnHookKbdMouse_time==0)
  3019. // UnHookKbdMouse_time=::GetTickCount();
  3020. // else
  3021. // {
  3022. // if((UnHookKbdMouse_time-::GetTickCount())>=500)
  3023. // UnHookKbdMouse();
  3024. // }
  3025. //}
  3026. }
  3027. //if()
  3028. //if(message==WM_USER+1||message==WM_USER+2||message==0x202||message==WM_KEYDOWN||message==WM_KEYUP)
  3029. //TSRuntime::add_log( "Before HOOK成功:lret:%x,hWnd:%x,message:%x,wParam:%x,lParam:%x,X:%d,Y:%d,g_currentHwnd:%x",lret,hWnd,message,wParam,lParam,(short)LOWORD(lParam),(short)HIWORD(lParam),g_currentHwnd);
  3030. //TSRuntime::add_log( "InternalCallWinProcstart-call:%x,message:%x,wParam:%x,lParam:%d",fAnsi,message,wParam,lParam);
  3031. lret = USER32InternalCallWinProc(fAnsi, hWnd, message, wParam, lParam);
  3032. //TSRuntime::add_log( "InternalCallWinProcstart-end:%x,wParam:%x,lParam:%d",message,wParam,lParam);
  3033. //if(message==WM_SYSKEYDOWN)
  3034. // TSRuntime::add_log( "wParam:%x,lParam:%x",wParam,lParam);
  3035. //TSRuntime::add_log( "hWnd:%x,message:%x,wParam:%x,LOWORD(lParam):%d,HIWORD(lParam):%d",hWnd,message,wParam,(short)LOWORD(lParam),(short)HIWORD(lParam));
  3036. return lret;
  3037. //return 1;
  3038. }
  3039. ULONG __stdcall MyNtUserCallOneParam(DWORD Param, DWORD Routine)
  3040. {
  3041. ULONG ret = 0;
  3042. if (Routine == 0x9)//GetMessagePos
  3043. {
  3044. POINT xy;
  3045. GetCursorPos(&xy);
  3046. ret = (ULONG)MAKELPARAM(xy.x, xy.y);
  3047. //TSRuntime::add_log("NtUserCallOneParam-GetMessagePos");
  3048. return 1;
  3049. }
  3050. else if (Routine == 0x26)//GetCursorPos,ScreenToClient
  3051. {
  3052. LPPOINT lpPoint = (LPPOINT)Param;
  3053. POINT Point;
  3054. Point.x = g_x;
  3055. Point.y = g_y;
  3056. ::ClientToScreen(g_currentHwnd, &Point);
  3057. lpPoint->x = Point.x;
  3058. lpPoint->y = Point.y;
  3059. //TSRuntime::add_log("NtUserCallOneParam-Param:%x,lpPoint:x:%d,lpPoint:y:%d,ret:%x",Param,lpPoint->x,lpPoint->y,ret);
  3060. return 1;
  3061. }
  3062. ret = NtUserCallOneParam(Param, Routine);
  3063. //TSRuntime::add_log("NtUserCallOneParam--Param:%x,Routine:%x,ret:%x",Param,Routine,ret);
  3064. return ret;
  3065. }
  3066. ULONG __stdcall MyNtUserCallTwoParam(DWORD Param1, DWORD Param2, DWORD Routine)
  3067. {
  3068. ULONG ret = 0;
  3069. if ((Routine == 0x74 && IsWin7) || (Routine == 0x7B && IsWin8) || ((IsWinxp || IsWin2003) && Routine == 0x6f))//SetCursorPos
  3070. {
  3071. return 0;
  3072. }
  3073. if ((Routine == 0x69 && IsWin7) || (Routine == 0x70 && IsWin8))//GetCursorPos,ScreenToClient
  3074. {
  3075. LPPOINT lpPoint = (LPPOINT)Param1;
  3076. POINT Point;
  3077. Point.x = g_x;
  3078. Point.y = g_y;
  3079. ::ClientToScreen(g_currentHwnd, &Point);
  3080. lpPoint->x = Point.x;
  3081. lpPoint->y = Point.y;
  3082. //TSRuntime::add_log("MyNtUserCallTwoParam-Param:%x,lpPoint:x:%d,lpPoint:y:%d,ret:%x",Param2,lpPoint->x,lpPoint->y,ret);
  3083. return 1;
  3084. }
  3085. ret = NtUserCallTwoParam(Param1, Param1, Routine);
  3086. //TSRuntime::add_log("MyNtUserCallTwoParam-Param:%x,lpPoint:x:%d,lpPoint:y:%d,ret:%x",Param2,lpPoint->x,lpPoint->y,ret);
  3087. return ret;
  3088. }
  3089. ULONG_PTR __stdcall MyNtUserGetThreadState(DWORD Routine)
  3090. {
  3091. ULONG_PTR ret = 0;
  3092. if (Routine == 0 || Routine == 1 || Routine == 2 || Routine == 16)//GetFocus,GetActiveWindow,GetCapture,16:UserThreadStateIsForeground
  3093. {
  3094. ret = (ULONG_PTR)g_currentHwnd;
  3095. return ret;
  3096. }
  3097. ret = NtUserGetThreadState(Routine);
  3098. //TSRuntime::add_log("NtUserGetThreadState--Routine:%d,ret:%x",Routine,ret);
  3099. return ret;
  3100. }
  3101. SHORT __stdcall MyNtUserGetKeyState(int nVirtKey)
  3102. {
  3103. //TSRuntime::add_log("NtUserGetKeyState--nVirtKey:%x",nVirtKey);
  3104. ULONG sret = 0;
  3105. if (g_GetKeyState || g_mouseDevice)
  3106. {
  3107. DWORD ALT_KEYCODE = 0;
  3108. bool iskeyevent = false;
  3109. for (int i = 0; i < 0x100; i++)
  3110. {
  3111. if (1 == TSRuntime::KeyPressMap[i])
  3112. {
  3113. if (nVirtKey == i)
  3114. {
  3115. iskeyevent = true;
  3116. break;
  3117. }
  3118. else if ((i == VK_MENU && (nVirtKey == VK_LMENU || nVirtKey == VK_RMENU)) || (i == VK_SHIFT && (nVirtKey == VK_LSHIFT || nVirtKey == VK_RSHIFT))
  3119. || (i == VK_CONTROL && (nVirtKey == VK_LCONTROL || nVirtKey == VK_RCONTROL)))
  3120. {
  3121. iskeyevent = true;
  3122. break;
  3123. }
  3124. }
  3125. }
  3126. if (g_message == WM_LBUTTONDOWN || g_message == WM_RBUTTONDOWN || g_message == WM_MBUTTONDOWN
  3127. || g_message == WM_LBUTTONUP || g_message == WM_RBUTTONUP || g_message == WM_MBUTTONUP)
  3128. {
  3129. if (nVirtKey == VK_LBUTTON || nVirtKey == VK_RBUTTON || nVirtKey == VK_MBUTTON)
  3130. {
  3131. iskeyevent = true;
  3132. if (g_message == WM_LBUTTONDOWN || g_message == WM_RBUTTONDOWN || g_message == WM_MBUTTONDOWN)
  3133. ismousedown = true;
  3134. //TSRuntime::add_log( "MyGetKeyState-1:g_message:%x,nVirtKey:%x,ismousedown:%d",g_message,nVirtKey,ismousedown);
  3135. }
  3136. if (g_message == WM_LBUTTONUP || g_message == WM_RBUTTONUP || g_message == WM_MBUTTONUP)
  3137. {
  3138. ismousedown = false;
  3139. g_mouseDevice = false;
  3140. }
  3141. //TSRuntime::add_log( "MyGetKeyState:g_message:%x,nVirtKey:%x,ismousedown:%d",g_message,nVirtKey,ismousedown);
  3142. }
  3143. //if((g_message==WM_KEYDOWN&&g_wParam==nVirtKey)||(g_message==WM_SYSKEYDOWN&&nVirtKey==VK_MENU)||(g_message==WM_SYSKEYDOWN&&nVirtKey==VK_LMENU) )
  3144. if ((((g_message == WM_KEYDOWN) || (g_message == WM_SYSKEYDOWN)
  3145. || (g_message == WM_LBUTTONDOWN)
  3146. || (g_message == WM_RBUTTONDOWN)
  3147. || (g_message == WM_MBUTTONDOWN)) && iskeyevent) || ((nVirtKey == VK_LBUTTON || nVirtKey == VK_RBUTTON || nVirtKey == VK_MBUTTON) && ismousedown))
  3148. {
  3149. sret = 0xffffff80;
  3150. //TSRuntime::add_log( "MyGetKeyState-WM_SYSKEYDOWN:g_message:%x,nVirtKey:%x,ismousedown:%d",g_message,nVirtKey,ismousedown);
  3151. //返回负数说明该键被按下
  3152. }
  3153. //else if((g_message==WM_KEYUP||g_message==WM_SYSKEYUP)&&g_wParam==nVirtKey)
  3154. else if (((g_message == WM_KEYUP || g_message == WM_SYSKEYUP)
  3155. || (g_message == WM_LBUTTONUP)
  3156. || (g_message == WM_RBUTTONUP)
  3157. || (g_message == WM_MBUTTONUP)) && iskeyevent)
  3158. {
  3159. //TSRuntime::add_log( "MyGetKeyState-WM_SYSKEYUP:g_message:%x,nVirtKey:%x,ismousedown:%d",g_message,nVirtKey,ismousedown);
  3160. sret = 1; //返回正数说明该键被弹起
  3161. g_GetKeyState = false;
  3162. TSRuntime::KeyPressMap[nVirtKey] = 0;
  3163. //g_wParam=0;
  3164. }
  3165. //TSRuntime::add_log( "GetKeyState:nVirtKey:%x,sret:%x,g_message:%x",nVirtKey,sret,g_message);
  3166. //TSRuntime::add_log( "MyGetKeyState:nVirtKey:%x",nVirtKey);
  3167. return sret;
  3168. //TerminateProcess()
  3169. //CloseWindow;
  3170. //::DestroyWindow()
  3171. //ExitThread()
  3172. }
  3173. sret = NtUserGetKeyState(nVirtKey);
  3174. return sret;
  3175. }
  3176. SHORT __stdcall MyNtUserGetAsyncKeyState(int vKey)
  3177. {
  3178. ULONG sret = 0;
  3179. //TSRuntime::add_log("NtUserGetAsyncKeyState--nVirtKey:%x,g_message:%x,g_mouseDevice:%d",vKey,g_message,g_mouseDevice);
  3180. if (g_kbdDevice || g_mouseDevice)
  3181. {
  3182. if ((g_message == WM_LBUTTONDOWN && vKey == VK_LBUTTON)
  3183. || (g_message == WM_RBUTTONDOWN && vKey == VK_RBUTTON)
  3184. || (g_message == WM_MBUTTONDOWN && vKey == VK_MBUTTON))
  3185. {
  3186. sret = 0x8000;
  3187. //TSRuntime::add_log("NtUserGetAsyncKeyState--nVirtKey:%x,g_message:%x,g_mouseDevice:%d",vKey,g_message,g_mouseDevice);
  3188. return sret;
  3189. }
  3190. else if ((g_message == WM_LBUTTONUP && vKey == VK_LBUTTON)
  3191. || (g_message == WM_RBUTTONUP && vKey == VK_LBUTTON)
  3192. || (g_message == WM_MBUTTONUP && vKey == VK_MBUTTON))
  3193. {
  3194. sret = 0;
  3195. g_message = 0;
  3196. //g_mouseDevice=false;
  3197. }
  3198. else if (g_message == WM_KEYDOWN || g_message == WM_KEYUP || g_message == WM_SYSKEYDOWN || g_message == WM_SYSKEYUP)
  3199. {
  3200. bool iskeyevent = false;
  3201. for (int i = 0; i < 0x100; i++)
  3202. {
  3203. if (1 == TSRuntime::KeyPressMap[i])
  3204. {
  3205. //int key=TSRuntime::VirtualToASCIIMap[i];
  3206. if (vKey == i)
  3207. {
  3208. if ((g_message == WM_KEYUP || g_message == WM_SYSKEYUP) && i == g_wParam)
  3209. TSRuntime::KeyPressMap[i] = 0;
  3210. else if (i != g_wParam)
  3211. return 0x8000;
  3212. iskeyevent = true;
  3213. break;
  3214. }
  3215. }
  3216. }
  3217. //TSRuntime::add_log("MyGetAsyncKeyState:iskeyevent:%d,vKey:%d,g_message:%x",iskeyevent,vKey,g_message);
  3218. if (iskeyevent && (g_message == WM_KEYDOWN || g_message == WM_SYSKEYDOWN))
  3219. {
  3220. sret = 0x8000;
  3221. //TSRuntime::add_log("iskeyevent:MyGetAsyncKeyState:sret:%d,vKey:%d",sret,vKey);
  3222. return sret;
  3223. }
  3224. else if (iskeyevent && (g_message == WM_KEYUP || g_message == WM_SYSKEYUP))
  3225. {
  3226. //g_keydown=0xFFFF8001;//重置
  3227. sret = 0;
  3228. g_kbdDevice = false;
  3229. //TSRuntime::add_log("iskeyevent:MyGetAsyncKeyState:sret:%d,vKey:%d",sret,vKey);
  3230. }
  3231. }
  3232. }
  3233. if (g_LockInput_kdb || g_LockInput_mouse) //封锁外部键盘鼠标
  3234. {
  3235. if (g_LockInput_mouse)
  3236. {
  3237. if (vKey == VK_LBUTTON || vKey == VK_RBUTTON || vKey == VK_MBUTTON)
  3238. sret = 0;
  3239. }
  3240. else if (g_LockInput_kdb)
  3241. {
  3242. sret = 0;
  3243. }
  3244. //TSRuntime::add_log("NtUserGetAsyncKeyState--g_LockInput_kdb:%x,g_LockInput_mouse:%x",g_LockInput_kdb,g_LockInput_mouse);
  3245. return 0;
  3246. }
  3247. sret = NtUserGetAsyncKeyState(vKey);
  3248. return sret;
  3249. }
  3250. void VIPHookandUnhookAPI(void* para)
  3251. {
  3252. //TSRuntime::add_log( "hprocess:%d",::GetCurrentProcess());
  3253. //TSRuntime::add_log( "HookandUnhookAPI-start,TSRuntime::IsVirtualProtectEx:%d",TSRuntime::IsVirtualProtectEx);
  3254. IsVIPHookandUnhookAPI = true;
  3255. bool ishook = (bool)para;
  3256. SySTpye = TSRuntime::InitialWindowsVersion();//先获取系统版本后在HOOK,1:XP,2:2003,4:win7
  3257. // if(ishook)
  3258. //{
  3259. // //GetHookModFuntion(L"user32.dll","PeekMessageA",0,(DWORD)MyPeekMessageA,(DWORD)UnhookPeekMessage,HookPeekMessageARet,ishook);
  3260. // //GetHookModFuntion(L"user32.dll","PeekMessageW",0,(DWORD)MyPeekMessageW,(DWORD)UnhookPeekMessage,HookPeekMessageWRet,ishook);
  3261. //}
  3262. if (SySTpye == 1 || SySTpye == 2) //SySTpye==1:XP系统,
  3263. {
  3264. if (SySTpye == 1)
  3265. {
  3266. IsWinxp = true;
  3267. //TSRuntime::add_log( "WinXP");
  3268. GetHookModFuntion(L"user32.dll", "InternalCallWinProc", USER32InternalCallWinProcXPoffse, (DWORD)MyInternalCallWinProc, (DWORD)UnhookInternalCallWinProc, HookInternalCallWinProcRet, ishook);//HOOK:XP系统下的:USER32.dll的InternalCallWinProc函数
  3269. if ((TSRuntime::IsVirtualProtectEx || TSRuntime::pData->ispichook) && UnhookPresent == false)
  3270. {
  3271. if (UnhookPresent == false && DxdeviceAddr == 0)
  3272. GetHookModFuntion(L"d3d9.dll", "Present", D3D9PresentXPoffse, (DWORD)MyD3D9Present, (DWORD)D3D9Present, HookD3D9PresentRet, ishook);
  3273. else if (ishook == true)
  3274. {
  3275. Ori_DxdeviceAddr = *(DWORD*)DxdeviceAddr;
  3276. *(DWORD*)DxdeviceAddr = (DWORD)MyD3D9Present;//把真正的函数地址修改到我们的函数地址,
  3277. UnhookPresent = true;
  3278. }
  3279. }
  3280. if (TSRuntime::IsVirtualProtectEx || TSRuntime::pData->ismousehook || TSRuntime::pData->iskeyboardhook || ishook == false)
  3281. {
  3282. GetHookModFuntion(L"user32.dll", "NtUserGetThreadState", NtUserGetThreadState_XPOffset, (DWORD)MyNtUserGetThreadState, (DWORD)NtUserGetThreadStateUnhookByte, NtUserGetThreadStateRet, ishook);
  3283. }
  3284. if (TSRuntime::IsVirtualProtectEx || TSRuntime::pData->ismousehook || ishook == false)
  3285. {
  3286. GetHookModFuntion(L"user32.dll", "NtUserCallOneParam", NtUserCallOneParam_XPOffset, (DWORD)MyNtUserCallOneParam, (DWORD)NtUserCallOneParamUnhookByte, NtUserCallOneParamRet, ishook);
  3287. GetHookModFuntion(L"user32.dll", "NtUserCallTwoParam", NtUserCallTwoParam_XPOffset, (DWORD)MyNtUserCallTwoParam, (DWORD)NtUserCallTwoParamUnhookByte, NtUserCallTwoParamRet, ishook);
  3288. }
  3289. if (TSRuntime::IsVirtualProtectEx || TSRuntime::pData->iskeyboardhook || ishook == false)
  3290. {
  3291. GetHookModFuntion(L"user32.dll", "NtUserGetKeyState", NtUserGetKeyState_XPOffset, (DWORD)MyNtUserGetKeyState, (DWORD)NtUserGetKeyStateUnhookByte, NtUserGetKeyStateRet, ishook);
  3292. GetHookModFuntion(L"user32.dll", "NtUserGetAsyncKeyState", NtUserGetAsyncKeyState_XPOffset, (DWORD)MyNtUserGetAsyncKeyState, (DWORD)NtUserGetAsyncKeyStateUnhookByte, NtUserGetAsyncKeyStateRet, ishook);
  3293. }
  3294. }
  3295. else if (SySTpye == 2) //SySTpye==2:Win2003系统
  3296. {
  3297. IsWin2003 = true;
  3298. // TSRuntime::add_log( "Win2003");
  3299. GetHookModFuntion(L"user32.dll", "InternalCallWinProc", USER32InternalCallWinProcWin2003offse, (DWORD)MyInternalCallWinProc, (DWORD)UnhookInternalCallWinProc, HookInternalCallWinProcRet, ishook);//HOOK:XP系统下的:USER32.dll的InternalCallWinProc函数
  3300. if ((TSRuntime::IsVirtualProtectEx || TSRuntime::pData->ispichook) && UnhookPresent == false)
  3301. {
  3302. if (UnhookPresent == false && DxdeviceAddr == 0)
  3303. GetHookModFuntion(L"d3d9.dll", "Present", D3D9PresentWin2003offse, (DWORD)MyD3D9Present, (DWORD)D3D9Present, HookD3D9PresentRet, ishook);
  3304. else if (ishook == true)
  3305. {
  3306. Ori_DxdeviceAddr = *(DWORD*)DxdeviceAddr;
  3307. *(DWORD*)DxdeviceAddr = (DWORD)MyD3D9Present;//把真正的函数地址修改到我们的函数地址,
  3308. UnhookPresent = true;
  3309. }
  3310. }
  3311. if (TSRuntime::IsVirtualProtectEx || TSRuntime::pData->ismousehook || TSRuntime::pData->iskeyboardhook || ishook == false)
  3312. {
  3313. GetHookModFuntion(L"user32.dll", "NtUserGetThreadState", NtUserGetThreadState_Win2003Offset, (DWORD)MyNtUserGetThreadState, (DWORD)NtUserGetThreadStateUnhookByte, NtUserGetThreadStateRet, ishook);
  3314. }
  3315. if (TSRuntime::IsVirtualProtectEx || TSRuntime::pData->ismousehook || ishook == false)
  3316. {
  3317. GetHookModFuntion(L"user32.dll", "NtUserCallOneParam", NtUserCallOneParam_Win2003Offset, (DWORD)MyNtUserCallOneParam, (DWORD)NtUserCallOneParamUnhookByte, NtUserCallOneParamRet, ishook);
  3318. GetHookModFuntion(L"user32.dll", "NtUserCallTwoParam", NtUserCallTwoParam_Win2003Offset, (DWORD)MyNtUserCallTwoParam, (DWORD)NtUserCallTwoParamUnhookByte, NtUserCallTwoParamRet, ishook);
  3319. }
  3320. if (TSRuntime::IsVirtualProtectEx || TSRuntime::pData->iskeyboardhook || ishook == false)
  3321. {
  3322. GetHookModFuntion(L"user32.dll", "NtUserGetKeyState", NtUserGetKeyState_Win2003Offset, (DWORD)MyNtUserGetKeyState, (DWORD)NtUserGetKeyStateUnhookByte, NtUserGetKeyStateRet, ishook);
  3323. GetHookModFuntion(L"user32.dll", "NtUserGetAsyncKeyState", NtUserGetAsyncKeyState_Win2003Offset, (DWORD)MyNtUserGetAsyncKeyState, (DWORD)NtUserGetAsyncKeyStateUnhookByte, NtUserGetAsyncKeyStateRet, ishook);
  3324. }
  3325. }
  3326. if (TSRuntime::IsVirtualProtectEx || TSRuntime::pData->ismousehook || TSRuntime::pData->iskeyboardhook || ishook == false)
  3327. {
  3328. //if(ishook||UnhookKbd_DeviceState||UnhookMouse_DeviceState)
  3329. {
  3330. //if(UnhookKbd_DeviceState||Kbd_DeviceStateAddr==0)
  3331. GetHookModFuntion(L"dinput8.dll", "GetDeviceState", GetDeviceStateOBJMouseXPoffse, (DWORD)MyGetDeviceStateMouse, (DWORD)GetDeviceStateMouse, HookGetDeviceStateMouseRet, ishook);////HOOK:dinput8.dll的GetDeviceState函数
  3332. //if(UnhookMouse_DeviceState||Mouse_DeviceStateAddr==0)
  3333. GetHookModFuntion(L"dinput8.dll", "GetDeviceState", GetDeviceStateOBJkeyboardXPoffse, (DWORD)MyGetDeviceStateKbd, (DWORD)GetDeviceStateKbd, HookGetDeviceStateKbdRet, ishook);
  3334. //HookKbdMouse_Thread=(HANDLE)_beginthread(HookKbdMouse,0,0);
  3335. }
  3336. }
  3337. }
  3338. else if (SySTpye == 4)//win7系统
  3339. {
  3340. IsWin7 = true;
  3341. typedef bool(__stdcall* myWow64DisableWow64FsRedirection)(LPVOID);
  3342. myWow64DisableWow64FsRedirection f_myWow64DisableWow64FsRedirection = NULL;
  3343. HINSTANCE hlibrary;
  3344. hlibrary = LoadLibrary(_T("Kernel32.dll"));
  3345. f_myWow64DisableWow64FsRedirection = (myWow64DisableWow64FsRedirection)GetProcAddress(hlibrary, "Wow64DisableWow64FsRedirection");
  3346. PVOID vlau = NULL;
  3347. bool ret = f_myWow64DisableWow64FsRedirection(&vlau);
  3348. //如果是win7_64系统ret返回true
  3349. if (!ret)
  3350. {
  3351. //TSRuntime::add_log( "IWProcWIN7"); //WIN7X86
  3352. GetHookModFuntion(L"user32.dll", "InternalCallWinProc", USER32InternalCallProcWin7offse, (DWORD)MyInternalCallWinProc, (DWORD)UnhookInternalCallWinProc, HookInternalCallWinProcRet, ishook);//HOOK:XP系统下的:USER32.dll的InternalCallWinProc函数
  3353. if (TSRuntime::IsVirtualProtectEx || TSRuntime::pData->ismousehook || TSRuntime::pData->iskeyboardhook || ishook == false)
  3354. {
  3355. GetHookModFuntion(L"user32.dll", "NtUserGetThreadState", NtUserGetThreadState_WIN7X86Offset, (DWORD)MyNtUserGetThreadState, (DWORD)NtUserGetThreadStateUnhookByte, NtUserGetThreadStateRet, ishook);
  3356. }
  3357. if (TSRuntime::IsVirtualProtectEx || TSRuntime::pData->ismousehook || ishook == false)
  3358. {
  3359. //GetHookModFuntion(L"user32.dll","NtUserCallOneParam",NtUserCallOneParam_WIN7X86Offset,(DWORD)MyNtUserCallOneParam,(DWORD)NtUserCallOneParamUnhookByte,NtUserCallOneParamRet,ishook);
  3360. GetHookModFuntion(L"user32.dll", "NtUserCallTwoParam", NtUserCallTwoParam_WIN7X86Offset, (DWORD)MyNtUserCallTwoParam, (DWORD)NtUserCallTwoParamUnhookByte, NtUserCallTwoParamRet, ishook);
  3361. }
  3362. if (TSRuntime::IsVirtualProtectEx || TSRuntime::pData->iskeyboardhook || ishook == false)
  3363. {
  3364. GetHookModFuntion(L"user32.dll", "NtUserGetKeyState", NtUserGetKeyState_WIN7X86Offset, (DWORD)MyNtUserGetKeyState, (DWORD)NtUserGetKeyStateUnhookByte, NtUserGetKeyStateRet, ishook);
  3365. GetHookModFuntion(L"user32.dll", "NtUserGetAsyncKeyState", NtUserGetAsyncKeyState_WIN7X86Offset, (DWORD)MyNtUserGetAsyncKeyState, (DWORD)NtUserGetAsyncKeyStateUnhookByte, NtUserGetAsyncKeyStateRet, ishook);
  3366. }
  3367. }
  3368. else //win7x64
  3369. {
  3370. //TSRuntime::add_log( "IWProcWIN7X64");
  3371. IsWin7X64 = true;
  3372. GetHookModFuntion(L"user32.dll", "InternalCallWinProc", USER32InternalCallProcWin7x64offse, (DWORD)MyInternalCallWinProc, (DWORD)UnhookInternalCallWinProc, HookInternalCallWinProcRet, ishook);//HOOK:XP系统下的:USER32.dll的InternalCallWinProc函数 //
  3373. if (TSRuntime::IsVirtualProtectEx || TSRuntime::pData->ismousehook || TSRuntime::pData->iskeyboardhook || ishook == false)
  3374. {
  3375. GetHookModFuntion(L"user32.dll", "NtUserGetThreadState", NtUserGetThreadState_WIN7X64Offset, (DWORD)MyNtUserGetThreadState, (DWORD)NtUserGetThreadStateUnhookByte, NtUserGetThreadStateRet, ishook);
  3376. }
  3377. if (TSRuntime::IsVirtualProtectEx || TSRuntime::pData->ismousehook || ishook == false)
  3378. {
  3379. //GetHookModFuntion(L"user32.dll","NtUserCallOneParam",NtUserCallOneParam_WIN7X64Offset,(DWORD)MyNtUserCallOneParam,(DWORD)NtUserCallOneParamUnhookByte,NtUserCallOneParamRet,ishook);
  3380. GetHookModFuntion(L"user32.dll", "NtUserCallTwoParam", NtUserCallTwoParam_WIN7X64Offset, (DWORD)MyNtUserCallTwoParam, (DWORD)NtUserCallTwoParamUnhookByte, NtUserCallTwoParamRet, ishook);
  3381. }
  3382. if (TSRuntime::IsVirtualProtectEx || TSRuntime::pData->iskeyboardhook || ishook == false)
  3383. {
  3384. GetHookModFuntion(L"user32.dll", "NtUserGetKeyState", NtUserGetKeyState_WIN7X64Offset, (DWORD)MyNtUserGetKeyState, (DWORD)NtUserGetKeyStateUnhookByte, NtUserGetKeyStateRet, ishook);
  3385. GetHookModFuntion(L"user32.dll", "NtUserGetAsyncKeyState", NtUserGetAsyncKeyState_WIN7X64Offset, (DWORD)MyNtUserGetAsyncKeyState, (DWORD)NtUserGetAsyncKeyStateUnhookByte, NtUserGetAsyncKeyStateRet, ishook);
  3386. }
  3387. }
  3388. if ((TSRuntime::IsVirtualProtectEx || TSRuntime::pData->ispichook) && UnhookPresent == false)//02d460a0
  3389. {
  3390. if (UnhookPresent == false && DxdeviceAddr == 0)
  3391. GetHookModFuntion(L"d3d9.dll", "Present", D3D9PresentWin7offse, (DWORD)MyD3D9Present, (DWORD)D3D9Present, HookD3D9PresentRet, ishook);
  3392. else if (ishook == true)
  3393. {
  3394. Ori_DxdeviceAddr = *(DWORD*)DxdeviceAddr;
  3395. *(DWORD*)DxdeviceAddr = (DWORD)MyD3D9Present;//把真正的函数地址修改到我们的函数地址,
  3396. UnhookPresent = true;
  3397. }
  3398. }
  3399. if (TSRuntime::IsVirtualProtectEx || TSRuntime::pData->ismousehook || TSRuntime::pData->iskeyboardhook || ishook == false)
  3400. {
  3401. //if(ishook||UnhookKbd_DeviceState||UnhookMouse_DeviceState)
  3402. //if(UnhookKbd_DeviceState||Kbd_DeviceStateAddr==0)
  3403. GetHookModFuntion(L"dinput8.dll", "GetDeviceState", GetDeviceStateOBJkeyboardWin7offse, (DWORD)MyGetDeviceStateKbd, (DWORD)GetDeviceStateKbd, HookGetDeviceStateKbdRet, ishook);
  3404. //if(UnhookMouse_DeviceState||Mouse_DeviceStateAddr==0)
  3405. GetHookModFuntion(L"dinput8.dll", "GetDeviceState", GetDeviceStateOBJMouseWin7offse, (DWORD)MyGetDeviceStateMouse, (DWORD)GetDeviceStateMouse, HookGetDeviceStateMouseRet, ishook);////HOOK:dinput8.dll的GetDeviceState函数
  3406. }
  3407. }
  3408. else if (SySTpye == 5)//win8系统
  3409. {
  3410. IsWin8 = true;
  3411. typedef bool(__stdcall* myWow64DisableWow64FsRedirection)(LPVOID);
  3412. myWow64DisableWow64FsRedirection f_myWow64DisableWow64FsRedirection = NULL;
  3413. HINSTANCE hlibrary;
  3414. hlibrary = LoadLibrary(_T("Kernel32.dll"));
  3415. f_myWow64DisableWow64FsRedirection = (myWow64DisableWow64FsRedirection)GetProcAddress(hlibrary, "Wow64DisableWow64FsRedirection");
  3416. PVOID vlau = NULL;
  3417. bool ret = f_myWow64DisableWow64FsRedirection(&vlau);
  3418. //如果是win8x64系统ret返回true
  3419. if (!ret)
  3420. {
  3421. //TSRuntime::add_log( "WIN8X86"); //WIN8X86
  3422. GetHookModFuntion(L"user32.dll", "InternalCallWinProc", USER32InternalCallProcWin8offse, (DWORD)MyInternalCallWinProc, (DWORD)UnhookInternalCallWinProc, HookInternalCallWinProcRet, ishook);//HOOK:系统下的:USER32.dll的InternalCallWinProc函数
  3423. if (TSRuntime::IsVirtualProtectEx || TSRuntime::pData->ismousehook || TSRuntime::pData->iskeyboardhook || ishook == false)
  3424. {
  3425. GetHookModFuntion(L"user32.dll", "NtUserGetThreadState", NtUserGetThreadState_WIN8X86Offset, (DWORD)MyNtUserGetThreadState, (DWORD)NtUserGetThreadStateUnhookByte, NtUserGetThreadStateRet, ishook);
  3426. }
  3427. if (TSRuntime::IsVirtualProtectEx || TSRuntime::pData->ismousehook || ishook == false)
  3428. {
  3429. GetHookModFuntion(L"user32.dll", "NtUserCallTwoParam", NtUserCallTwoParam_WIN8X86Offset, (DWORD)MyNtUserCallTwoParam, (DWORD)NtUserCallTwoParamUnhookByte, NtUserCallTwoParamRet, ishook);
  3430. }
  3431. if (TSRuntime::IsVirtualProtectEx || TSRuntime::pData->iskeyboardhook || ishook == false)
  3432. {
  3433. GetHookModFuntion(L"user32.dll", "NtUserGetKeyState", NtUserGetKeyState_WIN8X86Offset, (DWORD)MyNtUserGetKeyState, (DWORD)NtUserGetKeyStateUnhookByte, NtUserGetKeyStateRet, ishook);
  3434. GetHookModFuntion(L"user32.dll", "NtUserGetAsyncKeyState", NtUserGetAsyncKeyState_WIN8X86Offset, (DWORD)MyNtUserGetAsyncKeyState, (DWORD)NtUserGetAsyncKeyStateUnhookByte, NtUserGetAsyncKeyStateRet, ishook);
  3435. }
  3436. }
  3437. else //win8x64
  3438. {
  3439. //TSRuntime::add_log( "win8x64");
  3440. IsWin8X64 = true;
  3441. GetHookModFuntion(L"user32.dll", "InternalCallWinProc", USER32InternalCallProcWin8x64offse, (DWORD)MyInternalCallWinProc, (DWORD)UnhookInternalCallWinProc, HookInternalCallWinProcRet, ishook);//HOOK:系统下的:USER32.dll的InternalCallWinProc函数 //
  3442. if (TSRuntime::IsVirtualProtectEx || TSRuntime::pData->ismousehook || TSRuntime::pData->iskeyboardhook || ishook == false)
  3443. {
  3444. GetHookModFuntion(L"user32.dll", "NtUserGetThreadState", NtUserGetThreadState_WIN8X64Offset, (DWORD)MyNtUserGetThreadState, (DWORD)NtUserGetThreadStateUnhookByte, NtUserGetThreadStateRet, ishook);
  3445. }
  3446. if (TSRuntime::IsVirtualProtectEx || TSRuntime::pData->ismousehook || ishook == false)
  3447. {
  3448. GetHookModFuntion(L"user32.dll", "NtUserCallTwoParam", NtUserCallTwoParam_WIN8X64Offset, (DWORD)MyNtUserCallTwoParam, (DWORD)NtUserCallTwoParamUnhookByte, NtUserCallTwoParamRet, ishook);
  3449. }
  3450. if (TSRuntime::IsVirtualProtectEx || TSRuntime::pData->iskeyboardhook || ishook == false)
  3451. {
  3452. GetHookModFuntion(L"user32.dll", "NtUserGetKeyState", NtUserGetKeyState_WIN8X64Offset, (DWORD)MyNtUserGetKeyState, (DWORD)NtUserGetKeyStateUnhookByte, NtUserGetKeyStateRet, ishook);
  3453. GetHookModFuntion(L"user32.dll", "NtUserGetAsyncKeyState", NtUserGetAsyncKeyState_WIN8X64Offset, (DWORD)MyNtUserGetAsyncKeyState, (DWORD)NtUserGetAsyncKeyStateUnhookByte, NtUserGetAsyncKeyStateRet, ishook);
  3454. }
  3455. }
  3456. if ((TSRuntime::IsVirtualProtectEx || TSRuntime::pData->ispichook) && UnhookPresent == false)
  3457. {
  3458. if (UnhookPresent == false && DxdeviceAddr == 0)
  3459. GetHookModFuntion(L"d3d9.dll", "Present", D3D9PresentWin8offse, (DWORD)MyD3D9Present, (DWORD)D3D9Present, HookD3D9PresentRet, ishook);
  3460. else if (ishook == true)
  3461. {
  3462. Ori_DxdeviceAddr = *(DWORD*)DxdeviceAddr;
  3463. *(DWORD*)DxdeviceAddr = (DWORD)MyD3D9Present;//把真正的函数地址修改到我们的函数地址,
  3464. UnhookPresent = true;
  3465. }
  3466. }
  3467. if (TSRuntime::IsVirtualProtectEx || TSRuntime::pData->ismousehook || TSRuntime::pData->iskeyboardhook || ishook == false)
  3468. {
  3469. GetHookModFuntion(L"dinput8.dll", "GetDeviceState", GetDeviceStateOBJMouseWin8offse, (DWORD)MyGetDeviceStateMouse, (DWORD)GetDeviceStateMouse, HookGetDeviceStateMouseRet, ishook);////HOOK:dinput8.dll的GetDeviceState函数
  3470. GetHookModFuntion(L"dinput8.dll", "GetDeviceState", GetDeviceStateOBJkeyboardWin8offse, (DWORD)MyGetDeviceStateKbd, (DWORD)GetDeviceStateKbd, HookGetDeviceStateKbdRet, ishook);
  3471. //HookKbdMouse_Thread=(HANDLE)_beginthread(HookKbdMouse,0,0);
  3472. }
  3473. }
  3474. if (TSRuntime::pData->Isdxantiapi == false)//开启次盾属性可能会导致部分后台功能失效,默认不开启
  3475. {
  3476. GetHookModFuntion(L"user32.dll", "GetForegroundWindow", 0, (DWORD)MyGetForegroundWindow, (DWORD)UnhookGetForegroundWindow, HookGetForegroundWindowRet, ishook);
  3477. if (TSRuntime::IsVirtualProtectEx || TSRuntime::pData->ismousehook || ishook == false)
  3478. {
  3479. GetHookModFuntion(L"user32.dll", "SetCursor", 0, (DWORD)MySetCursor, (DWORD)USER32SetCursor, HookSetCursorRet, ishook);
  3480. }
  3481. GetHookModFuntion(L"Imm32.dll", "ImmGetCompositionStringA", 0, (DWORD)MyIMM32ImmGetCompositionStringA, (DWORD)IMM32ImmGetCompositionStringA, HookImmGetCompositionStringARet, ishook);
  3482. GetHookModFuntion(L"Imm32.dll", "ImmGetCompositionStringW", 0, (DWORD)MyIMM32ImmGetCompositionStringW, (DWORD)IMM32ImmGetCompositionStringW, HookImmGetCompositionStringWRet, ishook);
  3483. }
  3484. if (TSRuntime::pData)
  3485. {
  3486. TSRuntime::pData->isInject = true;
  3487. TSRuntime::pData->ispichook = false;
  3488. g_InjectHWND = TSRuntime::pData->InjectHwnd;
  3489. }
  3490. }
  3491. //DWORD g_GetRawInputData=0;//xp:0x11ac,2003:,win7:
  3492. void HookandUnhookAPI(void* para)
  3493. {
  3494. //TSRuntime::add_log( "HookandUnhookAPI-start");
  3495. ////TSRuntime::add_log( "hprocess:%d",::GetCurrentProcess());
  3496. ////TSRuntime::add_log( "HookandUnhookAPI-start,TSRuntime::IsVirtualProtectEx:%d",TSRuntime::IsVirtualProtectEx);
  3497. bool ishook = (bool)para;
  3498. bool isHSProtect = false;//下钩子前检测是否有HS保护的模块
  3499. //SySTpye=TSRuntime::InitialWindowsVersion();//先获取系统版本后在HOOK,1:XP,2:2003,4:win7
  3500. //if(ishook)
  3501. //{
  3502. // GetHookModFuntion(L"user32.dll","PeekMessageA",0,(DWORD)MyPeekMessageA,(DWORD)UnhookPeekMessage,HookPeekMessageARet,ishook);
  3503. // GetHookModFuntion(L"user32.dll","PeekMessageW",0,(DWORD)MyPeekMessageW,(DWORD)UnhookPeekMessage,HookPeekMessageWRet,ishook);
  3504. //}
  3505. if (IsWindow(g_InjectHWND) == FALSE && g_InjectHWND != NULL)//判断注入进程是否异常退出
  3506. {
  3507. //if(TSRuntime::pData)
  3508. // delete [] TSRuntime::pData;
  3509. char pszMapName[MAX_PATH] = { 0 };
  3510. sprintf(pszMapName, "%s%d", TS_MAPVIEW_NAME, GetCurrentProcessId());
  3511. HANDLE hFileMap = OpenFileMappingA(FILE_MAP_ALL_ACCESS, FALSE, pszMapName);
  3512. //如果hFileMap句柄不为空并且pData==NULL说明DLL被注入,准备启动注入线程
  3513. if (hFileMap != NULL)
  3514. {
  3515. //这里先打开共享内存,共享内存和程序是一对一的关系
  3516. CShareMemory* sm = new CShareMemory(pszMapName);
  3517. TSRuntime::pData = (CMessageData*)sm->GetBuffer();
  3518. }
  3519. }
  3520. HMODULE HSmode = GetModuleHandle(L"EhSvc.dll");
  3521. if (HSmode)
  3522. isHSProtect = true;
  3523. if (SySTpye == 1 || SySTpye == 2) //SySTpye==1:XP系统,
  3524. {
  3525. if (SySTpye == 1)
  3526. {
  3527. GetHookModFuntion(L"user32.dll", "InternalCallWinProc", USER32InternalCallWinProcXPoffse, (DWORD)MyInternalCallWinProc, (DWORD)UnhookInternalCallWinProc, HookInternalCallWinProcRet, ishook);//HOOK:XP系统下的:USER32.dll的InternalCallWinProc函数
  3528. if ((TSRuntime::IsVirtualProtectEx || TSRuntime::pData->ispichook) && UnhookPresent == false)
  3529. {
  3530. if (UnhookPresent == false && DxdeviceAddr == 0)
  3531. GetHookModFuntion(L"d3d9.dll", "Present", D3D9PresentXPoffse, (DWORD)MyD3D9Present, (DWORD)D3D9Present, HookD3D9PresentRet, ishook);
  3532. else if (ishook == true)
  3533. {
  3534. *(DWORD*)DxdeviceAddr = (DWORD)MyD3D9Present;//把真正的函数地址修改到我们的函数地址,
  3535. UnhookPresent = true;
  3536. }
  3537. }
  3538. g_OriSetCursor = 0x11ff;
  3539. g_GetRawInputData = 0x11ac;
  3540. dwMoveGetKeyboardState = 0x119e;
  3541. //TSRuntime::add_log( "WinXP");
  3542. }
  3543. else if (SySTpye == 2) //SySTpye==2:Win2003系统
  3544. {
  3545. // TSRuntime::add_log( "Win2003");
  3546. GetHookModFuntion(L"user32.dll", "InternalCallWinProc", USER32InternalCallWinProcWin2003offse, (DWORD)MyInternalCallWinProc, (DWORD)UnhookInternalCallWinProc, HookInternalCallWinProcRet, ishook);//HOOK:XP系统下的:USER32.dll的InternalCallWinProc函数
  3547. if ((TSRuntime::IsVirtualProtectEx || TSRuntime::pData->ispichook) && UnhookPresent == false)
  3548. {
  3549. if (UnhookPresent == false && DxdeviceAddr == 0)
  3550. GetHookModFuntion(L"d3d9.dll", "Present", D3D9PresentWin2003offse, (DWORD)MyD3D9Present, (DWORD)D3D9Present, HookD3D9PresentRet, ishook);
  3551. else if (ishook == true)
  3552. {
  3553. *(DWORD*)DxdeviceAddr = (DWORD)MyD3D9Present;//把真正的函数地址修改到我们的函数地址,
  3554. UnhookPresent = true;
  3555. }
  3556. }
  3557. g_OriSetCursor = 0x11fd;
  3558. g_GetRawInputData = 0x11ab;
  3559. dwMoveGetKeyboardState = 0x119d;
  3560. }
  3561. if (TSRuntime::IsVirtualProtectEx || TSRuntime::pData->ismousehook || ishook == false)
  3562. {
  3563. GetHookModFuntion(L"user32.dll", "ScreenToClient", 0, (DWORD)MyScreenToClient, (DWORD)USER32ScreenToClient, HookScreenToClientRet, ishook);//HOOKScreenToClient
  3564. }
  3565. if (TSRuntime::IsVirtualProtectEx || TSRuntime::pData->ismousehook || TSRuntime::pData->iskeyboardhook || ishook == false)
  3566. {
  3567. GetHookModFuntion(L"dinput8.dll", "GetDeviceState", GetDeviceStateOBJMouseXPoffse, (DWORD)MyGetDeviceStateMouse, (DWORD)GetDeviceStateMouse, HookGetDeviceStateMouseRet, ishook);//HOOK:XP系统下的:dinput8.dll的GetDeviceState函数
  3568. GetHookModFuntion(L"dinput8.dll", "GetDeviceState", GetDeviceStateOBJkeyboardXPoffse, (DWORD)MyGetDeviceStateKbd, (DWORD)GetDeviceStateKbd, HookGetDeviceStateKbdRet, ishook);
  3569. }
  3570. }
  3571. else if (SySTpye == 4)//win7系统
  3572. {
  3573. if (!TSRuntime::IsWin7X64)
  3574. {
  3575. //TSRuntime::add_log( "IWProcWIN7"); //WIN7X86
  3576. GetHookModFuntion(L"user32.dll", "InternalCallWinProc", USER32InternalCallProcWin7offse, (DWORD)MyInternalCallWinProc, (DWORD)UnhookInternalCallWinProc, HookInternalCallWinProcRet, ishook);//HOOK:XP系统下的:USER32.dll的InternalCallWinProc函数
  3577. g_GetRawInputData = 0x11c0;
  3578. }
  3579. else //win7x64
  3580. {
  3581. //TSRuntime::add_log( "IWProcWIN7X64");
  3582. IsWin7X64 = true;
  3583. GetHookModFuntion(L"user32.dll", "InternalCallWinProc", USER32InternalCallProcWin7x64offse, (DWORD)MyInternalCallWinProc, (DWORD)UnhookInternalCallWinProc, HookInternalCallWinProcRet, ishook);//HOOK:XP系统下的:USER32.dll的InternalCallWinProc函数 //
  3584. g_GetRawInputData = 0x12be;
  3585. }
  3586. //g_OriSetCursor=0x1221;
  3587. //dwMoveGetKeyboardState=0x11b2;
  3588. if ((TSRuntime::IsVirtualProtectEx || TSRuntime::pData->ispichook) && UnhookPresent == false)
  3589. {
  3590. if (UnhookPresent == false && DxdeviceAddr == 0)
  3591. GetHookModFuntion(L"d3d9.dll", "Present", D3D9PresentWin7offse, (DWORD)MyD3D9Present, (DWORD)D3D9Present, HookD3D9PresentRet, ishook);
  3592. else if (ishook == true)
  3593. {
  3594. //TSRuntime::add_log( "MyD3D9Present");
  3595. *(DWORD*)DxdeviceAddr = (DWORD)MyD3D9Present;//把真正的函数地址修改到我们的函数地址,
  3596. UnhookPresent = true;
  3597. }
  3598. }
  3599. if (TSRuntime::IsVirtualProtectEx || TSRuntime::pData->ismousehook || ishook == false)
  3600. {
  3601. GetHookModFuntion(L"user32.dll", "ScreenToClient", 0, (DWORD)MyScreenToClient, (DWORD)UnhookScreenToClientRet, HookScreenToClientRet, ishook);//HOOKScreenToClient
  3602. }
  3603. if (TSRuntime::IsVirtualProtectEx || TSRuntime::pData->ismousehook || TSRuntime::pData->iskeyboardhook || ishook == false)
  3604. {
  3605. GetHookModFuntion(L"dinput8.dll", "GetDeviceState", GetDeviceStateOBJMouseWin7offse, (DWORD)MyGetDeviceStateMouse, (DWORD)GetDeviceStateMouse, HookGetDeviceStateMouseRet, ishook);////HOOK:dinput8.dll的GetDeviceState函数
  3606. GetHookModFuntion(L"dinput8.dll", "GetDeviceState", GetDeviceStateOBJkeyboardWin7offse, (DWORD)MyGetDeviceStateKbd, (DWORD)GetDeviceStateKbd, HookGetDeviceStateKbdRet, ishook);
  3607. //MessageBox(NULL,L"dinput8",L"TS",NULL);
  3608. }
  3609. }
  3610. else if (SySTpye == 5)//win8系统
  3611. {
  3612. if (!TSRuntime::IsWin8X64)
  3613. {
  3614. //TSRuntime::add_log( "WIN8X86"); //WIN8X86
  3615. GetHookModFuntion(L"user32.dll", "InternalCallWinProc", USER32InternalCallProcWin8offse, (DWORD)MyInternalCallWinProc, (DWORD)UnhookInternalCallWinProc, HookInternalCallWinProcRet, ishook);//HOOK:系统下的:USER32.dll的InternalCallWinProc函数
  3616. }
  3617. else //win8x64
  3618. {
  3619. //TSRuntime::add_log( "win8x64");
  3620. IsWin8X64 = true;
  3621. GetHookModFuntion(L"user32.dll", "InternalCallWinProc", USER32InternalCallProcWin8x64offse, (DWORD)MyInternalCallWinProc, (DWORD)UnhookInternalCallWinProc, HookInternalCallWinProcRet, ishook);//HOOK:系统下的:USER32.dll的InternalCallWinProc函数 //
  3622. }
  3623. if ((TSRuntime::IsVirtualProtectEx || TSRuntime::pData->ispichook) && UnhookPresent == false)
  3624. {
  3625. if (UnhookPresent == false && DxdeviceAddr == 0)
  3626. GetHookModFuntion(L"d3d9.dll", "Present", D3D9PresentWin8offse, (DWORD)MyD3D9Present, (DWORD)D3D9Present, HookD3D9PresentRet, ishook);
  3627. else if (ishook == true)
  3628. {
  3629. *(DWORD*)DxdeviceAddr = (DWORD)MyD3D9Present;//把真正的函数地址修改到我们的函数地址,
  3630. UnhookPresent = true;
  3631. }
  3632. }
  3633. if (TSRuntime::IsVirtualProtectEx || TSRuntime::pData->ismousehook || ishook == false)
  3634. {
  3635. GetHookModFuntion(L"user32.dll", "ScreenToClient", 0, (DWORD)MyScreenToClient, (DWORD)UnhookScreenToClientRet, HookScreenToClientRet, ishook);//HOOKScreenToClient
  3636. }
  3637. if (TSRuntime::IsVirtualProtectEx || TSRuntime::pData->ismousehook || TSRuntime::pData->iskeyboardhook || ishook == false)
  3638. {
  3639. GetHookModFuntion(L"dinput8.dll", "GetDeviceState", GetDeviceStateOBJMouseWin8offse, (DWORD)MyGetDeviceStateMouse, (DWORD)GetDeviceStateMouse, HookGetDeviceStateMouseRet, ishook);////HOOK:dinput8.dll的GetDeviceState函数
  3640. GetHookModFuntion(L"dinput8.dll", "GetDeviceState", GetDeviceStateOBJkeyboardWin8offse, (DWORD)MyGetDeviceStateKbd, (DWORD)GetDeviceStateKbd, HookGetDeviceStateKbdRet, ishook);
  3641. }
  3642. }
  3643. if (TSRuntime::IsVirtualProtectEx || TSRuntime::pData->ismousehook || TSRuntime::pData->iskeyboardhook || ishook == false)
  3644. {
  3645. GetHookModFuntion(L"user32.dll", "GetActiveWindow", 0, (DWORD)MyGetActiveWindow, (DWORD)UnhookGetActiveWindow, HookGetActiveWindowRet, ishook);
  3646. GetHookModFuntion(L"user32.dll", "GetFocus", 0, (DWORD)MyGetFocus, (DWORD)UnhookGetFocus, HookGetFocusRet, ishook);
  3647. GetHookModFuntion(L"user32.dll", "IsWindowEnabled", 0, (DWORD)MyIsWindowEnabled, (DWORD)USER32IsWindowEnabled, HookIsWindowEnabledRet, ishook);
  3648. GetHookModFuntion(L"user32.dll", "GetForegroundWindow", 0, (DWORD)MyGetForegroundWindow, (DWORD)UnhookGetForegroundWindow, HookGetForegroundWindowRet, ishook);
  3649. GetHookModFuntion(L"user32.dll", "GetTopWindow", 0, (DWORD)MyGetTopWindow, (DWORD)UnhookGetTopWindow, HookGetTopWindowRet, ishook);
  3650. GetHookModFuntion(L"user32.dll", "WindowFromPoint", 0, (DWORD)MyWindowFromPoint, (DWORD)UnhookWindowFromPoint, HookWindowFromPointRet, ishook);
  3651. GetHookModFuntion(L"user32.dll", "GetAsyncKeyState", 0, (DWORD)MyGetAsyncKeyState, (DWORD)USER32GetAsyncKeyState, HookGetAsyncKeyStateRet, ishook);
  3652. GetHookModFuntion(L"user32.dll", "GetRawInputData", 0, (DWORD)MyGetRawInputData, (DWORD)USER32GetRawInputData, HookGetRawInputDataRet, ishook);
  3653. //GetHookModFuntion(L"user32.dll","GetCapture",0,(DWORD)MyGetCapture,(DWORD)USER32GetCapture,HookGetCaptureRet,ishook);
  3654. }
  3655. if (TSRuntime::IsVirtualProtectEx || TSRuntime::pData->ismousehook || ishook == false)
  3656. {
  3657. GetHookModFuntion(L"user32.dll", "GetCursorPos", 0, (DWORD)MyGetCursorPos, (DWORD)USER32GetCursorPos, HookGetCursorPosRet, ishook);//HOOKGetCursorPos
  3658. GetHookModFuntion(L"user32.dll", "SetCursor", 0, (DWORD)MySetCursor, (DWORD)USER32SetCursor, HookSetCursorRet, ishook);
  3659. GetHookModFuntion(L"user32.dll", "GetMessagePos", 0, (DWORD)MyGetMessagePos, (DWORD)UnhookGetMessagePos, HookGetMessagePosRet, ishook);
  3660. GetHookModFuntion(L"user32.dll", "SetCursorPos", 0, (DWORD)MySetCursorPos, (DWORD)USER32SetCursorPos, HookSetCursorPosRet, ishook);
  3661. }
  3662. if (TSRuntime::IsVirtualProtectEx || TSRuntime::pData->iskeyboardhook || ishook == false)
  3663. {
  3664. GetHookModFuntion(L"user32.dll", "GetKeyState", 0, (DWORD)MyGetKeyState, (DWORD)USER32GetKeyState, HookGetKeyStateRet, ishook);
  3665. GetHookModFuntion(L"user32.dll", "GetKeyboardState", 0, (DWORD)MyGetKeyboardState, (DWORD)UnhookGetKeyboardState, HookGetKeyboardStateRet, ishook);
  3666. }
  3667. GetHookModFuntion(L"Imm32.dll", "ImmGetCompositionStringA", 0, (DWORD)MyIMM32ImmGetCompositionStringA, (DWORD)IMM32ImmGetCompositionStringA, HookImmGetCompositionStringARet, ishook);
  3668. GetHookModFuntion(L"Imm32.dll", "ImmGetCompositionStringW", 0, (DWORD)MyIMM32ImmGetCompositionStringW, (DWORD)IMM32ImmGetCompositionStringW, HookImmGetCompositionStringWRet, ishook);
  3669. if (TSRuntime::pData)
  3670. {
  3671. TSRuntime::pData->isInject = true;
  3672. TSRuntime::pData->ispichook = false;
  3673. g_InjectHWND = TSRuntime::pData->InjectHwnd;
  3674. }
  3675. //TSRuntime::ZwProtectVirtualMemoryRet
  3676. //TSRuntime::add_log( "HookandUnhookAPI-end,TSRuntime::IsVirtualProtectEx:%d",TSRuntime::IsVirtualProtectEx);
  3677. }
  3678. void ReadShareMemoryThreadFunc(void* para)//创建读写共享数据线程
  3679. {
  3680. g_Unbind = false;
  3681. memset(TSRuntime::SetPath, 0, MAX_PATH);
  3682. //g_currentHwnd=TSRuntime::GetProcessMainWnd(::GetCurrentProcessId()); //获取自身进程ID的窗口句柄
  3683. g_currentHwnd = TSRuntime::pData->m_hwnd;
  3684. //是否开启dxkmprotect盾,启动不同的钩子
  3685. if (TSRuntime::pData->Isdxkmprotect)
  3686. VIPHookandUnhookAPI(para);
  3687. else
  3688. HookandUnhookAPI(para);
  3689. }