D3D11CreateDeviceAndSwapChain()执行成功但是返回的swap chian为NULL

Monkey_Online 2014-01-16 09:37:32
最近在读一款云游戏的源码,里面利用DirectX11的方式启动游戏的时候启动不起来,查看源码是D3DCreateDeviceAndSwapChain()创建成功了,但是返回的swap chian 一直是NULL。这里有几点需要说明下:
1. 由于游戏是采用的hook(钩子)的方式,即将原本的D3DCreateDeviceAndSwapChain()执行函数,hook到我们自
己的实现函数里面,游戏在起来后,调用dll中的相关函数就相当于调用我们自己的实现函数。不同于我们之
前都是自己注册、创建窗口,然后在上面画布。

2. D3DCreateDeviceAndSwapChain()执行成功了,但swap chian为空,代码如下:

// Detour function that replaces the D3D11CreateDeviceAndSwapChain() API
DllExport HRESULT __stdcall
hook_D3D11CreateDeviceAndSwapChain(
IDXGIAdapter *pAdapter,
D3D_DRIVER_TYPE DriverType,
HMODULE Software,
UINT Flags,
const D3D_FEATURE_LEVEL *pFeatureLevels,
UINT FeatureLevels,
UINT SDKVersion,
const DXGI_SWAP_CHAIN_DESC *pSwapChainDesc,
IDXGISwapChain **ppSwapChain,
ID3D11Device **ppDevice,
D3D_FEATURE_LEVEL *pFeatureLevel,
ID3D11DeviceContext **ppImmediateContext
)
{
Flags |= D3D11_CREATE_DEVICE_DEBUG;

HRESULT hr = pD3D11CreateDeviceAndSwapChain(pAdapter, DriverType, Software, Flags,
pFeatureLevels, FeatureLevels, SDKVersion, pSwapChainDesc,
ppSwapChain, ppDevice, pFeatureLevel, ppImmediateContext);


// added by houqd pAdapter
if(FAILED(hr)){
ga_error("pD3D11CreateDeviceAndSwapChain execute failed.\n");
return hr;
}

if(SUCCEEDED(hr)){
ga_error("pD3D11CreateDeviceAndSwapChain execute success. \n");
}


if (pDXGISwapChainPresent == NULL && pAdapter != NULL && ppSwapChain != NULL && ppDevice != NULL) {
//OutputDebugString("[D3D11CreateDeviceAndSwapChain]");
ga_error("I will jump into proc_hook_IDXGISwapChain_Present() function. \n");
proc_hook_IDXGISwapChain_Present(*ppSwapChain);
}
ga_error("pAdapter = %p and ppSwapChain = %p and ppDevice = %p.\n", pAdapter , ppSwapChain , ppDevice);


return hr;
}


hr确定已经success了,从日志里面看到的输出,Adapter和ppDevice均不为空,ppSwapChian为空。
pD3D11CreateDeviceAndSwapChain是利用微软的detour库将D3D11CreateDeviceAndSwapChain()真实的地址hook到我们实现的这个函数上。

恳求大家帮忙看看,万分感谢,已经弄了好几天了,提供一些思路也可以。
...全文
457 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuli132 2014-04-09
  • 打赏
  • 举报
回复
不懂hook,不过DX11创建交换链的时候,有几个推荐值,不妨直接设置它看看。 Adapter 设置为NULL; DricerType设置为D3D_DRIVER_TYPE_HARDWARE; 如使用驱动设备类型是软件设备,则software参数不能为NULL。 另外ppImmediateContext结果也是空不?
Monkey_Online 2014-01-16
  • 打赏
  • 举报
回复
引用 2 楼 u013061236 的回复:
我就帮你顶了吧
好人一生平安。 快来人,快来人。
心是菩提树 2014-01-16
  • 打赏
  • 举报
回复
我就帮你顶了吧
Monkey_Online 2014-01-16
  • 打赏
  • 举报
回复
帮顶啊, 各位帮帮忙啊。

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