VC获取硬盘的参数
作者:flyfish 2010-3-29
获取硬盘的参数信息包括
硬盘的大小,柱面数,每柱面磁道数,每磁道扇区数,每扇区字节数等
需要掌握的函数
1 函数CreateFile获得设备句柄。
HANDLE CreateFile(
LPCTSTR lpFileName, // 文件名/设备路径
DWORD dwDesiredAccess, // 访问方式
DWORD dwShareMode, // 共享方式
LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 安全描述符指针
DWORD dwCreationDisposition, // 创建方式
DWORD dwFlagsAndAttributes, // 文件属性及标志
HANDLE hTemplateFile // 模板文件的句柄
);
CreateFile“打开”设备驱动程序,得到设备的句柄。操作完成后用
CloseHandle关闭设备句柄。
2 函数DeviceIoControl来实现对设备的访问
DeviceIoControl的函数原型为
BOOL DeviceIoControl(
HANDLE hDevice, // CreateFile打开的设备句柄
DWORD dwIoControlCode, // 控制码
LPVOID lpInBuffer, // 输入数据缓冲区指针
DWORD nInBufferSize, // 输入数据缓冲区长度
LPVOID lpOutBuffer, // 输出数据缓冲区指针
DWORD nOutBufferSize, // 输出数据缓冲区长度
LPDWORD lpBytesReturned, // 输出数据实际长度单元长度
LPOVERLAPPED lpOverlapped // 重叠操作结构指针
);
3 下面的代码改编自MSDN,查看MSDN源码请在MSDN搜索GetDriveGeometry
过滤条件如下
语言:C++
技术:C++库(本机),Win32和COM
DISK_GEOMETRY结构说明
typedef struct _DISK_GEOMETRY {
LARGE_INTEGER Cylinders; // 柱面数
MEDIA_TYPE MediaType; // 介质类型
DWORD TracksPerCylinder; // 每柱面的磁道数
DWORD SectorsPerTrack; // 每磁道的扇区数
DWORD BytesPerSector; // 每扇区的字节数
} DISK_GEOMETRY;
代码如下
BOOL 类名::GetDriveGeometry(DISK_GEOMETRY * pdg)
{
HANDLE hDevice;
BOOL bResult=TRUE;
DWORD cbByteReturned;
hDevice = CreateFile(L"////.//PhysicalDrive0",
0,
FILE_SHARE_READ |
FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
// 输出一个DISK_GEOMETRY结构
if (hDevice == INVALID_HANDLE_VALUE)
{
return (FALSE);
}
bResult = DeviceIoControl(hDevice,
IOCTL_DISK_GET_DRIVE_GEOMETRY,
NULL, 0,
pdg, sizeof(*pdg),
&cbByteReturned,
NULL);
CloseHandle(hDevice);
return (bResult);
}
4 该函数使用方法
DISK_GEOMETRY pdg;
BOOL bResult;
ULONGLONG DiskSize;
bResult = GetDriveGeometry (&pdg);
if (bResult)
{
CString strCylinders;
CString strTracksPerCylinder;
CString strSectorsPerTrack;
CString strBytesPerSector;
CString strDiskSize;
strCylinders.Format(L"Cylinders = %I64d", pdg.Cylinders);
strTracksPerCylinder.Format(L"Tracks per cylinder = %ld", (ULONG) pdg.TracksPerCylinder);
strSectorsPerTrack.Format(L"Sectors per track = %ld", (ULONG) pdg.SectorsPerTrack);
strBytesPerSector.Format(L"Bytes per sector = %ld", (ULONG) pdg.BytesPerSector);
DiskSize = pdg.Cylinders.QuadPart * (ULONG)pdg.TracksPerCylinder *(ULONG)pdg.SectorsPerTrack * (ULONG)pdg.BytesPerSector;
strDiskSize.Format(L"Disk size = %I64d (Bytes) = %I64d (MB)= %I64d (GB)", DiskSize,DiskSize / (1024 * 1024),DiskSize / (1024 * 1024*1024));
AfxMessageBox(strCylinders);
AfxMessageBox(strTracksPerCylinder);
AfxMessageBox(strSectorsPerTrack);
AfxMessageBox(strBytesPerSector);
AfxMessageBox(strDiskSize);
}
以上程序在Windows XP sp3+VC2005下调试通过