⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 硬盘0磁道读写.txt

📁 硬盘0磁道读写
💻 TXT
字号:
硬盘0磁道i/o读写问题
DWORD CDiskInfo::WriteDiskSector(DWORD LogicSector, 						unsigned char *str)
{
	HANDLE hDevice = CreateFile("\\\\.\\PhysicalDrive0", GENERIC_READ,
		FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
	if(hDevice == INVALID_HANDLE_VALUE)
	{
		AfxMessageBox("Can't open disk");
		CloseHandle(hDevice);
		return FALSE;
	}
	long hi = LogicSector >> 23;

	SetFilePointer(hDevice, 
		(long)((LogicSector * Disk_Geometry.BytesPerSector) % 
		0x100000000), &hi, FILE_BEGIN);

	DWORD write;

	WriteFile(hDevice, str, 512, 
		&write, NULL);
	
	CloseHandle(hDevice);
	return write;

}
///////////////////////////
DWORD CDiskInfo::WriteDiskSector(DWORD LogicSector, 
								 unsigned char *str)
{
	HANDLE hDevice = CreateFile("\\\\.\\PhysicalDrive0", GENERIC_WRITE,
		FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
	if(hDevice == INVALID_HANDLE_VALUE)
	{
		AfxMessageBox("Can't open disk");
		CloseHandle(hDevice);
		return FALSE;
	}
	long hi = LogicSector >> 23;

	SetFilePointer(hDevice, 
		(long)((LogicSector * Disk_Geometry.BytesPerSector) % 
		0x100000000), &hi, FILE_BEGIN);

	DWORD write;

	WriteFile(hDevice, str, Disk_Geometry.BytesPerSector, 
		&write, NULL);
	
	CloseHandle(hDevice);
	return write;

}
上面有两个参数错了。我在2000下运行了没问题
yaolan1999(可可猫) :
能否告知變量LogicSector如何獲得,同時long hi = LogicSector >> 23;的意義爲何?
Disk_Geometry是否是由函數GetDiskGeometry(hDevice,Disk_Geometry)得到?
这是一个函数,LogicSector == 0表示写第一个扇区。Disk_Geometry.BytesPerSector为一个扇区的字节数,一般为512。long hi = LogicSector >> 23表示取扇区的高字位,由于512 == 2的9次方,因此还要移32-9=23位。
DWORD CDiskInfo::ReadDiskSector(DWORD LogicSector, 
								unsigned char *str)
{
	HANDLE hDevice = CreateFile("\\\\.\\PhysicalDrive0", GENERIC_READ,
		FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
	if(hDevice == INVALID_HANDLE_VALUE)
	{
		AfxMessageBox("Can't open disk");
		CloseHandle(hDevice);
		return FALSE;
	}
	long hi = LogicSector >> 23;

	SetFilePointer(hDevice, 
		(long)((LogicSector * Disk_Geometry.BytesPerSector) % 
		0x100000000), &hi, FILE_BEGIN);

	DWORD read;

	ReadFile(hDevice, str, Disk_Geometry.BytesPerSector, 
		&read, NULL);
	
	CloseHandle(hDevice);
	return read;

}
不好意思再问两个,若作答分全给你:
1:按你的代码写入到的是0磁道吗?
2:往0柱面0磁道1扇区写东西是很危险的,但还是想知道如何定这个位呢,就是保证写
就是保证写入位置的准确性?
你先写另一个扇区试试如第二扇区。
unsigned char *str;
for(int i = 0; i < 512; i++)
str[i] = 1;
WriteDiskSector(1, str);
应该没问题。你也可以先读

unsigned char *str;
str = malloc(512);
ReadDiskSector(0, str);
注意str = malloc(512);不能少不然会读失败。
非常感谢你,yaolan1999(可可猫) !
不过有点笔误:修改成unsigned char * str = (unsigned char *)malloc(512);
则完美无缺!

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -