可能是ReadFile的一个Bug

最近在写程序的时候,发现Microsoft提供的File Management Functions或多或少存在一些Bug,比如ReadFile。

前段时间移动硬盘坏了,于是用强大的R-Studio恢复硬盘上的数据,文件全部被恢复出来,但是后来在打开其中一个名为 a.c 文件的

时候,notepad提示说“函数不正确”,又试了下notepad++,一样打不开,说File does not exist,这是什么原因?

于是拿起Ollydbg跟了一下notepad打开文件的过程,发现它在调用CreateFile打开这个文件时,该函数能够正确执行,并且

返回一个有效的文件句柄,紧接着它又调用了GetFileInformationByHandle这个函数,而这个函数却失败了,GetLastError返回1,

即ERROR_INVALID_FUNCTION(好奇怪的错误代码)。想了想,之所以会这样,可能是因为这个文件在恢复的时候,没有恢复成功,

文件索引损坏了,但它又确实存在于磁盘上,所以CreateFile能够正确执行。

好玩的是,一些AV软件在扫描到这个文件时会假死,在这个地方扫不下去了,跟了一下,发现是在调用CreateFile之后,直接就调用

ReadFile去读这个文件了,而ReadFile却一直没有返回,程序执行不下去了,这可能是ReadFile的一个Bug。

所以,我们应该在调用完CreateFile之后,立即调用GetFileInformationByHandle来判断这个文件是不是真的有效,否则后续在读和写

文件的时候,会发生难以预料的错误。

Creating Windows CreateMDIWindow CreateWindow CreateWindowEx RegisterClass RegisterClassEx UnregisterClass Message Processing BroadcastSystemMessage CallNextHookEx CallWindowProc DefFrameProc DefMDIChildProc DefWindowProc DispatchMessage GetMessage GetMessageExtraInfo GetMessagePos GetMessageTime GetQueueStatus InSendMessage PeekMessage PostMessage PostQuitMessage PostThreadMessage RegisterWindowMessage ReplyMessage SendMessage SendMessageCallback SendMessageTimeout SendNotifyMessage SetMessageExtraInfo SetWindowsHookEx TranslateMessage UnhookWindowsHookEx WaitMessage Window Information AnyPopup ChildWindowFromPoint ChildWindowFromPointEx EnableWindow EnumChildWindows EnumPropsEx EnumThreadWindows EnumWindows FindWindow FindWindowEx GetClassInfoEx GetClassLong GetClassName GetClientRect GetDesktopWindow GetFocus GetForegroundWindow GetNextWindow GetParent GetProp GetTopWindow GetWindow GetWindowLong GetWindowRect GetWindowText GetWindowTextLength IsChild IsIconic IsWindow IsWindowEnabled IsWindowUnicode IsWindowVisible IsZoomed RemoveProp SetActiveWindow SetClassLong SetFocus SetForegroundWindow SetParent SetProp SetWindowLong SetWindowText WindowFromPoint Processes and Threads CreateEvent CreateMutex CreateProcess CreateSemaphore CreateThread DeleteCriticalSection DuplicateHandle EnterCriticalSection ExitProcess ExitThread GetCurrentProcess GetCurrentProcessId GetCurrentThread GetCurrentThreadId GetExitCodeProcess GetExitCodeThread GetPriorityClass GetThreadPriority GetWindowThreadProcessId InitializeCriticalSection InterlockedDecrement InterlockedExchange InterlockedIncrement LeaveCriticalSection OpenEvent OpenMutex OpenProcess OpenSemaphore PulseEvent ReleaseMutex ReleaseSemaphore ResetEvent ResumeThread SetEvent SetPr
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值