⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 do_diskdlg.cpp

📁 用于查看FAT表
💻 CPP
📖 第 1 页 / 共 4 页
字号:
for(i=0;i <4 ;i++){
  if(*(DWORD*)&cBuf[0x1be+12+i*16]==0)break;
  wsprintf(mid,"    偏移0自举标志%x(80为活动分区)\r\n",cBuf[0x1be+i*16]);
  strcat(pinf,mid);
  wsprintf(mid,"    偏移1起始磁头号%x\r\n",cBuf[0x1be+1+i*16]);
  strcat(pinf,mid);
  wsprintf(mid,"    偏移2起始扇区号%x\r\n",cBuf[0x1be+2+i*16]);
  strcat(pinf,mid);
  wsprintf(mid,"    偏移3起始磁道号%x\r\n",cBuf[0x1be+3+i*16]);
  strcat(pinf,mid);
  CString form;
  if(cBuf[0x1be+4+i*16]==5&&cBuf[0x1be+4+i*16]==0xf)isExtend=TRUE;//存在扩展分区
  else isExtend=FALSE;
  if(cBuf[0x1be+4+i*16]==0)form="非法";
  else if(cBuf[0x1be+4+i*16]==1)form="FAT12";
  else if(cBuf[0x1be+4+i*16]==2)form="XENIX root";
  else if(cBuf[0x1be+4+i*16]==3)form="XENIX usr";
  else if(cBuf[0x1be+4+i*16]==4)form="FAT16 <32M";
  else if(cBuf[0x1be+4+i*16]==5)form="Extended";
  else if(cBuf[0x1be+4+i*16]==6)form="FAT16";
  else if(cBuf[0x1be+4+i*16]==7)form="NTFS OR HPFS"; 
  else if(cBuf[0x1be+4+i*16]==8)form="AIX";
  else if(cBuf[0x1be+4+i*16]==9)form="AIX BOOTABLE";
  else if(cBuf[0x1be+4+i*16]==0xb)form="FAT32";
  else if(cBuf[0x1be+4+i*16]==0xc)form="FAT32";
  else if(cBuf[0x1be+4+i*16]==0xe)form="FAT16";
  else if(cBuf[0x1be+4+i*16]==0xf)form="EXTENDED(>8G)";
  else form="其它,见书38页"; 
 
  wsprintf(mid,"    偏移4为分区格式:%s\r\n",(char*)form.GetBuffer(0));
  strcat(pinf,mid);
  wsprintf(mid,"    偏移5终止磁头号%x\r\n",cBuf[0x1be+5+i*16]);
  strcat(pinf,mid);
  wsprintf(mid,"    偏移6终止扇区号%x\r\n",cBuf[0x1be+6+i*16]);
  strcat(pinf,mid);  
  wsprintf(mid,"    偏移7终止磁道号%x\r\n",cBuf[0x1be+7+i*16]);
  strcat(pinf,mid);  
  wsprintf(mid,"    偏移8--11本分区前已用扇区%X\r\n",*((DWORD*)&cBuf[0x1be+8+i*16]));
  hadSector[2]=*((DWORD*)&cBuf[0x1be+8+i*16]);
  befor[2]=*((DWORD*)&cBuf[0x1be+12+i*16]);
  strcat(pinf,mid);  
  wsprintf(mid,"    偏移12--15本分区总扇区数%X\r\n",*((DWORD*)&cBuf[0x1be+12+i*16]));
  strcat(pinf,mid); 
  strcat(pinf,">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\r\n");
  }
  }

  hDev = CreateFile(driver, GENERIC_READ, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
  if (hDev == INVALID_HANDLE_VALUE){
      m_EData.SetWindowText("初始化磁盘失败");
	  return  ;
  }
  lo=UInt32x32To64(0x1389DB0+0x17723A0,512);
  low=(DWORD)lo;
  high=(long)(lo>>32);
  SetFilePointer(hDev,low , &high, FILE_BEGIN);
  memset(cBuf,0,512);
   bRet = ReadFile(hDev, cBuf, 512 , &dwCB, NULL);
  if(bRet==FALSE){
      m_EData.SetWindowText("读磁盘失败11");
	  return  ;
  }
  CloseHandle(hDev);
for(j = 0; j < 32; j++) {
  pm=j*16;
  low=((DWORD)pm);
  high=(long)(pm>>32);
  memset(line,0,20);

  sprintf(aword,"%x",low);
  li=strlen(aword);
  for( p=0;p<8-li;p++){
   line[p]='0';
  }
  strcat(line,aword);
  strcat(line,"| ");
  strcat(pinf,line);
 
for (i = 0; i < 16; i++) {
  memset(ap,0,4);
  c=cBuf[j*16+i+n*512];
  r=c&0x000000f0;
  r>>=4;
  if(r>9)ap[0]='A'+(char)(r-10);
  else ap[0]='0'+(char)r;

  r=c&0x0000000f;
  if(r>9)ap[1]='A'+(char)(r-10);
  else ap[1]='0'+(char)r;
  strcat(pinf,ap);
  if(i==7)pinf[strlen(pinf)]='-';
  else strcat(pinf," ");
}

  strcat(pinf,"|");
for(int k=0;k<16;k++){
  c=cBuf[j*16+k+n*512];
  if(c>=0x20&&c<0x7F)pinf[strlen(pinf)]=c;
  else pinf[strlen(pinf)]='.';
}
 
  strcat(pinf,"\r\n");
}
  strcat(pinf,"        -----------------------------------------------------------\r\n");


//显示属性
 
  strcat(pinf,"    从偏移0x1BE开始为硬盘分区表\r\n");
  strcat(pinf,"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\r\n");
for(i=0;i <4 ;i++){
  if(*(DWORD*)&cBuf[0x1be+12+i*16]==0)break;
  wsprintf(mid,"    偏移0自举标志%x(80为活动分区)\r\n",cBuf[0x1be+i*16]);
  strcat(pinf,mid);
  wsprintf(mid,"    偏移1起始磁头号%x\r\n",cBuf[0x1be+1+i*16]);
  strcat(pinf,mid);
  wsprintf(mid,"    偏移2起始扇区号%x\r\n",cBuf[0x1be+2+i*16]);
  strcat(pinf,mid);
  wsprintf(mid,"    偏移3起始磁道号%x\r\n",cBuf[0x1be+3+i*16]);
  strcat(pinf,mid);
  CString form;
  if(cBuf[0x1be+4+i*16]==5&&cBuf[0x1be+4+i*16]==0xf)isExtend=TRUE;//存在扩展分区
  else isExtend=FALSE;
  if(cBuf[0x1be+4+i*16]==0)form="非法";
  else if(cBuf[0x1be+4+i*16]==1)form="FAT12";
  else if(cBuf[0x1be+4+i*16]==2)form="XENIX root";
  else if(cBuf[0x1be+4+i*16]==3)form="XENIX usr";
  else if(cBuf[0x1be+4+i*16]==4)form="FAT16 <32M";
  else if(cBuf[0x1be+4+i*16]==5)form="Extended";
  else if(cBuf[0x1be+4+i*16]==6)form="FAT16";
  else if(cBuf[0x1be+4+i*16]==7)form="NTFS OR HPFS"; 
  else if(cBuf[0x1be+4+i*16]==8)form="AIX";
  else if(cBuf[0x1be+4+i*16]==9)form="AIX BOOTABLE";
  else if(cBuf[0x1be+4+i*16]==0xb)form="FAT32";
  else if(cBuf[0x1be+4+i*16]==0xc)form="FAT32";
  else if(cBuf[0x1be+4+i*16]==0xe)form="FAT16";
  else if(cBuf[0x1be+4+i*16]==0xf)form="EXTENDED(>8G)";
  else form="其它,见书38页"; 
 
  wsprintf(mid,"    偏移4为分区格式:%s\r\n",(char*)form.GetBuffer(0));
  strcat(pinf,mid);
  wsprintf(mid,"    偏移5终止磁头号%x\r\n",cBuf[0x1be+5+i*16]);
  strcat(pinf,mid);
  wsprintf(mid,"    偏移6终止扇区号%x\r\n",cBuf[0x1be+6+i*16]);
  strcat(pinf,mid);  
  wsprintf(mid,"    偏移7终止磁道号%x\r\n",cBuf[0x1be+7+i*16]);
  strcat(pinf,mid);  
  wsprintf(mid,"    偏移8--11本分区前已用扇区%X\r\n",*((DWORD*)&cBuf[0x1be+8+i*16]));
  hadSector[2]=*((DWORD*)&cBuf[0x1be+8+i*16]);
  befor[2]=*((DWORD*)&cBuf[0x1be+12+i*16]);
  strcat(pinf,mid);  
  wsprintf(mid,"    偏移12--15本分区总扇区数%X\r\n",*((DWORD*)&cBuf[0x1be+12+i*16]));
  strcat(pinf,mid); 
  strcat(pinf,">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\r\n");
  }
  


  m_EData.SetWindowText(pinf);
//  form.Format("%x,%x--%x,%x--%x,%x",hadSector[0],befor[0],hadSector[1],befor[1],hadSector[2],befor[2]);
//  ::MessageBox(0,form,NULL,MB_OK);
}

