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

📄 do_diskdlg.cpp

📁 用于查看FAT表
💻 CPP
📖 第 1 页 / 共 4 页
字号:
			  app.Format("%lx%lx",(DWORD)(la>>32),(DWORD)(la));
			  inf+=app;
			  inf+=" MB\r\n";//磁盘剩余空间
         }
         else
         {
              inf+=("设备未准备好\r\n");
         }
*/
       DiskCount++;
     }	 
    	 DiskInfo>>=1;
	}
 	app.Format("\r\n逻辑磁盘数量: %d",DiskCount);
    inf+=app;
	m_CDriver.SetCurSel(0);

}



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

void CDo_DiskDlg::OnSize(UINT nType, int cx, int cy) 
{

	CDialog::OnSize(nType, cx, cy);
	CRect r;
	GetClientRect(&r);
	::MoveWindow(m_EData.m_hWnd,2,50,r.right-4,r.bottom-50,FALSE);	
}

HBRUSH CDo_DiskDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
 
	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
   if(pWnd->m_hWnd==m_EData.m_hWnd){
   pDC->SetTextColor(RGB(0,20,255));

	}
	return hbr;
}

void CDo_DiskDlg::OnBboot() 
{
char item[30];
BOOL bRet;
int sel= m_CDriver.GetCurSel( );
if(sel==CB_ERR){
	AfxMessageBox("11");
	return;  }
m_CDriver.GetLBText(sel,item);
char driver[30];
int d=-1;
if(CString(item).Find("软盘")!=-1){
	strcpy(driver,"\\\\.\\A:");
    d=0;
}
else if(CString(item).Find("磁盘")!=-1){
	strcpy(driver,"\\\\.\\A:");
	d=2;    }
else if(CString(item).Find("光盘")!=-1){
	AfxMessageBox("22");
	return;  }
driver[4]=item[0];
DWORD dwCB;
HANDLE hDev = CreateFile(driver, GENERIC_READ, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (hDev == INVALID_HANDLE_VALUE) {
	AfxMessageBox("33");
	return;  };
SetFilePointer(hDev,0 , NULL, FILE_BEGIN);
memset(cBuf,0,512*10);
 bRet = ReadFile(hDev, cBuf, 512 , &dwCB, NULL);
CloseHandle(hDev);

ShowData(1,0);
m_ELogic=0;
UpdateData(FALSE);
}

void CDo_DiskDlg::OnBmbr() 
{
	  ULONGLONG lo=0;
      long high;
	  BOOL  bRet;
	    DWORD dwCB;
      BOOL isExtend=0;
	  DWORD hadSector[5]={0,0,0,0,0};
	  DWORD befor[5]={0,0,0,0,0};   //本分区已有扇区和前面已有扇区
	  CString form;
  char driver[]="\\\\.\\PhysicalDrive0";
  HANDLE hDev = CreateFile(driver, GENERIC_READ, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
  if (hDev == INVALID_HANDLE_VALUE){
      m_EData.SetWindowText("初始化磁盘失败");
	  return  ;
  }
  SetFilePointer(hDev,0 , &high, FILE_BEGIN);
 
  memset(cBuf,0,512);
  bRet = ReadFile(hDev, cBuf, 512 , &dwCB, NULL);
  if(bRet==FALSE){
      m_EData.SetWindowText("读磁盘失败11");
	  return  ;
  }
  CloseHandle(hDev);
  	
char ap[4];
char aword[5];
char line[20];
DWORD  r=0,low;
int j=0,i=0,n=0;
char c;

long pm=0;
  memset(pinf,0,90*33*10);
int li,p;

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");

//显示硬盘属性
  char  mid[100];
  strcat(pinf,"    从偏移0x1BE开始为硬盘分区表\r\n");
  strcat(pinf,"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\r\n");
for(i=0;i <4 ;i++){
  if(*(DWORD*)&cBuf[0x1be+12+i*16]==0)break;  //分区大小为0,退出
  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);
  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]==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]));
  if(isExtend){
    hadSector[0]=*((DWORD*)&cBuf[0x1be+8+i*16-16]);
    befor[0]=*((DWORD*)&cBuf[0x1be+12+i*16-16]);
  }
  strcat(pinf,mid);  
  wsprintf(mid,"    偏移12--15本分区总扇区数%X\r\n",*((DWORD*)&cBuf[0x1be+12+i*16]));
  strcat(pinf,mid); 
  strcat(pinf,">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\r\n");
  }

 //存在扩展分区
if(isExtend){ 
	isExtend=0;
   strcat(pinf,"......扩展分区虚拟MBR......\r\n");
   hDev = CreateFile(driver, GENERIC_READ, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
   if (hDev == INVALID_HANDLE_VALUE){
      m_EData.SetWindowText("初始化磁盘失败");
	  return  ;
  }
   ULONGLONG lo=UInt32x32To64(hadSector[0]+befor[0],512);
   DWORD low=(DWORD)(lo);
   high=(DWORD)(lo>>32);

   SetFilePointer(hDev, low, &high, FILE_BEGIN);
 
   BOOL bRet = ReadFile(hDev, cBuf, 512 , &dwCB, NULL);
   if(bRet==FALSE){
      m_EData.SetWindowText("读磁盘失败22");
	  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");


//显示属性
  char  mid[100];
  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[1]=*((DWORD*)&cBuf[0x1be+8+i*16]);
  befor[1]=*((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");
  }
  }

 //存在扩展分区
if(isExtend){ 
	isExtend=0;
   strcat(pinf,"......扩展分区虚拟MBR......\r\n");
   hDev = CreateFile(driver, GENERIC_READ, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
   if (hDev == INVALID_HANDLE_VALUE){
      m_EData.SetWindowText("初始化磁盘失败");
	  return  ;
  }
   ULONGLONG lo=UInt32x32To64(hadSector[1]+befor[1]/*+hadSector[0]+befor[0]*/,512);
   DWORD low=(DWORD)(lo);
   high=(DWORD)(lo>>32);

   SetFilePointer(hDev, low, &high, FILE_BEGIN);
 
   BOOL bRet = ReadFile(hDev, cBuf, 512 , &dwCB, NULL);
   if(bRet==FALSE){
      m_EData.SetWindowText("读磁盘失败33");
	  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");


//显示属性
  char  mid[100];
  strcat(pinf,"    从偏移0x1BE开始为硬盘分区表\r\n");
  strcat(pinf,"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\r\n");

⌨️ 快捷键说明

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