操作系统实验:获取磁盘基本信息

  • Post author:
  • Post category:其他




实验十:获取磁盘基本信息




一、实验目的

(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()中每个参数的实际意义并能在本实验中正确使用。

images



版权声明:本文为qq_44919455原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。