Chinaunix首页 | 论坛 | 博客

  • 博客访问: 474024
  • 博文数量: 86
  • 博客积分: 2010
  • 博客等级: 大尉
  • 技术积分: 878
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-06 14:11
文章分类

全部博文(86)

文章存档

2010年(12)

2009年(60)

2008年(14)

我的朋友

分类: C/C++

2009-03-02 22:29:54

Windows下把所有的设备都当作文件进行操作,对磁盘的某个扇区读写,可以使用CreateFile()函数。这里不是用“DISK1、“DISK2等去标识某一个物理存在的硬盘,这里需要以一定的格式指定所需访问的磁盘分区。对于逻辑分区X,其格式为“\\.\X”。

CreateFile()函数的原型如下:

HANDLE CreatFile(

LPCTSTR lpFileName,

DWord dwDesiredAccess,

DWORD dwShareMode,

LPSECURITY_ATTRIBUTES lpSecurityAttributes,

Dword dwCreationDisposition,

DWORD dwFlagsAndAttributes,

HANDLE hTemplateFile );

各参数说明如下:

Ø         lpFileName:所要访问的磁盘分区,格式为“\\.\X”。

Ø         dwDesiredAccess:写磁盘设置为GENERIC_WRITE,读磁盘设置为GENERIC_READ

Ø         dwShareMode:读写磁盘均设置为FILE_SHARE_WRITE

Ø         LpSecurityAttributes:读写磁盘均设置为NULL

Ø         DwCreationDisposition:由于访问的是事实上已经存在的磁盘扇区,因此只能以OPEN_EXISTING标志设置dwCreationDisposition参数指出将要打开已经存在的文件(设备)。

Ø         dwFlagsAndAttributes读写磁盘均设置为0

Ø         HTemplateFile:读写磁盘均设置为NULL

通过CreateFile()打开的是整个磁盘逻辑分区,如果要操作该分区的某些扇区,还要通过SetFilePointer()函数以文件操作的方式把指针移到要操作的磁盘扇区开始处。

SetFilePointer()函数原型如下:

DWORD SetFilePointer(

HANDLE hFile,

LONG lDistanceToMove,

PLONG lpDistanceToMoveHigh,

DWORD dwMoveMethod);

各参数说明如下:

Ø         hFileCreatFile()函数返回的文件(设备)句柄。

Ø         lDistanceToMove:指出要设置偏移量的低端部分。

Ø         lpDistanceToMoveHigh:指出要设置偏移量的高端部分。

Ø         dwMoveMethod:指出文件指针从何处开始移动,可能的选项有FILE_START(从文件开始)、FILE_END(从文件结尾)和FILE_CURRENT(从文件当前位置)。

在定位到要访问的扇区开始位置后就可以通过ReadFile()或WriteFile()函数实施相应的读写访问了,具体操作与文件读写并没有什么太大的差别。

ReadFile()函数原型如下:

BOOL ReadFile(

HANDLE hfile,

PVOID pvBuffer,

DWORD nNumBytesToRead,

PDWORD pdwNumBytes,

OVERLAPPED* pOverlapped);

各参数说明如下:

Ø         hfile:标识了你想访问的设备的句柄,由SetFilePointer()设置。

Ø         pvBuffer:指向用于读出设备数据的缓冲区。

Ø         nNumBytesToRead:告诉ReadFile要从设备中读出多少字节。

Ø         pdwNumByte:指定一个DWORD的地址,函数对该地址填写输入设备的成功的字节数。

Ø         pOverlapped:在进行同步I/O时应该是NULL

WriteFile()函数原型如下:

BOOL WriteFile(

HANDLE hfile,

CONST VOID  *pvBuffer,

DWORD nNumBytesToWrite,

PDWORD pdwNumBytes,

OVERLAPPED* pOverlapped);

参数与ReadFile()类似:

Ø         hfile:标识了你想访问的设备的句柄,由SetFilePointer()设置。

Ø         pvBuffer:指向用于写入设备的数据的缓冲区。

Ø         nNumBytesToWrite:告诉WriteFile要写入设备多少字节。

Ø         pdwNumBytes:指定一个DWORD的地址,函数对该地址填写输出设备的成功的字节数。

Ø         pOverlapped:在进行同步I/O时应该是NULL

下面是一段用VC编写的读取磁盘任意扇区的测试程序

#include     

#include     

#include  

#include  

#include  

void main(){

       DWORD StartSector,BufferSize;

       char drivename[]="\\\\.\\A:";

       char b;

       cout<<"输入盘符('F'输入'F')"<

       cin>>b;

       drivename[4]=b;

       cout<<"输入读取的扇区号"<

       cin>>StartSector;

     BufferSize=BufferSize*512;

       unsigned char buffer[512]={0};

HANDLE hDev=CreateFile(drivename,GENERIC_READ,FILE_SHARE_WRITE,0,OPEN_EXISTING,0,0);

       SetFilePointer(hDev,StartSector*512,0,FILE_BEGIN);

       DWORD dwCB;

       ReadFile(hDev,buffer,512,&dwCB,0);

       CloseHandle(hDev);

       cout<<"扇区数据"<

       for(DWORD i=1;i<513;i++){

              cout << hex << (unsigned int)(unsigned char)buffer[i-1]<<"  ";

              if(i%16==0){

                     cout<

              }

       }

       int a;

       cout<<"按任意键结束"<

              cin>>a;

}

阅读(4163) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~