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