📄 do_diskdlg.cpp
字号:
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 + -