这个问题有点遥远,但我认为也许有人知道一个聪明的解决方案。

我在Windows中的RTS游戏(凯恩的愤怒)中有一个特殊情况,该游戏可以保存重播文件。不利的对手有可能触发游戏崩溃。在那种情况下,具有尽可能完整的重放文件将是有利的。

但是,重放文件的输出似乎已被缓冲,并且仅以4096字节为一组(这是很多游戏时间)发生的。我想知道是否有可能在崩溃的情况下以某种方式强制程序刷新其所有文件句柄。是否有一些内置的OS功能允许对应用程序禁用缓冲?

失败的话,我可能想为这个问题写一个启动器/包装器。我想象它应该注入(inject)一些代码,其中a)为崩溃安装了信号处理程序(是否为SIGSEGV?),b)重定向CreateFile(我知道程序从跟踪中使用该代码)来存储句柄。然后,崩溃处理程序将只使用 FlushFileBuffers 刷新所有处理程序。

还是有可能获得另一个进程的打开文件句柄?

这是否有可能奏效,您能否就如何以最少的入侵量来最好地实现这一目标提供任何建议?

少许更新:@CatPlusPlus建议Detours挂接到程序中,拦截文件打开的调用并将其修改为无缓冲。这很可能是解决方案!

最佳答案

好吧,您可以先将winmain包装在try / catch块中,如下所述
文章:

XCrashReport : Exception Handling and Crash Reporting - Part 1

基本上是这样的:

int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPTSTR lpstrCmdLine, int nCmdShow)
{
    int Result = -1;
    __try
    {
        Result = HandledWinMain(hInstance, NULL, lpstrCmdLine, nCmdShow);
    }

    __except(RecordExceptionInfo(hInstance,GetExceptionInformation(), "main thread"))
    {
        // Do nothing here - RecordExceptionInfo() has already done
        // everything that is needed. Actually this code won't even
        // get called unless you return EXCEPTION_EXECUTE_HANDLER from
        // the __except clause.
    }

    return Result;
}

当然,我不确定您的缓冲区的状态是什么,但这将使您能够进入该过程。

10-08 05:41
查看更多