《操作系统》第二版徐宗元第四章实验3.docx

上传人:大张伟 文档编号:11658577 上传时间:2021-08-28 格式:DOCX 页数:5 大小:72.02KB
返回 下载 相关 举报
《操作系统》第二版徐宗元第四章实验3.docx_第1页
第1页 / 共5页
《操作系统》第二版徐宗元第四章实验3.docx_第2页
第2页 / 共5页
《操作系统》第二版徐宗元第四章实验3.docx_第3页
第3页 / 共5页
《操作系统》第二版徐宗元第四章实验3.docx_第4页
第4页 / 共5页
《操作系统》第二版徐宗元第四章实验3.docx_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《《操作系统》第二版徐宗元第四章实验3.docx》由会员分享,可在线阅读,更多相关《《操作系统》第二版徐宗元第四章实验3.docx(5页珍藏版)》请在三一文库上搜索。

1、4-8-3磁盘I/O API函数应用一 实习要求本实习着重于了解磁盘的物理组织,以及如何通过用户态的程序直接调用磁盘I/O API 函数(DeviceloControl )根据输入的驱动器号读取驱动器中磁盘的基本信 息,在Windows2000环境进行实习。二相关的API介绍1 .获取磁盘的基本信息的磁盘I/O API函数DeviceloControl格式如下:BOOLDeviceloControl( HANDLE hDevice, DWORD dwioControlCode,LPVOID IpInBuffer,DWORD nlnBufferSize,LPVOID IpOutBuffer DW

2、ORD nOutBufferSize,LPDWORD IpBytesReturned , LPOVERLAPPED IpOverlapped ) ; hDevice :所要进行操作的设备的句 柄,它通过调用CreateFile函数来获得。dwioControlCode :指定操作的控制代码。这个值用来 辨别将要执行的指定的操作,以及对哪一种设备进行操作。对磁盘应设置为IOCTL_DISK_GET_DRIVE_GEOMETRYJpInBufer :操作所要的输入数据缓冲区指针,NULL表示不需要输入数据。 nlnBufferSize :指定IpInBuffer所指向的缓冲区的大小(以字节为单位)

3、。.IpOutBuffer :接收操作输出的数据缓冲区指针,NULL表示操作没有产生输出数据。输出数据的缓冲区要足够大,对磁盘它采用固定的数据结构DISK.GEOMETRY格式如下:struct DISK_GEOMETRY unsigned bytesPerSector ; unsigned sectorsPerTrack ;unsigned heads ;unsigned cylinders; nOutBufferSize :指定IpOutBuffer所指向的缓冲区的大小(以字节为单位)。 IpBytesReturned : 指向一个变量,它接收IpOutBuffer所指的缓冲区储存的数据个

4、数。.IpOverlapped :指向一个 OVERLAPPE 结构。返回值:如果函数调用成功,返回值是一个非0值。如果函数调用失败GetLastError函数来获得 相关的错误信息。2.建立文件或打开一个已存在文件API函数CreateFile该函数用来创建或打开下列对象(文件、管 道、目录、邮件插口、控制台、通信资源、磁盘设备等)并返回一个用于读取该对象的句柄。HANDLE CreateFile ( LPCTSTR IpFilename , DWORD dwDesiredAccess,DWORD dwShareMode,LPSECURITY_ATTRIBUTES IpSecurityAtt

5、ributes,DWORD dwCreationDisposition , DWORD dwFlagsAndAttributes,HANDLE hTemplateFile );JpFileName :指向一个以NULL结束的字符串的指针,该字符串用于创建或打开对象、指定对象 名。- dwDesiredAccess :指定对对象的访问类型,一个应用程序可以得到读、写、读写或设备查询访问 等类型,此参数可以为下列值的任意一个组合值:- 0:指定对象的查询访问权限,一个应用程序可以不通过访问设备来查询设备属性。. GENERIJREAD指定对象的读访问,可以读文件的数据且可移动文件中的指针。. GE

6、NERIC_WRITE指定对象的写访问,可以写文件的数据且可以移动文件指针,写访问 GENERIC_WRIT 要与 GENERIC_REA 联合使用。.dwShoreMode:设成 NULL 即可。,IpSecurityAttributes :设成 NULL 即可。 dwCreationDisposition :指定对存在的文件采取哪种措施,且当文件不存在时采用哪种 措施,此函数必须是下列值中的一个:. CREAT_NEW创建一个新文件,如果文件存在,则函数调用失败。. CREAT_ALWAYS创建一个新文件,如果文件存在,函数重写文件且清空现有属性。OPEN_EXISTIN : G打开文件,

