您的位置:首页 > 其它

vc下读写硬盘的操作

2015-05-22 16:50 288 查看
<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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: