📄 directaccesshddlg.cpp
字号:
#include "stdafx.h"
#include "DirectAccessHD.h"
#include "DirectAccessHDDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
CDirectAccessHDDlg::CDirectAccessHDDlg( CWnd* pParent /*=NULL*/ )
: CDialog( CDirectAccessHDDlg::IDD, pParent )
{
//{{AFX_DATA_INIT( CDirectAccessHDDlg )
m_sData = _T( "" );
m_sDisk = _T( "" );
m_uFrom = 0;
m_uTo = 0;
m_bAllDisk = FALSE;
//}}AFX_DATA_INIT
m_hIcon = AfxGetApp()->LoadIcon( IDR_MAINFRAME );
}
void CDirectAccessHDDlg::DoDataExchange( CDataExchange* pDX )
{
CDialog::DoDataExchange( pDX );
//{{AFX_DATA_MAP( CDirectAccessHDDlg )
DDX_Text( pDX, IDC_DATA, m_sData );
DDX_CBString( pDX, IDC_DISK, m_sDisk );
DDX_Text( pDX, IDC_FROM, m_uFrom );
DDV_MinMaxUInt( pDX, m_uFrom, 0, 99999999 );
DDX_Text( pDX, IDC_TO, m_uTo );
DDV_MinMaxUInt( pDX, m_uTo, 0, 99999999 );
DDX_Check( pDX, IDC_ALLDISK, m_bAllDisk );
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP( CDirectAccessHDDlg, CDialog )
//{{AFX_MSG_MAP( CDirectAccessHDDlg )
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED( IDC_VIEW, OnView )
ON_BN_CLICKED( IDC_CLEARDATA, OnCleardata )
ON_BN_CLICKED( IDC_BACKUP, OnBackup )
ON_BN_CLICKED( IDC_RESTORE, OnRestore )
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
BOOL CDirectAccessHDDlg::OnInitDialog()
{
CDialog::OnInitDialog();
SetIcon( m_hIcon, TRUE ); // Set big icon
SetIcon( m_hIcon, FALSE ); // Set small icon
return TRUE;
}
void CDirectAccessHDDlg::OnPaint()
{
if ( IsIconic() )
{
CPaintDC m_dc( this ); // device context for painting
SendMessage( WM_ICONERASEBKGND, ( WPARAM ) m_dc.GetSafeHdc(), 0 );
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;
m_dc.DrawIcon( x, y, m_hIcon );
}
else
CDialog::OnPaint();
}
HCURSOR CDirectAccessHDDlg::OnQueryDragIcon()
{
return ( HCURSOR ) m_hIcon;
}
void CDirectAccessHDDlg::OnView()
{
UpdateData( TRUE );
if ( m_uTo < m_uFrom )
return;
char cTemp[1];
memcpy( cTemp, m_sDisk.Left( 1 ), 1 );
UINT uDiskID = cTemp[0] - 64;
DWORD dwSectorNum = m_uTo - m_uFrom + 1;
if ( dwSectorNum > 100 )
return;
unsigned char* bBuf = new unsigned char[dwSectorNum * 512];
if ( ReadSectors( uDiskID, m_uFrom, ( UINT )dwSectorNum, bBuf ) == FALSE )
{
MessageBox( "所选磁盘分区不存在!", "错误", MB_OK | MB_ICONERROR );
return;
}
char* cBuf = new char[dwSectorNum * 5120];
memset( cBuf, 0, sizeof( cBuf ) );
for ( DWORD i = 0; i < dwSectorNum * 512; i++ )
{
sprintf( cBuf, "%s%02X ", cBuf, bBuf[i] );
if ( ( i % 512 ) == 511 )
sprintf( cBuf, "%s\r\n第%d扇区\r\n", cBuf, ( int )( i / 512 ) + m_uFrom );
if ( ( i % 16 ) == 15 )
sprintf( cBuf, "%s\r\n", cBuf );
else if ( ( i % 16 ) == 7 )
sprintf( cBuf, "%s- ", cBuf );
}
SetDlgItemText( IDC_DATA, cBuf );
delete[] bBuf;
delete[] cBuf;
}
void CDirectAccessHDDlg::OnCleardata()
{
UpdateData( TRUE );
char cTemp[1];
memcpy( cTemp, m_sDisk.Left( 1 ), 1 );
UINT uDiskID = cTemp[0] - 64;
if ( uDiskID > 2 )
{
if ( MessageBox( "要清理的是硬盘分区,请确认是否继续?", "提示", MB_YESNO | MB_ICONWARNING ) != 6 )
return;
if ( uDiskID == 3 )
{
if ( MessageBox( "要清理的是系统分区,请再次确认是否继续?", "提示", MB_YESNO | MB_ICONWARNING ) != 6 )
return;
}
}
unsigned char bBuf[512];
UINT i = 0;
BOOL m_ret = TRUE;
while ( m_bAllDisk )
{
memset( bBuf, 0xFF, sizeof( bBuf ) );
m_ret = WriteSectors( uDiskID, i, 1, bBuf );
memset( bBuf, 0, sizeof( bBuf ) );
m_ret = WriteSectors( uDiskID, i, 1, bBuf );
if ( m_ret == FALSE )
{
if ( i == 0 )
MessageBox( "所选磁盘分区不存在!", "错误", MB_OK | MB_ICONERROR );
else
MessageBox( "磁盘数据擦除完毕!", "错误", MB_OK | MB_ICONERROR );
return;
}
i++;
}
if ( m_bAllDisk == FALSE )
{
for ( DWORD i = m_uFrom; i <= m_uTo; i++ )
{
memset( bBuf, 0xFF, sizeof( bBuf ) );
m_ret = WriteSectors( uDiskID, i, 1, bBuf );
memset( bBuf, 0, sizeof( bBuf ) );
m_ret = WriteSectors( uDiskID, i, 1, bBuf );
if ( m_ret == FALSE )
{
if ( i == 0 )
MessageBox( "所选磁盘分区不存在!", "错误", MB_OK | MB_ICONERROR );
else
MessageBox( "磁盘数据擦除完毕!", "提示", MB_OK | MB_ICONINFORMATION );
return;
}
}
}
}
void CDirectAccessHDDlg::OnBackup()
{
UpdateData( TRUE );
if ( m_uTo < m_uFrom )
return;
CFileDialog fileDlg( FALSE, "*.sec", "*.sec", OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "磁盘扇区数据( *.sec )|*.sec||", NULL );
CFile m_file;
if ( fileDlg.DoModal() != IDOK )
return;
m_file.Open( fileDlg.GetPathName(), CFile::modeCreate | CFile::modeReadWrite );
char cTemp[1];
memcpy( cTemp, m_sDisk.Left( 1 ), 1 );
UINT uDiskID = cTemp[0] - 64;
DWORD dwSectorNum = m_uTo - m_uFrom + 1;
unsigned char* bBuf = new unsigned char[dwSectorNum * 512];
if ( ReadSectors( uDiskID, m_uFrom, ( UINT )dwSectorNum, bBuf ) == FALSE )
{
MessageBox( "所选磁盘分区不存在!", "错误", MB_OK | MB_ICONERROR );
return;
}
m_file.Write( bBuf, dwSectorNum * 512 );
m_file.Close();
delete[] bBuf;
MessageBox( "数据备份完毕!", "提示", MB_OK | MB_ICONINFORMATION );
}
void CDirectAccessHDDlg::OnRestore()
{
UpdateData( TRUE );
char cTemp[1];
memcpy( cTemp, m_sDisk.Left( 1 ), 1 );
UINT uDiskID = cTemp[0] - 64;
CFileDialog fileDlg( TRUE, "*.sec", "*.sec", OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
"磁盘扇区数据( *.sec )|*.sec||", NULL );
CFile m_file;
if ( fileDlg.DoModal() != IDOK )
return;
m_file.Open( fileDlg.GetPathName(), CFile::modeReadWrite );
DWORD dwSectorNum = m_file.GetLength();
if ( dwSectorNum % 512 != 0 )
return;
dwSectorNum /= 512;
unsigned char* bBuf = new unsigned char[dwSectorNum * 512];
m_file.Read( bBuf, dwSectorNum * 512 );
if ( WriteSectors( uDiskID, m_uFrom, ( UINT )dwSectorNum, bBuf ) == FALSE )
MessageBox( "所选磁盘分区不存在!", "错误", MB_OK | MB_ICONERROR );
else
{
m_file.Close();
delete[] bBuf;
MessageBox( "数据恢复完毕!", "提示", MB_OK | MB_ICONINFORMATION );
}
}
BOOL CDirectAccessHDDlg::WriteSectors( BYTE m_drive, DWORD m_start_sec,
WORD m_sec_num, LPBYTE m_sec_buf )
{
if ( m_drive == 0 )
return 0;
char m_dev_name[] = "\\\\.\\A:";
m_dev_name[4] ='A' + m_drive - 1;
HANDLE m_dev = CreateFile( m_dev_name, GENERIC_WRITE, FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, 0, NULL );
if ( m_dev == INVALID_HANDLE_VALUE )
return 0;
SetFilePointer( m_dev, 512 * m_start_sec, 0, FILE_BEGIN );
DWORD dwCB;
BOOL m_ret = WriteFile( m_dev, m_sec_buf, 512 * m_sec_num, &dwCB, NULL );
CloseHandle( m_dev );
return m_ret;
}
BOOL CDirectAccessHDDlg::ReadSectors( BYTE m_drive, DWORD m_start_sec,
WORD m_sec_num, LPBYTE m_sec_buf )
{
if ( m_drive == 0 )
return 0;
char m_dev_name[] = "\\\\.\\A:";
m_dev_name[4] ='A' + m_drive - 1;
HANDLE m_dev = CreateFile( m_dev_name, GENERIC_READ, FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, 0, NULL );
if ( m_dev == INVALID_HANDLE_VALUE )
return 0;
SetFilePointer( m_dev, 512 * m_start_sec, 0, FILE_BEGIN );
DWORD dwCB;
BOOL m_ret = ReadFile( m_dev, m_sec_buf, 512 * m_sec_num, &dwCB, NULL );
CloseHandle( m_dev );
return m_ret;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -