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

📄 directx9hook.pas

📁 冒险岛吸怪源码UCE的制作材料 用于冒险岛游戏的外挂
💻 PAS
📖 第 1 页 / 共 5 页
字号:
unit directx9hook;

interface
uses classes,windows,messages,forms,dialogs,sysutils,direct3d9,d3dx9,math,graphics,keylistener;

type TTextureInfo = record
  //creation parameters
  Width, Height, Levels : Cardinal;
  Usage : LongWord;
  Format : TD3DFormat;
  Pool : TD3DPool;

  locked: boolean;
  texturehandle: IDirect3DTexture9;
  xdelta,ydelta,zdelta: single;
end;

type PIDirect3D9=^IDirect3D9;
type TDirect3DCreate9=function(SDKVersion: DWORD): PIDirect3D9; stdcall;

type TIDirect3D9_CreateDevice_Original=function(const self: IDirect3D9; const Adapter : Cardinal; const DeviceType : TD3DDevType; FocusWindow : HWND; BehaviorFlags : LongWord; var PresentationParameters : TD3DPresentParameters; out ReturnedDeviceInterface : IDirect3DDevice9) : HResult; stdcall;
type TIDirect3DDevice9_Reset_Original=function(const self: IDirect3DDevice9 ;var PresentationParameters : TD3DPresentParameters) : HResult; stdcall;
type TIDirect3DDevice9_CreateTexture_Original=function(const self: IDirect3DDevice9 ;const Width, Height, Levels : Cardinal; const Usage : LongWord; Format : TD3DFormat; Pool : TD3DPool; out Texture : IDirect3DTexture9; SharedHandle : PHandle) : HResult; stdcall;
type TIDirect3DDevice9_BeginScene_Original=function(const self: IDirect3DDevice9): HResult; stdcall;
type TIDirect3DDevice9_EndScene_Original=function(const self: IDirect3DDevice9): HResult; stdcall;
type TIDirect3DDevice9_SetTransform_Original=function(const self: IDirect3DDevice9; State : TD3DTransformStateType; const Matrix : TD3DMatrix) : HResult; stdcall;
type TIDirect3DDevice9_GetTransform_Original=function(const self: IDirect3DDevice9; State : TD3DTransformStateType; out Matrix : TD3DMatrix) : HResult; stdcall;
type TIDirect3DDevice9_SetRenderState_Original=function(const self: IDirect3DDevice9; State : TD3DRenderStateType; const Value : LongWord) : HResult; stdcall;
type TIDirect3DDevice9_SetTexture_Original=function(const self: IDirect3DDevice9; const Stage : LongWord; Texture : IDirect3DBaseTexture9) : HResult; stdcall;
type TIDirect3DDevice9_DrawPrimitive_Original=function(const self: IDirect3DDevice9;PrimitiveType : TD3DPrimitiveType; const StartVertex, PrimitiveCount : Cardinal) : HResult; stdcall;
type TIDirect3DDevice9_DrawIndexedPrimitive_Original=function(const self: IDirect3DDevice9;_Type : TD3DPrimitiveType; const BaseVertexIndex : Integer; const MinVertexIndex, NumVertices, StartIndex, PrimCount : Cardinal) : HResult; stdcall;
type TIDirect3DDevice9_DrawPrimitiveUP_Original=function(const self: IDirect3DDevice9;PrimitiveType : TD3DPrimitiveType; const PrimitiveCount : Cardinal; VertexStreamZeroData : Pointer; const VertexStreamZeroStride : Cardinal) : HResult; stdcall;
type TIDirect3DDevice9_DrawIndexedPrimitiveUP_Original=function(const self: IDirect3DDevice9;PrimitiveType : TD3DPrimitiveType; const MinVertexIndex, NumVertices, PrimitiveCount : Cardinal; IndexData : Pointer; IndexDataFormat : TD3DFormat; VertexStreamZeroData : Pointer; const VertexStreamZeroStride : Cardinal) : HResult; stdcall;

type TIDirect3DTexture9_Release_Original=function(const self: IDirect3DTexture9): integer; stdcall;



var Direct3DCreate9:TDirect3DCreate9;
    Direct3DCreate9Info: TAPIInfo;

    IDirect3D9_CreateDevice:TAPIInfo;

    //IDirect3DDevice8 method hooks
    IDirect3DDevice9_Reset: TApiInfo;
    IDirect3DDevice9_CreateTexture: TApiInfo;
    IDirect3DDevice9_BeginScene: TApiInfo;
    IDirect3DDevice9_EndScene: TApiInfo;
    IDirect3DDevice9_SetTransform: TApiInfo;
    IDirect3DDevice9_GetTransform: TApiInfo;
    IDirect3DDevice9_SetRenderState: TApiInfo;
    IDirect3DDevice9_SetTexture: TAPIInfo;
    IDirect3DDevice9_DrawPrimitive: TAPIInfo;
    IDirect3DDevice9_DrawIndexedPrimitive: TAPIInfo;
    IDirect3DDevice9_DrawPrimitiveUP:TAPIInfo;
    IDirect3DDevice9_DrawIndexedPrimitiveUP: TApiinfo;

    IDirect3DTexture9_Release: TAPIInfo;


    d3d9dll: THandle;

