📄 directxhook.pas.svn-base
字号:
xpp: ^Pdword; AIDirect3DVertexBuffer8: IDirect3DVertexBuffer8;begin //restore with original code asm push esi push edi lea esi,Direct3DCreate8Info.original[0] mov edi,Direct3DCreate8Info.location movsd movsb pop edi pop esi end; outputdebugstring('Creating a direct3d8 object'); //execute api result:=directxhook.Direct3DCreate8(SDKVersion); x:=dword(result); //hook createdevice outputdebugstring('Hooking createdevice'); if IDirect3D_CreateDevice.location=nil then IDirect3D_CreateDevice.location:=pointer(pdword(pdword(x)^+$3c)^); virtualprotect(pointer(pdword(x)^+$3c),4,PAGE_EXECUTE_READWRITE,y); pdword(pdword(x)^+$3c)^:=dword(@IDirect3D_CreateDevice_Hook); virtualprotect(pointer(pdword(x)^+$3c),4,y,y); outputdebugstring('Hooking createdevice-success');end;function Fixhook(const self:IDirect3DDevice8):boolean; stdcall;var x:dword;begin virtualprotect(pdword(pdword(dword(Self))^),4*77,PAGE_EXECUTE_READWRITE,x); //hook Reset if IDirect3DDevice8_Reset.location=nil then IDirect3DDevice8_Reset.location:=pointer(pdword(pdword(dword(Self))^+4*14)^); pdword(pdword(dword(Self))^+4*14)^:=dword(@IDirect3DDevice8_Reset_Hook); //hook createtexture if IDirect3DDevice8_CreateTexture.location=nil then IDirect3DDevice8_CreateTexture.location:=pointer(pdword(pdword(dword(Self))^+4*20)^); pdword(pdword(dword(Self))^+4*20)^:=dword(@IDirect3DDevice8_CreateTexture_Hook); //hook CreateVertexBuffer if IDirect3DDevice8_CreateVertexBuffer.location=nil then IDirect3DDevice8_CreateVertexBuffer.location:=pointer(pdword(pdword(dword(Self))^+4*23)^); pdword(pdword(dword(Self))^+4*23)^:=dword(@IDirect3DDevice8_CreateVertexBuffer_Hook); //hook beginscene if IDirect3DDevice8_BeginScene.location=nil then IDirect3DDevice8_BeginScene.location:=pointer(pdword(pdword(dword(Self))^+4*34)^); pdword(pdword(dword(Self))^+4*34)^:=dword(@IDirect3DDevice8_BeginScene_Hook); //EndScene if IDirect3DDevice8_EndScene.location=nil then IDirect3DDevice8_EndScene.location:=pointer(pdword(pdword(dword(Self))^+4*35)^); pdword(pdword(dword(Self))^+4*35)^:=dword(@IDirect3DDevice8_EndScene_Hook); //SetTransform if IDirect3DDevice8_SetTransform.location=nil then IDirect3DDevice8_SetTransform.location:=pointer(pdword(pdword(dword(Self))^+4*37)^); pdword(pdword(dword(Self))^+4*37)^:=dword(@IDirect3DDevice8_SetTransform_Hook); x:=dword(pdword(dword(Self))^+4*37); //GetTransform if IDirect3DDevice8_GetTransform.location=nil then IDirect3DDevice8_GetTransform.location:=pointer(pdword(pdword(dword(Self))^+4*38)^); pdword(pdword(dword(Self))^+4*38)^:=dword(@IDirect3DDevice8_GetTransform_Hook); //hook SetRenderState if IDirect3DDevice8_SetRenderState.location=nil then IDirect3DDevice8_SetRenderState.location:=pointer(pdword(pdword(dword(Self))^+4*50)^); pdword(pdword(dword(Self))^+4*50)^:=dword(@IDirect3DDevice8_SetRenderState_Hook); //hook SetTexture if IDirect3DDevice8_SetTexture.location=nil then IDirect3DDevice8_SetTexture.location:=pointer(pdword(pdword(dword(Self))^+4*61)^); pdword(pdword(dword(Self))^+4*61)^:=dword(@IDirect3DDevice8_SetTexture_Hook);//---------- //hook DrawPrimitive if IDirect3DDevice8_DrawPrimitive.location=nil then IDirect3DDevice8_DrawPrimitive.location:=pointer(pdword(pdword(dword(Self))^+4*70)^); pdword(pdword(dword(Self))^+4*70)^:=dword(@IDirect3DDevice8_DrawPrimitive_Hook); //hook DrawIndexedPrimitive if IDirect3DDevice8_DrawIndexedPrimitive.location=nil then IDirect3DDevice8_DrawIndexedPrimitive.location:=pointer(pdword(pdword(dword(Self))^+4*71)^); pdword(pdword(dword(Self))^+4*71)^:=dword(@IDirect3DDevice8_DrawIndexedPrimitive_Hook); //hook DrawPrimitiveUP if IDirect3DDevice8_DrawPrimitiveUP.location=nil then IDirect3DDevice8_DrawPrimitiveUP.location:=pointer(pdword(pdword(dword(Self))^+4*72)^); pdword(pdword(dword(Self))^+4*72)^:=dword(@IDirect3DDevice8_DrawPrimitiveUP_Hook); //hook DrawIndexedPrimitiveUP if IDirect3DDevice8_DrawIndexedPrimitiveUP.location=nil then IDirect3DDevice8_DrawIndexedPrimitiveUP.location:=pointer(pdword(pdword(dword(Self))^+4*73)^); pdword(pdword(dword(Self))^+4*73)^:=dword(@IDirect3DDevice8_DrawIndexedPrimitiveUP_Hook);//---------- //hook SetVertexShader if IDirect3DDevice8_SetVertexShader.location=nil then IDirect3DDevice8_SetVertexShader.location:=pointer(pdword(pdword(dword(Self))^+4*76)^); pdword(pdword(dword(Self))^+4*76)^:=dword(@IDirect3DDevice8_SetVertexShader_Hook); virtualprotect(pointer(pdword(dword(Self))^),4*77,x,x);end;function IDirect3D_CreateDevice_Hook(const self: IDirect3D8; const Adapter : Cardinal; const DeviceType : TD3DDevType; hFocusWindow : HWND; BehaviorFlags : LongWord; var pPresentationParameters : TD3DPresent_Parameters; out ppReturnedDeviceInterface : IDirect3DDevice8) : HResult; stdcall;var pMode: TD3DDisplayMode; x,y: dword; tl: TD3DLocked_Rect; r: Trect; pr: prect; ca,cr,cg,cb: word;begin directxversion:=directx8; setlength(xylist,0); setlength(xylist2,0); outputdebugstring('going to create a direct3d8 device'); self.GetAdapterDisplayMode(D3dadapter_default,pmode);{ x:=pPresentationParameters.hDeviceWindow; zeromemory(@ppresentationParameters,sizeof(td3dpresent_parameters)); pPresentationParameters.Windowed:=true; pPresentationParameters.SwapEffect:=d3dswapeffect_discard; pPresentationParameters.BackBufferFormat:=pmode.format; pPresentationParameters.hDeviceWindow:=x; if pPresentationParameters.hDeviceWindow<>0 then begin setWindowPos(pPresentationParameters.hDeviceWindow,HWND_NOTOPMOST , 10,10,600,450, SWP_NOZORDER); end; if hFocusWindow<>0 then begin setWindowPos(pPresentationParameters.hDeviceWindow,HWND_NOTOPMOST , 10,10,600,450,SWP_NOMOVE or SWP_NOZORDER); end;} Behaviorflags:=behaviorflags and not (D3DCREATE_PUREDEVICE); result:=TIDirect3D_CreateDevice_Original(IDirect3D_CreateDevice.location)(self,Adapter,Devicetype,hFocusWindow,BehaviorFlags,pPresentationParameters,ppReturnedDeviceInterface); try texturepointer:=-1; screencenter.x:=screen.Width / 2; screencenter.y:=screen.Height / 2; if result=0 then //also hook some methods of IDirect3DDevice8 begin if resetdevice then begin if mysprite<>nil then mysprite:=nil; D3DXCreateSprite(ppReturnedDeviceInterface,mysprite); cefont.OnResetDevice; resetdevice:=false; exit; end; D3DXCreateTextureFromFile(ppReturnedDeviceInterface,pchar(keys.CEDir+'lockedstring.bmp'),lockedStringTexture); D3DXCreateTextureFromFile(ppReturnedDeviceInterface,pchar(keys.CEDir+'unlockedstring.bmp'),unlockedStringTexture); D3DXCreateTextureFromFile(ppReturnedDeviceInterface,pchar(keys.CEDir+'texturestring.bmp'),textureStringTexture); D3DXCreateTextureFromFile(ppReturnedDeviceInterface,pchar(keys.CEDir+'Black.bmp'),blackTexture);// D3DXCreateTextureFromFileEx(ppReturnedDeviceInterface,pchar(keys.CEDir+'Logo3.bmp'),D3DX_DEFAULT,D3DX_DEFAULT,1,0,D3DFMT_A8R8G8B8,D3DPOOL_MANAGED,D3DX_DEFAULT,D3DX_DEFAULT,$FFFFFFFF,nil,nil,myspritetexture); D3DXCreateTextureFromFileEx(ppReturnedDeviceInterface,pchar(keys.CEDir+'TargetTexture.bmp'),D3DX_DEFAULT,D3DX_DEFAULT,1,0,D3DFMT_A8R8G8B8,D3DPOOL_MANAGED,D3DX_DEFAULT,D3DX_DEFAULT,$FFFFFFFF,nil,nil,targettexture); D3DXCreateTextureFromFileEx(ppReturnedDeviceInterface,pchar(keys.CEDir+'Locktexture.bmp'),D3DX_DEFAULT,D3DX_DEFAULT,1,0,D3DFMT_A8R8G8B8,D3DPOOL_MANAGED,D3DX_DEFAULT,D3DX_DEFAULT,$FFFFFFFF,nil,nil,locktexture); D3DXCreateTextureFromFileEx(ppReturnedDeviceInterface,pchar(keys.CEDir+'Movementtexture.bmp'),D3DX_DEFAULT,D3DX_DEFAULT,1,0,D3DFMT_A8R8G8B8,D3DPOOL_MANAGED,D3DX_DEFAULT,D3DX_DEFAULT,$FFFFFFFF,nil,nil,movementtexture); cefonthandle.free; cefonthandle:=tfont.Create; cefonthandle.Color:=clred; cefonthandle.Name:='Courier'; D3DXCreateFont(ppReturnedDeviceInterface,cefonthandle.handle,CEFont); D3DXCreateSprite(ppReturnedDeviceInterface,mysprite); fixhook(ppReturnedDeviceInterface); end; except outputdebugstring('something went wrong'); end;end;function IDirect3DDevice8_Reset_Hook(const self:IDirect3DDevice8; var pPresentationParameters : TD3DPresent_Parameters) : HResult; stdcall;var i: integer; err: dword;begin try mysprite.OnLostDevice; cefont.OnLostDevice; texturelistcs.Enter; lockedtexturelistcs.Enter; try fillmemory(@texturelist[0],length(texturelist)*sizeof(TTextureInfo),0); fillmemory(@lockedtexturelist[0],length(texturelist)*sizeof(TTextureInfo),0); setlength(texturelist,0); setlength(lockedtexturelist,0); finally lockedtexturelistcs.Leave; texturelistcs.Leave; end; except outputdebugstring('error in reset(8)'); end; texturepointer:=-1; err:=TIDirect3DDevice8_Reset_Original(IDirect3DDevice8_Reset.location)(self,pPresentationParameters); try if err=0 then begin mysprite.OnResetDevice; cefont.OnResetDevice; end else begin resetdevice:=true; end; except //outputdebugstring('Error in my reset routine'); end; result:=err;end;function IDirect3dDevice8_CreateTexture_Hook(const self:IDirect3DDevice8;const Width, Height, Levels : Cardinal; const Usage : LongWord; const Format : TD3DFormat; const Pool : TD3DPool; out ppTexture : IDirect3DTexture8) : HResult; stdcall;type a=^IDirect3DTexture8;var i: integer; x: dword;begin result:=TIDirect3DDevice8_CreateTexture_Original(IDirect3DDevice8_createtexture.location)(self,width,height,levels,usage,format,pool,pptexture); texturelistcs.Enter; try if imdrawing then exit; if not ((usage=0) and (pool=D3DPOOL_DEFAULT)) then begin i:=length(texturelist); setlength(texturelist,i+1); copymemory(@texturelist[i].texturehandle,@pptexture,4); texturelist[i].Width:=width; texturelist[i].Height:=height; texturelist[i].Levels:=levels; texturelist[i].Usage:=usage; texturelist[i].Format:=format; texturelist[i].Pool:=pool; texturelist[i].locked:=false; //texturelist[i].checked:=false; if texturepointer=-1 then texturepointer:=0; end; finally texturelistcs.Leave; end; if result=0 then begin //hook release virtualprotect(pdword(pdword(dword(ppTexture))^+4*2),4,PAGE_EXECUTE_READWRITE,x); if IDirect3DTexture8_release.location=nil then IDirect3DTexture8_release.location:=pointer(pdword(pdword(dword(ppTexture))^+4*2)^); pdword(pdword(dword(ppTexture))^+4*2)^:=dword(@IDirect3DTexture8_release_Hook); virtualprotect(pdword(pdword(dword(ppTexture))^+4*2),4,x,x); end;end;function IDirect3DDevice8_CreateVertexBuffer_Hook(const self:IDirect3DDevice8;const Length : Cardinal; const Usage, FVF : LongWord; const Pool : TD3DPool; out ppVertexBuffer : IDirect3DVertexBuffer8) : HResult; stdcall;begin result:=TIDirect3DDevice8_CreateVertexBuffer_Original(IDirect3DDevice8_CreateVertexBuffer.location)(self,length,usage,fvf,pool,ppVertexBuffer);end;function IDirect3DDevice8_UpdateTexture_hook(const self: IDirect3DDevice8; const pSourceTexture, pDestinationTexture : IDirect3DBaseTexture8) : HResult; stdcall;begin result:=TIDirect3DDevice8_UpdateTexture_Original(IDirect3DDevice8_UpdateTexture.location)(self,pSourceTexture,pDestinationTexture);end;function IDirect3DDevice8_BeginScene_Hook(const self:IDirect3DDevice8): HResult; stdcall;var cp: single; c: TD3DClipStatus8;begin setlength(xylist,0); setlength(xylist2,0); result:=TIDirect3DDevice8_BeginScene_Original(IDirect3DDevice8_BeginScene.location)(self);end;procedure DrawHotkeylist8(const self: IDirect3DDevice8;vp:td3dviewport8);var position,scale: td3dxvector2; pdesc: TD3DSurface_Desc; i: integer; r: trect;begin mysprite._Begin; if blacktexture.GetLevelDesc(0,pdesc)=0 then begin scale.x:=requiredkeylistwidth / pdesc.Width; scale.y:=requiredkeylistheight / pdesc.Height; end else begin scale.x:=requiredkeylistwidth; scale.y:=requiredkeylistheight; end; position.x:=vp.Width-requiredkeylistwidth; position.y:=0; mysprite.Draw(blacktexture,nil,@scale,nil,0,@position,D3DCOLOR_ARGB(140,255,255,255)); mysprite._End;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -