WriteFile导致程序崩溃的问题

昨天晚上写了一个测试读写文件速度的测试程序,一直调试错误,说的空指针访问。

先上源代码:

#include "stdafx.h"
#include <iostream>
using namespace std;
#include "CStopwatch.h"

const int BUFFER_SIZE = 8 * 1024;

int _tmain(int argc, _TCHAR* argv[])
{
	char szBuffer[BUFFER_SIZE];
	HANDLE hFile = ::CreateFile(_T("E:\\安装文件\\vs 2008\\VS2008TeamSuiteENU90DayTrialX1429235.iso"),
		GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
	HANDLE hFile_cpy = ::CreateFile(_T("E:\\安装文件\\vs 2008\\VS2008TeamSuiteENU90DayTrialX1429235.iso.bak"),
		GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
	if (INVALID_HANDLE_VALUE == hFile || INVALID_HANDLE_VALUE == hFile_cpy)
	{
		return -1;
	}
	DWORD dwByteRead = 0, dwByteWrite = 0;
	CStopwatch stopwatch;
	stopwatch.Start();

	while (1)
	{
		::ReadFile(hFile, szBuffer, BUFFER_SIZE, &dwByteRead, NULL);
		::WriteFile(hFile_cpy, szBuffer, dwByteRead, NULL, NULL);
		if (dwByteRead < BUFFER_SIZE)
		{
			break;
		}
	}

	printf("time = %d \n",stopwatch.Now());
	::CloseHandle(hFile);
	::CloseHandle(hFile_cpy);
	return 0;
}

 

程序会在WriteFile的地方出现空指针访问。用vs调试吧,发现调试信息不够。Alt+8反汇编,还是不够。正好最近用了下windbg,果断试试!

直接运行到崩溃处:

image

可见,程序尝试向edi寄存器内容所指向的空间写内容,也就是00000000处。这明显是一个空指针访问违例!

查看msdn以后才知道,原来当ReadFile和WriteFile的lpOverlapped参数为NULL时,那么必须指定一定有效的地址用来存放读写的字节数。上面我指定了一个null,所以才会出现空指针访问。这点从上面的反汇编结果可以知道这点。

最后补充下,为什么这里不用vs呢?原因是信息不够,顺便我也想用下windbg,装下13,呵呵

image

posted @ 2012-04-18 10:32  kcy-666  阅读(2302)  评论(0编辑  收藏  举报