VC写磁盘浏览器buffer的奇怪问题,求解
暮雨朝夕 2011-12-24 03:45:14 ////////
//BYTE bDrive 驱动器号
//LARGE_INTEGER li 磁盘地址信息
//WORD wSectors 读取的大小
//LPBYTE lpSectBuff 数据缓冲区
//////
//return 失败或有错误 返回false
BOOL ReadSectors(BYTE bDrive, LARGE_INTEGER li, WORD wSectors, LPBYTE lpSectBuff)
{
if (bDrive < 0)
return FALSE;
char devName[] = "\\\\.\\PHYSICALDRIVE0";// 0号 物理磁盘
//devName[strlen(devName) - 1] = devName[strlen(devName) - 1] + bDrive;
HANDLE hDev = CreateFile(devName, ////创建文件的名称
GENERIC_READ, //读文件
FILE_SHARE_READ,//共享读
NULL, //缺省安全属性
OPEN_EXISTING, //打开存在文件
0,
NULL);//模板文件为空
if (hDev == INVALID_HANDLE_VALUE) //句柄无效
{
//printf("ok \n");
return 0;
}
SetFilePointer(hDev,//文件句柄
li.LowPart,//起始偏移低32位
&(li.HighPart),//高32位
FILE_BEGIN);
DWORD dwCB;//双字
BOOL bRet = ReadFile(hDev, lpSectBuff, 512 * sizeof(BYTE), &dwCB, NULL);// 读取wSectors个扇区的数据
CloseHandle(hDev);//关闭文件
return bRet;
}
int anNode(NODE *node)
{
//node->address.HighPart = li.HighPart;
//node->address.LowPart = li.LowPart;
////////
//anBuffer(node,li);/// 计算X 分区表的数据
printf("所读地址: %02X%08X\n",node->address.HighPart,node->address.LowPart);
unsigned char buffer[MAX_BUFFER] = {0};// 数据缓冲区
if(ReadSectors(0, node->address, 1, (LPBYTE)buffer)==0)///获得磁盘数据
{
return 1;////结束
}
unsigned int dataL = (unsigned char)buffer[3]*0x1000000+(unsigned char)buffer[2]*0x10000+(unsigned char)buffer[1]*0x100+(unsigned char)buffer[0];
unsigned int dataH = (unsigned char)buffer[7]*0x1000000+(unsigned char)buffer[6]*0x10000+(unsigned char)buffer[5]*0x100+(unsigned char)buffer[4];
unsigned int dataE = (unsigned char)buffer[0x1FF]*0x100+(unsigned char)buffer[0x1FE];
unsigned int param = 0x1C9;////扇区里的偏移量 单位字节
//int param = 441;////扇区里的偏移量 单位字节
//////////
printf("dataL = %08X dataE = %04X \n",dataL,dataE);
if(dataL==0x4E9052EB&&dataH==0x20534654)
{//////// 若为 逻辑分区
node->flag = 0;
}else if(dataE==0xAA55){//分区表
node->flag = 1;
int i=0;/////循环控制
while(i<4)
{
LARGE_INTEGER address;
address.QuadPart = (unsigned char)buffer[param]*0x1000000+(unsigned char)buffer[param-0x1]*0x10000+(unsigned char)buffer[param-0x2]*0x100+(unsigned char)buffer[param-0x3];
node->x[i].address = address;
param += 0x4;
LARGE_INTEGER big;
big.QuadPart = (unsigned char)buffer[param]*0x1000000+(unsigned char)buffer[param-0x1]*0x10000+(unsigned char)buffer[param-0x2]*0x100+(unsigned char)buffer[param-0x3];
node->x[i].big = big;
param += 0xC;
LARGE_INTEGER add;
add.QuadPart = node->x[i].address.QuadPart+node->address.QuadPart;
printf("add = %02X%08X \n",add.HighPart,add.LowPart);
//node.x[i].flag= isTable(add);////分区的 类型
/////////////////////////
printf(" i = %d \n",i);
system("pause");
i++;
}///end of while
/////只是适合本机/////未扩展应用
node->x[0].flag= 0;
node->x[1].flag= 1;
node->x[2].flag=-1;
node->x[3].flag=-1;
}////end of else
else
{
return 0;
}
/////只是适合本机/////未扩展应用
if(node->x[1].flag == 1)
{
LARGE_INTEGER temp ;
temp.HighPart = node->x[1].address.HighPart+node->address.HighPart;
temp.LowPart = node->x[1].address.LowPart+node->address.LowPart;
NODE *next = new NODE[1];
next->flag = 1;
next->address.QuadPart = temp.QuadPart;
next->ahead = node;
node->next = next;
int x = anNode(next);
//////////////////////
printf(" x = %d \n",x);
system("pause");
if(x == 1)
{
next->address.QuadPart = temp.QuadPart - node->ahead->x[1].address.QuadPart;
x = anNode(next);
return 0;
}
}
}/////end of funtion
主要问题是:
递归的时候,发现传过来的地址是对的,但是读出来的buffer数据不是对应位置的。第一次执行时候一切正常,第二次就出了问题。急.急.急.急.急.急.急.求解!!!!!
help!!!!