我正在修改一个旧的Windows DirectDraw游戏。我已经创建了一个DirectDraw代理。它记录每个IDirectDraw和IDirectDrawSurface调用。后备缓冲区看起来像之后一次BltFast
来电:
喜欢这个之前下一个BltFast
来电:
这些图片会在Lock
来电之前和之后Unlock
复制 - BltFast
后备缓冲区转储。
这两个BltFast
来电之间没有其他IDirectDraw(Surface)调用,尤其是没有Lock
/ Unlock
来电。这怎么可能?
答案 0 :(得分:1)
据我所知,看起来游戏可能会在多个阶段进行绘制,而你正在中间捕捉它。 IE,游戏调用blit一次渲染其背景,然后再次(可能多次)渲染交互式“精灵”。 (但是,顺序很可能会被颠倒,这意味着您捕获的第二帧实际上是下一个循环的第一层。)
就backbufer而言,我能够在DirectDraw的MSDNs文档中找到它: https://msdn.microsoft.com/en-us/library/windows/desktop/gg426183(v=vs.85).aspx
如果硬件支持BltFast总是尝试异步blit。
所以它可能是一场比赛,但我想,任何锁定的尝试都会阻止,直到完成。
不要将DirectDraw bitblt函数从表面的锁定区域调用bitblt。如果这样做,bitblt将返回DDERR_SURFACEBUSY或DDERR_LOCKEDSURFACES。在锁定的视频内存表面上使用时,GDI blit函数也会无声地失败。
这意味着bitblt本身具有锁定语义。鉴于不允许GDI访问明确锁定的表面,它也可能无法在异步blit操作的中间访问表面。
因此,要专门回答您的问题,GDI似乎可以在不锁定的情况下访问表面。
当然,在演出的名义下可以做各种奇怪的事情,所以谁知道他们可能做过哪些其他类型的黑客攻击?
我会说,我不是DirectDraw的专家,并且假设后备缓冲器就像任何其他表面一样。