在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);
各参数说明如下:
Ø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
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;
}