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

📄 do_diskdlg.cpp

📁 用于查看FAT表
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	{
		return FALSE;
	}

	// IDENTIFY DEVICE
	bResult = ::IdentifyDeviceAsScsi(hDevice, nDrive%2, pIdInfo);

	// 检查是不是空串
	if(pIdInfo->sModelNumber[0]=='\0')
	{
		bResult = FALSE;
	}

	if(bResult)
	{
		// 调整字符串
		::AdjustString(pIdInfo->sSerialNumber, 20);
		::AdjustString(pIdInfo->sModelNumber, 40);
		::AdjustString(pIdInfo->sFirmwareRev, 8);
	}

	return bResult;
}

/////////////////////////////////////////////////////////////////////////////
// CDo_DiskDlg dialog

CDo_DiskDlg::CDo_DiskDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CDo_DiskDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CDo_DiskDlg)
	m_ELogic = 0;
	cBuf=NULL;
	m_ESearch = _T("");
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CDo_DiskDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CDo_DiskDlg)
	DDX_Control(pDX, IDC_EData, m_EData);
	DDX_Control(pDX, IDC_CDriver, m_CDriver);
	DDX_Text(pDX, IDC_ELogical, m_ELogic);
	DDV_MinMaxDWord(pDX, m_ELogic, 0, 4294967295);
	DDX_Text(pDX, IDC_ESearch, m_ESearch);
	DDV_MaxChars(pDX, m_ESearch, 256);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CDo_DiskDlg, CDialog)
	//{{AFX_MSG_MAP(CDo_DiskDlg)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_EN_CHANGE(IDC_EData, OnChangeEData)
	ON_WM_SIZE()
	ON_WM_CTLCOLOR()
	ON_BN_CLICKED(IDC_BBOOT, OnBboot)
	ON_BN_CLICKED(IDC_BMBR, OnBmbr)
	ON_BN_CLICKED(IDC_BFAT_1, OnBfat1)
	ON_BN_CLICKED(IDC_BFDT, OnBfdt)
	ON_EN_CHANGE(IDC_ELogical, OnChangeELogical)
	ON_BN_CLICKED(IDC_BLup, OnBLup)
	ON_BN_CLICKED(IDC_BLdown, OnBLdown)
	ON_BN_CLICKED(IDC_BSearch, OnBSearch)
	ON_EN_CHANGE(IDC_ESearch, OnChangeESearch)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDo_DiskDlg message handlers

BOOL CDo_DiskDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	cBuf=(BYTE*)::GlobalAlloc(GPTR,512*10);  //最多10个扇区
    pinf=(char*)::GlobalAlloc(GPTR,90*33*12);   //我想够了
	memset(&disk_inf,0,sizeof(disk_inf));
	CString strInfo;
	int nD=0;
	inf="";
	EnumDiskInfo();
	strInfo+="\r\n";	
	for(int i=0; i<8; i++)
	{
		if(::GetPhysicalDriveInfoInNT(i, &IdInfo))
		{
			strInfo += "\r\n" + MakeIdeInfo(i, 0, &IdInfo);
        	inf+=strInfo;
			nD++;
		}
	}
	strInfo.Format("物理硬盘的个数为%d\r\n",nD);
	strInfo+=inf;
	m_EData.SetWindowText(strInfo);
	//设置磁头、磁道、每磁道扇区数范围

    //设置窗口大小
	int MaxX=GetSystemMetrics( SM_CXSCREEN );
	int MaxY=GetSystemMetrics( SM_CYSCREEN );
	MoveWindow(0,0,MaxX-4,MaxY-25,TRUE);
	m_EData.SetFocus();
    font.CreateFont(30,11,0,0,FW_BLACK,0,0,0,0,0,0,PROOF_QUALITY,0,"宋体");
    m_EData.SetFont(&font);
    ShowWindow(SW_SHOWMAXIMIZED);
	CRect r;
	GetClientRect(&r);
	::MoveWindow(m_EData.m_hWnd,2,30,r.right-4,r.bottom-4,FALSE);
	return FALSE;  // return TRUE  unless you set the focus to a control
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CDo_DiskDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CDo_DiskDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}


void CDo_DiskDlg::OnChangeEData() 
{
UpdateData();
}
/*
void CDo_DiskDlg::OnReadSector() 
{
 int i=m_CDriver.GetCurSel();
 if(i==CB_ERR)return;
 CString dri;
 m_CDriver.GetLBText(i,dri);
 
 i=(int)((((char*)dri.GetBuffer(0))[0]-'A')&0x000000ff);
 int sector=(m_EHead*IdInfo.wNumCyls+m_ECylin)*IdInfo.wNumSectorsPerTrack+m_ESector;
  dri.Format("%d,%d",IdInfo.wNumCyls,IdInfo.wNumSectorsPerTrack);

 ReadSectors((BYTE)i,sector, cBuf);
 ShowData(10,sector);
}
*/


