<span style="font-size:18px;color:#cc0000;"> </span><p><span style="font-size:18px;color:#cc0000;">vc下读写硬盘的操作,简单来说就是将硬盘当作是一个文件流来操作:</span></p><p><span style="font-size:18px;color:#cc0000;">下面是实现的函数:</span></p>
//drv 是盘符,一个字符,替换字符串“\\.\A:”中的字符A
//startSector 是开始扇区号
//sectors 扇区数量
//lpSectBuff 缓冲区
BOOL CRWSectorsDlg::ReadSectors(char drv, DWORD startSector, WORD sectors, LPBYTE lpSectBuff)
{
char devName[] = "\\\\.\\A:";
devName[4] =drv;
//打开指定分区
HANDLE hDev=CreateFile(devName, GENERIC_READ, FILE_SHARE_WRITE,NULL, OPEN_EXISTING, 0, NULL);
if(hDev==INVALID_HANDLE_VALUE)
return 0;
//将文件指针指向起始扇区
SetFilePointer(hDev,512*startSector,0,FILE_BEGIN);
DWORD dwCB;
//读取指定数量的扇区
BOOL bRet=ReadFile(hDev,lpSectBuff,512*sectors,&dwCB,NULL);
CloseHandle(hDev);
return bRet;
}
BOOL CRWSectorsDlg::WriteSectors( char drv, DWORD startSector, WORD sectors, LPBYTE lpSectBuff )
{
char devName[] = "\\\\.\\A:";
devName[4] =drv;
HANDLE hDev=CreateFile(devName, GENERIC_WRITE, FILE_SHARE_WRITE,NULL, OPEN_EXISTING, 0, NULL);
if(hDev==INVALID_HANDLE_VALUE)
return 0;
SetFilePointer(hDev,512*startSector,0,FILE_BEGIN);
DWORD dwCB;
BOOL bRet=WriteFile(hDev,lpSectBuff,512*sectors,&dwCB,NULL);
CloseHandle(hDev);
return bRet;
}
下边是用vc控制台程序实现的一个读取硬盘分区大小的简单代码(win7下好像不能读取到C盘的信息,暂时不知道为什么)
#include <stdio.h>
#include <stdlib.h>
#include <WTypes.h>
int main()
{
LONGLONG lPartBegin, lPartEnd;
DWORD dwOutByte; // DeviceIoControl 读取的字节数
DISK_GEOMETRY diskGeometry;
DWORD dwSectorByte;
HANDLE m_hDriver;
//char Drive[] = ".//PHYSICALDRIVE0";
/ ("\\\\.\\D:") // disk D:
m_hDriver = CreateFile(("\\\\.\\D:"), GENERIC_READ, FILE_SHARE_READ,NULL, OPEN_EXISTING, 0, NULL);
if(m_hDriver == INVALID_HANDLE_VALUE)
{
return FALSE;
}
// GENERIC_READ FILE_SHARE_READ
// GENERIC_WRITE FILE_SHARE_WRITE
// ReadFile(m_hDriver, ...);
// 读取每扇区字节数
BOOL bDeviceRet = DeviceIoControl(m_hDriver, IOCTL_DISK_GET_DRIVE_GEOMETRY,
NULL, 0, &diskGeometry, sizeof(DISK_GEOMETRY), &dwOutByte, NULL);
// 每扇区字节数
dwSectorByte = diskGeometry.BytesPerSector;
// 读取分区大小和偏移量
PARTITION_INFORMATION partInfo;
bDeviceRet = DeviceIoControl(m_hDriver, IOCTL_DISK_GET_PARTITION_INFO,
NULL, 0, &partInfo, sizeof(PARTITION_INFORMATION), &dwOutByte, NULL);
LONGLONG lPartitionSize = partInfo.PartitionLength.QuadPart; // 分区的大小
LONGLONG lOffset = partInfo.StartingOffset.QuadPart; // 偏移
// StartingOffset 除以每扇区字节数就是开始扇区;
// PartitionLength 除以每扇区字节数就是扇区总数。
lPartBegin = lOffset / dwSectorByte;
lPartEnd = lPartitionSize / dwSectorByte;
// 开始扇区加上扇区总数再减去1就是结束扇区。
lPartEnd += lPartBegin; //lOffset;
lPartEnd -= 1;
return 0;
}