[d3d11x] proper optional checks for some wrappers

[d3d11x] make sure QueryInterface calls aren't leaking PC pointers
[d3d11x] add debug logs for AddRef and Release in search of bad ref counting
[d3d11x] properly grab the shader slot from the PacketHeader
[d3d11x] properly unwrap Set calls
[d3d11x] properly wrap Get calls
[kernelx] remove debug logs
This commit is contained in:
Patoke
2025-01-09 06:54:10 -03:00
parent 2b852e8bf4
commit 175bb8a857
11 changed files with 253 additions and 85 deletions

View File

@@ -3,32 +3,33 @@
HRESULT d3d11x::ID3D11BufferWrapper::QueryInterface(REFIID riid, void** ppvObject)
{
// DEBUG
char iidstr[ sizeof("{AAAAAAAA-BBBB-CCCC-DDEE-FFGGHHIIJJKK}") ];
OLECHAR iidwstr[ sizeof(iidstr) ];
StringFromGUID2(riid, iidwstr, ARRAYSIZE(iidwstr));
WideCharToMultiByte(CP_UTF8, 0, iidwstr, -1, iidstr, sizeof(iidstr), nullptr, nullptr);
printf("[ID3D11BufferWrapper] QueryInterface: %s\n", iidstr);
if (riid == __uuidof(::ID3D11Buffer))
{
*ppvObject = this;
AddRef( );
return S_OK;
}
else
{
// DEBUG
char iidstr[ sizeof("{AAAAAAAA-BBBB-CCCC-DDEE-FFGGHHIIJJKK}") ];
OLECHAR iidwstr[ sizeof(iidstr) ];
StringFromGUID2(riid, iidwstr, ARRAYSIZE(iidwstr));
WideCharToMultiByte(CP_UTF8, 0, iidwstr, -1, iidstr, sizeof(iidstr), nullptr, nullptr);
printf("[IDXGIDeviceWrapper] QueryInterface: %s\n", iidstr);
}
return m_realBuffer->QueryInterface(riid, ppvObject);
*ppvObject = nullptr;
return E_NOINTERFACE;
}
ULONG d3d11x::ID3D11BufferWrapper::AddRef( )
{
printf("[ID3D11BufferWrapper] --> AddRef\n");
return InterlockedIncrement(&m_RefCount);
}
ULONG d3d11x::ID3D11BufferWrapper::Release( )
{
printf("[ID3D11BufferWrapper] --> Release\n");
ULONG refCount = InterlockedDecrement(&m_RefCount);
if (refCount == 0)
delete this;

View File

@@ -20,16 +20,19 @@ namespace d3d11x
return S_OK;
}
return m_realTexture->QueryInterface(riid, ppvObject);
*ppvObject = nullptr;
return E_NOINTERFACE;
}
ULONG ID3D11Texture1DWrapper::AddRef( )
{
printf("[ID3D11Texture1DWrapper] --> AddRef\n");
return InterlockedIncrement(&m_RefCount);
}
ULONG ID3D11Texture1DWrapper::Release( )
{
printf("[ID3D11Texture1DWrapper] --> AddRef\n");
ULONG refCount = InterlockedDecrement(&m_RefCount);
if (refCount == 0)
delete this;
@@ -107,16 +110,19 @@ namespace d3d11x
return S_OK;
}
return m_realTexture->QueryInterface(riid, ppvObject);
*ppvObject = nullptr;
return E_NOINTERFACE;
}
ULONG ID3D11Texture2DWrapper::AddRef( )
{
printf("[ID3D11Texture2DWrapper] --> AddRef\n");
return InterlockedIncrement(&m_RefCount);
}
ULONG ID3D11Texture2DWrapper::Release( )
{
printf("[ID3D11Texture2DWrapper] --> AddRef\n");
ULONG refCount = InterlockedDecrement(&m_RefCount);
if (refCount == 0)
delete this;
@@ -194,16 +200,19 @@ namespace d3d11x
return S_OK;
}
return m_realTexture->QueryInterface(riid, ppvObject);
*ppvObject = nullptr;
return E_NOINTERFACE;
}
ULONG ID3D11Texture3DWrapper::AddRef( )
{
printf("[ID3D11Texture3DWrapper] --> AddRef\n");
return InterlockedIncrement(&m_RefCount);
}
ULONG ID3D11Texture3DWrapper::Release( )
{
printf("[ID3D11Texture3DWrapper] --> AddRef\n");
ULONG refCount = InterlockedDecrement(&m_RefCount);
if (refCount == 0)
delete this;

View File

@@ -21,16 +21,19 @@ namespace d3d11x
printf("[IDXGIDeviceWrapper] QueryInterface: %s\n", iidstr);
return m_realTarget->QueryInterface(riid, ppvObject);
*ppvObject = nullptr;
return E_NOINTERFACE;
}
ULONG ID3D11RenderTargetViewWrapper::AddRef( )
{
printf("[ID3D11RenderTargetViewWrapper] --> AddRef\n");
return InterlockedIncrement(&m_RefCount);
}
ULONG ID3D11RenderTargetViewWrapper::Release( )
{
printf("[ID3D11RenderTargetViewWrapper] --> AddRef\n");
ULONG refCount = InterlockedDecrement(&m_RefCount);
if (refCount == 0)
delete this;
@@ -94,16 +97,19 @@ namespace d3d11x
WideCharToMultiByte(CP_UTF8, 0, iidwstr, -1, iidstr, sizeof(iidstr), nullptr, nullptr);
printf("[IDXGIDeviceWrapper] QueryInterface: %s\n", iidstr);
return m_realTarget->QueryInterface(riid, ppvObject);
*ppvObject = nullptr;
return E_NOINTERFACE;
}
ULONG ID3D11DepthStencilViewWrapper::AddRef( )
{
printf("[ID3D11DepthStencilViewWrapper] --> AddRef\n");
return InterlockedIncrement(&m_RefCount);
}
ULONG ID3D11DepthStencilViewWrapper::Release( )
{
printf("[ID3D11DepthStencilViewWrapper] --> AddRef\n");
ULONG refCount = InterlockedDecrement(&m_RefCount);
if (refCount == 0)
delete this;
@@ -167,16 +173,19 @@ namespace d3d11x
WideCharToMultiByte(CP_UTF8, 0, iidwstr, -1, iidstr, sizeof(iidstr), nullptr, nullptr);
printf("[IDXGIDeviceWrapper] QueryInterface: %s\n", iidstr);
return m_realTarget->QueryInterface(riid, ppvObject);
*ppvObject = nullptr;
return E_NOINTERFACE;
}
ULONG ID3D11ShaderResourceViewWrapper::AddRef( )
{
printf("[ID3D11ShaderResourceViewWrapper] --> AddRef\n");
return InterlockedIncrement(&m_RefCount);
}
ULONG ID3D11ShaderResourceViewWrapper::Release( )
{
printf("[ID3D11ShaderResourceViewWrapper] --> AddRef\n");
ULONG refCount = InterlockedDecrement(&m_RefCount);
if (refCount == 0)
delete this;
@@ -240,16 +249,19 @@ namespace d3d11x
WideCharToMultiByte(CP_UTF8, 0, iidwstr, -1, iidstr, sizeof(iidstr), nullptr, nullptr);
printf("[IDXGIDeviceWrapper] QueryInterface: %s\n", iidstr);
return m_realTarget->QueryInterface(riid, ppvObject);
*ppvObject = nullptr;
return E_NOINTERFACE;
}
ULONG ID3D11UnorderedAccessViewWrapper::AddRef( )
{
printf("[ID3D11UnorderedAccessViewWrapper] --> AddRef\n");
return InterlockedIncrement(&m_RefCount);
}
ULONG ID3D11UnorderedAccessViewWrapper::Release( )
{
printf("[ID3D11UnorderedAccessViewWrapper] --> AddRef\n");
ULONG refCount = InterlockedDecrement(&m_RefCount);
if (refCount == 0)
delete this;

View File

@@ -11,16 +11,19 @@ namespace d3d11x {
WideCharToMultiByte(CP_UTF8, 0, iidwstr, -1, iidstr, sizeof(iidstr), nullptr, nullptr);
printf("[ID3D11ResourceWrapperX] QueryInterface: %s\n", iidstr);
return m_realResource->QueryInterface(riid, ppvObject);
}
*ppvObject = nullptr;
return E_NOINTERFACE;
}
ULONG ID3D11ResourceWrapperX::AddRef( )
{
printf("[ID3D11ResourceWrapperX] --> AddRef\n");
return InterlockedIncrement(&m_RefCount);
}
ULONG ID3D11ResourceWrapperX::Release( )
{
printf("[ID3D11ResourceWrapperX] --> AddRef\n");
ULONG refCount = InterlockedDecrement(&m_RefCount);
if (refCount == 0)
delete this;

View File

@@ -341,7 +341,6 @@ namespace d3d11x
_In_range_(0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - StartSlot) UINT NumBuffers,
_In_reads_opt_(NumBuffers) ID3D11Buffer* const* ppConstantBuffers)
{
if (ppConstantBuffers != NULL)
{
ID3D11Buffer** modifiedBuffers = new ID3D11Buffer * [ NumBuffers ];
@@ -367,21 +366,19 @@ namespace d3d11x
return;
}
UINT slot = (PacketHeader - 0x6B40) >> 5;
UINT slot = ((PacketHeader & 0xFFFF) - 0x6B40) >> 5;
UINT NumViews = (PacketHeader >> 19) + 1;
// @Patoke todo
//if (NumViews <= 1)
//{
// return;
//}
if (ppShaderResourceViews != NULL)
{
ID3D11ShaderResourceView** modifiedViews = new ID3D11ShaderResourceView * [NumViews] {};
for (UINT i = 0; i < NumViews; ++i)
ID3D11ShaderResourceView** modifiedViews = new ID3D11ShaderResourceView * [NumViews] {0};
for (UINT i = 0; i < NumViews; i++)
{
modifiedViews[ i ] = reinterpret_cast<ID3D11ShaderResourceViewWrapper*>(ppShaderResourceViews[ i ])->m_realTarget;
if (ppShaderResourceViews[ i ] == nullptr)
modifiedViews[ i ] = nullptr;
else
modifiedViews[ i ] = reinterpret_cast<ID3D11ShaderResourceViewWrapper*>(ppShaderResourceViews[ i ])->m_realTarget;
}
m_realDeviceCtx->PSSetShaderResources(slot, NumViews, modifiedViews);
}
@@ -508,8 +505,21 @@ namespace d3d11x
virtual void STDMETHODCALLTYPE GSSetConstantBuffers(
_In_range_(0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - 1) UINT StartSlot,
_In_range_(0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - StartSlot) UINT NumBuffers,
_In_reads_opt_(NumBuffers) ID3D11Buffer* const* ppConstantBuffers) {
m_realDeviceCtx->GSSetConstantBuffers(StartSlot, NumBuffers, ppConstantBuffers);
_In_reads_opt_(NumBuffers) ID3D11Buffer* const* ppConstantBuffers)
{
if (ppConstantBuffers != NULL)
{
ID3D11Buffer** modifiedBuffers = new ID3D11Buffer * [ NumBuffers ];
for (UINT i = 0; i < NumBuffers; ++i)
{
modifiedBuffers[ i ] = reinterpret_cast<ID3D11BufferWrapper*>(ppConstantBuffers[ i ])->m_realBuffer;
}
m_realDeviceCtx->GSSetConstantBuffers(StartSlot, NumBuffers, modifiedBuffers);
}
else
{
m_realDeviceCtx->GSSetConstantBuffers(StartSlot, NumBuffers, ppConstantBuffers);
}
}
virtual void STDMETHODCALLTYPE GSSetShader(
@@ -530,15 +540,19 @@ namespace d3d11x
return;
}
UINT slot = (PacketHeader - 0x1D80) >> 5;
UINT slot = ((PacketHeader & 0xFFFF) - 0x1D80) >> 5;
UINT NumViews = (PacketHeader >> 19) + 1;
if (ppShaderResourceViews != NULL)
{
ID3D11ShaderResourceView** modifiedViews = new ID3D11ShaderResourceView * [ NumViews ];
for (UINT i = 0; i < NumViews; ++i)
ID3D11ShaderResourceView** modifiedViews = new ID3D11ShaderResourceView * [NumViews] {0};
for (UINT i = 0; i < NumViews; i++)
{
modifiedViews[ i ] = reinterpret_cast<ID3D11ShaderResourceViewWrapper*>(ppShaderResourceViews[ i ])->m_realTarget;
if (ppShaderResourceViews[ i ] == nullptr)
modifiedViews[ i ] = nullptr;
else
modifiedViews[ i ] = reinterpret_cast<ID3D11ShaderResourceViewWrapper*>(ppShaderResourceViews[ i ])->m_realTarget;
}
m_realDeviceCtx->VSSetShaderResources(slot, NumViews, modifiedViews);
}
@@ -589,15 +603,19 @@ namespace d3d11x
return;
}
UINT slot = (PacketHeader - 0x57D0) >> 5;
UINT slot = ((PacketHeader & 0xFFFF) - 0x57D0) >> 5;
UINT NumViews = (PacketHeader >> 19) + 1;
if (ppShaderResourceViews != NULL)
{
ID3D11ShaderResourceView** modifiedViews = new ID3D11ShaderResourceView * [ NumViews ];
for (UINT i = 0; i < NumViews; ++i)
ID3D11ShaderResourceView** modifiedViews = new ID3D11ShaderResourceView * [NumViews] {0};
for (UINT i = 0; i < NumViews; i++)
{
modifiedViews[ i ] = reinterpret_cast<ID3D11ShaderResourceViewWrapper*>(ppShaderResourceViews[ i ])->m_realTarget;
if (ppShaderResourceViews[ i ] == nullptr)
modifiedViews[ i ] = nullptr;
else
modifiedViews[ i ] = reinterpret_cast<ID3D11ShaderResourceViewWrapper*>(ppShaderResourceViews[ i ])->m_realTarget;
}
m_realDeviceCtx->GSSetShaderResources(slot, NumViews, modifiedViews);
}
@@ -625,10 +643,15 @@ namespace d3d11x
if (ppRenderTargetViews != NULL)
{
ID3D11RenderTargetView** modifiedViews = new ID3D11RenderTargetView * [ NumViews ];
for (UINT i = 0; i < NumViews; ++i)
ID3D11RenderTargetView** modifiedViews = new ID3D11RenderTargetView * [NumViews] {0};
UINT i = 0;
for (ID3D11RenderTargetView* view = *ppRenderTargetViews; view; view++, i++)
{
modifiedViews[ i ] = reinterpret_cast<ID3D11RenderTargetViewWrapper*>(ppRenderTargetViews[ i ])->m_realTarget;
if (i >= NumViews)
break;
modifiedViews[ i ] = reinterpret_cast<ID3D11RenderTargetViewWrapper*>(view)->m_realTarget;
}
m_realDeviceCtx->OMSetRenderTargets(NumViews, modifiedViews, depthStencilView);
}
@@ -636,8 +659,6 @@ namespace d3d11x
{
m_realDeviceCtx->OMSetRenderTargets(NumViews, ppRenderTargetViews, depthStencilView);
}
}
virtual void STDMETHODCALLTYPE OMSetRenderTargetsAndUnorderedAccessViews(
@@ -819,15 +840,19 @@ namespace d3d11x
return;
}
UINT slot = (PacketHeader - 0x30F0) >> 5;
UINT slot = ((PacketHeader & 0xFFFF) - 0x30F0) >> 5;
UINT NumViews = (PacketHeader >> 19) + 1;
if (ppShaderResourceViews != NULL)
{
ID3D11ShaderResourceView** modifiedViews = new ID3D11ShaderResourceView * [ NumViews ];
for (UINT i = 0; i < NumViews; ++i)
ID3D11ShaderResourceView** modifiedViews = new ID3D11ShaderResourceView * [NumViews] {0};
for (UINT i = 0; i < NumViews; i++)
{
modifiedViews[ i ] = reinterpret_cast<ID3D11ShaderResourceViewWrapper*>(ppShaderResourceViews[ i ])->m_realTarget;
if (ppShaderResourceViews[ i ] == nullptr)
modifiedViews[ i ] = nullptr;
else
modifiedViews[ i ] = reinterpret_cast<ID3D11ShaderResourceViewWrapper*>(ppShaderResourceViews[ i ])->m_realTarget;
}
m_realDeviceCtx->HSSetShaderResources(slot, NumViews, modifiedViews);
}
@@ -854,7 +879,8 @@ namespace d3d11x
virtual void STDMETHODCALLTYPE HSSetConstantBuffers(
_In_range_(0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - 1) UINT StartSlot,
_In_range_(0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - StartSlot) UINT NumBuffers,
_In_reads_opt_(NumBuffers) ID3D11Buffer* const* ppConstantBuffers) {
_In_reads_opt_(NumBuffers) ID3D11Buffer* const* ppConstantBuffers)
{
if (ppConstantBuffers != NULL)
{
ID3D11Buffer** modifiedBuffers = new ID3D11Buffer * [ NumBuffers ];
@@ -880,15 +906,19 @@ namespace d3d11x
return;
}
UINT slot = (PacketHeader - 0x4460) >> 5;
UINT slot = ((PacketHeader & 0xFFFF) - 0x4460) >> 5;
UINT NumViews = (PacketHeader >> 19) + 1;
if (ppShaderResourceViews != NULL)
{
ID3D11ShaderResourceView** modifiedViews = new ID3D11ShaderResourceView * [ NumViews ];
for (UINT i = 0; i < NumViews; ++i)
ID3D11ShaderResourceView** modifiedViews = new ID3D11ShaderResourceView * [NumViews] {0};
for (UINT i = 0; i < NumViews; i++)
{
modifiedViews[ i ] = reinterpret_cast<ID3D11ShaderResourceViewWrapper*>(ppShaderResourceViews[ i ])->m_realTarget;
if (ppShaderResourceViews[ i ] == nullptr)
modifiedViews[ i ] = nullptr;
else
modifiedViews[ i ] = reinterpret_cast<ID3D11ShaderResourceViewWrapper*>(ppShaderResourceViews[ i ])->m_realTarget;
}
m_realDeviceCtx->HSSetShaderResources(slot, NumViews, modifiedViews);
}
@@ -915,7 +945,8 @@ namespace d3d11x
virtual void STDMETHODCALLTYPE DSSetConstantBuffers(
_In_range_(0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - 1) UINT StartSlot,
_In_range_(0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - StartSlot) UINT NumBuffers,
_In_reads_opt_(NumBuffers) ID3D11Buffer* const* ppConstantBuffers) {
_In_reads_opt_(NumBuffers) ID3D11Buffer* const* ppConstantBuffers)
{
if (ppConstantBuffers != NULL)
{
ID3D11Buffer** modifiedBuffers = new ID3D11Buffer * [ NumBuffers ];
@@ -941,15 +972,19 @@ namespace d3d11x
return;
}
UINT slot = (PacketHeader - 0x140) >> 5;
UINT slot = ((PacketHeader & 0xFFFF) - 0x140) >> 5;
UINT NumViews = (PacketHeader >> 19) + 1;
if (ppShaderResourceViews != NULL)
{
ID3D11ShaderResourceView** modifiedViews = new ID3D11ShaderResourceView * [ NumViews ];
for (UINT i = 0; i < NumViews; ++i)
ID3D11ShaderResourceView** modifiedViews = new ID3D11ShaderResourceView * [NumViews] {0};
for (UINT i = 0; i < NumViews; i++)
{
modifiedViews[ i ] = reinterpret_cast<ID3D11ShaderResourceViewWrapper*>(ppShaderResourceViews[ i ])->m_realTarget;
if (ppShaderResourceViews[ i ] == nullptr)
modifiedViews[ i ] = nullptr;
else
modifiedViews[ i ] = reinterpret_cast<ID3D11ShaderResourceViewWrapper*>(ppShaderResourceViews[ i ])->m_realTarget;
}
m_realDeviceCtx->HSSetShaderResources(slot, NumViews, modifiedViews);
}
@@ -984,7 +1019,8 @@ namespace d3d11x
virtual void STDMETHODCALLTYPE CSSetConstantBuffers(
_In_range_(0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - 1) UINT StartSlot,
_In_range_(0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - StartSlot) UINT NumBuffers,
_In_reads_opt_(NumBuffers) ID3D11Buffer* const* ppConstantBuffers) {
_In_reads_opt_(NumBuffers) ID3D11Buffer* const* ppConstantBuffers)
{
if (ppConstantBuffers != NULL)
{
ID3D11Buffer** modifiedBuffers = new ID3D11Buffer * [ NumBuffers ];
@@ -1004,7 +1040,22 @@ namespace d3d11x
_In_range_(0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - 1) UINT StartSlot,
_In_range_(0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - StartSlot) UINT NumBuffers,
_Out_writes_opt_(NumBuffers) ID3D11Buffer** ppConstantBuffers) {
m_realDeviceCtx->VSGetConstantBuffers(StartSlot, NumBuffers, ppConstantBuffers);
if (ppConstantBuffers != NULL)
{
ID3D11Buffer** unwrappedBuffers = new ID3D11Buffer * [NumBuffers] {0};
m_realDeviceCtx->VSGetConstantBuffers(StartSlot, NumBuffers, unwrappedBuffers);
for (UINT i = 0; i < NumBuffers; ++i)
{
ppConstantBuffers[ i ] = reinterpret_cast<ID3D11Buffer*>(new ID3D11BufferWrapper(unwrappedBuffers[ i ]));
}
}
else
{
m_realDeviceCtx->VSGetConstantBuffers(StartSlot, NumBuffers, ppConstantBuffers);
}
}
virtual void STDMETHODCALLTYPE PSGetShaderResources(
@@ -1039,7 +1090,21 @@ namespace d3d11x
_In_range_(0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - 1) UINT StartSlot,
_In_range_(0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - StartSlot) UINT NumBuffers,
_Out_writes_opt_(NumBuffers) ID3D11Buffer** ppConstantBuffers) {
m_realDeviceCtx->PSGetConstantBuffers(StartSlot, NumBuffers, ppConstantBuffers);
if (ppConstantBuffers != NULL)
{
ID3D11Buffer** unwrappedBuffers = new ID3D11Buffer * [NumBuffers] {0};
m_realDeviceCtx->PSGetConstantBuffers(StartSlot, NumBuffers, unwrappedBuffers);
for (UINT i = 0; i < NumBuffers; ++i)
{
ppConstantBuffers[ i ] = reinterpret_cast<ID3D11Buffer*>(new ID3D11BufferWrapper(unwrappedBuffers[ i ]));
}
}
else
{
m_realDeviceCtx->PSGetConstantBuffers(StartSlot, NumBuffers, ppConstantBuffers);
}
}
virtual void STDMETHODCALLTYPE IAGetInputLayout(
@@ -1067,7 +1132,22 @@ namespace d3d11x
_In_range_(0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - 1) UINT StartSlot,
_In_range_(0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - StartSlot) UINT NumBuffers,
_Out_writes_opt_(NumBuffers) ID3D11Buffer** ppConstantBuffers) {
m_realDeviceCtx->GSGetConstantBuffers(StartSlot, NumBuffers, ppConstantBuffers);
if (ppConstantBuffers != NULL)
{
ID3D11Buffer** unwrappedBuffers = new ID3D11Buffer * [NumBuffers] {0};
m_realDeviceCtx->GSGetConstantBuffers(StartSlot, NumBuffers, unwrappedBuffers);
for (UINT i = 0; i < NumBuffers; ++i)
{
ppConstantBuffers[ i ] = reinterpret_cast<ID3D11Buffer*>(new ID3D11BufferWrapper(unwrappedBuffers[ i ]));
}
}
else
{
m_realDeviceCtx->GSGetConstantBuffers(StartSlot, NumBuffers, ppConstantBuffers);
}
}
virtual void STDMETHODCALLTYPE GSGetShader(
@@ -1125,7 +1205,7 @@ namespace d3d11x
::ID3D11RenderTargetView* target = nullptr;
m_realDeviceCtx->OMGetRenderTargets(NumViews, &target, ppDepthStencilView);
*ppRenderTargetViews = reinterpret_cast<ID3D11RenderTargetView_X*>(new ID3D11RenderTargetViewWrapper(target));
*ppRenderTargetViews = ppRenderTargetViews ? reinterpret_cast<ID3D11RenderTargetView_X*>(new ID3D11RenderTargetViewWrapper(target)) : nullptr;
}
@@ -1200,7 +1280,22 @@ namespace d3d11x
_In_range_(0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - 1) UINT StartSlot,
_In_range_(0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - StartSlot) UINT NumBuffers,
_Out_writes_opt_(NumBuffers) ID3D11Buffer** ppConstantBuffers) {
m_realDeviceCtx->HSGetConstantBuffers(StartSlot, NumBuffers, ppConstantBuffers);
if (ppConstantBuffers != NULL)
{
ID3D11Buffer** unwrappedBuffers = new ID3D11Buffer * [NumBuffers] {0};
m_realDeviceCtx->HSGetConstantBuffers(StartSlot, NumBuffers, unwrappedBuffers);
for (UINT i = 0; i < NumBuffers; ++i)
{
ppConstantBuffers[ i ] = reinterpret_cast<ID3D11Buffer*>(new ID3D11BufferWrapper(unwrappedBuffers[ i ]));
}
}
else
{
m_realDeviceCtx->HSGetConstantBuffers(StartSlot, NumBuffers, ppConstantBuffers);
}
}
virtual void STDMETHODCALLTYPE DSGetShaderResources(
@@ -1228,7 +1323,22 @@ namespace d3d11x
_In_range_(0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - 1) UINT StartSlot,
_In_range_(0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - StartSlot) UINT NumBuffers,
_Out_writes_opt_(NumBuffers) ID3D11Buffer** ppConstantBuffers) {
m_realDeviceCtx->DSGetConstantBuffers(StartSlot, NumBuffers, ppConstantBuffers);
if (ppConstantBuffers != NULL)
{
ID3D11Buffer** unwrappedBuffers = new ID3D11Buffer * [NumBuffers] {0};
m_realDeviceCtx->DSGetConstantBuffers(StartSlot, NumBuffers, unwrappedBuffers);
for (UINT i = 0; i < NumBuffers; ++i)
{
ppConstantBuffers[ i ] = reinterpret_cast<ID3D11Buffer*>(new ID3D11BufferWrapper(unwrappedBuffers[ i ]));
}
}
else
{
m_realDeviceCtx->DSGetConstantBuffers(StartSlot, NumBuffers, ppConstantBuffers);
}
}
virtual void STDMETHODCALLTYPE CSGetShaderResources(
@@ -1263,7 +1373,22 @@ namespace d3d11x
_In_range_(0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - 1) UINT StartSlot,
_In_range_(0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - StartSlot) UINT NumBuffers,
_Out_writes_opt_(NumBuffers) ID3D11Buffer** ppConstantBuffers) {
m_realDeviceCtx->CSGetConstantBuffers(StartSlot, NumBuffers, ppConstantBuffers);
if (ppConstantBuffers != NULL)
{
ID3D11Buffer** unwrappedBuffers = new ID3D11Buffer * [NumBuffers] {0};
m_realDeviceCtx->CSGetConstantBuffers(StartSlot, NumBuffers, unwrappedBuffers);
for (UINT i = 0; i < NumBuffers; ++i)
{
ppConstantBuffers[ i ] = reinterpret_cast<ID3D11Buffer*>(new ID3D11BufferWrapper(unwrappedBuffers[ i ]));
}
}
else
{
m_realDeviceCtx->CSGetConstantBuffers(StartSlot, NumBuffers, ppConstantBuffers);
}
}
virtual void STDMETHODCALLTYPE ClearState(void) {

View File

@@ -23,16 +23,19 @@ namespace d3d11x
WideCharToMultiByte(CP_UTF8, 0, iidwstr, -1, iidstr, sizeof(iidstr), nullptr, nullptr);
printf("[IDXGIDeviceWrapper] QueryInterface: %s\n", iidstr);
return m_realAdapter->QueryInterface(riid, ppvObject);
*ppvObject = nullptr;
return E_NOINTERFACE;
}
ULONG IDXGIAdapterWrapper::AddRef( )
{
printf("[IDXGIAdapterWrapper] --> AddRef\n");
return InterlockedIncrement(&m_RefCount);
}
ULONG IDXGIAdapterWrapper::Release( )
{
printf("[IDXGIAdapterWrapper] --> AddRef\n");
ULONG refCount = InterlockedDecrement(&m_RefCount);
if (refCount == 0)
delete this;

View File

@@ -20,7 +20,8 @@ namespace d3d11x
WideCharToMultiByte(CP_UTF8, 0, iidwstr, -1, iidstr, sizeof(iidstr), nullptr, nullptr);
printf("[IDXGIDeviceWrapper] QueryInterface: %s\n", iidstr);
return m_realDevice->QueryInterface(riid, ppvObject);
*ppvObject = nullptr;
return E_NOINTERFACE;
}
@@ -28,11 +29,13 @@ namespace d3d11x
ULONG IDXGIDeviceWrapper::AddRef( )
{
printf("[IDXGIDeviceWrapper] --> AddRef\n");
return InterlockedIncrement(&m_RefCount);
}
ULONG IDXGIDeviceWrapper::Release( )
{
printf("[IDXGIDeviceWrapper] --> AddRef\n");
ULONG refCount = InterlockedDecrement(&m_RefCount);
if (refCount == 0)
delete this;

View File

@@ -26,18 +26,21 @@ namespace d3d11x
printf("[IDXGIFactoryWrapper] QueryInterface: %s\n", iidstr);
return m_realFactory->QueryInterface(riid, ppvObject);
}
*ppvObject = nullptr;
return E_NOINTERFACE;
}
ULONG IDXGIFactoryWrapper::AddRef( )
{
printf("[IDXGIFactoryWrapper] --> AddRef\n");
return InterlockedIncrement(&m_RefCount);
}
ULONG IDXGIFactoryWrapper::Release( )
{
printf("[IDXGIFactoryWrapper] --> AddRef\n");
ULONG refCount = InterlockedDecrement(&m_RefCount);
if (refCount == 0)
delete this;

View File

@@ -21,17 +21,20 @@ namespace d3d11x
WideCharToMultiByte(CP_UTF8, 0, iidwstr, -1, iidstr, sizeof(iidstr), nullptr, nullptr);
printf("[IDXGIDeviceWrapper] QueryInterface: %s\n", iidstr);
return m_realSwapchain->QueryInterface(riid, ppvObject);
*ppvObject = nullptr;
return E_NOINTERFACE;
}
ULONG IDXGISwapChainWrapper::AddRef( )
{
printf("[IDXGISwapChainWrapper] --> AddRef\n");
return InterlockedIncrement(&m_RefCount);
}
ULONG IDXGISwapChainWrapper::Release( )
{
printf("[IDXGISwapChainWrapper] --> AddRef\n");
ULONG refCount = InterlockedDecrement(&m_RefCount);
if (refCount == 0)
delete this;

View File

@@ -47,7 +47,11 @@ HRESULT d3d11x::D3D11DeviceXWrapperX::CreateTexture1D(
ID3D11Texture1D* texture1d = nullptr;
HRESULT hr = m_realDevice->CreateTexture1D(pDesc, pInitialData, &texture1d);
*ppTexture1D = SUCCEEDED(hr) ? new ID3D11Texture1DWrapper(texture1d) : nullptr;
ERROR_LOG_FUNC( );
if (ppTexture1D != nullptr)
{
*ppTexture1D = SUCCEEDED(hr) ? new ID3D11Texture1DWrapper(texture1d) : nullptr;
}
return hr;
}
@@ -60,8 +64,13 @@ HRESULT d3d11x::D3D11DeviceXWrapperX::CreateTexture2D(
ID3D11Texture2D* texture2d = nullptr;
HRESULT hr = m_realDevice->CreateTexture2D(pDesc, pInitialData, &texture2d);
printf("[CreateTexture2D] created texture at 0x%llX\n", texture2d);
ERROR_LOG_FUNC( );
*ppTexture2D = SUCCEEDED(hr) ? new ID3D11Texture2DWrapper(texture2d) : nullptr;
if (ppTexture2D != nullptr)
{
*ppTexture2D = SUCCEEDED(hr) ? new ID3D11Texture2DWrapper(texture2d) : nullptr;
}
// @Patoke todo: crashing on texture create with DXGI_ERROR_DEVICE_REMOVED and DXGI_ERROR_DRIVER_INTERNAL_ERROR
if (FAILED(hr))
@@ -69,6 +78,8 @@ HRESULT d3d11x::D3D11DeviceXWrapperX::CreateTexture2D(
HRESULT device_result = m_realDevice->GetDeviceRemovedReason( );
ERROR_LOG_HRES(device_result);
__debugbreak( );
return S_OK;
}
return hr;
@@ -83,8 +94,10 @@ HRESULT d3d11x::D3D11DeviceXWrapperX::CreateTexture3D(
HRESULT hr = m_realDevice->CreateTexture3D(pDesc, pInitialData, &texture3d);
ERROR_LOG_FUNC( );
*ppTexture3D = SUCCEEDED(hr) ? new ID3D11Texture3DWrapper(texture3d) : nullptr;
if (ppTexture3D != nullptr)
{
*ppTexture3D = SUCCEEDED(hr) ? new ID3D11Texture3DWrapper(texture3d) : nullptr;
}
return hr;
}

View File

@@ -62,7 +62,7 @@ void FixRelativePath(LPCWSTR& lpFileName)
HFILE WINAPI OpenFile_Hook(LPCSTR lpFileName, LPOFSTRUCT lpReOpenBuff, UINT uStyle)
{
printf("[OpenFile] try read file %s\n", lpFileName);
//FixRelativePath(lpFileName);
return TrueOpenFile(lpFileName, lpReOpenBuff, uStyle);
}
@@ -72,14 +72,7 @@ HANDLE WINAPI CreateFileW_Hook(LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD
{
FixRelativePath(lpFileName);
HANDLE res = TrueCreateFileW(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
if (res == INVALID_HANDLE_VALUE)
{
printf("[CreateFileW] failed to read file 0x%X | %ls\n", GetLastError(), lpFileName);
}
return res;
return TrueCreateFileW(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
}
DWORD WINAPI GetFileAttributesW_Hook(LPCWSTR lpFileName)