📄 directx9hook.pas
字号:
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 + -