Windows XP下的硬盘读写

wyvernwhite 2004-07-19 05:48:42
在WinXP下面有哪些API可以读写硬盘(最好是对硬盘的直接读写)
...全文
134 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
wyvernwhite 2004-07-23
  • 打赏
  • 举报
回复
已经全部搞定了,多谢
wyvernwhite 2004-07-20
  • 打赏
  • 举报
回复
......我发出回复以后想起来这可能是你自己写的了,但是好象不能改帖子.....
再次表示衷心的感谢,有什么疑问我再问你吧^^
会思考的草 2004-07-20
  • 打赏
  • 举报
回复
m_hDrive就不用多说了吧,至于这个m_DiskInfo么……
BOOL CLogicalPartition::GetDiskGeometry()
{
char szPath[255] = {0};
BOOL bResult = FALSE;
DWORD dwOutBytes = 0;

if(m_hDrive == INVALID_HANDLE_VALUE)
{
return FALSE;
}

sprintf(szPath, "%c:\\", m_chDriveLetter);

ZeroMemory(&m_DiskInfo, sizeof(DISK_GEOMETRY));
if(GetDriveType(szPath)== DRIVE_CDROM)
{
bResult = DeviceIoControl(
m_hDrive,
IOCTL_CDROM_GET_DRIVE_GEOMETRY,
NULL,
0,
&m_DiskInfo,
sizeof(DISK_GEOMETRY),
&dwOutBytes,
NULL
);
}
else
{
bResult = DeviceIoControl(
m_hDrive,
IOCTL_DISK_GET_DRIVE_GEOMETRY,
NULL,
0,
&m_DiskInfo,
sizeof(DISK_GEOMETRY),
&dwOutBytes,
NULL
);
}
return bResult;
}
会思考的草 2004-07-20
  • 打赏
  • 举报
回复
这个……咳,是俺写的一个类,汗……
wyvernwhite 2004-07-20
  • 打赏
  • 举报
回复
谢谢楼上,不过......这个CLogicalPartition我怎么在MSDN里查不到啊,能不能再麻烦你一下把缺失的部分补上^^(比如m_hDrive, m_DiskInfo 这些成员变量的值怎么得到)
会思考的草 2004-07-20
  • 打赏
  • 举报
回复
2000/XP下,先打开卷:
HANDLE CLogicalPartition::GetDriveHandle
{
char szDevice[255] = {0};

sprintf(szDevice, "\\\\.\\%c:", m_chDriveLetter);
return CreateFile(szDevice,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);
}

然后读取扇区:

//从第dwStart个扇区开始,连续读取包括起始扇区在内的dwSecCount个扇区.dwBufSz是m_pFat大小(以字节计)
//扇区起始号均是从0开始计算
BOOL CLogicalPartition::ReadSectors(LPBYTE lpBuf, DWORD dwBufSz, DWORD dwStartSec, DWORD dwSecCount)
{
DWORD dwResult = 0;
LARGE_INTEGER qDistance;

//入口参数合法性校验
if(lpBuf == NULL)
{
return FALSE;
}
if(dwBufSz < (dwSecCount*m_DiskInfo.BytesPerSector))
{
MessageBox(NULL,"缓冲区不够!数据会被截断!","警告",MB_OK|MB_ICONWARNING);
}
if(m_hDrive == INVALID_HANDLE_VALUE)
{
return FALSE;
}

//移动文件指针到起始位置
ZeroMemory(&qDistance, sizeof(LARGE_INTEGER));
qDistance.QuadPart = dwStartSec*m_DiskInfo.BytesPerSector;//计算移动距离
if(qDistance.u.HighPart==0 && qDistance.u.LowPart==0)
{
dwResult = SetFilePointer(m_hDrive, 0, NULL, FILE_BEGIN);
}
else if(qDistance.u.HighPart==0)//高32位为0
{
dwResult = SetFilePointer(m_hDrive, qDistance.u.LowPart, NULL, FILE_BEGIN);
}
else
{
dwResult = SetFilePointer(m_hDrive,qDistance.u.LowPart,&qDistance.u.HighPart,FILE_BEGIN);
}
if(dwResult== -1 && GetLastError()!= NO_ERROR)
{
CString strErrorMsg = _T("");

strErrorMsg.Format("磁盘读取错误,错误号:%x",GetLastError());
MessageBox(NULL,strErrorMsg, "错误", MB_OK|MB_ICONERROR);

return FALSE;
}
dwResult = 0;

//读取磁盘扇区
if(ReadFile(m_hDrive, lpBuf, dwSecCount*m_DiskInfo.BytesPerSector, &dwResult, NULL)== 0)
{
CString strErrorMsg = _T("");

strErrorMsg.Format("磁盘读取错误,错误号:%x",GetLastError());
MessageBox(NULL,strErrorMsg, "错误", MB_OK|MB_ICONERROR);

return FALSE;
}
if(dwResult == 0)
{
return FALSE;
}

return TRUE;
}
wyvernwhite 2004-07-19
  • 打赏
  • 举报
回复
那有什么办法能在硬盘里找到指定的数据(也要需要用直接对硬盘操作来实现)
名牌大灰狼 2004-07-19
  • 打赏
  • 举报
回复
BOOL DeviceIoControl(
HANDLE hDevice,
DWORD dwIoControlCode,
LPVOID lpInBuffer,
DWORD nInBufferSize,
LPVOID lpOutBuffer,
DWORD nOutBufferSize,
LPDWORD lpBytesReturned,
LPOVERLAPPED lpOverlapped
);
liotion 2004-07-19
  • 打赏
  • 举报
回复
DeviceIoControl

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