procedure handlekeypresses;
procedure LoadLockedTextureInfo9(aimconfigfile:string);
procedure SaveLockedTextureInfo9(aimconfigfile: string);
procedure SaveAllTextures9;


function Direct3DCreate9Hook(SDKVersion: DWORD): PIDirect3D9; stdcall;
function IDirect3D9_CreateDevice_Hook(const self: IDirect3D9; const Adapter : Cardinal; const DeviceType : TD3DDevType; FocusWindow : HWND; BehaviorFlags : LongWord; var PresentationParameters : TD3DPresentParameters; out ReturnedDeviceInterface : IDirect3DDevice9) : HResult; stdcall;

function IDirect3DDevice9_Reset_Hook(const self: IDirect3DDevice9 ;var PresentationParameters : TD3DPresentParameters) : HResult; stdcall;
function IDirect3DDevice9_CreateTexture_Hook(const self: IDirect3DDevice9 ;const Width, Height, Levels : Cardinal; const Usage : LongWord; Format : TD3DFormat; Pool : TD3DPool; out Texture : IDirect3DTexture9; SharedHandle : PHandle) : HResult; stdcall;
function IDirect3DDevice9_BeginScene_Hook(const self: IDirect3DDevice9): HResult; stdcall;
function IDirect3DDevice9_EndScene_Hook(const self: IDirect3DDevice9): HResult; stdcall;
function IDirect3DDevice9_SetTransform_Hook(const self: IDirect3DDevice9; State : TD3DTransformStateType; const Matrix : TD3DMatrix) : HResult; stdcall;
function IDirect3DDevice9_GetTransform_Hook(const self: IDirect3DDevice9; State : TD3DTransformStateType; out Matrix : TD3DMatrix) : HResult; stdcall;
function IDirect3DDevice9_SetRenderState_Hook(const self: IDirect3DDevice9; State : TD3DRenderStateType; const Value : LongWord) : HResult; stdcall;
function IDirect3DDevice9_SetTexture_Hook(const self: IDirect3DDevice9; const Stage : LongWord; Texture : IDirect3DBaseTexture9) : HResult; stdcall;
function IDirect3DDevice9_DrawPrimitive_Hook(const self: IDirect3DDevice9;PrimitiveType : TD3DPrimitiveType; const StartVertex, PrimitiveCount : Cardinal) : HResult; stdcall;
function IDirect3DDevice9_DrawIndexedPrimitive_Hook(const self: IDirect3DDevice9;_Type : TD3DPrimitiveType; const BaseVertexIndex : Integer; const MinVertexIndex, NumVertices, StartIndex, PrimCount : Cardinal) : HResult; stdcall;
function IDirect3DDevice9_DrawPrimitiveUP_Hook(const self: IDirect3DDevice9;PrimitiveType : TD3DPrimitiveType; const PrimitiveCount : Cardinal; VertexStreamZeroData : Pointer; const VertexStreamZeroStride : Cardinal) : HResult; stdcall;
function IDirect3DDevice9_DrawIndexedPrimitiveUP_Hook(const self: IDirect3DDevice9;PrimitiveType : TD3DPrimitiveType; const MinVertexIndex, NumVertices, PrimitiveCount : Cardinal; IndexData : Pointer; IndexDataFormat : TD3DFormat; VertexStreamZeroData : Pointer; const VertexStreamZeroStride : Cardinal) : HResult; stdcall;

function IDirect3DTexture9_Release_Hook(const self: IDirect3DTexture9): integer; stdcall;

