MyException - 我的异常网
当前位置:我的异常网» C语言 » C里为什么找不到<bois.h> 这个文件了呢解决办

C里为什么找不到<bois.h> 这个文件了呢解决办法

www.MyException.Cn  网友分享于:2013-04-04  浏览:25次
C里为什么找不到<bois.h> 这个文件了呢
C里为什么找不到 <bois.h>   这个文件了呢
请教:我想读磁盘扇区数据

------解决方案--------------------
VC++实现Win2000下直接读写磁盘扇区
来源: STCore 收集整理  发布日期:2006-08-03 进入论坛

  引言
  由于Windows 操作系统在很大程度上采取了访问安全保护机制(例如,在Windows操作系统下不能直接访问物理内存、不能使用各种DOS、BIOS中断等等),使得广大程序设计人员在长时间的开发过程中不知不觉地逐渐养成了这样的潜意识——在Windows操作系统下直接操纵硬件设备是极端困难和非常烦琐的,并将其看作Windows编程的一个禁区。尽管在大多数场合下这样的论断还算是贴切,但也并非对所有的硬件设备访问都那么困难。其实Windows在采取“实保护”措施的同时也提供了另外的一种有别于在DOS下访问硬件设备的方法,即把所有的硬件设备全部看做“文件”,并允许按照对文件的读写方式来对其进行数据存取访问。撰写本文的另外一个目的也就是帮助读者打消在Windows环境下对硬件编程的恐惧心理。
  
  对磁盘扇区数据的访问
  前面已经提过,在Windows 下把所有的设备当作文件进行操作。如果对串口进行编程或许不少读者还比较熟悉:对于串行端口1、2,可以用”COM1”、”COM2”作为参数调用 CreateFile()函数,这里的”COM1”、”COM2”即以文件存放路径的方式指出了要操作的硬件设备。但是如果需要对磁盘的某个扇区进行读写,可能不少读者不会想到使用CreateFile()函数或是不知如何使用。其实,与对串行端口的访问类似,需要用与文件存放路径相类似的方式指出要操作的硬件设备(硬盘)。但是这里并不是用“DISK1”、“DISK2”等去标识某一块物理存在的硬盘。由于逻辑扇区是存在于逻辑分区上的,因此这里需要以某种特定的格式来指定需要访问的磁盘逻辑分区。对于逻辑分区X,其格式为”\\.\X:”。
  
  HANDLE CreateFile( LPCTSTR lpFileName,
  DWORD dwDesiredAccess,
  DWORD dwShareMode,
  LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  DWORD dwCreationDisposition,
  DWORD dwFlagsAndAttributes,
  HANDLE hTemplateFile );
  
  CreateFile()函数原型如上所示,由于访问的是事实上已经存在的磁盘扇区,因此只能以OPEN_EXISTING标志设置dwCreationDisposition参数指出将要打开已经存在的文件(设备)。至于其他参数的使用与操作普通文件时的用法相同。
  通过CreateFile()打开的是整个磁盘逻辑分区,而要操作的是该分区的某些扇区,因此还要通过SetFilePointer()函数以文件操作的方式把指针移到要操作的磁盘扇区开始处。SetFilePointer()函数原型为:
  
  DWORD SetFilePointer(HANDLE hFile,
  LONG lDistanceToMove,
  PLONG lpDistanceToMoveHigh,
  DWORD dwMoveMethod);
  
  参数hFile为CreateFile()返回的文件(设备)句柄;lDistanceToMove和lpDistanceToMoveHigh指出了要设置偏移量的低端和高端部分;dwMoveMethod指出文件指针从何处开始移动,可能的选项有FILE_START(从文件开始)、 FILE_END(从文件结尾)和FILE_CURRENT(从文件当前位置)。
  
  在定位到要访问的扇区开始位置后就可以通过 ReadFile()或WriteFile()函数实施相应的读写访问了,具体操作与文件读写并没有什么太大的差别。最后,在完成访问操作后以 CloseHandle()关闭文件句柄释放资源,从而完成一次完整的磁盘扇区数据访问操作。下面给出具体的读、写处理过程:
  
  BOOL CDirectAccessHDDlg::WriteSectors(BYTE bDrive, DWORD dwStartSector, WORD wSectors, LPBYTE lpSectBuff)
  // 对磁盘扇区数据的写入
  {
  if (bDrive == 0) return 0;
  char devName[] = "\\\\.\\A: ";
  devName[4] = 'A ' + bDrive - 1;
  HANDLE hDev = CreateFile(devName, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
  if (hDev == INVALID_HANDLE_VALUE) return 0;
  SetFilePointer(hDev, 512 * dwStartSector, 0, FILE_BEGIN);
  DWORD dwCB;
  BOOL bRet = WriteFile(hDev, lpSectBuff, 512 * wSectors, &dwCB, NULL);
  CloseHandle(hDev);
  return bRet;
  }
  BOOL CDirectAccessHDDlg::ReadSectors(BYTE bDrive, DWORD dwStartSector, WORD wSectors, LPBYTE lpSectBuff)
  // 对磁盘扇区数据的读取
  {
  if (bDrive == 0) return 0;
  char devName[] = "\\\\.\\A: ";
  devName[4] = 'A ' + bDrive - 1;
  HANDLE hDev = CreateFile(devName, GENERIC_READ, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
  if (hDev == INVALID_HANDLE_VALUE) return 0;
  SetFilePointer(hDev, 512 * dwStartSector, 0, FILE_BEGIN);
  DWORD dwCB;
  BOOL bRet = ReadFile(hDev, lpSectBuff, 512 * wSectors, &dwCB, NULL);
  CloseHandle(hDev);
  return bRet;
  }
  
  磁盘扇区数据直接读写技术的应用
  上一步实现了对磁盘扇区数据进行读写访问的核心处理过程。在此基础上可以完成一些有实用价值的应用,例如,可以实现对指定磁盘分区中指定起止扇区的内容查看:
  
  if (ReadSectors(uDiskID, m_uFrom, (UINT)dwSectorNum, bBuf) == FALSE) {
  MessageBox( "所选磁盘分区不存在! ", "错误 ", MB_OK | MB_ICONERROR);
  return;
  }
  
  为了方便数据的显示,可做如下处理以完成格式转换等工作:
  
  for (DWORD i = 0; i < dwSectorNum * 512; i++) {
  sprintf(cBuf, "%s%02X ", cBuf, bBuf[i]);
  if ((i % 512) == 511)
  sprintf(cBuf, "%s\r\n第%d扇区\r\n ", cBuf, (int)(i / 512) + m_uFrom);
  if ((i % 16) == 15)

文章评论

如何成为一名黑客
如何成为一名黑客
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
旅行,写作,编程
旅行,写作,编程
总结2014中国互联网十大段子
总结2014中国互联网十大段子
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
每天工作4小时的程序员
每天工作4小时的程序员
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
一个程序员的时间管理
一个程序员的时间管理
那些争议最大的编程观点
那些争议最大的编程观点
中美印日四国程序员比较
中美印日四国程序员比较
 程序员的样子
程序员的样子
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
程序员应该关注的一些事儿
程序员应该关注的一些事儿
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
程序员必看的十大电影
程序员必看的十大电影
程序员都该阅读的书
程序员都该阅读的书
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
老程序员的下场
老程序员的下场
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
漫画:程序员的工作
漫画:程序员的工作
Java程序员必看电影
Java程序员必看电影
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
鲜为人知的编程真相
鲜为人知的编程真相
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
为什么程序员都是夜猫子
为什么程序员都是夜猫子
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
代码女神横空出世
代码女神横空出世
程序员的鄙视链
程序员的鄙视链
我的丈夫是个程序员
我的丈夫是个程序员
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
10个调试和排错的小建议
10个调试和排错的小建议
编程语言是女人
编程语言是女人
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有