📄 硬盘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 + -