From 2101fc28f32f8e3a03cd93bd563e6b24cf32931c Mon Sep 17 00:00:00 2001 From: momo5502 Date: Tue, 12 Jan 2016 00:48:27 +0100 Subject: [PATCH] D3D9Ex. --- src/Components/Loader.cpp | 1 + src/Components/Loader.hpp | 1 + src/Components/Modules/D3D9Ex.cpp | 815 ++++++++++++++++++++++++++++++ src/Components/Modules/D3D9Ex.hpp | 177 +++++++ src/Components/Modules/News.cpp | 8 +- src/STDInclude.hpp | 2 + src/Utils/WebIO.cpp | 29 +- src/Utils/WebIO.hpp | 4 + 8 files changed, 1029 insertions(+), 8 deletions(-) create mode 100644 src/Components/Modules/D3D9Ex.cpp create mode 100644 src/Components/Modules/D3D9Ex.hpp diff --git a/src/Components/Loader.cpp b/src/Components/Loader.cpp index 2594a5b0..cb6664f5 100644 --- a/src/Components/Loader.cpp +++ b/src/Components/Loader.cpp @@ -15,6 +15,7 @@ namespace Components Loader::Register(new Menus()); Loader::Register(new Party()); Loader::Register(new Colors()); + Loader::Register(new D3D9Ex()); Loader::Register(new Logger()); Loader::Register(new Window()); Loader::Register(new Command()); diff --git a/src/Components/Loader.hpp b/src/Components/Loader.hpp index 3facb3a0..46151646 100644 --- a/src/Components/Loader.hpp +++ b/src/Components/Loader.hpp @@ -26,6 +26,7 @@ namespace Components #include "Modules\Flags.hpp" #include "Modules\Menus.hpp" #include "Modules\Colors.hpp" +#include "Modules\D3D9Ex.hpp" #include "Modules\Logger.hpp" #include "Modules\Window.hpp" #include "Modules\Command.hpp" diff --git a/src/Components/Modules/D3D9Ex.cpp b/src/Components/Modules/D3D9Ex.cpp new file mode 100644 index 00000000..c32d8714 --- /dev/null +++ b/src/Components/Modules/D3D9Ex.cpp @@ -0,0 +1,815 @@ +#include "STDInclude.hpp" + +namespace Components +{ + + myIDirect3DDevice9::myIDirect3DDevice9(IDirect3DDevice9* pOriginal) + { + m_pIDirect3DDevice9 = pOriginal; // store the pointer to original object + } + + myIDirect3DDevice9::~myIDirect3DDevice9(void) + { + } + + HRESULT myIDirect3DDevice9::QueryInterface(REFIID riid, void** ppvObj) + { + // check if original dll can provide interface. then send *our* address + *ppvObj = NULL; + + HRESULT hRes = m_pIDirect3DDevice9->QueryInterface(riid, ppvObj); + + if (hRes == NOERROR) + { + *ppvObj = this; + } + + return hRes; + } + + ULONG myIDirect3DDevice9::AddRef(void) + { + return(m_pIDirect3DDevice9->AddRef()); + } + + ULONG myIDirect3DDevice9::Release(void) + { + // ATTENTION: This is a booby-trap ! Watch out ! + // If we create our own sprites, surfaces, etc. (thus increasing the ref counter + // by external action), we need to delete that objects before calling the original + // Release function + + // release/delete own objects + // ..... + + // Calling original function now + ULONG count = m_pIDirect3DDevice9->Release(); + + // now, the Original Object has deleted itself, so do we here + delete(this); // destructor will be called automatically + + return (count); + } + + HRESULT myIDirect3DDevice9::TestCooperativeLevel(void) + { + return(m_pIDirect3DDevice9->TestCooperativeLevel()); + } + + UINT myIDirect3DDevice9::GetAvailableTextureMem(void) + { + return(m_pIDirect3DDevice9->GetAvailableTextureMem()); + } + + HRESULT myIDirect3DDevice9::EvictManagedResources(void) + { + return(m_pIDirect3DDevice9->EvictManagedResources()); + } + + HRESULT myIDirect3DDevice9::GetDirect3D(IDirect3D9** ppD3D9) + { + return(m_pIDirect3DDevice9->GetDirect3D(ppD3D9)); + } + + HRESULT myIDirect3DDevice9::GetDeviceCaps(D3DCAPS9* pCaps) + { + return(m_pIDirect3DDevice9->GetDeviceCaps(pCaps)); + } + + HRESULT myIDirect3DDevice9::GetDisplayMode(UINT iSwapChain, D3DDISPLAYMODE* pMode) + { + return(m_pIDirect3DDevice9->GetDisplayMode(iSwapChain, pMode)); + } + + HRESULT myIDirect3DDevice9::GetCreationParameters(D3DDEVICE_CREATION_PARAMETERS *pParameters) + { + return(m_pIDirect3DDevice9->GetCreationParameters(pParameters)); + } + + HRESULT myIDirect3DDevice9::SetCursorProperties(UINT XHotSpot, UINT YHotSpot, IDirect3DSurface9* pCursorBitmap) + { + return(m_pIDirect3DDevice9->SetCursorProperties(XHotSpot, YHotSpot, pCursorBitmap)); + } + + void myIDirect3DDevice9::SetCursorPosition(int X, int Y, DWORD Flags) + { + return(m_pIDirect3DDevice9->SetCursorPosition(X, Y, Flags)); + } + + BOOL myIDirect3DDevice9::ShowCursor(BOOL bShow) + { + return(m_pIDirect3DDevice9->ShowCursor(bShow)); + } + + HRESULT myIDirect3DDevice9::CreateAdditionalSwapChain(D3DPRESENT_PARAMETERS* pPresentationParameters, IDirect3DSwapChain9** pSwapChain) + { + return(m_pIDirect3DDevice9->CreateAdditionalSwapChain(pPresentationParameters, pSwapChain)); + } + + HRESULT myIDirect3DDevice9::GetSwapChain(UINT iSwapChain, IDirect3DSwapChain9** pSwapChain) + { + return(m_pIDirect3DDevice9->GetSwapChain(iSwapChain, pSwapChain)); + } + + UINT myIDirect3DDevice9::GetNumberOfSwapChains(void) + { + return(m_pIDirect3DDevice9->GetNumberOfSwapChains()); + } + + HRESULT myIDirect3DDevice9::Reset(D3DPRESENT_PARAMETERS* pPresentationParameters) + { + return m_pIDirect3DDevice9->Reset(pPresentationParameters); + } + + HRESULT myIDirect3DDevice9::Present(CONST RECT* pSourceRect, CONST RECT* pDestRect, HWND hDestWindowOverride, CONST RGNDATA* pDirtyRegion) + { + return m_pIDirect3DDevice9->Present(pSourceRect, pDestRect, hDestWindowOverride, pDirtyRegion); + } + + HRESULT myIDirect3DDevice9::GetBackBuffer(UINT iSwapChain, UINT iBackBuffer, D3DBACKBUFFER_TYPE Type, IDirect3DSurface9** ppBackBuffer) + { + return(m_pIDirect3DDevice9->GetBackBuffer(iSwapChain, iBackBuffer, Type, ppBackBuffer)); + } + + HRESULT myIDirect3DDevice9::GetRasterStatus(UINT iSwapChain, D3DRASTER_STATUS* pRasterStatus) + { + return(m_pIDirect3DDevice9->GetRasterStatus(iSwapChain, pRasterStatus)); + } + + HRESULT myIDirect3DDevice9::SetDialogBoxMode(BOOL bEnableDialogs) + { + return(m_pIDirect3DDevice9->SetDialogBoxMode(bEnableDialogs)); + } + + void myIDirect3DDevice9::SetGammaRamp(UINT iSwapChain, DWORD Flags, CONST D3DGAMMARAMP* pRamp) + { + return(m_pIDirect3DDevice9->SetGammaRamp(iSwapChain, Flags, pRamp)); + } + + void myIDirect3DDevice9::GetGammaRamp(UINT iSwapChain, D3DGAMMARAMP* pRamp) + { + return(m_pIDirect3DDevice9->GetGammaRamp(iSwapChain, pRamp)); + } + + HRESULT myIDirect3DDevice9::CreateTexture(UINT Width, UINT Height, UINT Levels, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DTexture9** ppTexture, HANDLE* pSharedHandle) + { + if (Pool == D3DPOOL_MANAGED) { Pool = D3DPOOL_DEFAULT; Usage |= D3DUSAGE_DYNAMIC; } + + return(m_pIDirect3DDevice9->CreateTexture(Width, Height, Levels, Usage, Format, Pool, ppTexture, pSharedHandle)); + } + + HRESULT myIDirect3DDevice9::CreateVolumeTexture(UINT Width, UINT Height, UINT Depth, UINT Levels, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DVolumeTexture9** ppVolumeTexture, HANDLE* pSharedHandle) + { + if (Pool == D3DPOOL_MANAGED) { Pool = D3DPOOL_DEFAULT; Usage |= D3DUSAGE_DYNAMIC; } + + return(m_pIDirect3DDevice9->CreateVolumeTexture(Width, Height, Depth, Levels, Usage, Format, Pool, ppVolumeTexture, pSharedHandle)); + } + + HRESULT myIDirect3DDevice9::CreateCubeTexture(UINT EdgeLength, UINT Levels, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DCubeTexture9** ppCubeTexture, HANDLE* pSharedHandle) + { + if (Pool == D3DPOOL_MANAGED) { Pool = D3DPOOL_DEFAULT; Usage |= D3DUSAGE_DYNAMIC; } + + return(m_pIDirect3DDevice9->CreateCubeTexture(EdgeLength, Levels, Usage, Format, Pool, ppCubeTexture, pSharedHandle)); + } + + HRESULT myIDirect3DDevice9::CreateVertexBuffer(UINT Length, DWORD Usage, DWORD FVF, D3DPOOL Pool, IDirect3DVertexBuffer9** ppVertexBuffer, HANDLE* pSharedHandle) + { + if (Pool == D3DPOOL_MANAGED) { Pool = D3DPOOL_DEFAULT; Usage |= D3DUSAGE_DYNAMIC; } + + return(m_pIDirect3DDevice9->CreateVertexBuffer(Length, Usage, FVF, Pool, ppVertexBuffer, pSharedHandle)); + } + + HRESULT myIDirect3DDevice9::CreateIndexBuffer(UINT Length, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DIndexBuffer9** ppIndexBuffer, HANDLE* pSharedHandle) + { + if (Pool == D3DPOOL_MANAGED) { Pool = D3DPOOL_DEFAULT; Usage |= D3DUSAGE_DYNAMIC; } + + return(m_pIDirect3DDevice9->CreateIndexBuffer(Length, Usage, Format, Pool, ppIndexBuffer, pSharedHandle)); + } + + HRESULT myIDirect3DDevice9::CreateRenderTarget(UINT Width, UINT Height, D3DFORMAT Format, D3DMULTISAMPLE_TYPE MultiSample, DWORD MultisampleQuality, BOOL Lockable, IDirect3DSurface9** ppSurface, HANDLE* pSharedHandle) + { + return(m_pIDirect3DDevice9->CreateRenderTarget(Width, Height, Format, MultiSample, MultisampleQuality, Lockable, ppSurface, pSharedHandle)); + } + + HRESULT myIDirect3DDevice9::CreateDepthStencilSurface(UINT Width, UINT Height, D3DFORMAT Format, D3DMULTISAMPLE_TYPE MultiSample, DWORD MultisampleQuality, BOOL Discard, IDirect3DSurface9** ppSurface, HANDLE* pSharedHandle) + { + return(m_pIDirect3DDevice9->CreateDepthStencilSurface(Width, Height, Format, MultiSample, MultisampleQuality, Discard, ppSurface, pSharedHandle)); + } + + HRESULT myIDirect3DDevice9::UpdateSurface(IDirect3DSurface9* pSourceSurface, CONST RECT* pSourceRect, IDirect3DSurface9* pDestinationSurface, CONST POINT* pDestPoint) + { + return(m_pIDirect3DDevice9->UpdateSurface(pSourceSurface, pSourceRect, pDestinationSurface, pDestPoint)); + } + + HRESULT myIDirect3DDevice9::UpdateTexture(IDirect3DBaseTexture9* pSourceTexture, IDirect3DBaseTexture9* pDestinationTexture) + { + return(m_pIDirect3DDevice9->UpdateTexture(pSourceTexture, pDestinationTexture)); + } + + HRESULT myIDirect3DDevice9::GetRenderTargetData(IDirect3DSurface9* pRenderTarget, IDirect3DSurface9* pDestSurface) + { + return(m_pIDirect3DDevice9->GetRenderTargetData(pRenderTarget, pDestSurface)); + } + + HRESULT myIDirect3DDevice9::GetFrontBufferData(UINT iSwapChain, IDirect3DSurface9* pDestSurface) + { + return(m_pIDirect3DDevice9->GetFrontBufferData(iSwapChain, pDestSurface)); + } + + HRESULT myIDirect3DDevice9::StretchRect(IDirect3DSurface9* pSourceSurface, CONST RECT* pSourceRect, IDirect3DSurface9* pDestSurface, CONST RECT* pDestRect, D3DTEXTUREFILTERTYPE Filter) + { + return(m_pIDirect3DDevice9->StretchRect(pSourceSurface, pSourceRect, pDestSurface, pDestRect, Filter)); + } + + HRESULT myIDirect3DDevice9::ColorFill(IDirect3DSurface9* pSurface, CONST RECT* pRect, D3DCOLOR color) + { + return(m_pIDirect3DDevice9->ColorFill(pSurface, pRect, color)); + } + + HRESULT myIDirect3DDevice9::CreateOffscreenPlainSurface(UINT Width, UINT Height, D3DFORMAT Format, D3DPOOL Pool, IDirect3DSurface9** ppSurface, HANDLE* pSharedHandle) + { + if (Pool == D3DPOOL_MANAGED) { Pool = D3DPOOL_DEFAULT; } + + return(m_pIDirect3DDevice9->CreateOffscreenPlainSurface(Width, Height, Format, Pool, ppSurface, pSharedHandle)); + } + + HRESULT myIDirect3DDevice9::SetRenderTarget(DWORD RenderTargetIndex, IDirect3DSurface9* pRenderTarget) + { + return m_pIDirect3DDevice9->SetRenderTarget(RenderTargetIndex, pRenderTarget); + } + + HRESULT myIDirect3DDevice9::GetRenderTarget(DWORD RenderTargetIndex, IDirect3DSurface9** ppRenderTarget) + { + return(m_pIDirect3DDevice9->GetRenderTarget(RenderTargetIndex, ppRenderTarget)); + } + + HRESULT myIDirect3DDevice9::SetDepthStencilSurface(IDirect3DSurface9* pNewZStencil) + { + return(m_pIDirect3DDevice9->SetDepthStencilSurface(pNewZStencil)); + } + + HRESULT myIDirect3DDevice9::GetDepthStencilSurface(IDirect3DSurface9** ppZStencilSurface) + { + return(m_pIDirect3DDevice9->GetDepthStencilSurface(ppZStencilSurface)); + } + + HRESULT myIDirect3DDevice9::BeginScene(void) + { + return m_pIDirect3DDevice9->BeginScene(); + } + + HRESULT myIDirect3DDevice9::EndScene(void) + { + return m_pIDirect3DDevice9->EndScene(); + } + + HRESULT myIDirect3DDevice9::Clear(DWORD Count, CONST D3DRECT* pRects, DWORD Flags, D3DCOLOR Color, float Z, DWORD Stencil) + { + return(m_pIDirect3DDevice9->Clear(Count, pRects, Flags, Color, Z, Stencil)); + } + + HRESULT myIDirect3DDevice9::SetTransform(D3DTRANSFORMSTATETYPE State, CONST D3DMATRIX* pMatrix) + { + return(m_pIDirect3DDevice9->SetTransform(State, pMatrix)); + } + + HRESULT myIDirect3DDevice9::GetTransform(D3DTRANSFORMSTATETYPE State, D3DMATRIX* pMatrix) + { + return(m_pIDirect3DDevice9->GetTransform(State, pMatrix)); + } + + HRESULT myIDirect3DDevice9::MultiplyTransform(D3DTRANSFORMSTATETYPE State, CONST D3DMATRIX* pMatrix) + { + return(m_pIDirect3DDevice9->MultiplyTransform(State, pMatrix)); + } + + HRESULT myIDirect3DDevice9::SetViewport(CONST D3DVIEWPORT9* pViewport) + { + return(m_pIDirect3DDevice9->SetViewport(pViewport)); + } + + HRESULT myIDirect3DDevice9::GetViewport(D3DVIEWPORT9* pViewport) + { + return(m_pIDirect3DDevice9->GetViewport(pViewport)); + } + + HRESULT myIDirect3DDevice9::SetMaterial(CONST D3DMATERIAL9* pMaterial) + { + return(m_pIDirect3DDevice9->SetMaterial(pMaterial)); + } + + HRESULT myIDirect3DDevice9::GetMaterial(D3DMATERIAL9* pMaterial) + { + return(m_pIDirect3DDevice9->GetMaterial(pMaterial)); + } + + HRESULT myIDirect3DDevice9::SetLight(DWORD Index, CONST D3DLIGHT9* pLight) + { + return(m_pIDirect3DDevice9->SetLight(Index, pLight)); + } + + HRESULT myIDirect3DDevice9::GetLight(DWORD Index, D3DLIGHT9* pLight) + { + return(m_pIDirect3DDevice9->GetLight(Index, pLight)); + } + + HRESULT myIDirect3DDevice9::LightEnable(DWORD Index, BOOL Enable) + { + return(m_pIDirect3DDevice9->LightEnable(Index, Enable)); + } + + HRESULT myIDirect3DDevice9::GetLightEnable(DWORD Index, BOOL* pEnable) + { + return(m_pIDirect3DDevice9->GetLightEnable(Index, pEnable)); + } + + HRESULT myIDirect3DDevice9::SetClipPlane(DWORD Index, CONST float* pPlane) + { + return(m_pIDirect3DDevice9->SetClipPlane(Index, pPlane)); + } + + HRESULT myIDirect3DDevice9::GetClipPlane(DWORD Index, float* pPlane) + { + return(m_pIDirect3DDevice9->GetClipPlane(Index, pPlane)); + } + + HRESULT myIDirect3DDevice9::SetRenderState(D3DRENDERSTATETYPE State, DWORD Value) + { + return(m_pIDirect3DDevice9->SetRenderState(State, Value)); + } + + HRESULT myIDirect3DDevice9::GetRenderState(D3DRENDERSTATETYPE State, DWORD* pValue) + { + return(m_pIDirect3DDevice9->GetRenderState(State, pValue)); + } + + HRESULT myIDirect3DDevice9::CreateStateBlock(D3DSTATEBLOCKTYPE Type, IDirect3DStateBlock9** ppSB) + { + return(m_pIDirect3DDevice9->CreateStateBlock(Type, ppSB)); + } + + HRESULT myIDirect3DDevice9::BeginStateBlock(void) + { + return(m_pIDirect3DDevice9->BeginStateBlock()); + } + + HRESULT myIDirect3DDevice9::EndStateBlock(IDirect3DStateBlock9** ppSB) + { + return(m_pIDirect3DDevice9->EndStateBlock(ppSB)); + } + + HRESULT myIDirect3DDevice9::SetClipStatus(CONST D3DCLIPSTATUS9* pClipStatus) + { + return(m_pIDirect3DDevice9->SetClipStatus(pClipStatus)); + } + + HRESULT myIDirect3DDevice9::GetClipStatus(D3DCLIPSTATUS9* pClipStatus) + { + return(m_pIDirect3DDevice9->GetClipStatus(pClipStatus)); + } + + HRESULT myIDirect3DDevice9::GetTexture(DWORD Stage, IDirect3DBaseTexture9** ppTexture) + { + return(m_pIDirect3DDevice9->GetTexture(Stage, ppTexture)); + } + + HRESULT myIDirect3DDevice9::SetTexture(DWORD Stage, IDirect3DBaseTexture9* pTexture) + { + return(m_pIDirect3DDevice9->SetTexture(Stage, pTexture)); + } + + HRESULT myIDirect3DDevice9::GetTextureStageState(DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, DWORD* pValue) + { + return(m_pIDirect3DDevice9->GetTextureStageState(Stage, Type, pValue)); + } + + HRESULT myIDirect3DDevice9::SetTextureStageState(DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, DWORD Value) + { + return(m_pIDirect3DDevice9->SetTextureStageState(Stage, Type, Value)); + } + + HRESULT myIDirect3DDevice9::GetSamplerState(DWORD Sampler, D3DSAMPLERSTATETYPE Type, DWORD* pValue) + { + return(m_pIDirect3DDevice9->GetSamplerState(Sampler, Type, pValue)); + } + + HRESULT myIDirect3DDevice9::SetSamplerState(DWORD Sampler, D3DSAMPLERSTATETYPE Type, DWORD Value) + { + return(m_pIDirect3DDevice9->SetSamplerState(Sampler, Type, Value)); + } + + HRESULT myIDirect3DDevice9::ValidateDevice(DWORD* pNumPasses) + { + return(m_pIDirect3DDevice9->ValidateDevice(pNumPasses)); + } + + HRESULT myIDirect3DDevice9::SetPaletteEntries(UINT PaletteNumber, CONST PALETTEENTRY* pEntries) + { + return(m_pIDirect3DDevice9->SetPaletteEntries(PaletteNumber, pEntries)); + } + + HRESULT myIDirect3DDevice9::GetPaletteEntries(UINT PaletteNumber, PALETTEENTRY* pEntries) + { + return(m_pIDirect3DDevice9->GetPaletteEntries(PaletteNumber, pEntries)); + } + + HRESULT myIDirect3DDevice9::SetCurrentTexturePalette(UINT PaletteNumber) + { + return(m_pIDirect3DDevice9->SetCurrentTexturePalette(PaletteNumber)); + } + + HRESULT myIDirect3DDevice9::GetCurrentTexturePalette(UINT *PaletteNumber) + { + return(m_pIDirect3DDevice9->GetCurrentTexturePalette(PaletteNumber)); + } + + HRESULT myIDirect3DDevice9::SetScissorRect(CONST RECT* pRect) + { + return(m_pIDirect3DDevice9->SetScissorRect(pRect)); + } + + HRESULT myIDirect3DDevice9::GetScissorRect(RECT* pRect) + { + return(m_pIDirect3DDevice9->GetScissorRect(pRect)); + } + + HRESULT myIDirect3DDevice9::SetSoftwareVertexProcessing(BOOL bSoftware) + { + return(m_pIDirect3DDevice9->SetSoftwareVertexProcessing(bSoftware)); + } + + BOOL myIDirect3DDevice9::GetSoftwareVertexProcessing(void) + { + return(m_pIDirect3DDevice9->GetSoftwareVertexProcessing()); + } + + HRESULT myIDirect3DDevice9::SetNPatchMode(float nSegments) + { + return(m_pIDirect3DDevice9->SetNPatchMode(nSegments)); + } + + float myIDirect3DDevice9::GetNPatchMode(void) + { + return(m_pIDirect3DDevice9->GetNPatchMode()); + } + + HRESULT myIDirect3DDevice9::DrawPrimitive(D3DPRIMITIVETYPE PrimitiveType, UINT StartVertex, UINT PrimitiveCount) + { + return(m_pIDirect3DDevice9->DrawPrimitive(PrimitiveType, StartVertex, PrimitiveCount)); + } + + HRESULT myIDirect3DDevice9::DrawIndexedPrimitive(D3DPRIMITIVETYPE PrimitiveType, INT BaseVertexIndex, UINT MinVertexIndex, UINT NumVertices, UINT startIndex, UINT primCount) + { + return(m_pIDirect3DDevice9->DrawIndexedPrimitive(PrimitiveType, BaseVertexIndex, MinVertexIndex, NumVertices, startIndex, primCount)); + } + + HRESULT myIDirect3DDevice9::DrawPrimitiveUP(D3DPRIMITIVETYPE PrimitiveType, UINT PrimitiveCount, CONST void* pVertexStreamZeroData, UINT VertexStreamZeroStride) + { + return(m_pIDirect3DDevice9->DrawPrimitiveUP(PrimitiveType, PrimitiveCount, pVertexStreamZeroData, VertexStreamZeroStride)); + } + + HRESULT myIDirect3DDevice9::DrawIndexedPrimitiveUP(D3DPRIMITIVETYPE PrimitiveType, UINT MinVertexIndex, UINT NumVertices, UINT PrimitiveCount, CONST void* pIndexData, D3DFORMAT IndexDataFormat, CONST void* pVertexStreamZeroData, UINT VertexStreamZeroStride) + { + return(m_pIDirect3DDevice9->DrawIndexedPrimitiveUP(PrimitiveType, MinVertexIndex, NumVertices, PrimitiveCount, pIndexData, IndexDataFormat, pVertexStreamZeroData, VertexStreamZeroStride)); + } + + HRESULT myIDirect3DDevice9::ProcessVertices(UINT SrcStartIndex, UINT DestIndex, UINT VertexCount, IDirect3DVertexBuffer9* pDestBuffer, IDirect3DVertexDeclaration9* pVertexDecl, DWORD Flags) + { + return(m_pIDirect3DDevice9->ProcessVertices(SrcStartIndex, DestIndex, VertexCount, pDestBuffer, pVertexDecl, Flags)); + } + + HRESULT myIDirect3DDevice9::CreateVertexDeclaration(CONST D3DVERTEXELEMENT9* pVertexElements, IDirect3DVertexDeclaration9** ppDecl) + { + return(m_pIDirect3DDevice9->CreateVertexDeclaration(pVertexElements, ppDecl)); + } + + HRESULT myIDirect3DDevice9::SetVertexDeclaration(IDirect3DVertexDeclaration9* pDecl) + { + return(m_pIDirect3DDevice9->SetVertexDeclaration(pDecl)); + } + + HRESULT myIDirect3DDevice9::GetVertexDeclaration(IDirect3DVertexDeclaration9** ppDecl) + { + return(m_pIDirect3DDevice9->GetVertexDeclaration(ppDecl)); + } + + HRESULT myIDirect3DDevice9::SetFVF(DWORD FVF) + { + return(m_pIDirect3DDevice9->SetFVF(FVF)); + } + + HRESULT myIDirect3DDevice9::GetFVF(DWORD* pFVF) + { + return(m_pIDirect3DDevice9->GetFVF(pFVF)); + } + + HRESULT myIDirect3DDevice9::CreateVertexShader(CONST DWORD* pFunction, IDirect3DVertexShader9** ppShader) + { + return(m_pIDirect3DDevice9->CreateVertexShader(pFunction, ppShader)); + } + + HRESULT myIDirect3DDevice9::SetVertexShader(IDirect3DVertexShader9* pShader) + { + return(m_pIDirect3DDevice9->SetVertexShader(pShader)); + } + + HRESULT myIDirect3DDevice9::GetVertexShader(IDirect3DVertexShader9** ppShader) + { + return(m_pIDirect3DDevice9->GetVertexShader(ppShader)); + } + + HRESULT myIDirect3DDevice9::SetVertexShaderConstantF(UINT StartRegister, CONST float* pConstantData, UINT Vector4fCount) + { + return(m_pIDirect3DDevice9->SetVertexShaderConstantF(StartRegister, pConstantData, Vector4fCount)); + } + + HRESULT myIDirect3DDevice9::GetVertexShaderConstantF(UINT StartRegister, float* pConstantData, UINT Vector4fCount) + { + return(m_pIDirect3DDevice9->GetVertexShaderConstantF(StartRegister, pConstantData, Vector4fCount)); + } + + HRESULT myIDirect3DDevice9::SetVertexShaderConstantI(UINT StartRegister, CONST int* pConstantData, UINT Vector4iCount) + { + return(m_pIDirect3DDevice9->SetVertexShaderConstantI(StartRegister, pConstantData, Vector4iCount)); + } + + HRESULT myIDirect3DDevice9::GetVertexShaderConstantI(UINT StartRegister, int* pConstantData, UINT Vector4iCount) + { + return(m_pIDirect3DDevice9->GetVertexShaderConstantI(StartRegister, pConstantData, Vector4iCount)); + } + + HRESULT myIDirect3DDevice9::SetVertexShaderConstantB(UINT StartRegister, CONST BOOL* pConstantData, UINT BoolCount) + { + return(m_pIDirect3DDevice9->SetVertexShaderConstantB(StartRegister, pConstantData, BoolCount)); + } + + HRESULT myIDirect3DDevice9::GetVertexShaderConstantB(UINT StartRegister, BOOL* pConstantData, UINT BoolCount) + { + return(m_pIDirect3DDevice9->GetVertexShaderConstantB(StartRegister, pConstantData, BoolCount)); + } + + HRESULT myIDirect3DDevice9::SetStreamSource(UINT StreamNumber, IDirect3DVertexBuffer9* pStreamData, UINT OffsetInBytes, UINT Stride) + { + return(m_pIDirect3DDevice9->SetStreamSource(StreamNumber, pStreamData, OffsetInBytes, Stride)); + } + + HRESULT myIDirect3DDevice9::GetStreamSource(UINT StreamNumber, IDirect3DVertexBuffer9** ppStreamData, UINT* OffsetInBytes, UINT* pStride) + { + return(m_pIDirect3DDevice9->GetStreamSource(StreamNumber, ppStreamData, OffsetInBytes, pStride)); + } + + HRESULT myIDirect3DDevice9::SetStreamSourceFreq(UINT StreamNumber, UINT Divider) + { + return(m_pIDirect3DDevice9->SetStreamSourceFreq(StreamNumber, Divider)); + } + + HRESULT myIDirect3DDevice9::GetStreamSourceFreq(UINT StreamNumber, UINT* Divider) + { + return(m_pIDirect3DDevice9->GetStreamSourceFreq(StreamNumber, Divider)); + } + + HRESULT myIDirect3DDevice9::SetIndices(IDirect3DIndexBuffer9* pIndexData) + { + return(m_pIDirect3DDevice9->SetIndices(pIndexData)); + } + + HRESULT myIDirect3DDevice9::GetIndices(IDirect3DIndexBuffer9** ppIndexData) + { + return(m_pIDirect3DDevice9->GetIndices(ppIndexData)); + } + + HRESULT myIDirect3DDevice9::CreatePixelShader(CONST DWORD* pFunction, IDirect3DPixelShader9** ppShader) + { + return(m_pIDirect3DDevice9->CreatePixelShader(pFunction, ppShader)); + } + + HRESULT myIDirect3DDevice9::SetPixelShader(IDirect3DPixelShader9* pShader) + { + return(m_pIDirect3DDevice9->SetPixelShader(pShader)); + } + + HRESULT myIDirect3DDevice9::GetPixelShader(IDirect3DPixelShader9** ppShader) + { + return(m_pIDirect3DDevice9->GetPixelShader(ppShader)); + } + + HRESULT myIDirect3DDevice9::SetPixelShaderConstantF(UINT StartRegister, CONST float* pConstantData, UINT Vector4fCount) + { + return(m_pIDirect3DDevice9->SetPixelShaderConstantF(StartRegister, pConstantData, Vector4fCount)); + } + + HRESULT myIDirect3DDevice9::GetPixelShaderConstantF(UINT StartRegister, float* pConstantData, UINT Vector4fCount) + { + return(m_pIDirect3DDevice9->GetPixelShaderConstantF(StartRegister, pConstantData, Vector4fCount)); + } + + HRESULT myIDirect3DDevice9::SetPixelShaderConstantI(UINT StartRegister, CONST int* pConstantData, UINT Vector4iCount) + { + return(m_pIDirect3DDevice9->SetPixelShaderConstantI(StartRegister, pConstantData, Vector4iCount)); + } + + HRESULT myIDirect3DDevice9::GetPixelShaderConstantI(UINT StartRegister, int* pConstantData, UINT Vector4iCount) + { + return(m_pIDirect3DDevice9->GetPixelShaderConstantI(StartRegister, pConstantData, Vector4iCount)); + } + + HRESULT myIDirect3DDevice9::SetPixelShaderConstantB(UINT StartRegister, CONST BOOL* pConstantData, UINT BoolCount) + { + return(m_pIDirect3DDevice9->SetPixelShaderConstantB(StartRegister, pConstantData, BoolCount)); + } + + HRESULT myIDirect3DDevice9::GetPixelShaderConstantB(UINT StartRegister, BOOL* pConstantData, UINT BoolCount) + { + return(m_pIDirect3DDevice9->GetPixelShaderConstantB(StartRegister, pConstantData, BoolCount)); + } + + HRESULT myIDirect3DDevice9::DrawRectPatch(UINT Handle, CONST float* pNumSegs, CONST D3DRECTPATCH_INFO* pRectPatchInfo) + { + return(m_pIDirect3DDevice9->DrawRectPatch(Handle, pNumSegs, pRectPatchInfo)); + } + + HRESULT myIDirect3DDevice9::DrawTriPatch(UINT Handle, CONST float* pNumSegs, CONST D3DTRIPATCH_INFO* pTriPatchInfo) + { + return(m_pIDirect3DDevice9->DrawTriPatch(Handle, pNumSegs, pTriPatchInfo)); + } + + HRESULT myIDirect3DDevice9::DeletePatch(UINT Handle) + { + return(m_pIDirect3DDevice9->DeletePatch(Handle)); + } + + HRESULT myIDirect3DDevice9::CreateQuery(D3DQUERYTYPE Type, IDirect3DQuery9** ppQuery) + { + return(m_pIDirect3DDevice9->CreateQuery(Type, ppQuery)); + } + + + + + + + + + + + + + + + + + + myIDirect3D9::myIDirect3D9(IDirect3D9Ex *pOriginal) + { + m_pIDirect3D9 = pOriginal; + } + + myIDirect3D9::~myIDirect3D9(void) + { + } + + HRESULT __stdcall myIDirect3D9::QueryInterface(REFIID riid, void** ppvObj) + { + *ppvObj = NULL; + + // call this to increase AddRef at original object + // and to check if such an interface is there + + HRESULT hRes = m_pIDirect3D9->QueryInterface(riid, ppvObj); + + if (hRes == NOERROR) // if OK, send our "fake" address + { + *ppvObj = this; + } + + return hRes; + } + + ULONG __stdcall myIDirect3D9::AddRef(void) + { + return(m_pIDirect3D9->AddRef()); + } + + ULONG __stdcall myIDirect3D9::Release(void) + { + // call original routine + ULONG count = m_pIDirect3D9->Release(); + + // in case no further Ref is there, the Original Object has deleted itself + // so do we here + if (count == 0) + { + delete(this); + } + + return(count); + } + + HRESULT __stdcall myIDirect3D9::RegisterSoftwareDevice(void* pInitializeFunction) + { + return(m_pIDirect3D9->RegisterSoftwareDevice(pInitializeFunction)); + } + + UINT __stdcall myIDirect3D9::GetAdapterCount(void) + { + return(m_pIDirect3D9->GetAdapterCount()); + } + + HRESULT __stdcall myIDirect3D9::GetAdapterIdentifier(UINT Adapter, DWORD Flags, D3DADAPTER_IDENTIFIER9* pIdentifier) + { + return(m_pIDirect3D9->GetAdapterIdentifier(Adapter, Flags, pIdentifier)); + } + + UINT __stdcall myIDirect3D9::GetAdapterModeCount(UINT Adapter, D3DFORMAT Format) + { + return(m_pIDirect3D9->GetAdapterModeCount(Adapter, Format)); + } + + HRESULT __stdcall myIDirect3D9::EnumAdapterModes(UINT Adapter, D3DFORMAT Format, UINT Mode, D3DDISPLAYMODE* pMode) + { + return(m_pIDirect3D9->EnumAdapterModes(Adapter, Format, Mode, pMode)); + } + + HRESULT __stdcall myIDirect3D9::GetAdapterDisplayMode(UINT Adapter, D3DDISPLAYMODE* pMode) + { + return(m_pIDirect3D9->GetAdapterDisplayMode(Adapter, pMode)); + } + + HRESULT __stdcall myIDirect3D9::CheckDeviceType(UINT iAdapter, D3DDEVTYPE DevType, D3DFORMAT DisplayFormat, D3DFORMAT BackBufferFormat, BOOL bWindowed) + { + return(m_pIDirect3D9->CheckDeviceType(iAdapter, DevType, DisplayFormat, BackBufferFormat, bWindowed)); + } + + HRESULT __stdcall myIDirect3D9::CheckDeviceFormat(UINT Adapter, D3DDEVTYPE DeviceType, D3DFORMAT AdapterFormat, DWORD Usage, D3DRESOURCETYPE RType, D3DFORMAT CheckFormat) + { + return(m_pIDirect3D9->CheckDeviceFormat(Adapter, DeviceType, AdapterFormat, Usage, RType, CheckFormat)); + } + + HRESULT __stdcall myIDirect3D9::CheckDeviceMultiSampleType(UINT Adapter, D3DDEVTYPE DeviceType, D3DFORMAT SurfaceFormat, BOOL Windowed, D3DMULTISAMPLE_TYPE MultiSampleType, DWORD* pQualityLevels) + { + return(m_pIDirect3D9->CheckDeviceMultiSampleType(Adapter, DeviceType, SurfaceFormat, Windowed, MultiSampleType, pQualityLevels)); + } + + HRESULT __stdcall myIDirect3D9::CheckDepthStencilMatch(UINT Adapter, D3DDEVTYPE DeviceType, D3DFORMAT AdapterFormat, D3DFORMAT RenderTargetFormat, D3DFORMAT DepthStencilFormat) + { + return(m_pIDirect3D9->CheckDepthStencilMatch(Adapter, DeviceType, AdapterFormat, RenderTargetFormat, DepthStencilFormat)); + } + + HRESULT __stdcall myIDirect3D9::CheckDeviceFormatConversion(UINT Adapter, D3DDEVTYPE DeviceType, D3DFORMAT SourceFormat, D3DFORMAT TargetFormat) + { + return(m_pIDirect3D9->CheckDeviceFormatConversion(Adapter, DeviceType, SourceFormat, TargetFormat)); + } + + HRESULT __stdcall myIDirect3D9::GetDeviceCaps(UINT Adapter, D3DDEVTYPE DeviceType, D3DCAPS9* pCaps) + { + return(m_pIDirect3D9->GetDeviceCaps(Adapter, DeviceType, pCaps)); + } + + HMONITOR __stdcall myIDirect3D9::GetAdapterMonitor(UINT Adapter) + { + return(m_pIDirect3D9->GetAdapterMonitor(Adapter)); + } + + HRESULT __stdcall myIDirect3D9::CreateDevice(UINT Adapter, D3DDEVTYPE DeviceType, HWND hFocusWindow, DWORD BehaviorFlags, D3DPRESENT_PARAMETERS* pPresentationParameters, IDirect3DDevice9** ppReturnedDeviceInterface) + { + // global var + // we intercept this call and provide our own "fake" Device Object + IDirect3DDevice9* device; + HRESULT hres = m_pIDirect3D9->CreateDevice(Adapter, DeviceType, hFocusWindow, BehaviorFlags, pPresentationParameters, &device); + + // + // Create our own Device object and store it in global pointer + // note: the object will delete itself once Ref count is zero (similar to COM objects) + + // store our pointer (the fake one) for returning it to the calling progam + *ppReturnedDeviceInterface = new myIDirect3DDevice9(device); + + return(hres); + } + + IDirect3D9* __stdcall D3D9Ex::Direct3DCreate9Stub(UINT sdk) + { + if (Dvar::Var("r_useD3D9Ex").Get()) + { + IDirect3D9Ex* test; + Direct3DCreate9Ex(sdk, &test); + return new myIDirect3D9(test); + } + else + { + return Direct3DCreate9(sdk); + } + } + + D3D9Ex::D3D9Ex() + { + Dvar::Register("r_useD3D9Ex", true, Game::dvar_flag::DVAR_FLAG_SAVED/* | Game::dvar_flag::DVAR_FLAG_LATCHED*/, "Use extended d3d9 interface!"); + + Utils::Hook::Set(0x6D74D0, D3D9Ex::Direct3DCreate9Stub); + } + + D3D9Ex::~D3D9Ex() + { + + } +} diff --git a/src/Components/Modules/D3D9Ex.hpp b/src/Components/Modules/D3D9Ex.hpp new file mode 100644 index 00000000..2c63beca --- /dev/null +++ b/src/Components/Modules/D3D9Ex.hpp @@ -0,0 +1,177 @@ +namespace Components +{ + + class myIDirect3DDevice9 : public IDirect3DDevice9 + { + public: + myIDirect3DDevice9(IDirect3DDevice9* pOriginal); + virtual ~myIDirect3DDevice9(void); + + // START: The original DX9 function definitions + HRESULT __stdcall QueryInterface(REFIID riid, void** ppvObj); + ULONG __stdcall AddRef(void); + ULONG __stdcall Release(void); + HRESULT __stdcall TestCooperativeLevel(void); + UINT __stdcall GetAvailableTextureMem(void); + HRESULT __stdcall EvictManagedResources(void); + HRESULT __stdcall GetDirect3D(IDirect3D9** ppD3D9); + HRESULT __stdcall GetDeviceCaps(D3DCAPS9* pCaps); + HRESULT __stdcall GetDisplayMode(UINT iSwapChain, D3DDISPLAYMODE* pMode); + HRESULT __stdcall GetCreationParameters(D3DDEVICE_CREATION_PARAMETERS *pParameters); + HRESULT __stdcall SetCursorProperties(UINT XHotSpot, UINT YHotSpot, IDirect3DSurface9* pCursorBitmap); + void __stdcall SetCursorPosition(int X, int Y, DWORD Flags); + BOOL __stdcall ShowCursor(BOOL bShow); + HRESULT __stdcall CreateAdditionalSwapChain(D3DPRESENT_PARAMETERS* pPresentationParameters, IDirect3DSwapChain9** pSwapChain); + HRESULT __stdcall GetSwapChain(UINT iSwapChain, IDirect3DSwapChain9** pSwapChain); + UINT __stdcall GetNumberOfSwapChains(void); + HRESULT __stdcall Reset(D3DPRESENT_PARAMETERS* pPresentationParameters); + HRESULT __stdcall Present(CONST RECT* pSourceRect, CONST RECT* pDestRect, HWND hDestWindowOverride, CONST RGNDATA* pDirtyRegion); + HRESULT __stdcall GetBackBuffer(UINT iSwapChain, UINT iBackBuffer, D3DBACKBUFFER_TYPE Type, IDirect3DSurface9** ppBackBuffer); + HRESULT __stdcall GetRasterStatus(UINT iSwapChain, D3DRASTER_STATUS* pRasterStatus); + HRESULT __stdcall SetDialogBoxMode(BOOL bEnableDialogs); + void __stdcall SetGammaRamp(UINT iSwapChain, DWORD Flags, CONST D3DGAMMARAMP* pRamp); + void __stdcall GetGammaRamp(UINT iSwapChain, D3DGAMMARAMP* pRamp); + HRESULT __stdcall CreateTexture(UINT Width, UINT Height, UINT Levels, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DTexture9** ppTexture, HANDLE* pSharedHandle); + HRESULT __stdcall CreateVolumeTexture(UINT Width, UINT Height, UINT Depth, UINT Levels, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DVolumeTexture9** ppVolumeTexture, HANDLE* pSharedHandle); + HRESULT __stdcall CreateCubeTexture(UINT EdgeLength, UINT Levels, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DCubeTexture9** ppCubeTexture, HANDLE* pSharedHandle); + HRESULT __stdcall CreateVertexBuffer(UINT Length, DWORD Usage, DWORD FVF, D3DPOOL Pool, IDirect3DVertexBuffer9** ppVertexBuffer, HANDLE* pSharedHandle); + HRESULT __stdcall CreateIndexBuffer(UINT Length, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DIndexBuffer9** ppIndexBuffer, HANDLE* pSharedHandle); + HRESULT __stdcall CreateRenderTarget(UINT Width, UINT Height, D3DFORMAT Format, D3DMULTISAMPLE_TYPE MultiSample, DWORD MultisampleQuality, BOOL Lockable, IDirect3DSurface9** ppSurface, HANDLE* pSharedHandle); + HRESULT __stdcall CreateDepthStencilSurface(UINT Width, UINT Height, D3DFORMAT Format, D3DMULTISAMPLE_TYPE MultiSample, DWORD MultisampleQuality, BOOL Discard, IDirect3DSurface9** ppSurface, HANDLE* pSharedHandle); + HRESULT __stdcall UpdateSurface(IDirect3DSurface9* pSourceSurface, CONST RECT* pSourceRect, IDirect3DSurface9* pDestinationSurface, CONST POINT* pDestPoint); + HRESULT __stdcall UpdateTexture(IDirect3DBaseTexture9* pSourceTexture, IDirect3DBaseTexture9* pDestinationTexture); + HRESULT __stdcall GetRenderTargetData(IDirect3DSurface9* pRenderTarget, IDirect3DSurface9* pDestSurface); + HRESULT __stdcall GetFrontBufferData(UINT iSwapChain, IDirect3DSurface9* pDestSurface); + HRESULT __stdcall StretchRect(IDirect3DSurface9* pSourceSurface, CONST RECT* pSourceRect, IDirect3DSurface9* pDestSurface, CONST RECT* pDestRect, D3DTEXTUREFILTERTYPE Filter); + HRESULT __stdcall ColorFill(IDirect3DSurface9* pSurface, CONST RECT* pRect, D3DCOLOR color); + HRESULT __stdcall CreateOffscreenPlainSurface(UINT Width, UINT Height, D3DFORMAT Format, D3DPOOL Pool, IDirect3DSurface9** ppSurface, HANDLE* pSharedHandle); + HRESULT __stdcall SetRenderTarget(DWORD RenderTargetIndex, IDirect3DSurface9* pRenderTarget); + HRESULT __stdcall GetRenderTarget(DWORD RenderTargetIndex, IDirect3DSurface9** ppRenderTarget); + HRESULT __stdcall SetDepthStencilSurface(IDirect3DSurface9* pNewZStencil); + HRESULT __stdcall GetDepthStencilSurface(IDirect3DSurface9** ppZStencilSurface); + HRESULT __stdcall BeginScene(void); + HRESULT __stdcall EndScene(void); + HRESULT __stdcall Clear(DWORD Count, CONST D3DRECT* pRects, DWORD Flags, D3DCOLOR Color, float Z, DWORD Stencil); + HRESULT __stdcall SetTransform(D3DTRANSFORMSTATETYPE State, CONST D3DMATRIX* pMatrix); + HRESULT __stdcall GetTransform(D3DTRANSFORMSTATETYPE State, D3DMATRIX* pMatrix); + HRESULT __stdcall MultiplyTransform(D3DTRANSFORMSTATETYPE State, CONST D3DMATRIX* pMatrix); + HRESULT __stdcall SetViewport(CONST D3DVIEWPORT9* pViewport); + HRESULT __stdcall GetViewport(D3DVIEWPORT9* pViewport); + HRESULT __stdcall SetMaterial(CONST D3DMATERIAL9* pMaterial); + HRESULT __stdcall GetMaterial(D3DMATERIAL9* pMaterial); + HRESULT __stdcall SetLight(DWORD Index, CONST D3DLIGHT9* pLight); + HRESULT __stdcall GetLight(DWORD Index, D3DLIGHT9* pLight); + HRESULT __stdcall LightEnable(DWORD Index, BOOL Enable); + HRESULT __stdcall GetLightEnable(DWORD Index, BOOL* pEnable); + HRESULT __stdcall SetClipPlane(DWORD Index, CONST float* pPlane); + HRESULT __stdcall GetClipPlane(DWORD Index, float* pPlane); + HRESULT __stdcall SetRenderState(D3DRENDERSTATETYPE State, DWORD Value); + HRESULT __stdcall GetRenderState(D3DRENDERSTATETYPE State, DWORD* pValue); + HRESULT __stdcall CreateStateBlock(D3DSTATEBLOCKTYPE Type, IDirect3DStateBlock9** ppSB); + HRESULT __stdcall BeginStateBlock(void); + HRESULT __stdcall EndStateBlock(IDirect3DStateBlock9** ppSB); + HRESULT __stdcall SetClipStatus(CONST D3DCLIPSTATUS9* pClipStatus); + HRESULT __stdcall GetClipStatus(D3DCLIPSTATUS9* pClipStatus); + HRESULT __stdcall GetTexture(DWORD Stage, IDirect3DBaseTexture9** ppTexture); + HRESULT __stdcall SetTexture(DWORD Stage, IDirect3DBaseTexture9* pTexture); + HRESULT __stdcall GetTextureStageState(DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, DWORD* pValue); + HRESULT __stdcall SetTextureStageState(DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, DWORD Value); + HRESULT __stdcall GetSamplerState(DWORD Sampler, D3DSAMPLERSTATETYPE Type, DWORD* pValue); + HRESULT __stdcall SetSamplerState(DWORD Sampler, D3DSAMPLERSTATETYPE Type, DWORD Value); + HRESULT __stdcall ValidateDevice(DWORD* pNumPasses); + HRESULT __stdcall SetPaletteEntries(UINT PaletteNumber, CONST PALETTEENTRY* pEntries); + HRESULT __stdcall GetPaletteEntries(UINT PaletteNumber, PALETTEENTRY* pEntries); + HRESULT __stdcall SetCurrentTexturePalette(UINT PaletteNumber); + HRESULT __stdcall GetCurrentTexturePalette(UINT *PaletteNumber); + HRESULT __stdcall SetScissorRect(CONST RECT* pRect); + HRESULT __stdcall GetScissorRect(RECT* pRect); + HRESULT __stdcall SetSoftwareVertexProcessing(BOOL bSoftware); + BOOL __stdcall GetSoftwareVertexProcessing(void); + HRESULT __stdcall SetNPatchMode(float nSegments); + float __stdcall GetNPatchMode(void); + HRESULT __stdcall DrawPrimitive(D3DPRIMITIVETYPE PrimitiveType, UINT StartVertex, UINT PrimitiveCount); + HRESULT __stdcall DrawIndexedPrimitive(D3DPRIMITIVETYPE PrimitiveType, INT BaseVertexIndex, UINT MinVertexIndex, UINT NumVertices, UINT startIndex, UINT primCount); + HRESULT __stdcall DrawPrimitiveUP(D3DPRIMITIVETYPE PrimitiveType, UINT PrimitiveCount, CONST void* pVertexStreamZeroData, UINT VertexStreamZeroStride); + HRESULT __stdcall DrawIndexedPrimitiveUP(D3DPRIMITIVETYPE PrimitiveType, UINT MinVertexIndex, UINT NumVertices, UINT PrimitiveCount, CONST void* pIndexData, D3DFORMAT IndexDataFormat, CONST void* pVertexStreamZeroData, UINT VertexStreamZeroStride); + HRESULT __stdcall ProcessVertices(UINT SrcStartIndex, UINT DestIndex, UINT VertexCount, IDirect3DVertexBuffer9* pDestBuffer, IDirect3DVertexDeclaration9* pVertexDecl, DWORD Flags); + HRESULT __stdcall CreateVertexDeclaration(CONST D3DVERTEXELEMENT9* pVertexElements, IDirect3DVertexDeclaration9** ppDecl); + HRESULT __stdcall SetVertexDeclaration(IDirect3DVertexDeclaration9* pDecl); + HRESULT __stdcall GetVertexDeclaration(IDirect3DVertexDeclaration9** ppDecl); + HRESULT __stdcall SetFVF(DWORD FVF); + HRESULT __stdcall GetFVF(DWORD* pFVF); + HRESULT __stdcall CreateVertexShader(CONST DWORD* pFunction, IDirect3DVertexShader9** ppShader); + HRESULT __stdcall SetVertexShader(IDirect3DVertexShader9* pShader); + HRESULT __stdcall GetVertexShader(IDirect3DVertexShader9** ppShader); + HRESULT __stdcall SetVertexShaderConstantF(UINT StartRegister, CONST float* pConstantData, UINT Vector4fCount); + HRESULT __stdcall GetVertexShaderConstantF(UINT StartRegister, float* pConstantData, UINT Vector4fCount); + HRESULT __stdcall SetVertexShaderConstantI(UINT StartRegister, CONST int* pConstantData, UINT Vector4iCount); + HRESULT __stdcall GetVertexShaderConstantI(UINT StartRegister, int* pConstantData, UINT Vector4iCount); + HRESULT __stdcall SetVertexShaderConstantB(UINT StartRegister, CONST BOOL* pConstantData, UINT BoolCount); + HRESULT __stdcall GetVertexShaderConstantB(UINT StartRegister, BOOL* pConstantData, UINT BoolCount); + HRESULT __stdcall SetStreamSource(UINT StreamNumber, IDirect3DVertexBuffer9* pStreamData, UINT OffsetInBytes, UINT Stride); + HRESULT __stdcall GetStreamSource(UINT StreamNumber, IDirect3DVertexBuffer9** ppStreamData, UINT* OffsetInBytes, UINT* pStride); + HRESULT __stdcall SetStreamSourceFreq(UINT StreamNumber, UINT Divider); + HRESULT __stdcall GetStreamSourceFreq(UINT StreamNumber, UINT* Divider); + HRESULT __stdcall SetIndices(IDirect3DIndexBuffer9* pIndexData); + HRESULT __stdcall GetIndices(IDirect3DIndexBuffer9** ppIndexData); + HRESULT __stdcall CreatePixelShader(CONST DWORD* pFunction, IDirect3DPixelShader9** ppShader); + HRESULT __stdcall SetPixelShader(IDirect3DPixelShader9* pShader); + HRESULT __stdcall GetPixelShader(IDirect3DPixelShader9** ppShader); + HRESULT __stdcall SetPixelShaderConstantF(UINT StartRegister, CONST float* pConstantData, UINT Vector4fCount); + HRESULT __stdcall GetPixelShaderConstantF(UINT StartRegister, float* pConstantData, UINT Vector4fCount); + HRESULT __stdcall SetPixelShaderConstantI(UINT StartRegister, CONST int* pConstantData, UINT Vector4iCount); + HRESULT __stdcall GetPixelShaderConstantI(UINT StartRegister, int* pConstantData, UINT Vector4iCount); + HRESULT __stdcall SetPixelShaderConstantB(UINT StartRegister, CONST BOOL* pConstantData, UINT BoolCount); + HRESULT __stdcall GetPixelShaderConstantB(UINT StartRegister, BOOL* pConstantData, UINT BoolCount); + HRESULT __stdcall DrawRectPatch(UINT Handle, CONST float* pNumSegs, CONST D3DRECTPATCH_INFO* pRectPatchInfo); + HRESULT __stdcall DrawTriPatch(UINT Handle, CONST float* pNumSegs, CONST D3DTRIPATCH_INFO* pTriPatchInfo); + HRESULT __stdcall DeletePatch(UINT Handle); + HRESULT __stdcall CreateQuery(D3DQUERYTYPE Type, IDirect3DQuery9** ppQuery); + // END: The original DX9 function definitions + + private: + IDirect3DDevice9 *m_pIDirect3DDevice9; + }; + + + class myIDirect3D9 : public IDirect3D9 + { + public: + myIDirect3D9(IDirect3D9Ex *pOriginal); + virtual ~myIDirect3D9(void); + + // The original DX9 function definitions + HRESULT __stdcall QueryInterface(REFIID riid, void** ppvObj); + ULONG __stdcall AddRef(void); + ULONG __stdcall Release(void); + HRESULT __stdcall RegisterSoftwareDevice(void* pInitializeFunction); + UINT __stdcall GetAdapterCount(void); + HRESULT __stdcall GetAdapterIdentifier(UINT Adapter, DWORD Flags, D3DADAPTER_IDENTIFIER9* pIdentifier); + UINT __stdcall GetAdapterModeCount(UINT Adapter, D3DFORMAT Format); + HRESULT __stdcall EnumAdapterModes(UINT Adapter, D3DFORMAT Format, UINT Mode, D3DDISPLAYMODE* pMode); + HRESULT __stdcall GetAdapterDisplayMode(UINT Adapter, D3DDISPLAYMODE* pMode); + HRESULT __stdcall CheckDeviceType(UINT iAdapter, D3DDEVTYPE DevType, D3DFORMAT DisplayFormat, D3DFORMAT BackBufferFormat, BOOL bWindowed); + HRESULT __stdcall CheckDeviceFormat(UINT Adapter, D3DDEVTYPE DeviceType, D3DFORMAT AdapterFormat, DWORD Usage, D3DRESOURCETYPE RType, D3DFORMAT CheckFormat); + HRESULT __stdcall CheckDeviceMultiSampleType(UINT Adapter, D3DDEVTYPE DeviceType, D3DFORMAT SurfaceFormat, BOOL Windowed, D3DMULTISAMPLE_TYPE MultiSampleType, DWORD* pQualityLevels); + HRESULT __stdcall CheckDepthStencilMatch(UINT Adapter, D3DDEVTYPE DeviceType, D3DFORMAT AdapterFormat, D3DFORMAT RenderTargetFormat, D3DFORMAT DepthStencilFormat); + HRESULT __stdcall CheckDeviceFormatConversion(UINT Adapter, D3DDEVTYPE DeviceType, D3DFORMAT SourceFormat, D3DFORMAT TargetFormat); + HRESULT __stdcall GetDeviceCaps(UINT Adapter, D3DDEVTYPE DeviceType, D3DCAPS9* pCaps); + HMONITOR __stdcall GetAdapterMonitor(UINT Adapter); + HRESULT __stdcall CreateDevice(UINT Adapter, D3DDEVTYPE DeviceType, HWND hFocusWindow, DWORD BehaviorFlags, D3DPRESENT_PARAMETERS* pPresentationParameters, IDirect3DDevice9** ppReturnedDeviceInterface); + // The original DX9 function definitions + + private: + IDirect3D9 *m_pIDirect3D9; + }; + + class D3D9Ex : public Component + { + public: + D3D9Ex(); + ~D3D9Ex(); + const char* GetName() { return "D3D9Ex"; }; + + private: + static IDirect3D9* __stdcall Direct3DCreate9Stub(UINT sdk); + }; +} diff --git a/src/Components/Modules/News.cpp b/src/Components/Modules/News.cpp index 460dc084..94349a71 100644 --- a/src/Components/Modules/News.cpp +++ b/src/Components/Modules/News.cpp @@ -11,14 +11,16 @@ namespace Components News::News() { - News::Motd = Utils::WebIO("IW4x", "http://localhost/iw4/motd.txt").Get(); - + Localization::Set("MPUI_CHANGELOG_TEXT", ""); + + News::Motd = Utils::WebIO("IW4x", "http://localhost/iw4/motd.txt").SetTimeout(1000)->Get(); + if (!News::Motd.size()) { News::Motd = "Welcome to ReactIW4x Multiplayer!"; } - Localization::Set("MPUI_CHANGELOG_TEXT", Utils::WebIO("IW4x", "http://localhost/iw4/changelog.txt").Get().data()); + Localization::Set("MPUI_CHANGELOG_TEXT", Utils::WebIO("IW4x", "http://localhost/iw4/changelog.txt").SetTimeout(1000)->Get().data()); // Patch motd setting Utils::Hook(0x60BF19, News::GetMotd, HOOK_CALL).Install()->Quick(); diff --git a/src/STDInclude.hpp b/src/STDInclude.hpp index b9897157..d19544f7 100644 --- a/src/STDInclude.hpp +++ b/src/STDInclude.hpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -54,6 +55,7 @@ #pragma comment(lib, "Winmm.lib") #pragma comment(lib, "Crypt32.lib") #pragma comment(lib, "Ws2_32.lib") +#pragma comment(lib, "d3d9.lib") // Revision number #define STRINGIZE_(x) #x diff --git a/src/Utils/WebIO.cpp b/src/Utils/WebIO.cpp index 9d36a6a2..a7576c57 100644 --- a/src/Utils/WebIO.cpp +++ b/src/Utils/WebIO.cpp @@ -9,7 +9,7 @@ namespace Utils WebIO::SetURL(url); } - WebIO::WebIO(std::string useragent) + WebIO::WebIO(std::string useragent) : m_timeout(5000) // 5 seconds timeout by default { WebIO::OpenSession(useragent); } @@ -187,24 +187,43 @@ namespace Utils const char* password = (WebIO::m_password.size() ? WebIO::m_password.c_str() : NULL); WebIO::m_hConnect = InternetConnect(WebIO::m_hSession, WebIO::m_sUrl.server.c_str(), wPort, username, password, dwService, dwFlag, 0); - return (WebIO::m_hConnect != INVALID_HANDLE_VALUE); + return (WebIO::m_hConnect && WebIO::m_hConnect != INVALID_HANDLE_VALUE); } void WebIO::CloseConnection() { - InternetCloseHandle(WebIO::m_hFile); - InternetCloseHandle(WebIO::m_hConnect); + if (WebIO::m_hFile && WebIO::m_hFile != INVALID_HANDLE_VALUE) InternetCloseHandle(WebIO::m_hFile); + if (WebIO::m_hConnect && WebIO::m_hConnect != INVALID_HANDLE_VALUE) InternetCloseHandle(WebIO::m_hConnect); + } + + WebIO* WebIO::SetTimeout(DWORD mseconds) + { + this->m_timeout = mseconds; + return this; } std::string WebIO::Execute(const char* command, std::string body) { - WebIO::OpenConnection(); + if (!WebIO::OpenConnection()) return ""; const char *acceptTypes[] = { "application/x-www-form-urlencoded", nullptr }; DWORD dwFlag = INTERNET_FLAG_RELOAD | (WebIO::IsSecuredConnection() ? INTERNET_FLAG_SECURE : 0); + + // This doesn't seem to actually do anything, half of those options don't even seem to be implemented. + // Good job microsoft... ( https://msdn.microsoft.com/en-us/library/windows/desktop/aa385328%28v=vs.85%29.aspx ) + //InternetSetOption(WebIO::m_hConnect, INTERNET_OPTION_CONNECT_TIMEOUT, &m_timeout, sizeof(m_timeout)); + //InternetSetOption(WebIO::m_hConnect, INTERNET_OPTION_RECEIVE_TIMEOUT, &m_timeout, sizeof(m_timeout)); + //InternetSetOption(WebIO::m_hConnect, INTERNET_OPTION_SEND_TIMEOUT, &m_timeout, sizeof(m_timeout)); + WebIO::m_hFile = HttpOpenRequest(WebIO::m_hConnect, command, WebIO::m_sUrl.document.c_str(), NULL, NULL, acceptTypes, dwFlag, 0); + if (!WebIO::m_hFile || WebIO::m_hFile == INVALID_HANDLE_VALUE) + { + WebIO::CloseConnection(); + return ""; + } + const char* headers = "Content-type: application/x-www-form-urlencoded"; HttpSendRequest(WebIO::m_hFile, headers, strlen(headers), (char*)body.c_str(), body.size() + 1); diff --git a/src/Utils/WebIO.hpp b/src/Utils/WebIO.hpp index 457dcc8e..07c5bed9 100644 --- a/src/Utils/WebIO.hpp +++ b/src/Utils/WebIO.hpp @@ -46,6 +46,8 @@ namespace Utils std::string Get(std::string url); std::string Get(); + WebIO* SetTimeout(DWORD mseconds); + // FTP bool Connect(); void Disconnect(); // Not necessary @@ -94,6 +96,8 @@ namespace Utils HINTERNET m_hConnect; HINTERNET m_hFile; + DWORD m_timeout; + std::string BuildPostBody(WebIO::Params params); bool IsSecuredConnection();