不同的D3D9设备不共享相同的VTable地址

时间:2016-12-05 16:40:31

标签: c++ com directx hook vtable

最近我一直在搞乱VTables和虚拟指针, 并且我发现来自同一类类型的每个vptr(应该)指向相同的VTable。(它们指向相同的地址)。

我已经搜索了有关COM对象如何工作的信息,并且我发现它们也共享相同的VTable。(同一类的对象)

https://www.codeproject.com/articles/153096/intercepting-calls-to-com-interfaces]

  

首先,当您设置方法钩子时,它不仅适用于COM对象的当前实例。它适用于同一个类的所有对象(但不适用于实现挂钩接口的所有类)。

我遇到的问题如下:我在一个测试应用程序中创建了3个不同的d3d9设备,我检查了它们指向VTable的指针,但它们不一样!

 if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
    return E_FAIL;
if (NULL == (g_pD3D2 = Direct3DCreate9(D3D_SDK_VERSION)))
    return E_FAIL;
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory( &d3dpp, sizeof( d3dpp ) );
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
D3DPRESENT_PARAMETERS d3dpp2;
ZeroMemory(&d3dpp2, sizeof(d3dpp2));
d3dpp2.Windowed = TRUE;
d3dpp2.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp2.BackBufferFormat = D3DFMT_UNKNOWN;
   if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                                  D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                  &d3dpp, &g_pd3dDevice ) ) )
{
    return E_FAIL;
}
if (FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
    D3DCREATE_SOFTWARE_VERTEXPROCESSING,
    &d3dpp2, &g_pd3dDevic)))
{
    return E_FAIL;
}
WNDCLASSEX wc = { sizeof(WNDCLASSEX),CS_CLASSDC,TempWProc,0L,0L,GetModuleHandle(NULL),NULL,NULL,NULL,NULL,(LPCWSTR)("1"),NULL };
RegisterClassEx(&wc);
HWND hWndd = CreateWindow((L"1"), NULL, WS_OVERLAPPEDWINDOW, 100, 100, 300, 300, GetDesktopWindow(), NULL, wc.hInstance, NULL);
if (FAILED(g_pD3D2->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWndd,
    D3DCREATE_SOFTWARE_VERTEXPROCESSING | D3DCREATE_DISABLE_DRIVER_MANAGEMENT,
    &d3dpp2, &g_pd3dDevic3)))
{
    return E_FAIL;
}

(作为最后的手段,我还创建了一个不同的窗口并初始化了一个新的D3D接口,以防它使新的d3d9设备指向同一个VTable。)

在调试器中,我检查了设备指针的值,这就是它们产生的结果:

g_pd3dDevice(The first one) : __vfptr = 0x00b75d1c { 0x6a976f19 }
g_pd3dDevic(The second one) : __vfptr = 0x0512a75c { 0x6a976f19 }
g_pd3dDevic3(The third one) : __vfptr = 0x0524393c { 0x6a976f19 }

3个VTable是相同的,但它们位于不同的地方。 (三个指针指向相同的功能) (我还检查了VTable是否被对象的0x2D9C所取代) 所以这就是我真正理解的:

  • D3D9设备始终使用相同的VTable吗?
  • 为什么他们不像COM对象那样使用相同的VTable,如我所给出的链接所指示的那样?

  • 在同一个HWND中有多个设备有问题吗?

  • 是否与编译器优化有关?
  • 他们真的是VTables吗?
P.S:对不起我的英语很差,以及我解释事情的方式:C

非常感谢您阅读这段文字,非常感谢。

提前致谢!!! (对不起,如果这是一个非常愚蠢的问题)

0 个答案:

没有答案