void CDo_DiskDlg::OnBfat1() 
{
CString d;
int sel=m_CDriver.GetCurSel();
if(sel==CB_ERR)return;
m_CDriver.GetLBText(sel,d);
if(d.Find("磁盘")==-1){
    AfxMessageBox("非硬盘,退出");
	return;
};

ULONGLONG  lo=0;
disk_inf.d=((char*)d.GetBuffer(0))[0];
char driver[]="\\\\.\\A:";
driver[4]=disk_inf.d;
DWORD dwCB;
HANDLE hDev = CreateFile(driver, GENERIC_READ, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (hDev == INVALID_HANDLE_VALUE) {
	AfxMessageBox("Create Error");
	return;  };
SetFilePointer(hDev,0 , NULL, FILE_BEGIN);
memset(cBuf,0,512*10);
BOOL bRet = ReadFile(hDev, cBuf, 512 , &dwCB, NULL);
if(bRet==FALSE){
   AfxMessageBox("读盘失败");
   return;
}

 disk_inf.bytePerSector=*(signed short int*)(cBuf+0x0b)&0xffff;
 disk_inf.secPerCluster=(char)cBuf[0x0d];
 disk_inf.resSec=*(signed short int*)(&cBuf[0x0e])&0xffff;
 disk_inf.secPerCylin=*(signed short int*)(&cBuf[0x18])&0xffff;
 disk_inf.secTotal=*(DWORD*)(&cBuf[0x20]);
 disk_inf.FATSecnum=*(DWORD*)(&cBuf[0x24]);
 disk_inf.FDTstart=*(DWORD*)(&cBuf[0x2c]);
 
 SetFilePointer(hDev,512*disk_inf.resSec, NULL, FILE_BEGIN);
 ReadFile(hDev, cBuf, 512*10 , &dwCB, NULL);
 ShowData(10,disk_inf.resSec);
CloseHandle(hDev);
m_ELogic=disk_inf.resSec;
UpdateData(FALSE);
}

void CDo_DiskDlg::OnBfdt() 
{
	if(disk_inf.d==0 || disk_inf.d=='A' ||disk_inf.d=='a'){
       AfxMessageBox("先读FAT或选择正确分区");
       return;
	}
CString d;
int sel=m_CDriver.GetCurSel();
if(sel==CB_ERR)return;
m_CDriver.GetLBText(sel,d);
if(d.Find("磁盘")==-1){
    AfxMessageBox("非硬盘,退出");
	return;
};

ULONGLONG  lo=0;
disk_inf.d=((char*)d.GetBuffer(0))[0];
char driver[]="\\\\.\\A:";
driver[4]=disk_inf.d;
DWORD dwCB;
HANDLE hDev = CreateFile(driver, GENERIC_READ, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (hDev == INVALID_HANDLE_VALUE) {
	AfxMessageBox("Create Error");
	return;  };

memset(cBuf,0,512*10);
lo=UInt32x32To64(disk_inf.resSec+2*disk_inf.FATSecnum+\
				 disk_inf.secPerCluster*(disk_inf.FDTstart-2),disk_inf.bytePerSector);
DWORD low=0;
long high=0;
low=(DWORD)lo;
high=(DWORD)(lo>>32);
SetFilePointer(hDev, low , &high , FILE_BEGIN);
BOOL bRet = ReadFile(hDev, cBuf, 512*10 , &dwCB, NULL);
if(bRet==FALSE){
   AfxMessageBox("读盘失败");
   return;
}
ShowData(10,disk_inf.resSec+2*disk_inf.FATSecnum+disk_inf.secPerCluster*(disk_inf.FDTstart-2));
CloseHandle(hDev);	
m_ELogic=disk_inf.resSec+2*disk_inf.FATSecnum+disk_inf.secPerCluster*(disk_inf.FDTstart-2);
UpdateData(FALSE);
}

void CDo_DiskDlg::OnChangeELogical() 
{
UpdateData();
}

void CDo_DiskDlg::OnBLup() 
{
CString d;
int sel=m_CDriver.GetCurSel();
if(sel==CB_ERR)return;
m_CDriver.GetLBText(sel,d);
if(d.Find("磁盘")==-1){
    AfxMessageBox("非硬盘,退出");
	return;
};
m_ELogic+=10;
UpdateData(FALSE);
ULONGLONG  lo=0;
char driver[]="\\\\.\\A:";
driver[4]=((char*)d.GetBuffer(0))[0];
DWORD dwCB;
HANDLE hDev = CreateFile(driver, GENERIC_READ, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (hDev == INVALID_HANDLE_VALUE) {
	AfxMessageBox("Create Error");
	return;  };

memset(cBuf,0,512*10);
lo=UInt32x32To64(m_ELogic,512);
DWORD low=0;
long high=0;
low=(DWORD)lo;
high=(DWORD)(lo>>32);
SetFilePointer(hDev, low , &high , FILE_BEGIN);
BOOL bRet = ReadFile(hDev, cBuf, 512*10 , &dwCB, NULL);
if(bRet==FALSE){
   AfxMessageBox("读盘失败");
   return;
}
//inf.Format("   %d ",m_ELogic);
//AfxMessageBox(inf);
CloseHandle(hDev);
ShowData(10,m_ELogic);

}

void CDo_DiskDlg::OnBLdown() 
{
if(m_ELogic<10)return;
m_ELogic-=10;
UpdateData(FALSE);	
CString d;
int sel=m_CDriver.GetCurSel();
if(sel==CB_ERR)return;
m_CDriver.GetLBText(sel,d);
if(d.Find("磁盘")==-1){
    AfxMessageBox("非硬盘,退出");
	return;
};

ULONGLONG  lo=0;
char driver[]="\\\\.\\A:";
driver[4]=((char*)d.GetBuffer(0))[0];
DWORD dwCB;
HANDLE hDev = CreateFile(driver, GENERIC_READ, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (hDev == INVALID_HANDLE_VALUE) {
	AfxMessageBox("Create Error");
	return;  };

memset(cBuf,0,512*10);
lo=UInt32x32To64(m_ELogic,512);
DWORD low=0;
long high=0;
low=(DWORD)lo;
high=(DWORD)(lo>>32);
SetFilePointer(hDev, low , &high , FILE_BEGIN);
BOOL bRet = ReadFile(hDev, cBuf, 512*10 , &dwCB, NULL);
if(bRet==FALSE){
   AfxMessageBox("读盘失败");
   return;
}
CloseHandle(hDev);
ShowData(10,m_ELogic);
}

void CDo_DiskDlg::OnBSearch() 
{
  if(m_ESearch.GetLength()==0){
      AfxMessageBox("无字符串");
	  return;
  }
m_ESearch.MakeUpper();
UpdateData(FALSE);	
CString d;
int sel=m_CDriver.GetCurSel();
if(sel==CB_ERR)return;
m_CDriver.GetLBText(sel,d);
if(d.Find("磁盘")==-1){
    AfxMessageBox("非硬盘,退出");
	return;
};

ULONGLONG  lo=0;
char driver[]="\\\\.\\A:";
driver[4]=((char*)d.GetBuffer(0))[0];
DWORD dwCB;
HANDLE hDev = CreateFile(driver, GENERIC_READ, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (hDev == INVALID_HANDLE_VALUE) {
	AfxMessageBox("Create Error");
	return;  };
  DWORD low=0;
  long high=0;

for(int i=0;;i++){
  memset(cBuf,0,512*10);
  lo=UInt32x32To64(m_ELogic,512);
  low=(DWORD)lo;
  high=(DWORD)(lo>>32);
  SetFilePointer(hDev, low , &high , FILE_BEGIN);
  BOOL bRet = ReadFile(hDev, cBuf, 512*10 , &dwCB, NULL);
  if(bRet==FALSE){
	AfxMessageBox("没找到或读失败!");
    break;
  }
  m_ELogic+=10;
  UpdateData(FALSE);	
  cBuf[512*10-1]=0;
  for(int k=0; k<512*10-m_ESearch.GetLength();k++){
	  _strupr((char*)(cBuf+k));
	  if(!strncmp((char*)m_ESearch.GetBuffer(0),(char*)(cBuf+k),m_ESearch.GetLength())){
		  CString  fin;
		  fin.Format("在扇区%d开始,内存偏移 0x%x处发现%s",m_ELogic,k,m_ESearch);
		  AfxMessageBox(fin);
		  break;}
  }
  if(i>30)break;       //别时间太长
	}

  ShowData(10,m_ELogic);
  CloseHandle(hDev);		
}

void CDo_DiskDlg::OnChangeESearch() 
{
UpdateData();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -