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