VC获取硬盘的参数

 

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++(本机)Win32COM

 

 

 

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下调试通过

 

你可能感兴趣的:(struct,File,null,Integer,disk,attributes)