var //variables for the directx9 hook
    cefont: ID3dXFont;
    mysprite: ID3DXSprite;
    myspritetexture: IDirect3DTexture9;
    targettexture: IDirect3DTexture9;
    locktexture: IDirect3DTexture9;
    movementtexture: IDirect3DTexture9;

    lockedstringtexture: IDirect3dTexture9;
    unlockedStringTexture: IDirect3dTexture9;
    textureStringTexture: IDirect3DTexture9;
    blacktexture: IDirect3DTexture9;


    dontsetlastviewmatrix:  boolean;
    dontsetlastworldmatrix: boolean;
    dontsetlastprojectionmatrix: boolean;
    lastviewmatrix:  TD3DMatrix;
    lastworldmatrix: TD3DMatrix;
    lastprojectionmatrix:  TD3DMatrix;
    lastprojectionmatrix2: TD3DMatrix;
    viewmatrixset:  boolean;
    worldmatrixset: boolean;
    projectionmatrixset: boolean;

    lockedtexturelist: array of TTextureInfo;
    texturelist: array of TTextureInfo;
    xylist: array of td3dxvector3;

    oldpos: td3dxvector3;
    newtick: int64;
    tickssincelastdraw: dword;
    mssincelastdraw: double;

    watchfornextdraw: boolean;
    CurrentTexture: integer;
    nextdrawstage: dword;

    resetdevice: boolean;

implementation

procedure SaveAllTextures9;
var i: integer;
begin
  for i:=0 to length(texturelist)-1 do
    D3DXSaveTextureToFile(pchar('CETEX'+IntToStr(i)+'.bmp'),D3DXIFF_BMP,texturelist[i].texturehandle,nil);
end;


procedure handlekeypresses;
var found: boolean;
    i,j: integer;
begin
  if keys.callibrationmode then
  begin
    try
      if checkkeycombo(keys.previoustexture) then if (texturepointer-1)<0 then texturepointer:=length(texturelist)-1 else dec(texturepointer);
      if checkkeycombo(keys.nexttexture) then if (texturepointer+1)>=length(texturelist) then texturepointer:=0 else inc(texturepointer);
      if checkkeycombo(keys.locktexture) then  //(un)lock
      begin
        found:=false;
        for i:=0 to length(lockedtexturelist)-1 do
        begin
          if dword(lockedtexturelist[i].texturehandle)=dword(texturelist[texturepointer].texturehandle) then
          begin
            j:=i;
            found:=true;
            break;
          end;
        end;

        if found then
        begin
          lockedtexturelist[i].texturehandle._Release;
          for i:=j to length(lockedtexturelist)-2 do
          begin
            lockedtexturelist[i].Width:=lockedtexturelist[i+1].Width;
            lockedtexturelist[i].Height:=lockedtexturelist[i+1].Height;
            lockedtexturelist[i].Levels:=lockedtexturelist[i+1].Levels;
            lockedtexturelist[i].Usage:=lockedtexturelist[i+1].Usage;
            lockedtexturelist[i].Format:=lockedtexturelist[i+1].Format;
            lockedtexturelist[i].Pool:=lockedtexturelist[i+1].Pool;
            lockedtexturelist[i].locked:=lockedtexturelist[i+1].locked;
            lockedtexturelist[i].xdelta:=lockedtexturelist[i+1].xdelta;
            lockedtexturelist[i].ydelta:=lockedtexturelist[i+1].ydelta;
            lockedtexturelist[i].zdelta:=lockedtexturelist[i+1].zdelta;
            copymemory(@lockedtexturelist[i].texturehandle,@lockedtexturelist[i+1].texturehandle,4);
          end;
          fillmemory(@lockedtexturelist[length(lockedtexturelist)-1].texturehandle,4,0);


          setlength(lockedtexturelist,length(lockedtexturelist)-1);

          texturelist[texturepointer].locked:=false;
        end
        else
        begin
          i:=length(lockedtexturelist);
          setlength(lockedtexturelist,i+1);

          lockedtexturelist[i].Width:=texturelist[texturepointer].Width;
          lockedtexturelist[i].Height:=texturelist[texturepointer].Height;
          lockedtexturelist[i].Levels:=texturelist[texturepointer].Levels;
          lockedtexturelist[i].Usage:=texturelist[texturepointer].Usage;
          lockedtexturelist[i].Format:=texturelist[texturepointer].Format;
          lockedtexturelist[i].Pool:=texturelist[texturepointer].Pool;
          lockedtexturelist[i].locked:=texturelist[texturepointer].locked;
          lockedtexturelist[i].xdelta:=texturelist[texturepointer].xdelta;
          lockedtexturelist[i].ydelta:=texturelist[texturepointer].ydelta;
          lockedtexturelist[i].zdelta:=texturelist[texturepointer].zdelta;
          copymemory(@lockedtexturelist[i].texturehandle,@texturelist[texturepointer].texturehandle,4);

          lockedtexturelist[i].texturehandle._AddRef;

          lockedtexturelist[i].locked:=true;

          texturelist[texturepointer].locked:=true;
        end;
      end;


      if (texturepointer<>-1) and (texturelist[texturepointer].locked) then
      begin
        if checkkeycombo(keys.IncreaseX) then
          for i:=0 to length(lockedtexturelist)-1 do
            if lockedtexturelist[i].texturehandle=texturelist[texturepointer].texturehandle then
            begin
              lockedtexturelist[i].xdelta:=lockedtexturelist[i].xdelta+1;
              texturelist[texturepointer].xdelta:=texturelist[texturepointer].xdelta+1;
              break;
            end;


        if checkkeycombo(keys.Increasey) then
          for i:=0 to length(lockedtexturelist)-1 do
            if lockedtexturelist[i].texturehandle=texturelist[texturepointer].texturehandle then
            begin
              lockedtexturelist[i].ydelta:=lockedtexturelist[i].ydelta+1;
              texturelist[texturepointer].ydelta:=texturelist[texturepointer].ydelta+1;
              break;
            end;

        if checkkeycombo(keys.Increasez) then
          for i:=0 to length(lockedtexturelist)-1 do
            if lockedtexturelist[i].texturehandle=texturelist[texturepointer].texturehandle then
            begin
              lockedtexturelist[i].zdelta:=lockedtexturelist[i].zdelta+1;
              texturelist[texturepointer].zdelta:=texturelist[texturepointer].zdelta+1;
              break;
            end;

        if checkkeycombo(keys.DecreaseX) then
          for i:=0 to length(lockedtexturelist)-1 do
            if lockedtexturelist[i].texturehandle=texturelist[texturepointer].texturehandle then
            begin
              lockedtexturelist[i].xdelta:=lockedtexturelist[i].xdelta-1;
              texturelist[texturepointer].xdelta:=texturelist[texturepointer].xdelta-1;
              break;
            end;

        if checkkeycombo(keys.Decreasey) then
          for i:=0 to length(lockedtexturelist)-1 do
            if lockedtexturelist[i].texturehandle=texturelist[texturepointer].texturehandle then
            begin
              lockedtexturelist[i].ydelta:=lockedtexturelist[i].ydelta-1;
              texturelist[texturepointer].ydelta:=texturelist[texturepointer].ydelta-1;
              break;
            end;

        if checkkeycombo(keys.Decreasez) then
          for i:=0 to length(lockedtexturelist)-1 do
            if lockedtexturelist[i].texturehandle=texturelist[texturepointer].texturehandle then
            begin
              lockedtexturelist[i].zdelta:=lockedtexturelist[i].zdelta-1;
              texturelist[texturepointer].zdelta:=texturelist[texturepointer].zdelta-1;
              break;
            end;

      end;
    except

    end;
  end;
