操作系统实验10 获取磁盘基本信息
实验10 获取磁盘基本信息一、实验目的(1) 了解磁盘的物理组织。(2) 熟悉Windows 系统如何查看磁盘相关系数。(3) 掌握Windows 系统提供的有关对磁盘操作 API。二、实验准备磁盘基本物理结构原型:Typedef struct_DTSK_GEOMETRY {LARGE_INTEGERCylinders ;MEDIA_TYPE MediaType ;DWORDTracksPerCy
·
实验10 获取磁盘基本信息
一、实验目的
(1) 了解磁盘的物理组织。
(2) 熟悉Windows 系统如何查看磁盘相关系数。
(3) 掌握Windows 系统提供的有关对磁盘操作 API。
二、实验准备
磁盘基本物理结构原型:
Typedef struct_DTSK_GEOMETRY {
LARGE_INTEGER Cylinders ;
MEDIA_TYPE MediaType ;
DWORD TracksPerCylinder ;
DWORD SectorsPerTrack ;
DWORD BytesPerSector ;
} DISK_GEOMETRY ;
CreateFile() 文件创建:用于打开磁盘驱动器并返回一个文件句柄
DeviceIoControl() 获取磁盘的基本信息
GetLastError() 得到更多的错误信息
三、实验内容
(一)实验内容
编写一个函数,根据给出的驱动器号读取磁盘基本信息,包括键盘的大小、该磁盘包括多少个扇区,该磁盘有多少个柱面,
每个柱面的磁道数、每个磁道的扇区数、每个扇区包含的字节数。
(二)主要代码
// 10.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "winioctl.h"
#include "10.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
DISK_GEOMETRY disk_info;
HANDLE GetDiskInformation(char drivername);
BOOL SectorRead(HANDLE Handle);
BOOL SectorWrite(HANDLE Handle);
/////////////////////////////////////////////////////////////////////////////
// The one and only application object
CWinApp theApp;
using namespace std;
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode=0;
HANDLE Handle;
//调用自定义函数获取磁盘C信息
Handle=GetDiskInformation('C');
return nRetCode;
}
//自定义获取磁盘信息函数
HANDLE GetDiskInformation(char drivername)
{
char device[]="\\\\.\\C:";
device[4]=drivername;
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_VALVE!\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("\tBytesPerSector:%d\n",disk_info.BytesPerSector);
printf("\tSectorPerTrack:%d\n",disk_info.SectorsPerTrack);
printf("\tTrackPerCylinder:%d\n",disk_info.TracksPerCylinder);
printf("\tCylinder: %d\n", disk_info.Cylinders);
Sector= disk_info. Cylinders.QuadPart* disk_info. TracksPerCylinder* disk_info. SectorsPerTrack;
printf("\tThere is %d Sectors!\n", Sector);
DiskSize=Sector*disk_info. BytesPerSector;
printf("\tSize of Disk: %4.2fMB\n",(DiskSize)/(1024*1024));
return FloopyDisk;
}
四、实验结果与总结(遇到的问题及解决方法)
总结:由于实验要使用的主要数据结构DISK_GEOMETRY 是由系统提供的,其声明在#include "winioctl.h"中,因此要将其加入到
实验程序的头文件说明中,否则程序编译时系统将无法识别DISK_GEOMETRY结构。
遇到的问题:一开始直接将#include "winioctl.h"放在了代码最开始的部分,出现编译错误,开始尝试修改,发现需将#include
"winioctl.h"放在#include "stdafx.h"后,方可编译运行成功。
实验结果截图:
更多推荐
所有评论(0)