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

📄 directaccesshddlg.cpp

📁 如何直接安全访问硬盘数据?
💻 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 + -