end;


procedure SaveLockedTextureInfo9(aimconfigfile: string);
var i,j,k: integer;
    tr: TD3DLocked_Rect;
    aimsettings: tfilestream;
    lr:TD3DLocked_Rect;
    bts: array of byte;
    s: string;

    total: dword;
    pdesc: td3dsurface_desc;
    bug: boolean;
    temp: array of byte;
begin
  try
    aimsettings:=tfilestream.Create((keys.cedir+aimconfigfile+'.cta'),fmCreate);
    try
      total:=length(lockedtexturelist);
      aimsettings.WriteBuffer(total,4);
      for i:=0 to length(lockedtexturelist)-1 do
      begin
        //save the levels
        aimsettings.WriteBuffer(lockedtexturelist[i],sizeof(TTextureInfo));

        try
          if lockedtexturelist[i].texturehandle.LockRect(0,tr,nil,D3DLOCK_NOSYSLOCK)=0 then
          begin

            try
              lockedtexturelist[i].texturehandle.GetLevelDesc(0,pdesc);

//              s:='Width='+IntToStr(lockedtexturelist[i].Width)+' Height='+IntToStr(lockedtexturelist[i].Height)+' pitch='+IntToStr(tr.Pitch)+' format='+IntToStr(lockedtexturelist[i].Format)+' levels='+inttostr(lockedtexturelist[i].Levels);
              total:=pdesc.width*pdesc.Height; //sigh...
              total:=total div 4;

              setlength(temp,total);
              bug:=true;
              while bug do
              begin
                try
                  copymemory(@temp[0],tr.Bits,total);
                  bug:=false;
                except
                  on e: exception do
                  begin
                    total:=total div 2;
                    setlength(temp,total);
                    if total=0 then bug:=false; //bah
                  end;
                end;
              end;

              aimsettings.WriteBuffer(total,4);
              aimsettings.WriteBuffer(temp[0],total);
            finally
              lockedtexturelist[i].texturehandle.UnlockRect(0);
            end;
          end;
        except
          //something went wrong, but try to not screw up
          total:=0;
          aimsettings.WriteBuffer(total,4);
        end;
      end;
    finally

⌨️ 快捷键说明

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