实验十:获取磁盘基本信息
一、实验目的
(1).了解磁盘的物理组织。
(2).熟悉Windows 系统如何查看磁盘相关系数。
(3).掌握Windows 系统提供的有关对磁盘操作 API。
二、实验准备
1.相关系数数据结构说明
磁盘基本物理结构原型:
Typedef struct_DISK_GEOMETRY {
LARGE_INTEGER Cylinders ;
MEDIA_TYPE MediaType ;
DWORD TracksPerCylinder ;
DWORD SectorsPerTrack ;
DWORD BytesPerSector ;
} DISK_GEOMETRY ;
成员说明:
(1)Cylinders:磁盘的柱面数。
(2)MediaType:介质类型,如3.5英寸,1.44MB软盘。
(3)TracksPerCylinder :每个柱面的磁道数。
(4)SectorsPerTrack:每个磁道的扇区数。
(5)BytesPerSector:每个扇区的字节数。
2.相关API 函数介绍
(1)文件创建--CreateFile()函数
原型:
HANDLE CreateFile(
LPCTSTE lpFileName, //指向文件名的指针
DWORD dwDesiredAccess, //读/写访问模式
DWORD dwShareMode, //共享模式
LPSECURITY_ATTRIBUTES lpSecurityAttributes, //指向安全属性的指针
DWORD dwCreateionaDisposition, //文件存在标志
DWORD dwFlagsAndAttributes, //文件属性
HANDLE hTemplateFile //指向访问模板文件的句柄
);
(2)获取磁盘的基本信息--DeviceIoControl()函数
原型:
BOOL DeviceIoControl (
HANDLE hDevice, //设备句柄
DWORD dwIoControlCode, //操作控制代码
LPVOID lpInBuffer, //输入数据缓冲区
DWORD nInBufferSize, //输入数据缓冲区大小
LPVOID lpOutBuffer, //输出数据缓冲区
DWORD nOutBufferSize, //输出数据缓冲区大小
LPDWORD lpBytesReturned, //可获取的字节计数
LPOVERLAPPED lpOverlapped, //指向OVERLAPPED结构的指针
);
返回值:
如果函数调用成功,则返回值为非0值。如果函数调用失败,则返回值为0。若要得到更多的错误信息,可调用函数GetLastError()。
三、实验内容
(一)实验内容
编写一个函数,根据给出的驱动器号读取磁盘基本信息,包括磁盘的大小、该磁盘包括多少个扇区,该磁盘有多少个柱面,每个柱面的磁道数、每个磁道的扇区数、每个扇区包含的字节数。
(二)主要代码
// 010.cpp : Defines the entry point for the console application.
#include "stdafx.h"
#include "010.h"
#include "winioctl.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/
// The one and only application object
CWinApp theApp;
using namespace std;
DISK_GEOMETRY disk_info;
HANDLE GetDiskInformation();
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
HANDLE Handle;
Handle=GetDiskInformation();
return(nRetCode);
}
HANDLE GetDiskInformation()
{
char device[]="\\\\.\\C:";
HANDLE FloopyDisk;
DWORD ReturnSize;
DWORD Sector;
double DiskSize;
FloopyDisk=CreateFile(device,
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,OPEN_EXISTING,
FILE_FLAG_RANDOM_ACCESS|FILE_FLAG_NO_BUFFERING,
NULL);
if (FloopyDisk == INVALID_HANDLE_VALUE)
printf("INVALID_HANDLE_VALUE! \n");
if (GetLastError() == ERROR_ALREADY_EXISTS)
printf("Can not Open Disk ! %d\n",GetLastError());
if (!DeviceIoControl(FloopyDisk,
IOCTL_DISK_GET_DRIVE_GEOMETRY,
NULL,0,
&disk_info,50,
&ReturnSize,
(LPOVERLAPPED)NULL))
printf("Open Disk Error! %d\n",GetLastError());
printf("Disk Information:\n");
printf("\t BytesPerSector: %d\n",disk_info.BytesPerSector);
printf("\t SectorPerTrack: %d\n",disk_info.SectorsPerTrack);
printf("\t TracksPerCylinder: %d\n",disk_info.TracksPerCylinder);
printf("\t Cylinder: %d\n", disk_info.Cylinders);
Sector=disk_info.Cylinders.QuadPart*
disk_info.TracksPerCylinder*
disk_info.SectorsPerTrack;
printf("\t There is %d Sectors!\n",Sector);
DiskSize=Sector*disk_info.BytesPerSector;
printf("\t Size of Disk: %4.2f MB\n",(DiskSize)/(1024*1024));
return FloopyDisk;
}
四、实验结果与总结
从实验结果可以看出,对给定的磁盘驱动器中,本实验能正确识别出它每个扇区有512字节,每个磁道有63个扇区,每个柱面有255个磁道,共有5221个柱面。
通过本次实验了解了磁盘主要数据结构DISK_GEOMETRY中每个成员的含义,深入理解了操作系统将设备当做文件处理的特性,理解函数CreateFile()及DeviceIoControl()中每个参数的实际意义并能在本实验中正确使用。
版权声明:本文为qq_44919455原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。