2009-12-25 48 views
0

我正在写DirectX 6.1库到DirectX 9.0c的windows32钩子;想法是将DX 6.1 3D设备的所有调用替换为Direct 9.0c的调用并注入一些自定义代码,因此我正在修补(99年)的旧游戏将能够使用着色器,后期效果等。以编程方式获取DirectX 6.1的设备上限(DDraw4)

旧的DX 6.1 3D设备是通过创建DDraw模块创建的。游戏然后列举设备上限。在我的模块中,整个DDraw模块被滑动,并且3D视图被初始化。所以我有问题,因为我不能给游戏Ddraw4设备上限,因为我根本没有DDraw设备!

所以我的问题是如何获得DDraw4设备上限,而无需初始化DDraw4设备。也许只要创建固定列表并将其提供给游戏就足够了,但我不知道该列表上应该包含什么内容(我给出了我认为应该的内容,并且游戏退出了 - 记录器显示它只是在设备上限之后检查)

回答

0

解决方案有点粗糙,但最重要的是 - 工作完美无瑕。

我已经编写了一个小型独立实用程序,它初始化DDraw 6.1,比获取设备大小,然后将它们转储到磁盘上的文件(设备大小是普通的旧C格式结构,因此保存它非常简单)和退出。然后,我可以从磁盘读取设备上限文件,并在应用程序询问我时向他们返回。

3

我从来没有尝试过这一点,但你可以尝试以下。假设你没有6.1 SDK,你可以自己制作DDCAPS结构(DirectDraw)(它基本上只是DWORD),然后使用DX9 GetDeviceCaps函数获得功能(D3DCAPS9)。接下来,从获得的上限(使用DX9)中获取所需的值,并在DDCAPS结构中设置DirectDraw的等效值。然后,您可以将这个填充的顶盖结构添加到游戏中。一些注意事项 - 正如你所提到的,你不知道它具体需要什么,所以这是一种碰撞和错过(除非你有源代码)。此外,对于caps结构值(在DX9和DDraw之间),可能没有1:1映射。最后 - 如果你不知道标志值,那么你可能会在根据获取的上限设置值时错误地设置标志。正如我所提到的,这可能会有所改变(或者需要大量的侦探工作),但我认为这可能是您可以尝试的。

相关问题