⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 directxhook.pas

📁 冒险岛吸怪源码UCE的制作材料 用于冒险岛游戏的外挂
💻 PAS
📖 第 1 页 / 共 5 页
字号:
10=GetAdapterCount : Cardinal; stdcall;
14=GetAdapterIdentifier(const Adapter : Cardinal; const Flags : LongWord; out pIdentifier : TD3DAdapter_Identifier8) : HResult; stdcall;
18=GetAdapterModeCount(Adapter : Cardinal) : Cardinal; stdcall;
1c=EnumAdapterModes(const Adapter, Mode : Cardinal; var pMode : TD3DDisplayMode) : HResult; stdcall;
20=GetAdapterDisplayMode(const Adapter : Cardinal; var pMode : TD3DDisplayMode) : HResult; stdcall;
24=CheckDeviceType(const Adapter : Cardinal; const CheckType : TD3DDevType; const DisplayFormat, BackBufferFormat : TD3DFormat; const Windowed : BOOL) : HResult; stdcall;
28=CheckDeviceFormat(const Adapter : Cardinal; const DeviceType : TD3DDevType; const AdapterFormat : TD3DFormat; const Usage : LongWord; const RType : TD3DResourceType; const CheckFormat : TD3DFormat) : HResult; stdcall;
2c=CheckDeviceMultiSampleType(const Adapter : Cardinal; const DeviceType : TD3DDevType; const SurfaceFormat : TD3DFormat; const Windowed : BOOL; const MultiSampleType : TD3DMultiSample_Type) : HResult; stdcall;
30=CheckDepthStencilMatch(const Adapter : Cardinal; const DeviceType : TD3DDevType; const AdapterFormat, RenderTargetFormat, DepthStencilFormat : TD3DFormat) : HResult; stdcall;
34=GetDeviceCaps(const Adapter : Cardinal; const DeviceType : TD3DDevType; out pCaps : TD3DCaps8) : HResult; stdcall;
38=GetAdapterMonitor(const Adapter : Cardinal) : HMONITOR; stdcall;
3c=CreateDevice(const Adapter : Cardinal; const DeviceType : TD3DDevType; hFocusWindow : HWND; BehaviorFlags : LongWord; var pPresentationParameters : TD3DPresent_Parameters; out ppReturnedDeviceInterface : IDirect3DDevice8) : HResult; stdcall;
  end;
}

//function D3DXMatrixPerspectiveFovLH , hrm, perhaps later,

function Direct3DCreate8Hook(SDKVersion: DWORD): PIDirect3D8; stdcall;
var x,y: dword;
    xp: ^dword;
    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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -