vc++实现windows下直接读写磁盘扇区

vc++实现windows下直接读写磁盘扇区

ID:16195435

大小:56.50 KB

页数:5页

时间:2018-08-08

vc++实现windows下直接读写磁盘扇区_第1页
vc++实现windows下直接读写磁盘扇区_第2页
vc++实现windows下直接读写磁盘扇区_第3页
vc++实现windows下直接读写磁盘扇区_第4页
vc++实现windows下直接读写磁盘扇区_第5页
资源描述:

《vc++实现windows下直接读写磁盘扇区》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、VC++实现Windows下直接读写磁盘扇区  摘要:本文主要介绍了在Windows下对磁盘扇区数据的直接读写访问方法,并在此基础上实现了对磁盘扇区内容的查看、基于扇区的数据备份与恢复、对磁盘信息的彻底擦除等一些有着实际意义的应用。  关键字:磁盘访问;扇区;Windows;VC++  引言  由于Windows操作系统在很大程度上采取了访问安全保护机制(例如,在Windows操作系统下不能直接访问物理内存、不能使用各种DOS、BIOS中断等等),使得广大程序设计人员在长时间的开发过程中不知不觉地逐渐养成了这样的潜意识——在W

2、indows操作系统下直接操纵硬件设备是极端困难和非常烦琐的,并将其看作Windows编程的一个禁区。尽管在大多数场合下这样的论断还算是贴切,但也并非对所有的硬件设备访问都那么困难。其实Windows在采取“实保护”措施的同时也提供了另外的一种有别于在DOS下访问硬件设备的方法,即把所有的硬件设备全部看做“文件”,并允许按照对文件的读写方式来对其进行数据存取访问。撰写本文的另外一个目的也就是帮助读者打消在Windows环境下对硬件编程的恐惧心理。  对磁盘扇区数据的访问  前面已经提过,在Windows下把所有的设备当作文件进

3、行操作。如果对串口进行编程或许不少读者还比较熟悉:对于串行端口1、2,可以用”COM1”、”COM2”作为参数调用CreateFile()函数,这里的”COM1”、”COM2”即以文件存放路径的方式指出了要操作的硬件设备。但是如果需要对磁盘的某个扇区进行读写,可能不少读者不会想到使用CreateFile()函数或是不知如何使用。其实,与对串行端口的访问类似,需要用与文件存放路径相类似的方式指出要操作的硬件设备(硬盘)。但是这里并不是用“DISK1”、“DISK2”等去标识某一块物理存在的硬盘。由于逻辑扇区是存在于逻辑分区上的,

4、因此这里需要以某种特定的格式来指定需要访问的磁盘逻辑分区。对于逻辑分区X,其格式为”\.X:”。HANDLECreateFile(LPCTSTRlpFileName,DWORDdwDesiredAccess,DWORDdwShareMode,LPSECURITY_ATTRIBUTESlpSecurityAttributes,DWORDdwCreationDisposition,DWORDdwFlagsAndAttributes,HANDLEhTemplateFile);  CreateFile()函数原型如上所示,由于访问

5、的是事实上已经存在的磁盘扇区,因此只能以OPEN_EXISTING标志设置dwCreationDisposition参数指出将要打开已经存在的文件(设备)。至于其他参数的使用与操作普通文件时的用法相同。通过CreateFile()打开的是整个磁盘逻辑分区,而要操作的是该分区的某些扇区,因此还要通过SetFilePointer()函数以文件操作的方式把指针移到要操作的磁盘扇区开始处。SetFilePointer()函数原型为:DWORDSetFilePointer(HANDLEhFile,LONGlDistanceToMove,

6、PLONGlpDistanceToMoveHigh,DWORDdwMoveMethod);  参数hFile为CreateFile()返回的文件(设备)句柄;lDistanceToMove和lpDistanceToMoveHigh指出了要设置偏移量的低端和高端部分;dwMoveMethod指出文件指针从何处开始移动,可能的选项有FILE_START(从文件开始)、FILE_END(从文件结尾)和FILE_CURRENT(从文件当前位置)。  在定位到要访问的扇区开始位置后就可以通过ReadFile()或WriteFile()函

7、数实施相应的读写访问了,具体操作与文件读写并没有什么太大的差别。最后,在完成访问操作后以CloseHandle()关闭文件句柄释放资源,从而完成一次完整的磁盘扇区数据访问操作。下面给出具体的读、写处理过程:BOOLCDirectAccessHDDlg::WriteSectors(BYTEbDrive,DWORDdwStartSector,WORDwSectors,LPBYTElpSectBuff)//对磁盘扇区数据的写入{ if(bDrive==0)return0; chardevName[]="\\.\A:"; dev

8、Name[4]='A'+bDrive-1; HANDLEhDev=CreateFile(devName,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL); if(hDev==INVALID_HANDLE_VAL

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。