WriteFile已成功截获,并转向了我自定义的函数MyWriteFile,代码如下:
BOOL MyWriteFile(
    HANDLE hFile, // 文件句柄
    LPCVOID lpBuffer,// 数据缓存区指针
    DWORD nNumberOfBytesToWrite, // 你要写的字节数
    LPDWORD lpNumberOfBytesWritten, // 用于保存实际写入字节数的存储区域的指针
    LPOVERLAPPED lpOverlapped // OVERLAPPED结构体指针
    )
{
OutputDebugString((LPCSTR)lpBuffer); //用于调试,输出待加密的明文
LPCVOID lpBufferNew = Encrypt(lpBuffer, nNumberOfBytesToWrite); //加密,更改了要写的字节数,并返回密文数据缓存区指针
OutputDebugString((LPCSTR)lpBufferNew); ////用于调试,输出加密后的密文
return WriteFile(hFile, lpBufferNew, nNumberOfBytesToWrite, lpNumberOfBytesWritten, lpOverlapped);
}目前只拿记事本程序做测试,第一次按下Ctrl+S保存后没问题,但第二次保存时便会弹出让我“另存为”的对话框,而且关闭记事本窗口的时候会提示让我保存(保存和不保存我都试过了:后者直接关闭窗口,而且文本内容确实是加密后的内容;前者会新建一个txt文件,内容和不保存所得的txt文件内容一样,都是加密过的)。问题是:我截获了WriteFile,在第一次保存之后,进行第二次保存或者关闭窗口为什么出现上述情况,为什么系统觉得我之前没有保存过呢?

解决方案 »

  1.   

    可能比较了 nNumberOfBytesToWrite 和 lpNumberOfBytesWritten
    你在里面把 nNumberOfBytesToWrite 改变了假设原来nNumberOfBytesToWrite = 10
    改后nNumberOfBytesToWrite = 16
    那么lpNumberOfBytesWritten返回16
    一比较两个字节数不同
      

  2.   

    我调试了一下,输出了这两个值,发现它们本来就不一样的。
    我还这样测试了一下:
    BOOL MyWriteFile(
        HANDLE hFile, // 文件句柄
        LPCVOID lpBuffer,// 数据缓存区指针
        DWORD nNumberOfBytesToWrite, // 你要写的字节数
        LPDWORD lpNumberOfBytesWritten, // 用于保存实际写入字节数的存储区域的指针
        LPOVERLAPPED lpOverlapped // OVERLAPPED结构体指针
        )
    {
        return WriteFile(hFile, lpBuffer, nNumberOfBytesToWrite, lpNumberOfBytesWritten, lpOverlapped);
    }
    发现即使我对要写的数据什么都不改,只要把WriteFile阶段了,这样出现一开始我说的那种状况...
      

  3.   

    咋最近问这种问题的好多,去看看http://fxh7622.blog.51cto.com的博客,里面有如何HOOK API函数的代码,其实方法挺简单的!
      

  4.   

    BOOL __stdcall MyWriteFile
    掉了这个?
      

  5.   

    怎么没有UnHook就:
    return WriteFile(hFile, lpBufferNew, nNumberOfBytesToWrite, lpNumberOfBytesWritten, lpOverlapped);