BOOL CDo_DiskDlg::WriteSectors(BYTE bDrive, DWORD dwStartSector , LPBYTE lpSectBuff)
{
//if (bDrive == 0) return 0;
char devName[] = "\\\\.\\A:";
ULONGLONG  pos=UInt32x32To64(512,dwStartSector);
DWORD low;
long high;
low=((DWORD)pos);
high=(long)(pos>>32);

devName[4] ='A' + bDrive;
HANDLE hDev = CreateFile(devName, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (hDev == INVALID_HANDLE_VALUE) return 0;
SetFilePointer(hDev, low, &high, FILE_BEGIN);
DWORD dwCB;
BOOL bRet = WriteFile(hDev, cBuf, 512*10 , &dwCB, NULL);
CloseHandle(hDev);
return bRet;
}

BOOL CDo_DiskDlg::ReadSectors(BYTE bDrive, DWORD dwStartSector,  LPBYTE lpSectBuff)
{
char devName[] = "\\\\.\\A:";
ULONGLONG  pos=(ULONGLONG)(512 * dwStartSector);
DWORD low;
long high;
low=((DWORD)pos);
high=(long)(pos>>32);
devName[4] ='A' + bDrive;
HANDLE hDev = CreateFile(devName, GENERIC_READ, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (hDev == INVALID_HANDLE_VALUE) return 0;
SetFilePointer(hDev,low , &high, FILE_BEGIN);
DWORD dwCB;
BOOL bRet = ReadFile(hDev, cBuf, 512*10 , &dwCB, NULL);
CloseHandle(hDev);
return bRet;
}

void CDo_DiskDlg::ShowData(int secNum,DWORD num)
{
if(num<0 || secNum>10)return;
DWORD low=0,high=0;
char c=0;
char ap[4];
char aword[5];
char line[40];
DWORD  r=0;
BOOL ok=TRUE;
int j=0,i=0,n=0;
ULONGLONG pm=0;
  memset(pinf,0,90*33*10);
int li,p;

for(n=0;n<secNum;n++){
  memset(line,0,40);
  wsprintf(line,"当前扇区号 %X(%u)\r\n",num+n,num+n);
  strcat(pinf,line);
for(j = 0; j < 32; j++) {
  pm=UInt32x32To64(n+num,512)+UInt32x32To64(j,16);
  low=(DWORD)pm;
  high=(DWORD)(pm>>32);
  memset(line,0,40);

  sprintf(aword,"%x",high);
  li=strlen(aword);
  for(p=0;p<8-li;p++){
   line[p]='0';
  }
  strcat(line,aword);
  strcat(line," ");

  sprintf(aword,"%x",low);
  li=strlen(aword);
  for( p=0;p<8-li;p++){
   line[p+9]='0';
  }
  strcat(line,aword);
  strcat(line,"| ");
  strcat(pinf,line);

//  inf.Format("%x-%x,%s,num=%d\r\n",high,low,line,num);
//  strcat(pinf,inf);

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");
  if(num==0 && ok==TRUE){   //读的是引导扇区
  ok=FALSE;
  strcat(pinf,"    这是逻辑驱动器: ");
  int sel=m_CDriver.GetCurSel();
  CString rStr;
  m_CDriver.GetLBText(sel,rStr);
  strcat(pinf,rStr);
  strcat(pinf,", 从偏移地址03H开始有如下参数:\r\n");
  strcat(pinf,"    偏移03--0ah为厂商标识和DOS版本号: ");
  strcat(pinf,(const char *)(cBuf+3));
  strcat(pinf,"\r\n");
  rStr.Format("    偏移0x0b-0x0c每扇区字节数 0x%x \r\n",*(signed short int*)(cBuf+0x0b)&0xffff);
  strcat(pinf,rStr);
  rStr.Format("    偏移0x0d为每簇扇区数 0x%x \r\n",(char)cBuf[0x0d]);
  strcat(pinf,rStr);  
  rStr.Format("    偏移0x0e-0x0f为保留扇区数 0x%x(分区BOOT扇区到FAT的扇区数)\r\n",*(signed short int*)(&cBuf[0x0e])&0xffff);
  strcat(pinf,rStr);    
  rStr.Format("    偏移0x10为FAT个数 0x%x \r\n",(char)cBuf[0x10]);
  strcat(pinf,rStr);    
  rStr.Format("    偏移0x0d为每簇扇区数 0x%x \r\n",(char)cBuf[0x0d]);
  strcat(pinf,rStr);  
  if(cBuf[0x15]==0xf8)strcat(pinf,"    偏移0x15为0xf8, 这是硬盘\r\n");
  else strcat(pinf,"    这是软盘\r\n");
  rStr.Format("    偏移0x18为每磁道扇区数 0x%x \r\n",*(signed short int*)(&cBuf[0x18])&0xffff);
  strcat(pinf,rStr);    
  rStr.Format("    偏移0x1A为逻辑磁头数 0x%x \r\n",*(signed short int*)(&cBuf[0x1a])&0xffff);
  strcat(pinf,rStr);    
  rStr.Format("    偏移0x1C为当前分区前隐含扇区数 0x%x(即MBR到分区BOOT扇区的扇区数)\r\n",*(signed short int*)(&cBuf[0x1c])&0xffff);
  strcat(pinf,rStr);    
  rStr.Format("    偏移0x20分区扇区总数 0x%x \r\n",*(DWORD*)(&cBuf[0x20]));
  strcat(pinf,rStr);    
  rStr.Format("    偏移0x24为每FAT占扇区数 0x%x \r\n",*(DWORD*)(&cBuf[0x24]));
  strcat(pinf,rStr);    
  rStr.Format("    偏移0x2C为根目录起始簇 0x%x \r\n",*(DWORD*)(&cBuf[0x2c]));
  strcat(pinf,rStr);    
  rStr.Format("    偏移0x30为每BOOT占用扇区数 0x%x \r\n",*(signed short int*)(&cBuf[0x30])&0xffff);
  strcat(pinf,rStr);    
  rStr.Format("    偏移0x32为备份引导扇区位置 0x%x \r\n",*(signed short int*)(&cBuf[0x32])&0xffff);
  strcat(pinf,rStr);    
  rStr.Format("    偏移0x43为硬盘序列号 0x%x \r\n",*(DWORD*)(&cBuf[0x43]));
  strcat(pinf,rStr);    
  cBuf[0x51]=0;
  cBuf[0x5a]=0;
  rStr.Format("    偏移0x47为硬盘卷标号%s,0x52偏移为文件系统%s \r\n",cBuf+0x47,cBuf+0x52);
  strcat(pinf,rStr);  
   }
}
  m_EData.SetWindowText(pinf);

//::GlobalFree(pinf);
}

void CDo_DiskDlg::EnumDiskInfo()
{
	CString app;
    int DiskCount = 0;
//	ULONGLONG  i64FreeBytesToCaller;
//    ULONGLONG  i64TotalBytes;
//    ULONGLONG  i64FreeBytes;
 
    DWORD DiskInfo = GetLogicalDrives();
//利用GetLogicalDrives()函数可以获取系统中逻辑驱动器的数量,
//函数返回的是一个32位无符号整型数据。
	int i=0,n=0;
	char din[30];
	strcpy(din,"A:\\ ");
	for(i=0; i<32; i++){
      n=DiskInfo&1;
		 		  din[4]=0;         
      if(n){
		  din[0]='A'+(char)i;
		  inf+=din;
         UINT DType = GetDriveType(din);
		 //GetDriveType函数,可以获取驱动器类型,参数为驱动器的根目录
	
         if(DType == DRIVE_FIXED){
			 inf+="磁盘; ";
			 strcpy(din+4,"磁盘");  }
         else if(DType == DRIVE_CDROM){
			 inf+="光驱; ";
			  strcpy(din+4,"光驱");      }
         else if(DType == DRIVE_REMOVABLE){
			 inf+="可移动式磁盘; ";
	  		 strcpy(din+4,"软盘");      }
         else if(DType == DRIVE_REMOTE){
			 inf+="网络磁盘; ";
			 strcpy(din+4,"网络磁盘");      }
         else if(DType == DRIVE_RAMDISK){
			 inf+="虚拟RAM磁盘; ";
			 strcpy(din+4,"虚拟RAM磁盘");  }
         else if (DType == DRIVE_UNKNOWN){
			 inf+="未知设备; ";
		     strcpy(din+4,"未知设备");      }
		 	      m_CDriver.AddString(din);
/*  不准确,       
		 BOOL fResult = GetDiskFreeSpaceEx (
              din,
              (PULARGE_INTEGER)&i64FreeBytesToCaller,
              (PULARGE_INTEGER)&i64TotalBytes,
              (PULARGE_INTEGER)&i64FreeBytes);
         //GetDiskFreeSpaceEx函数,可以获取驱动器磁盘的空间状态,函数返回的是个BOOL类型数据
         if(fResult)//通过返回的BOOL数据判断驱动器是否在工作状态
         {
			  ULONGLONG  la;
			  la=(ULONGLONG)(i64TotalBytes/1024/1024); 
              inf+="总磁盘空间: ";
			  app.Format("%lx%lx",(DWORD)(la>>32),(DWORD)(la));
			  inf+=app;
			  inf+=" MB, ";//磁盘总容量
              inf+="剩余空间: ";
			  la=(ULONGLONG )(i64FreeBytesToCaller/1024/1024);

⌨️ 快捷键说明

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