C风格的铸造混乱

C风格的铸造混乱

问题描述:

我正在阅读某人的(公共)源代码,并且我遇到了这一行,并且不知道它的功能。我尝试过分解它,但它总是最终令我困惑,尽管我尝试了。C风格的铸造混乱

uintptr_t* pInterfaceVTable = (uintptr_t*)*(uintptr_t*)pd3dDevice; 

pd3dDeviceLPDIRECT3DDEVICE9,这是一个IDirect3DDevice9*IDirect3DDevice9是继承了IUnknown的类,它们都实现了一堆虚函数。

有人可能更世俗请帮我这个代码做的,一行一行吗?

非常感谢您的时间!

+0

这实际上是未定义的行为。写这个的正确方法是这样的:'uintptr_t * p; const char * q = reinterpert_cast (pd3dDevice); std :: copy(q,q + sizeof(uintptr_t *),reinterpret_cast (&p));'。 –

uintptr_t的是可以存储一个整数类型指针。作者假设(知道?)IDirect3DDevice9中的第一个条目是一个指针,因此他将IDirect3DDevice9转换为(uintptr_t *)并将其取消引用以访问该指针。然后他再次将该uintptr_t转换为指向uintptr_t的指针以将其分配给pInterfaceVTable。
正如在评论和AndyT中所提到的那样,那就是所使用的编译器存储了指向VTable的指针,但这不是由C++保证的。

+0

演员与“ (uintptr_t *)pd3dDevice'? –

+0

@Kerrek:指针被解除引用,所以你没有得到pd3dDevice的值,但是pd3dDevice指向的值被解释为uintptr_t * – stefaanv

+0

哦,当然,我明白了。仍然UB,但:-) –

似乎笔者剖析了IDirect3DDevice9实例的虚拟表。我可以想象一个原因 - 代码注入或挂钩。可以将自定义代码插入到IDirect3DDevice9实现中,以便由于多种原因挂起其方法调用,例如,录制游戏,视频

+0

感谢您的回复。我修改了我的问题,因为它的意图不清楚。我真正想知道的是每个cast/pointer/dereference在现在的问题(单行)代码行中有效 – Yuki

+0

stefaanv已经回答了这个问题 –

+0

谢谢@Andy。当我发表评论时,他的回答并没有达到。 – Yuki

uintptr_t* pInterfaceVTable = (uintptr_t*)*(uintptr_t*)pd3dDevice; 

看起来,做了强制转换为uintptr_t的*然后取消引用指针,然后蒙上解除引用的结果为uintptr_t的*