分类: C/C++
2009-03-02 22:29:54
在Windows下把所有的设备都当作文件进行操作,对磁盘的某个扇区读写,可以使用CreateFile()函数。这里不是用“DISK
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);
各参数说明如下:
Ø hFile:CreatFile()函数返回的文件(设备)句柄。
Ø 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;
}