今天我写一个程序,把lpNumberOfBytesWritten的指针给错了,隐式给成了NULL,但我是在Win8编译测试的,结果WriteFile通过了,我没察觉到这个错误。而我转到Win7上运行,直接蹦了,百思不解,无奈之下打开OD调,结果发现死在WriteFile这里,仔细一跟,我艹。。。

原来是这样的,lpNumberOfBytesWritten参数大家都不能设置为NULL或一个无效的指针,除非lpOverlapped参数不是NULL,也就是说WriteFile的最后2个参数必须有一个不为NULL,MSDN也是这样写的。可Win8开始不是这样了,你可以把WriteFile的最后2个参数都设置为NULL。。。比如:

WriteFile(hFile,lpBuffer,dwWriteSize,NULL,NULL);

这样在Win7下运行会挂的,而Win8下不会,因为Win8会检查lpNumberOfBytesWritten参赛是否为空指针,如果是空指针就跳过不写了。汇编如下

Win7:

Win8:


很多人可能问了,为什么那么舒服的东西微软不早点加?加不加我们无法控制,不过可以在Win7等老系统下把lpNumberOfBytesWritten设置为NULL并且不崩溃的办法有没有?相信聪明的你一定想到了,呃,就是在WriteFile前加个SEH或者VEH,骗系统我们已经处理了那个指针访问异常让系统继续执行就行了(因为访问lpNumberOfBytesWritten是在NtWriteFile结束后才访问的,所以文件的写操作其实已经完成了)。。。