WinCE下的物理扇区读写
首先引用头文件:
#include
"D://WINCE500//PUBLIC//COMMON//OAK//INC//Diskio.h"
看看你的PB是如何安装的,没有安装PB的朋友,给我留言吧,我把上述文件发给你。
打开磁盘:
hFile = CreateFile(_T("DSK2:"), GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
注意上述函数中的几个参数使用。打开磁盘后还要设置准备要读写的扇区位置,如下:
SetFilePointer(hFile,sec_num * 512,0,FILE_BEGIN);
自己查一下MSDN上关于该函数的说明,要注意访问磁盘的位置一定是512的倍数。
写操作:
SG_REQ sr;
memset(&sr,0x00,sizeof(SG_REQ));
sr.sr_start = sec_st; //
从第几个扇区开始访问
sr.sr_num_sec = sec_num; //
访问扇区的个数
sr.sr_num_sg = 1;
sr.sr_status = 0; //ERROR_SUCCESS;
sr.sr_callback = NULL;
sr.sr_sglist[0].sb_buf = (LPBYTE)pBuf; //
要写的内容,自己指定
sr.sr_sglist[0].sb_len = len; //
必须是的倍数,一个扇区字节
//
写入
DWORD dRet = 0;
ret = DeviceIoControl(hFile,DISK_IOCTL_WRITE,&sr,sizeof(SG_REQ),0,0,&dRet,NULL);
读操作:
和写操作类似,只是改动:
………….
sr.sr_sglist[0].sb_buf = (LPBYTE)pBuf; //
要读的内容,自己指定缓存
………….
ret = DeviceIoControl(hFile,DISK_IOCTL_READ,&sr,sizeof(SG_REQ),0,0,&dRet,NULL);
另外在WinCE下访问缓冲需注意字节个数问题,涉及UNICODE,不明白的朋友,声明空间时统统使用:
BYTE buf[3000]; //
声明3000个字节的空间
BYTE *pBuf = NULL; //
声明指针