android sd卡 物理扇区读取,磁盘、SD卡、移动磁盘物理扇区读写

在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;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值