陷阱Windows应用程序崩溃和刷新文件缓冲区

时间:2011-08-03 16:53:46

标签: c++ winapi crash flush

这个问题有点遥不可及,但我想也许有人知道一个聪明的解决方案。

我在Windows中使用RTS游戏( Kane's Wrath )有特殊情况,它可以保存重播文件。不利的对手有可能在游戏中引发崩溃。在这种情况下,尽可能完整的重播文件将是有利的。

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

如果做不到这一点,我可能想为这个问题编写一个启动器/包装器。我想它应该注入一些代码,a)安装崩溃的信号处理程序(是SIGSEGV?),b)重定向CreateFile(我知道程序使用跟踪跟踪)来存储句柄。然后,崩溃处理程序将使用FlushFileBuffers刷新所有处理程序。

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

这是否有机会工作,你能否就如何以最少的入侵实现这一目标给我任何建议?


小更新: @CatPlusPlus已建议Detours挂钩程序,拦截文件打开调用并将其修改为无缓冲。这可能是解决方案!

3 个答案:

答案 0 :(得分:1)

你可以先把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;
}

当然我不确定你的缓冲区的状态是什么,但是这将允许你进入这个过程。

答案 1 :(得分:1)

假设这个过程不是你的, 你唯一的选择似乎是挂钩WriteFile函数,而是写一个WriteFile,然后是Flush 可以通过IAT挂钩或使用像eashook这样的库来挂钩WriteFile。

答案 2 :(得分:0)

我唯一能想到的是在其汇编程序输出中附加调试器和修补程序。

我记得当他们撞到我的时候用一些程序做这件事:跳过违规的机器指令到函数的末尾,让它运行。大约50%的案例会让程序达到我可以保存数据的程度。当然,之后重新启动是强制性的。