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