7、如果文件不存在,则函数调用失败。.OPEN_ALWAYS如果文件存在,则打开文件。如果文件不存在,则创建一个新文件。,TRUNCATE_EXISTING 丁开文件,一旦文件打开,就被删截掉,从而使文件的大小为0字节,调用函数必须用GENERIC_WRIT访问来打开文件,如果文件不存在,则函数调用失败。dwFlagsAndAttributes :指定文件属性和标志,该参数可取很多种组合,以下示三种:,FILE_FLAG_OVERLAPPED旨导系统对对象进行初始化,以便操作有足够的时间来处理返回ERROR_IO_PENDINGi完成操作时,指定事件被设置为发信号状态。.FILE_FLAG_NO_

8、BUFFERING引导系统打开没有瞬间缓冲或缓存的文件,当与FILE_FLAG_OVERLAPPE结合时,标志给出最大的按时间顺序的操作,因为I/O不依靠内存管理器的时间顺序的操作,但是,因为数据没有在缓存中,一些 I/O操作将长一些。. FILE_FLAG_SEQUENTIAL_SCAN表明文件从开头到结尾按顺序被访问。使用它,系统可优化 文件缓存。访问方式读大文件的应用程序,指定此标志可以增加它的性能。.hTemplateFile :设成 NULL 即可。返回值:如果函数调用成功,返回值为指向指定文件的打开句柄;如果函数调用失败,返回值为INVALID_HANDLE_VALUE三参考源代码

9、:SoftDisklo-1.cpp#include #include #include #include struct Disk /关于Disk结构的定义 HANDLE handle;DISK GEOMETRY disk info;);Disk disk;HANDLE Floppy;static Jnt64 sector;bool flag;Disk physicDisk(char driverLetter);void main(void)char DriverLetter ;选择要查看的磁盘coutvv ”请输入磁盘号:a/c endl ; cinDriverLetter ;/disk =

10、physicDisk(DriverLetter)Disk physicDisk(char driverLetter) / flag = true ;DISK_GEOMETRY* temp = new DISK_GEOMETR ; Ychar device9 = .c:, ;device4 = driverLetter ;Floppy = CreateFile( device, /将要打开的驱动器名GENERIC_READ, 存取的权限FILE_SHARE_READ | FILE_SHARE_WRITE, /共享的权限NULL, 默认属性位OPEN_EXISTING, /创建驱动器的方式0,所创

11、建的驱动器的属性NULL); 指向模板文件的句柄if ( GetLastError() = ERROR_ALREADY_EXISTS ) /如打开失败,返回错误代码coutvv” 不能打开磁盘endl ; coutGetLastError()endl ; flag = false ; return disk ;)DWORD bytereturned ;BOOL Result ;disk.handle = Floppy ;Result = DeviceloControl ( Floppy,IOCTL DISK GET DRIVE GEOMETRY,NULL,0,temp,sizeof(*temp

12、)5&bytereturned,(LPOVERLAPPED)NULL);if(!Result) /如果失败,返回错误代码 |coutvv” 打开失败 endl ;cout错误代码为:GetLastError()endl ;flag = false ;return disk ;)disk.diskjnfo = *temp ; 输出整个物理磁盘的信息coutdriverLetter 盘有:Hendl ;coutn 柱面数为:(unsigned long)disk.disk_info.Cylinders.QuadPartendl cout 每柱面的 磁道数为:disk.disk_info.Track

13、sPerCylinderendl ;coutvv ” 每磁道的扇区数为:(,disk.disk_info.SectorsPerTrackendl ;cout 每扇区的字节数为:,disk.disk_info.BytesPerSectorendl ;sector = disk.diskjnfo.Cylinders.QuadPart* (disk.diskJnfo.TracksPerCylinder)*(disk.diskjnfo.SectorsPerTrack);double DiskSize =(double)disk.disk_info.Cylinders.QuadPart * / (dis

14、k.diskJnfo.TracksPerCylinder) *(disk.diskjnfo.SectorsPerTrack) *(disk.diskjnfo.BytesPerSector) ; coutdriverLetter, 盘所在磁盘总共有vv(long)sectorvv 个扇区endl ; coutvv”磁盘大为:DiskSize/(1024*1024)MB endl ; delete temp ; return disk ; )四-例程序的结果请输入磁盘号:a/c aa盘有:柱面数为:80每柱面的磁道数为:2每磁道的扇区数为:18每扇区的字节数为:512 a盘所在磁盘总共有2880个扇区磁盘大为:1.40625MB五讨论如输入磁盘号为C,显示的磁盘信息是整个硬盘信息,而不是c盘分区的信息。如输入磁盘号为d,显示的磁盘信息与如输入磁盘号为c显示的磁盘信息相同。用磁盘 I/O API函数读出的磁盘信息是从硬盘的主引导区得到。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1