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!!!!
...全文
42 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
暮雨朝夕 2011-12-24
  • 打赏
  • 举报
回复

////////
//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);////分区的 类型
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);;
if(x == 1)
{
next->address.QuadPart = temp.QuadPart - node->ahead->x[1].address.QuadPart;
x = anNode(next);

return 0;
}
}

}/////end of funtion



主要问题是:
递归的时候,发现传过来的地址是对的,但是读出来的buffer数据不是对应位置的。第一次执行时候一切正常,第二次就出了问题。急.急.急.急.急.急.急.求解!!!!!
help!!!!

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