mirror of
https://github.com/bobranten/Ext4Fsd.git
synced 2025-10-30 13:28:31 -05:00
2132 lines
58 KiB
C++
2132 lines
58 KiB
C++
// Ext2MgrDlg.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "Ext2Mgr.h"
|
|
#include "PartitionType.h"
|
|
#include "DelDeadLetter.h"
|
|
#include "Ext2MgrDlg.h"
|
|
#include "DlgView.h"
|
|
#include <dbt.h>
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CAboutDlg dialog used for App About
|
|
|
|
class CAboutDlg : public CDialog
|
|
{
|
|
public:
|
|
CAboutDlg();
|
|
|
|
HBITMAP m_hBitmap;
|
|
HDC m_hMemDC;
|
|
HBITMAP m_hOldBmp;
|
|
|
|
// Dialog Data
|
|
//{{AFX_DATA(CAboutDlg)
|
|
enum { IDD = IDD_ABOUTBOX };
|
|
// CMyHyperLink m_lMail;
|
|
//}}AFX_DATA
|
|
|
|
// ClassWizard generated virtual function overrides
|
|
//{{AFX_VIRTUAL(CAboutDlg)
|
|
public:
|
|
virtual BOOL DestroyWindow();
|
|
protected:
|
|
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
|
|
//}}AFX_VIRTUAL
|
|
|
|
// Implementation
|
|
protected:
|
|
//{{AFX_MSG(CAboutDlg)
|
|
virtual BOOL OnInitDialog();
|
|
afx_msg void OnPaint();
|
|
afx_msg void OnExt2fsd();
|
|
afx_msg void OnDonate();
|
|
afx_msg void OnTimer(UINT_PTR nIDEvent);
|
|
//}}AFX_MSG
|
|
DECLARE_MESSAGE_MAP()
|
|
|
|
};
|
|
|
|
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
|
|
{
|
|
//{{AFX_DATA_INIT(CAboutDlg)
|
|
//}}AFX_DATA_INIT
|
|
}
|
|
|
|
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CAboutDlg)
|
|
// DDX_Control(pDX, IDC_AUTHOR, m_lMail);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
|
|
//{{AFX_MSG_MAP(CAboutDlg)
|
|
ON_WM_PAINT()
|
|
ON_BN_CLICKED(IDC_EXT2FSD, OnExt2fsd)
|
|
ON_BN_CLICKED(ID_DONATE, OnDonate)
|
|
ON_WM_TIMER()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
BOOL CAboutDlg::DestroyWindow()
|
|
{
|
|
// TODO: Add your specialized code here and/or call the base class
|
|
if (m_hBitmap) {
|
|
|
|
if (m_hMemDC) {
|
|
::SelectObject(m_hMemDC, m_hOldBmp);
|
|
::DeleteDC(m_hMemDC);
|
|
}
|
|
|
|
::DeleteObject (m_hBitmap);
|
|
m_hBitmap = NULL;
|
|
}
|
|
|
|
return CDialog::DestroyWindow();
|
|
}
|
|
|
|
BOOL CAboutDlg::OnInitDialog()
|
|
{
|
|
CString s;
|
|
CHAR Version[0x20];
|
|
CHAR Date[0x20];
|
|
CHAR Time[0x20];
|
|
|
|
CDialog::OnInitDialog();
|
|
|
|
m_hBitmap = (HBITMAP)::LoadImage(GetModuleHandle(NULL),
|
|
MAKEINTRESOURCE(IDB_ABOUT_SMALL),
|
|
IMAGE_BITMAP, 0, 0, 0);
|
|
|
|
if (m_hBitmap) {
|
|
m_hMemDC = ::CreateCompatibleDC(this->GetDC()->m_hDC);
|
|
m_hOldBmp = (HBITMAP)::SelectObject(m_hMemDC, m_hBitmap);
|
|
}
|
|
|
|
INT rc = Ext2QueryDrvVersion(Version, Date, Time);
|
|
|
|
if (rc < 0) {
|
|
s.Format("Ext2Fsd: NOT started !\0");
|
|
} else if (rc > 0) {
|
|
s.Format("Ext2Fsd: %s (%s)\0", Version, Date);
|
|
} else {
|
|
s.Format("Ext2Fsd: < 0.42 (Dec 2007)\0");
|
|
}
|
|
SET_TEXT(IDC_DRIVER, s);
|
|
s = "Ext2Mgr: 3.00 (";
|
|
s += __DATE__;
|
|
s += ")\0";
|
|
SET_TEXT(IDC_PROGRAM, s);
|
|
|
|
// Set the target URL
|
|
// m_lMail.SetLinkUrl("mailto:Matt Wu<matt@ext2fsd.com>?subject=Ext2Fsd Support");
|
|
// Enable showing the Tooltip
|
|
// m_lMail.ActiveToolTip(TRUE);
|
|
// Set the Tooltiptext
|
|
// m_lMail.SetTootTipText("Write a mail to Ext2Fsd group.");
|
|
|
|
return TRUE; // return TRUE unless you set the focus to a control
|
|
// EXCEPTION: OCX Property Pages should return FALSE
|
|
}
|
|
|
|
void CAboutDlg::OnPaint()
|
|
{
|
|
CPaintDC dc(this); // device context for painting
|
|
|
|
int rc;
|
|
BITMAP cs;
|
|
|
|
rc = ::GetObject(m_hBitmap, sizeof(cs), &cs);
|
|
if (rc == 0) {
|
|
return;
|
|
}
|
|
|
|
CRect rect;
|
|
CWnd *pAboutWnd = GetDlgItem(IDC_ABOUT_SHOW);
|
|
pAboutWnd->GetWindowRect(rect);
|
|
ScreenToClient(rect);
|
|
|
|
::StretchBlt(dc.m_hDC, rect.left, rect.top, rect.Width(), rect.Height(),
|
|
m_hMemDC, 0, 0, cs.bmWidth, cs.bmHeight, SRCCOPY);
|
|
|
|
// Do not call CDialog::OnPaint() for painting messages
|
|
}
|
|
|
|
|
|
void CAboutDlg::OnExt2fsd()
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
ShellExecute(this->GetSafeHwnd(), "open",
|
|
"http://www.ext2fsd.com",
|
|
NULL, NULL, SW_SHOW );
|
|
}
|
|
|
|
void CAboutDlg::OnDonate()
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
GetParent()->SendMessage(WM_COMMAND, ID_DONATE);
|
|
}
|
|
|
|
void CAboutDlg::OnTimer(UINT_PTR nIDEvent)
|
|
{
|
|
// TODO: Add your message handler code here and/or call default
|
|
|
|
CDialog::OnTimer(nIDEvent);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CExt2List message handlers
|
|
|
|
CExt2List::CExt2List()
|
|
{
|
|
}
|
|
|
|
CExt2List::~CExt2List()
|
|
{
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CExt2List, CListCtrl)
|
|
//{{AFX_MSG_MAP(CExt2List)
|
|
ON_WM_RBUTTONDOWN()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
void CExt2List::OnRButtonDown(UINT nFlags, CPoint point)
|
|
{
|
|
// TODO: Add your message handler code here and/or call default
|
|
m_Point = point;
|
|
CListCtrl::OnRButtonDown(nFlags, point);
|
|
}
|
|
|
|
int CExt2List::QuerySubItemText(int item, CHAR *Data, int length)
|
|
{
|
|
LV_COLUMN lvc;
|
|
LV_ITEM lvi;
|
|
int ncol;
|
|
CRect rect;
|
|
|
|
::ZeroMemory(&lvc, sizeof(lvc));
|
|
lvc.mask = LVCF_WIDTH |LVCF_FMT;
|
|
|
|
for (ncol=0; GetColumn(ncol, &lvc); ncol++) {
|
|
|
|
if (ncol > 0) {
|
|
GetSubItemRect(item, ncol,LVIR_BOUNDS, rect);
|
|
} else {
|
|
GetItemRect(item, rect, LVIR_BOUNDS);
|
|
rect.right = GetColumnWidth(0);
|
|
rect.left = 0;
|
|
}
|
|
|
|
if (rect.PtInRect(m_Point)) {
|
|
|
|
::ZeroMemory(Data, length);
|
|
::ZeroMemory(&lvi, sizeof(lvi));
|
|
|
|
lvi.iItem = item;
|
|
lvi.mask = LVIF_TEXT;
|
|
lvi.iSubItem = ncol;
|
|
lvi.pszText = Data;
|
|
lvi.cchTextMax = length;
|
|
|
|
return GetItem(&lvi);
|
|
break;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CExt2MgrDlg dialog
|
|
|
|
CExt2MgrDlg::CExt2MgrDlg(CWnd* pParent /*=NULL*/)
|
|
: CDialog(CExt2MgrDlg::IDD, pParent)
|
|
{
|
|
//{{AFX_DATA_INIT(CExt2MgrDlg)
|
|
// NOTE: the ClassWizard will add member initialization here
|
|
//}}AFX_DATA_INIT
|
|
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
|
|
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
|
|
m_bHide = FALSE;
|
|
m_bQuiet = FALSE;
|
|
m_bService = FALSE;
|
|
m_bStat = FALSE;
|
|
|
|
m_splash = NULL;
|
|
|
|
m_bFocusVolume = FALSE;
|
|
m_IndexVolume = 0;
|
|
m_bFocusDisk = FALSE;
|
|
m_IndexDisk = 0;
|
|
|
|
m_type = 0;
|
|
m_sdev = NULL;
|
|
|
|
m_PerfDlg = NULL;
|
|
|
|
m_hUsbNotify = NULL;
|
|
m_bHandleChange = FALSE;
|
|
|
|
m_hAccel = NULL;
|
|
m_bFsStarted = FALSE;
|
|
|
|
m_nStartmode = 0;
|
|
m_bAutoMount = FALSE;
|
|
m_bExt3Writable = FALSE;
|
|
m_bReadonly = FALSE;
|
|
}
|
|
|
|
void CExt2MgrDlg::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CExt2MgrDlg)
|
|
DDX_Control(pDX, IDC_VOLUME_LIST, m_VolumeList);
|
|
DDX_Control(pDX, IDC_DISK_LIST, m_DiskView);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CExt2MgrDlg, CDialog)
|
|
//{{AFX_MSG_MAP(CExt2MgrDlg)
|
|
ON_WM_WINDOWPOSCHANGING()
|
|
ON_WM_SYSCOMMAND()
|
|
ON_WM_DEVICECHANGE()
|
|
ON_WM_DESTROY()
|
|
ON_WM_PAINT()
|
|
ON_WM_QUERYDRAGICON()
|
|
ON_WM_SIZE()
|
|
ON_COMMAND(ID_CHANGE, OnChangeProperty)
|
|
ON_COMMAND(ID_REFRESH, OnRefresh)
|
|
ON_COMMAND(ID_FORMAT, OnFormat)
|
|
ON_COMMAND(ID_SERVICE, OnService)
|
|
ON_COMMAND(ID_ABOUT, OnAbout)
|
|
ON_COMMAND(ID_EXIT, OnExit)
|
|
ON_WM_MEASUREITEM()
|
|
ON_NOTIFY(NM_DBLCLK, IDC_DISK_LIST, OnDblclkDiskList)
|
|
ON_NOTIFY(NM_KILLFOCUS, IDC_DISK_LIST, OnKillfocusDiskList)
|
|
ON_NOTIFY(NM_RCLICK, IDC_DISK_LIST, OnRclickDiskList)
|
|
ON_NOTIFY(NM_DBLCLK, IDC_VOLUME_LIST, OnDblclkVolumeList)
|
|
ON_NOTIFY(NM_KILLFOCUS, IDC_VOLUME_LIST, OnKillfocusVolumeList)
|
|
ON_NOTIFY(NM_RCLICK, IDC_VOLUME_LIST, OnRclickVolumeList)
|
|
ON_NOTIFY(NM_CLICK, IDC_DISK_LIST, OnClickDiskList)
|
|
ON_NOTIFY(NM_CLICK, IDC_VOLUME_LIST, OnClickVolumeList)
|
|
ON_NOTIFY(NM_SETFOCUS, IDC_DISK_LIST, OnSetfocusDiskList)
|
|
ON_NOTIFY(NM_SETFOCUS, IDC_VOLUME_LIST, OnSetfocusVolumeList)
|
|
ON_COMMAND(ID_PROPERTY, OnProperty)
|
|
ON_COMMAND(ID_DONATE, OnDonate)
|
|
ON_COMMAND(ID_COPY, OnCopy)
|
|
ON_COMMAND(ID_COPYALL, OnCopyAll)
|
|
ON_WM_TIMER()
|
|
ON_COMMAND(ID_DRV_LETTER, OnDrvLetter)
|
|
ON_COMMAND(ID_DRV_QUICK_MOUNT, OnDrvQuickMount)
|
|
ON_COMMAND(ID_INSTALL_SERVICE, OnInstallService)
|
|
ON_COMMAND(ID_REMOVE_SERVICE, OnRemoveService)
|
|
ON_COMMAND(ID_ENABLE_AUTOSTART, OnEnableAutorun)
|
|
ON_COMMAND(ID_DISABLE_AUTOSTART, OnDisableAutorun)
|
|
ON_COMMAND(ID_SHOW_MAIN, OnShowMain)
|
|
ON_MESSAGE(WM_TRAY_ICON_NOTIFY, OnTrayNotification)
|
|
ON_MESSAGE(WM_TERMINATE_PROGRAM, OnTerminate)
|
|
ON_MESSAGE(WM_MOUNTPOINT_NOTIFY, OnMountPointNotify)
|
|
ON_COMMAND(ID_HELP, OnHelp)
|
|
ON_COMMAND(ID_PERFSTAT, OnPerfStat)
|
|
ON_COMMAND(ID_PERFSTOP, OnPerfStop)
|
|
ON_COMMAND(ID_FLUSH_BUFFER, OnFlush)
|
|
ON_COMMAND(ID_CHANGE_PARTTYPE, OnPartType)
|
|
ON_COMMAND(ID_REMOVE_DEAD_LETTER, OnRemoveDeadLetter)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CExt2MgrDlg message handlers
|
|
|
|
|
|
static UINT BASED_CODE indicators[] =
|
|
{
|
|
ID_INDICATOR_MESSAGE,
|
|
ID_INDICATOR_TIME,
|
|
ID_INDICATOR_EXTRA,
|
|
};
|
|
|
|
/* A5DCBF10-6530-11D2-901F-00C04FB951ED */
|
|
DEFINE_GUID(GUID_CLASS_USB_DEVICE, 0xA5DCBF10L, 0x6530, 0x11D2, 0x90, 0x1F, 0x00, \
|
|
0xC0, 0x4F, 0xB9, 0x51, 0xED);
|
|
|
|
|
|
BOOL CExt2MgrDlg::OnInitDialog()
|
|
{
|
|
CString str;
|
|
LONG_PTR dwStyle = 0;
|
|
|
|
CDialog::OnInitDialog();
|
|
|
|
/* set windows identifier */
|
|
SetWindowLongPtr(this->GetSafeHwnd(), DWLP_USER, EXT2_DIALOG_MAGIC);
|
|
|
|
/* minimize the dialog during startup */
|
|
if (m_bHide) {
|
|
PostMessage(WM_SYSCOMMAND, SC_MINIMIZE, 0);
|
|
}
|
|
|
|
// IDM_ABOUTBOX must be in the system command range.
|
|
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
|
|
ASSERT(IDM_ABOUTBOX < 0xF000);
|
|
|
|
CMenu* pSysMenu = GetSystemMenu(FALSE);
|
|
if (pSysMenu != NULL)
|
|
{
|
|
CString strAboutMenu;
|
|
strAboutMenu.LoadString(IDS_ABOUTBOX);
|
|
if (!strAboutMenu.IsEmpty())
|
|
{
|
|
pSysMenu->AppendMenu(MF_SEPARATOR);
|
|
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
|
|
}
|
|
}
|
|
|
|
/* F1 - F12 key */
|
|
m_hAccel = ::LoadAccelerators(AfxGetInstanceHandle(),
|
|
MAKEINTRESOURCE(IDR_AKEY_EXT2MGR));
|
|
|
|
// 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 large icon
|
|
SetIcon(m_hIcon, FALSE); // Set small icon
|
|
|
|
/* create new font for views */
|
|
m_MSSanS.CreatePointFont(80, "MS Sans Serif");
|
|
m_DiskView.SetFont(&m_MSSanS);
|
|
m_VolumeList.SetFont(&m_MSSanS);
|
|
|
|
/* initialize the disk view */
|
|
dwStyle=GetWindowLongPtr(m_DiskView.GetSafeHwnd(),GWL_STYLE);
|
|
dwStyle&=~LVS_TYPEMASK;
|
|
dwStyle|=(LVS_REPORT | LVS_OWNERDRAWFIXED);
|
|
SetWindowLongPtr(m_DiskView.GetSafeHwnd(),GWL_STYLE,dwStyle);
|
|
|
|
m_DiskView.InsertColumn(0, (LPCSTR)"", LVCFMT_CENTER, 80);
|
|
str.LoadString(IDS_LISTITEM_TYPE);
|
|
m_DiskView.InsertColumn(1, (LPCSTR)str, LVCFMT_LEFT, 60);
|
|
|
|
str.LoadString(IDS_LISTITEM_FILESYSTEM);
|
|
m_DiskView.InsertColumn(2, (LPCSTR)str, LVCFMT_LEFT, 80);
|
|
|
|
str.LoadString(IDS_LISTITEM_TOTALSIZE);
|
|
m_DiskView.InsertColumn(3, (LPCSTR)str, LVCFMT_RIGHT, 80);
|
|
|
|
str.LoadString(IDS_LISTITEM_USEDSIZE);
|
|
m_DiskView.InsertColumn(4, (LPCSTR)str, LVCFMT_RIGHT, 70);
|
|
|
|
str.LoadString(IDS_LISTITEM_CODEPAGE);
|
|
m_DiskView.InsertColumn(5, (LPCSTR)str, LVCFMT_LEFT, 70);
|
|
|
|
str.LoadString(IDS_LISTITEM_PARTID);
|
|
m_DiskView.InsertColumn(6, (LPCSTR)str, LVCFMT_LEFT, 120);
|
|
|
|
/* initialize volume list */
|
|
dwStyle=GetWindowLongPtr(m_VolumeList.GetSafeHwnd(),GWL_STYLE);
|
|
dwStyle&=~LVS_TYPEMASK;
|
|
dwStyle|= (LVS_REPORT | LVS_AUTOARRANGE);
|
|
SetWindowLongPtr(m_VolumeList.GetSafeHwnd(),GWL_STYLE,dwStyle);
|
|
m_VolumeList.SetExtendedStyle(LVS_EX_GRIDLINES);
|
|
|
|
m_VolumeList.InsertColumn(0, NULL, LVCFMT_CENTER, 20);
|
|
str.LoadString(IDS_LISTITEM_VOLUME);
|
|
m_VolumeList.InsertColumn(1, (LPCSTR)str, LVCFMT_LEFT, 60);
|
|
|
|
str.LoadString(IDS_LISTITEM_TYPE);
|
|
m_VolumeList.InsertColumn(2, (LPCSTR)str, LVCFMT_LEFT, 60);
|
|
|
|
str.LoadString(IDS_LISTITEM_FILESYSTEM);
|
|
m_VolumeList.InsertColumn(3, (LPCSTR)str, LVCFMT_LEFT, 80);
|
|
|
|
str.LoadString(IDS_LISTITEM_TOTALSIZE);
|
|
m_VolumeList.InsertColumn(4, (LPCSTR)str, LVCFMT_RIGHT, 80);
|
|
|
|
str.LoadString(IDS_LISTITEM_USEDSIZE);
|
|
m_VolumeList.InsertColumn(5, (LPCSTR)str, LVCFMT_RIGHT, 70);
|
|
|
|
str.LoadString(IDS_LISTITEM_CODEPAGE);
|
|
m_VolumeList.InsertColumn(6, (LPCSTR)str, LVCFMT_LEFT, 70);
|
|
|
|
str.LoadString(IDS_LISTITEM_DEVOBJ);
|
|
m_VolumeList.InsertColumn(7, (LPCSTR)str, LVCFMT_LEFT, 200);
|
|
|
|
ListView_SetExtendedListViewStyleEx (
|
|
m_VolumeList.GetSafeHwnd(),
|
|
LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT );
|
|
|
|
/* initialize ImageList */
|
|
m_ImageList.Create(16, 16, ILC_COLOR8 | ILC_MASK, 5, 5);
|
|
for (UINT nID = IDI_FLOPPY; nID <= IDI_DYNAMIC; nID++) {
|
|
CBitmap bitmap;
|
|
if (bitmap.LoadBitmap(nID)) {
|
|
m_ImageList.Add(&bitmap, RGB(0,0,0));
|
|
bitmap.DeleteObject();
|
|
}
|
|
}
|
|
m_VolumeList.SetImageList(&m_ImageList, LVSIL_SMALL);
|
|
|
|
/* Status Bar Initialization */
|
|
m_bar.Create(this); //We create the status bar
|
|
m_bar.SetIndicators(indicators, 3);
|
|
|
|
CRect rect;
|
|
GetClientRect(&rect);
|
|
m_bar.SetPaneInfo(0,ID_INDICATOR_MESSAGE, SBPS_NORMAL,rect.Width()-160);
|
|
m_bar.SetPaneInfo(1,ID_INDICATOR_TIME,SBPS_NORMAL ,132);
|
|
m_bar.SetPaneInfo(2,ID_INDICATOR_EXTRA,SBPS_STRETCH ,0);
|
|
/* m_bar.GetStatusBarCtrl().SetBkColor(RGB(180,180,180)); */
|
|
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,
|
|
ID_INDICATOR_EXTRA);
|
|
|
|
CTime t1;
|
|
t1 = CTime::GetCurrentTime();
|
|
|
|
CString s;
|
|
s.Format("%s", "Ready");
|
|
m_bar.SetPaneText(0, s);
|
|
|
|
s.Format(" %3.3s", t1.Format("%B"));
|
|
s += t1.Format(" %d,%Y %H:%M:%S");
|
|
m_bar.SetPaneText(1, s);
|
|
|
|
SetTimer(ID_INDICATOR_TIME,1000,NULL);
|
|
|
|
/* close the splash window */
|
|
PostMessage(WM_SYSCOMMAND, IDM_CLOSE_SPLASH, 0);
|
|
|
|
/* loading system configurations */
|
|
if (Ext2QuerySysConfig()) {
|
|
Ext2LoadDisks();
|
|
Ext2LoadCdroms();
|
|
if (Ext2LoadVolumes()) {
|
|
Ext2LoadRemovableVolumes();
|
|
Ext2LoadDrvLetters();
|
|
Ext2LoadCdromDrvLetters();
|
|
Ext2LoadAllVolumeDrvLetters();
|
|
Ext2LoadAllDiskPartitions();
|
|
if (g_bAutoRemoveDeadLetters) {
|
|
Ext2AutoRemoveDeadLetters();
|
|
}
|
|
if (Ext2ProcessExt2Volumes()) {
|
|
}
|
|
}
|
|
} else {
|
|
return FALSE;
|
|
}
|
|
|
|
m_bHandleChange = TRUE;
|
|
|
|
/* updating the volume list */
|
|
Ext2RefreshVolumeList(&m_VolumeList);
|
|
|
|
/* updating the disk list */
|
|
Ext2RefreshDiskList(&m_DiskView);
|
|
|
|
CMenu* pMenu = AfxGetMainWnd()->GetMenu();
|
|
CMenu* pSubFile = pMenu->GetSubMenu(0);
|
|
if (pSubFile) {
|
|
if (Ext2RunMgrForCurrentUser()) {
|
|
pSubFile->EnableMenuItem(ID_ENABLE_AUTOSTART, MF_BYCOMMAND|MF_GRAYED|MF_DISABLED);
|
|
pSubFile->EnableMenuItem(ID_DISABLE_AUTOSTART, MF_BYCOMMAND|MF_ENABLED);
|
|
} else {
|
|
pSubFile->EnableMenuItem(ID_ENABLE_AUTOSTART, MF_BYCOMMAND|MF_ENABLED);
|
|
pSubFile->EnableMenuItem(ID_DISABLE_AUTOSTART, MF_BYCOMMAND|MF_GRAYED|MF_DISABLED);
|
|
}
|
|
}
|
|
|
|
m_Menu.CreatePopupMenu();
|
|
|
|
HICON hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
|
|
m_Tray.Create(this, WM_TRAY_ICON_NOTIFY,"Ext2 Volume Manager",hIcon, IDR_TRAY);
|
|
|
|
/* start Ext2Fsd statistics window */
|
|
if (m_bStat) {
|
|
PostMessage(WM_COMMAND, ID_PERFSTAT, 0);
|
|
}
|
|
|
|
/* query global parameters */
|
|
Ext2QueryGlobalProperty(
|
|
&m_nStartmode,
|
|
(BOOL *)&m_bReadonly,
|
|
(BOOL *)&m_bExt3Writable,
|
|
(CHAR *)m_Codepage.GetBuffer(CODEPAGE_MAXLEN),
|
|
(CHAR *)m_sPrefix.GetBuffer(HIDINGPAT_LEN),
|
|
(CHAR *)m_sSuffix.GetBuffer(HIDINGPAT_LEN),
|
|
(BOOL *)&m_bAutoMount
|
|
);
|
|
g_bAutoMount = m_bAutoMount;
|
|
m_Codepage.ReleaseBuffer(-1);
|
|
m_sPrefix.ReleaseBuffer(-1);
|
|
m_sSuffix.ReleaseBuffer(-1);
|
|
|
|
RegisterDeviceInterface(DiskClassGuid, &m_hUsbNotify);
|
|
|
|
return TRUE; // return TRUE unless you set the focus to a control
|
|
}
|
|
|
|
void CExt2MgrDlg::OnSysCommand(UINT nID, LPARAM lParam)
|
|
{
|
|
if ((nID & 0xFFF0) == IDM_ABOUTBOX) {
|
|
CAboutDlg dlgAbout;
|
|
dlgAbout.DoModal();
|
|
} else if ((nID & 0xFFF0) == SC_MINIMIZE) {
|
|
m_Tray.ShowIcon();
|
|
ShowWindow(SW_HIDE);
|
|
} else if ((nID & 0xFFF0) == SC_CLOSE) {
|
|
SendMessage(WM_COMMAND, ID_EXIT, 0);
|
|
} else if ((nID & 0xFFF0) == IDM_CLOSE_SPLASH) {
|
|
if (m_splash) {
|
|
m_splash->CloseSplash();
|
|
delete m_splash;
|
|
m_splash = NULL;
|
|
}
|
|
} else {
|
|
CDialog::OnSysCommand(nID, lParam);
|
|
}
|
|
}
|
|
|
|
BOOL CExt2MgrDlg::OnDeviceChange(UINT nEventType, DWORD_PTR dwData)
|
|
{
|
|
PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)dwData;
|
|
PDEV_BROADCAST_DEVICEINTERFACE pdbch = (PDEV_BROADCAST_DEVICEINTERFACE)dwData;
|
|
if (pdbch && pdbch->dbcc_devicetype == DBT_DEVTYP_DEVICEINTERFACE) {
|
|
|
|
if (nEventType == DBT_DEVICEARRIVAL || DBT_DEVICEREMOVECOMPLETE) {
|
|
KillTimer('REFR');
|
|
SetTimer('REFR', 1000, NULL);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
switch (nEventType) {
|
|
|
|
case DBT_DEVICEARRIVAL:
|
|
|
|
if (lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME) {
|
|
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
|
|
DriversChangeNotify(lpdbv->dbcv_unitmask, TRUE);
|
|
Ext2AddLetterMask((ULONGLONG)(lpdbv->dbcv_unitmask));
|
|
}
|
|
|
|
break;
|
|
case DBT_DEVICEQUERYREMOVE:
|
|
break;
|
|
case DBT_DEVICEQUERYREMOVEFAILED:
|
|
break;
|
|
case DBT_DEVICEREMOVEPENDING:
|
|
break;
|
|
case DBT_DEVICEREMOVECOMPLETE:
|
|
if (lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME) {
|
|
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
|
|
DriversChangeNotify(lpdbv->dbcv_unitmask, FALSE);
|
|
}
|
|
break;
|
|
case DBT_DEVICETYPESPECIFIC:
|
|
break;
|
|
case DBT_CONFIGCHANGED:
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void CExt2MgrDlg::OnDestroy()
|
|
{
|
|
KillTimer(ID_INDICATOR_TIME);
|
|
|
|
Ext2CleanupDisks();
|
|
Ext2CleanupCdroms();
|
|
Ext2CleanupVolumes();
|
|
Ext2CleanupDrvLetters();
|
|
|
|
OnPerfStop();
|
|
|
|
if (m_hUsbNotify) {
|
|
UnregisterDeviceNotification(m_hUsbNotify);
|
|
m_hUsbNotify = NULL;
|
|
}
|
|
|
|
if (m_hAccel) {
|
|
DestroyAcceleratorTable(m_hAccel);
|
|
m_hAccel = NULL;
|
|
}
|
|
|
|
CDialog::OnDestroy();
|
|
}
|
|
|
|
// 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 CExt2MgrDlg::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 CExt2MgrDlg::OnQueryDragIcon()
|
|
{
|
|
return (HCURSOR) m_hIcon;
|
|
}
|
|
|
|
void CExt2MgrDlg::OnSize(UINT nType, int cx, int cy)
|
|
{
|
|
int i = 0;
|
|
int ctlId[] = {IDC_VOLUME_LIST, IDC_DISK_LIST, 0};
|
|
|
|
return;
|
|
|
|
// create an instance of the CRect object
|
|
CRect crw, cri;
|
|
|
|
do {
|
|
|
|
CWnd *pWnd = GetDlgItem(ctlId[i]);
|
|
if (pWnd) {
|
|
pWnd->GetWindowRect(&cri);
|
|
ScreenToClient(&cri);
|
|
pWnd->SetWindowPos(pWnd,
|
|
cri.left * cx / crw.Width(),
|
|
cri.top * cy / crw.Height(),
|
|
cri.Width() * cx / crw.Width(),
|
|
cri.Height() * cy / crw.Height(),
|
|
SWP_NOZORDER | SWP_SHOWWINDOW);
|
|
}
|
|
|
|
} while (ctlId[++i]);
|
|
}
|
|
|
|
LRESULT CExt2MgrDlg::OnTrayNotification(WPARAM wParam,LPARAM lParam)
|
|
{
|
|
switch(LOWORD(lParam))
|
|
{
|
|
case WM_LBUTTONUP:
|
|
m_bHide = FALSE;
|
|
ShowWindow(SW_SHOW);
|
|
SendMessage(WM_SYSCOMMAND, SC_RESTORE);
|
|
break;
|
|
}
|
|
|
|
return m_Tray.OnTrayNotification(wParam,lParam);
|
|
}
|
|
|
|
void CExt2MgrDlg::OnAbout()
|
|
{
|
|
// TODO: Add your command handler code here
|
|
SendMessage(WM_SYSCOMMAND, IDM_ABOUTBOX);
|
|
}
|
|
|
|
void CExt2MgrDlg::OnExit()
|
|
{
|
|
if (TRUE) {
|
|
/* AfxMessageBox("Are you sure to exit ? ",MB_YESNO,0) == IDYES */
|
|
EndDialog(0);
|
|
}
|
|
}
|
|
|
|
void CExt2MgrDlg::OnOK()
|
|
{
|
|
}
|
|
|
|
void CExt2MgrDlg::OnCancel()
|
|
{
|
|
}
|
|
|
|
void CExt2MgrDlg::OnRefresh()
|
|
{
|
|
m_bHandleChange = FALSE;
|
|
m_bFocusVolume = FALSE;
|
|
m_bFocusDisk = FALSE;
|
|
|
|
Ext2AutoRemoveDeadLetters();
|
|
|
|
/* cleanup all the disk/volume structures */
|
|
Ext2CleanupDisks();
|
|
Ext2CleanupCdroms();
|
|
Ext2CleanupVolumes();
|
|
Ext2CleanupDrvLetters();
|
|
|
|
/* loading system configurations */
|
|
if (Ext2QuerySysConfig()) {
|
|
Ext2LoadDisks();
|
|
Ext2LoadCdroms();
|
|
if (Ext2LoadVolumes()) {
|
|
Ext2LoadRemovableVolumes();
|
|
Ext2LoadDrvLetters();
|
|
Ext2LoadCdromDrvLetters();
|
|
Ext2LoadAllVolumeDrvLetters();
|
|
Ext2LoadAllDiskPartitions();
|
|
if (g_bAutoRemoveDeadLetters) {
|
|
Ext2AutoRemoveDeadLetters();
|
|
}
|
|
if (Ext2ProcessExt2Volumes()) {
|
|
}
|
|
}
|
|
} else {
|
|
return;
|
|
}
|
|
|
|
/* updating the volume list */
|
|
Ext2RefreshVolumeList(&m_VolumeList);
|
|
|
|
/* updating the disk list */
|
|
Ext2RefreshDiskList(&m_DiskView);
|
|
|
|
m_bHandleChange = TRUE;
|
|
}
|
|
|
|
void CExt2MgrDlg::OnService()
|
|
{
|
|
// TODO: Add your command handler code here
|
|
CServiceManage SrvDlg;
|
|
if (!SrvDlg.m_bInited) {
|
|
AfxMessageBox("Cannot query Ext2Fsd service !", MB_OK|MB_ICONSTOP);
|
|
return;
|
|
}
|
|
|
|
/* query global parameters */
|
|
Ext2QueryGlobalProperty(
|
|
&m_nStartmode,
|
|
(BOOL *)&m_bReadonly,
|
|
(BOOL *)&m_bExt3Writable,
|
|
(CHAR *)m_Codepage.GetBuffer(CODEPAGE_MAXLEN),
|
|
(CHAR *)m_sPrefix.GetBuffer(HIDINGPAT_LEN),
|
|
(CHAR *)m_sSuffix.GetBuffer(HIDINGPAT_LEN),
|
|
(BOOL *)&m_bAutoMount
|
|
);
|
|
g_bAutoMount = m_bAutoMount;
|
|
m_Codepage.ReleaseBuffer(-1);
|
|
m_sPrefix.ReleaseBuffer(-1);
|
|
m_sSuffix.ReleaseBuffer(-1);
|
|
|
|
SrvDlg.m_nStartmode = m_nStartmode;
|
|
SrvDlg.m_bReadonly = m_bReadonly;
|
|
SrvDlg.m_bExt3Writable = m_bExt3Writable;
|
|
SrvDlg.m_bAutoMount = m_bAutoMount;
|
|
SrvDlg.m_Codepage = m_Codepage;
|
|
SrvDlg.m_sPrefix = m_sPrefix;
|
|
SrvDlg.m_sSuffix = m_sSuffix;
|
|
if (IDOK == SrvDlg.DoModal()) {
|
|
/* query global parameters */
|
|
Ext2QueryGlobalProperty(
|
|
&m_nStartmode,
|
|
(BOOL *)&m_bReadonly,
|
|
(BOOL *)&m_bExt3Writable,
|
|
(CHAR *)m_Codepage.GetBuffer(CODEPAGE_MAXLEN),
|
|
(CHAR *)m_sPrefix.GetBuffer(HIDINGPAT_LEN),
|
|
(CHAR *)m_sSuffix.GetBuffer(HIDINGPAT_LEN),
|
|
(BOOL *)&m_bAutoMount
|
|
);
|
|
g_bAutoMount = m_bAutoMount;
|
|
}
|
|
}
|
|
|
|
|
|
void CExt2MgrDlg::OnChangeProperty()
|
|
{
|
|
CExt2Attribute EA;
|
|
|
|
PEXT2_VOLUME_PROPERTY3 EVP = NULL;
|
|
|
|
PEXT2_VOLUME volume = NULL;
|
|
PEXT2_CDROM cdrom = NULL;
|
|
|
|
if (m_bFocusVolume) {
|
|
if (m_type == EXT2_VOLUME_MAGIC) {
|
|
volume = (PEXT2_VOLUME) m_sdev;
|
|
EVP = &volume->EVP;
|
|
} else if (m_type == EXT2_CDROM_DEVICE_MAGIC) {
|
|
cdrom = (PEXT2_CDROM) m_sdev;
|
|
EVP = &cdrom->EVP;
|
|
}
|
|
} else {
|
|
if (m_type == EXT2_PART_MAGIC) {
|
|
PEXT2_PARTITION part = (PEXT2_PARTITION) m_sdev;
|
|
volume = part->Volume;
|
|
EVP = &volume->EVP;
|
|
} else if (m_type == EXT2_CDROM_VOLUME_MAGIC ||
|
|
m_type == EXT2_CDROM_DEVICE_MAGIC ) {
|
|
cdrom = (PEXT2_CDROM) m_sdev;
|
|
EVP = &cdrom->EVP;
|
|
}
|
|
}
|
|
|
|
if (EVP) {
|
|
|
|
NT::NTSTATUS status;
|
|
HANDLE Handle = NULL;
|
|
CString s;
|
|
|
|
EA.m_EVP = EVP;
|
|
if (volume) {
|
|
if (volume->Part)
|
|
EA.m_DevName = volume->Part->Name;
|
|
else
|
|
EA.m_DevName = volume->Name;
|
|
} else {
|
|
EA.m_bCdrom = TRUE;
|
|
EA.m_DevName = cdrom->Name;
|
|
}
|
|
|
|
status = Ext2Open(EA.m_DevName.GetBuffer(EA.m_DevName.GetLength()),
|
|
&Handle, EXT2_DESIRED_ACCESS);
|
|
|
|
if (!NT_SUCCESS(status)) {
|
|
|
|
s.Format("Ext2Fsd service isn't started.\n");
|
|
AfxMessageBox(s, MB_OK | MB_ICONSTOP);
|
|
|
|
} else {
|
|
|
|
if (!Ext2QueryExt2Property(Handle, EVP)) {
|
|
Ext2Close(&Handle);
|
|
return;
|
|
}
|
|
|
|
Ext2Close(&Handle);
|
|
}
|
|
|
|
EA.m_MainDlg = (CWnd *)this;
|
|
if (EA.DoModal() == IDOK) {
|
|
}
|
|
if (volume) {
|
|
UpdateVolume(volume);
|
|
} else if (cdrom) {
|
|
UpdateCdrom(cdrom);
|
|
}
|
|
}
|
|
}
|
|
|
|
void CExt2MgrDlg::OnFormat()
|
|
{
|
|
CString str;
|
|
// TODO: Add your command handler code here
|
|
if (m_bFocusVolume) {
|
|
str.Format("Formating volume item: %d", m_IndexVolume);
|
|
}
|
|
if (m_bFocusDisk) {
|
|
str.Format("Formating disk item: %d", m_IndexDisk);
|
|
}
|
|
|
|
if (!str.IsEmpty())
|
|
AfxMessageBox(str);
|
|
}
|
|
|
|
void CExt2MgrDlg::OnWindowPosChanging(WINDOWPOS* lpwndpos)
|
|
{
|
|
if(m_bHide)
|
|
lpwndpos->flags &= ~SWP_SHOWWINDOW;
|
|
|
|
CDialog::OnWindowPosChanging(lpwndpos);
|
|
}
|
|
|
|
BOOL CExt2MgrDlg::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
|
|
{
|
|
// TODO: Add your specialized code here and/or call the base class
|
|
|
|
LPNMHDR pNmhdr = (LPNMHDR)lParam;
|
|
|
|
return CDialog::OnNotify(wParam, lParam, pResult);
|
|
}
|
|
|
|
void CExt2MgrDlg::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct)
|
|
{
|
|
if (nIDCtl == IDC_DISK_LIST) {
|
|
m_DiskView.MeasureItem(lpMeasureItemStruct);
|
|
} else {
|
|
CDialog::OnMeasureItem(nIDCtl, lpMeasureItemStruct);
|
|
}
|
|
}
|
|
|
|
void CExt2MgrDlg::OnDblclkDiskList(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
BOOL IsExt2 = FALSE;
|
|
m_bFocusVolume = FALSE;
|
|
m_bFocusDisk = TRUE;
|
|
m_IndexDisk = m_DiskView.GetSelectionMark();
|
|
|
|
if (!m_bFsStarted) {
|
|
m_bFsStarted = Ext2IsServiceStarted();
|
|
}
|
|
|
|
if (QuerySelectedItem(&IsExt2)) {
|
|
if (IsExt2 && m_bFsStarted) {
|
|
SendMessage(WM_COMMAND, ID_CHANGE, 0);
|
|
} else {
|
|
SendMessage(WM_COMMAND, ID_PROPERTY, 0);
|
|
}
|
|
}
|
|
|
|
*pResult = 0;
|
|
}
|
|
|
|
void CExt2MgrDlg::OnSetfocusDiskList(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
m_bFocusDisk = TRUE;
|
|
m_bFocusVolume = FALSE;
|
|
// m_bar.SetPaneText(0, CString("Disk: Set Focus"));
|
|
|
|
QuerySelectedItem(NULL);
|
|
*pResult = 0;
|
|
}
|
|
|
|
void CExt2MgrDlg::OnKillfocusDiskList(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
m_bFocusDisk = FALSE;
|
|
// m_bar.SetPaneText(0, CString("Disk: Focus Lost"));
|
|
|
|
QuerySelectedItem(NULL);
|
|
*pResult = 0;
|
|
}
|
|
|
|
void CExt2MgrDlg::OnRclickDiskList(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
RECT rect;
|
|
CString s;
|
|
|
|
m_bFocusVolume = FALSE;
|
|
m_bFocusDisk = TRUE;
|
|
m_IndexDisk = m_DiskView.GetSelectionMark();
|
|
|
|
if (!QuerySelectedItem(NULL)) {
|
|
return;
|
|
}
|
|
|
|
while (m_Menu.DeleteMenu(0, MF_BYPOSITION));
|
|
|
|
if (m_bFocusDisk) {
|
|
|
|
if (m_type == EXT2_CDROM_DEVICE_MAGIC ||
|
|
m_type == EXT2_CDROM_VOLUME_MAGIC ) {
|
|
|
|
PEXT2_CDROM cdrom = (PEXT2_CDROM) m_sdev;
|
|
|
|
s.LoadString(IDS_DRV_QUICK_MOUNT);
|
|
if (0 == cdrom->DrvLetters)
|
|
m_Menu.AppendMenu(MF_STRING, ID_DRV_QUICK_MOUNT, (LPCTSTR)s);
|
|
|
|
s.LoadString(IDS_CHANGE_DRVLETTER);
|
|
m_Menu.AppendMenu(MF_STRING, ID_DRV_LETTER, (LPCTSTR)s);
|
|
|
|
m_Menu.AppendMenu(MF_SEPARATOR, 0, "");
|
|
if (cdrom->bLoaded && !cdrom->bEjected &&
|
|
(cdrom->EVP.bExt2 || cdrom->EVP.bExt3)) {
|
|
|
|
s.LoadString(IDS_EXT2_MANAGEMENT);
|
|
m_Menu.AppendMenu(MF_STRING, ID_CHANGE, (LPCTSTR)s);
|
|
}
|
|
|
|
m_Menu.AppendMenu(MF_SEPARATOR, 0, "");
|
|
|
|
s.LoadString(IDS_COPY_ITEM_TO_CLIP);
|
|
m_Menu.AppendMenu(MF_STRING, ID_COPY, (LPCTSTR)s);
|
|
m_Menu.AppendMenu(MF_SEPARATOR, 0, "");
|
|
|
|
} else if (m_type == EXT2_PART_MAGIC) {
|
|
|
|
PEXT2_PARTITION part = (PEXT2_PARTITION) m_sdev;
|
|
PEXT2_VOLUME volume = part->Volume;
|
|
|
|
if (volume && !volume->bDynamic) {
|
|
s.LoadString(IDS_DRV_QUICK_MOUNT);
|
|
if (0 == volume->DrvLetters)
|
|
m_Menu.AppendMenu(MF_STRING, ID_DRV_QUICK_MOUNT, (LPCTSTR)s);
|
|
|
|
s.LoadString(IDS_CHANGE_DRVLETTER);
|
|
m_Menu.AppendMenu(MF_STRING, ID_DRV_LETTER, (LPCTSTR)s);
|
|
m_Menu.AppendMenu(MF_SEPARATOR, 0, "");
|
|
}
|
|
|
|
if (volume && volume->bRecognized && (volume->EVP.bExt2 || volume->EVP.bExt3)) {
|
|
s.LoadString(IDS_EXT2_MANAGEMENT);
|
|
m_Menu.AppendMenu(MF_STRING, ID_CHANGE, (LPCTSTR)s);
|
|
m_Menu.AppendMenu(MF_SEPARATOR, 0, "");
|
|
}
|
|
|
|
if (part->Entry) {
|
|
s.LoadString(IDS_FLUSH_BUFFER);
|
|
m_Menu.AppendMenu(MF_STRING, ID_FLUSH_BUFFER, (LPCTSTR)s);
|
|
|
|
if (part->PartType == PARTITION_STYLE_MBR) {
|
|
s.LoadString(IDS_CHANGE_PARTID);
|
|
m_Menu.AppendMenu(MF_STRING, ID_CHANGE_PARTTYPE, (LPCTSTR)s);
|
|
}
|
|
m_Menu.AppendMenu(MF_SEPARATOR, 0, "");
|
|
}
|
|
|
|
s.LoadString(IDS_COPY_ITEM_TO_CLIP);
|
|
m_Menu.AppendMenu(MF_STRING, ID_COPY, (LPCTSTR)s);
|
|
|
|
m_Menu.AppendMenu(MF_SEPARATOR, 0, "");
|
|
|
|
} else {
|
|
ASSERT(m_type == EXT2_DISK_MAGIC);
|
|
}
|
|
}
|
|
|
|
s.LoadString(IDS_RELOAD_REFRESH);
|
|
m_Menu.AppendMenu(MF_STRING, ID_REFRESH, (LPCTSTR)s);
|
|
m_Menu.AppendMenu(MF_SEPARATOR, 0, "");
|
|
|
|
s.LoadString(IDS_SHOW_PROPERTY);
|
|
m_Menu.AppendMenu(MF_STRING, ID_PROPERTY, (LPCTSTR)s);
|
|
m_Menu.AppendMenu(MF_SEPARATOR, 0, "");
|
|
|
|
s.LoadString(IDS_SERVICE_MANAGE);
|
|
m_Menu.AppendMenu(MF_STRING, ID_SERVICE, (LPCTSTR)s);
|
|
|
|
s.LoadString(IDS_PERFMEM_STAT);
|
|
m_Menu.AppendMenu(MF_STRING, ID_PERFSTAT, (LPCTSTR)s);
|
|
|
|
s.LoadString(IDS_REMOVE_DEAD_LETTER);
|
|
m_Menu.AppendMenu(MF_STRING, ID_REMOVE_DEAD_LETTER, (LPCTSTR)s);
|
|
|
|
m_DiskView.GetWindowRect(&rect);
|
|
m_Menu.TrackPopupMenu( TPM_LEFTALIGN,
|
|
rect.left + m_DiskView.m_Point.x,
|
|
rect.top + m_DiskView.m_Point.y,
|
|
m_DiskView.GetSafeOwner(),
|
|
NULL);
|
|
|
|
*pResult = 0;
|
|
}
|
|
|
|
|
|
void CExt2MgrDlg::OnClickDiskList(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
m_bFocusVolume = FALSE;
|
|
m_bFocusDisk = TRUE;
|
|
m_IndexDisk = m_DiskView.GetSelectionMark();
|
|
|
|
QuerySelectedItem(NULL);
|
|
*pResult = 0;
|
|
}
|
|
|
|
void CExt2MgrDlg::OnDblclkVolumeList(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
BOOL bIsExt2 = FALSE;
|
|
|
|
if (!m_bFsStarted) {
|
|
m_bFsStarted = Ext2IsServiceStarted();
|
|
}
|
|
|
|
m_bFocusVolume = TRUE;
|
|
m_IndexVolume = m_VolumeList.GetSelectionMark();;
|
|
m_bFocusDisk = FALSE;
|
|
if (QuerySelectedItem(&bIsExt2)) {
|
|
if (bIsExt2 && m_bFsStarted) {
|
|
SendMessage(WM_COMMAND, ID_CHANGE, 0);
|
|
} else {
|
|
SendMessage(WM_COMMAND, ID_PROPERTY, 0);
|
|
}
|
|
}
|
|
*pResult = 0;
|
|
}
|
|
|
|
void CExt2MgrDlg::OnSetfocusVolumeList(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
//m_bar.SetPaneText(0, CString("Volume: Set Focus"));
|
|
m_bFocusVolume = TRUE;
|
|
*pResult = 0;
|
|
QuerySelectedItem(NULL);
|
|
}
|
|
|
|
void CExt2MgrDlg::OnKillfocusVolumeList(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
m_bFocusVolume = FALSE;
|
|
//m_bar.SetPaneText(0, CString("Volume: Focus Lost"));
|
|
|
|
// TODO: Add your control notification handler code here
|
|
*pResult = 0;
|
|
QuerySelectedItem(NULL);
|
|
}
|
|
|
|
void CExt2MgrDlg::OnRclickVolumeList(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
RECT rect;
|
|
CString s;
|
|
|
|
m_bFocusVolume = TRUE;
|
|
m_IndexVolume = m_VolumeList.GetSelectionMark();;
|
|
m_bFocusDisk = FALSE;
|
|
|
|
if (!QuerySelectedItem(NULL)) {
|
|
return;
|
|
}
|
|
|
|
while (m_Menu.DeleteMenu(0, MF_BYPOSITION));
|
|
|
|
if (m_bFocusVolume) {
|
|
|
|
if (m_type == EXT2_VOLUME_MAGIC) {
|
|
|
|
PEXT2_VOLUME volume = (PEXT2_VOLUME) m_sdev;
|
|
PEXT2_PARTITION part;
|
|
|
|
s.LoadString(IDS_DRV_QUICK_MOUNT);
|
|
if (0 == volume->DrvLetters)
|
|
m_Menu.AppendMenu(MF_STRING, ID_DRV_QUICK_MOUNT, (LPCTSTR)s);
|
|
|
|
s.LoadString(IDS_CHANGE_DRVLETTER);
|
|
m_Menu.AppendMenu(MF_STRING, ID_DRV_LETTER, (LPCTSTR)s);
|
|
m_Menu.AppendMenu(MF_SEPARATOR, 0, "");
|
|
|
|
if (volume->bRecognized && (volume->EVP.bExt2 || volume->EVP.bExt3)) {
|
|
s.LoadString(IDS_EXT2_MANAGEMENT);
|
|
m_Menu.AppendMenu(MF_STRING, ID_CHANGE, (LPCTSTR)s);
|
|
m_Menu.AppendMenu(MF_SEPARATOR, 0, "");
|
|
}
|
|
|
|
s.LoadString(IDS_FLUSH_BUFFER);
|
|
m_Menu.AppendMenu(MF_STRING, ID_FLUSH_BUFFER, (LPCTSTR)s);
|
|
|
|
part = Ext2QueryVolumePartition(volume);
|
|
if (part && part->PartType == PARTITION_STYLE_MBR) {
|
|
s.LoadString(IDS_CHANGE_PARTID);
|
|
m_Menu.AppendMenu(MF_STRING, ID_CHANGE_PARTTYPE, (LPCTSTR)s);
|
|
}
|
|
|
|
} else if (m_type == EXT2_CDROM_DEVICE_MAGIC ||
|
|
m_type == EXT2_CDROM_VOLUME_MAGIC ) {
|
|
|
|
PEXT2_CDROM cdrom = (PEXT2_CDROM)m_sdev;
|
|
|
|
s.LoadString(IDS_DRV_QUICK_MOUNT);
|
|
if (0 == cdrom->DrvLetters)
|
|
m_Menu.AppendMenu(MF_STRING, ID_DRV_QUICK_MOUNT, (LPCTSTR)s);
|
|
|
|
s.LoadString(IDS_CHANGE_DRVLETTER);
|
|
m_Menu.AppendMenu(MF_STRING, ID_DRV_LETTER, (LPCTSTR)s);
|
|
|
|
if (cdrom->bLoaded && !cdrom->bEjected &&
|
|
(cdrom->EVP.bExt2 || cdrom->EVP.bExt3)) {
|
|
m_Menu.AppendMenu(MF_SEPARATOR, 0, "");
|
|
s.LoadString(IDS_EXT2_MANAGEMENT);
|
|
m_Menu.AppendMenu(MF_STRING, ID_CHANGE, (LPCTSTR)s);
|
|
}
|
|
}
|
|
|
|
m_Menu.AppendMenu(MF_SEPARATOR, 0, "");
|
|
s.LoadString(IDS_COPY_ITEM_TO_CLIP);
|
|
m_Menu.AppendMenu(MF_STRING, ID_COPY, (LPCTSTR)s);
|
|
m_Menu.AppendMenu(MF_SEPARATOR, 0, "");
|
|
}
|
|
|
|
s.LoadString(IDS_RELOAD_REFRESH);
|
|
m_Menu.AppendMenu(MF_STRING, ID_REFRESH, (LPCTSTR)s);
|
|
m_Menu.AppendMenu(MF_SEPARATOR, 0, "");
|
|
|
|
s.LoadString(IDS_SHOW_PROPERTY);
|
|
m_Menu.AppendMenu(MF_STRING, ID_PROPERTY, (LPCTSTR)s);
|
|
m_Menu.AppendMenu(MF_SEPARATOR, 0, "");
|
|
|
|
s.LoadString(IDS_SERVICE_MANAGE);
|
|
m_Menu.AppendMenu(MF_STRING, ID_SERVICE, (LPCTSTR)s);
|
|
|
|
s.LoadString(IDS_PERFMEM_STAT);
|
|
m_Menu.AppendMenu(MF_STRING, ID_PERFSTAT, (LPCTSTR)s);
|
|
|
|
s.LoadString(IDS_REMOVE_DEAD_LETTER);
|
|
m_Menu.AppendMenu(MF_STRING, ID_REMOVE_DEAD_LETTER, (LPCTSTR)s);
|
|
|
|
m_VolumeList.GetWindowRect(&rect);
|
|
m_Menu.TrackPopupMenu(TPM_LEFTALIGN,
|
|
rect.left + m_VolumeList.m_Point.x ,
|
|
rect.top + m_VolumeList.m_Point.y,
|
|
m_VolumeList.GetSafeOwner(), NULL);
|
|
|
|
*pResult = 0;
|
|
}
|
|
|
|
|
|
void CExt2MgrDlg::OnClickVolumeList(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
m_bFocusVolume = TRUE;
|
|
m_IndexVolume = m_VolumeList.GetSelectionMark();;
|
|
m_bFocusDisk = FALSE;
|
|
|
|
QuerySelectedItem(NULL);
|
|
|
|
*pResult = 0;
|
|
}
|
|
|
|
|
|
void CExt2MgrDlg::OnProperty()
|
|
{
|
|
PVOID sdev = QuerySelectedItem(NULL);
|
|
if (sdev) {
|
|
CProperties PPD;
|
|
PPD.m_bdisk = m_bFocusDisk;
|
|
PPD.m_type = m_type;
|
|
PPD.m_sdev = sdev;
|
|
PPD.DoModal();
|
|
}
|
|
}
|
|
|
|
VOID
|
|
CExt2MgrDlg::DriversChangeNotify(
|
|
ULONG drvsMask,
|
|
BOOL bArrival
|
|
)
|
|
{
|
|
for (ULONG i=0; i < 26; i++) {
|
|
|
|
PEXT2_LETTER drvLetter = &drvLetters[i];
|
|
|
|
if (drvsMask & (1 << i)) {
|
|
DriverChangeNotify(drvLetter, bArrival);
|
|
}
|
|
}
|
|
}
|
|
|
|
VOID
|
|
CExt2MgrDlg::DriverLetterChangeNotify(
|
|
CHAR cLetter,
|
|
BOOL bArrival
|
|
)
|
|
{
|
|
PEXT2_LETTER drvLetter = NULL;
|
|
|
|
if (cLetter >= '0' && cLetter <= '9') {
|
|
drvLetter = &drvDigits[cLetter - '0'];
|
|
} else if (cLetter >= 'A' && cLetter <= 'Z') {
|
|
drvLetter = &drvLetters[cLetter - 'A'];
|
|
}
|
|
|
|
if (drvLetter) {
|
|
DriverChangeNotify(drvLetter, bArrival);
|
|
}
|
|
}
|
|
|
|
VOID
|
|
CExt2MgrDlg::DriverChangeNotify(
|
|
PEXT2_LETTER drvLetter,
|
|
BOOL bArrival
|
|
)
|
|
{
|
|
ULONGLONG LetterMask = 0;
|
|
ULONG i;
|
|
|
|
if (!m_bHandleChange) {
|
|
return;
|
|
}
|
|
|
|
if (bArrival) {
|
|
if (!drvLetter->bUsed) {
|
|
Ext2CleanDrvLetter(drvLetter);
|
|
Ext2QueryDrvLetter(drvLetter);
|
|
}
|
|
}
|
|
|
|
if (drvLetter->Letter >= '0' && drvLetter->Letter <= '9') {
|
|
LetterMask = ((ULONGLONG) 1) << (drvLetter->Letter - '0' + 32);
|
|
} else if (drvLetter->Letter >= 'A' && drvLetter->Letter <= 'Z') {
|
|
LetterMask = ((ULONGLONG) 1) << (drvLetter->Letter - 'A');
|
|
}
|
|
|
|
if (drvLetter->bUsed) {
|
|
|
|
if (NULL != drvLetter->Extent) {
|
|
|
|
PEXT2_VOLUME Volume = &gVols[0];
|
|
for (i=0; i < g_nVols && Volume != NULL; i++) {
|
|
if (Ext2CompareExtents(drvLetter->Extent, Volume->Extent)) {
|
|
if (bArrival) {
|
|
Volume->DrvLetters |= LetterMask;
|
|
} else {
|
|
Volume->DrvLetters &= ~LetterMask;
|
|
}
|
|
UpdateVolume(Volume);
|
|
break;
|
|
}
|
|
Volume = Volume->Next;
|
|
}
|
|
}
|
|
|
|
for (i=0; i < g_nCdroms; i++) {
|
|
PEXT2_CDROM Cdrom = &gCdroms[i];
|
|
if (!_stricmp(drvLetters->SymLink, Cdrom->Name)) {
|
|
if (bArrival) {
|
|
Cdrom->DrvLetters |= LetterMask;
|
|
} else {
|
|
Cdrom->DrvLetters &= ~LetterMask;
|
|
}
|
|
UpdateCdrom(Cdrom);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!bArrival) {
|
|
|
|
//Ext2SymLinkRemoval(drvLetter->Letter);
|
|
//Ext2RemoveDosSymLink(drvLetter->Letter);
|
|
|
|
if (drvLetter->bUsed) {
|
|
//Ext2DismountVolume(drvLetter->SymLink);
|
|
Ext2RemoveMountPoint(drvLetter, FALSE);
|
|
}
|
|
}
|
|
}
|
|
|
|
void CExt2MgrDlg::UpdateVolume(PEXT2_VOLUME volume)
|
|
{
|
|
for (int i = 0; i < m_VolumeList.GetItemCount(); i++) {
|
|
PULONG data = (PULONG)m_VolumeList.GetItemData(i);
|
|
if (!data) {
|
|
continue;
|
|
}
|
|
if (*data == EXT2_VOLUME_MAGIC &&
|
|
data == (PULONG)volume) {
|
|
Ext2RefreshVLVI(&m_VolumeList, volume, i);
|
|
}
|
|
}
|
|
|
|
for (int i = 0; i < m_DiskView.GetItemCount(); i++) {
|
|
PEXT2_PARTITION part;
|
|
part = (PEXT2_PARTITION)m_DiskView.GetItemData(i);
|
|
if (!part) {
|
|
continue;
|
|
}
|
|
if (part->Magic == EXT2_PART_MAGIC &&
|
|
part->Volume == volume) {
|
|
part->DrvLetters = volume->DrvLetters;
|
|
Ext2RefreshDVPT(&m_DiskView, part, i);
|
|
}
|
|
}
|
|
}
|
|
|
|
void CExt2MgrDlg::UpdateCdrom(PEXT2_CDROM cdrom)
|
|
{
|
|
for (int i = 0; i < m_VolumeList.GetItemCount(); i++) {
|
|
PULONG data = (PULONG)m_VolumeList.GetItemData(i);
|
|
if (!data) {
|
|
continue;
|
|
}
|
|
if (*data == EXT2_CDROM_DEVICE_MAGIC &&
|
|
data == (PULONG)cdrom) {
|
|
Ext2RefreshVLCD(&m_VolumeList, cdrom, i);
|
|
}
|
|
}
|
|
|
|
for (int i = 0; i < m_DiskView.GetItemCount(); i++) {
|
|
PULONG data = (PULONG)m_DiskView.GetItemData(i);
|
|
if (!data) {
|
|
continue;
|
|
}
|
|
if (*data == EXT2_CDROM_VOLUME_MAGIC &&
|
|
(PUCHAR)data == ((PUCHAR)cdrom + 4)) {
|
|
Ext2RefreshDVCM(&m_DiskView, cdrom, i);
|
|
}
|
|
}
|
|
}
|
|
|
|
void CExt2MgrDlg::UpdatePartition(PEXT2_PARTITION part)
|
|
{
|
|
int i;
|
|
|
|
if (part->Volume) {
|
|
part->Volume->DrvLetters = part->DrvLetters;
|
|
UpdateVolume(part->Volume);
|
|
return;
|
|
}
|
|
|
|
for (i = 0; i < m_DiskView.GetItemCount(); i++) {
|
|
|
|
PULONG data = (PULONG)m_DiskView.GetItemData(i);
|
|
if (!data) {
|
|
continue;
|
|
}
|
|
if (*data == EXT2_PART_MAGIC &&
|
|
data == (PULONG)part) {
|
|
Ext2RefreshDVPT(&m_DiskView, part, i);
|
|
}
|
|
}
|
|
}
|
|
|
|
void CExt2MgrDlg::OnDrvLetter()
|
|
{
|
|
// TODO: Add your command handler code here
|
|
CMountPoints mntPoint;
|
|
if (m_bFocusVolume) {
|
|
if (m_type == EXT2_VOLUME_MAGIC) {
|
|
mntPoint.m_Volume = (PEXT2_VOLUME) m_sdev;
|
|
} else {
|
|
mntPoint.m_Cdrom = (PEXT2_CDROM) m_sdev;
|
|
}
|
|
} else {
|
|
if (m_type == EXT2_CDROM_DEVICE_MAGIC ||
|
|
m_type == EXT2_CDROM_VOLUME_MAGIC ) {
|
|
mntPoint.m_Cdrom = (PEXT2_CDROM) m_sdev;
|
|
} else {
|
|
mntPoint.m_Part = (PEXT2_PARTITION) m_sdev;
|
|
}
|
|
}
|
|
|
|
mntPoint.m_MainDlg = this;
|
|
mntPoint.DoModal();
|
|
|
|
/* to be done in OnDeviceChange */
|
|
|
|
/*
|
|
if (mntPoint.m_bUpdated) {
|
|
|
|
if (mntPoint.m_Volume) {
|
|
UpdateVolume(mntPoint.m_Volume);
|
|
}
|
|
if (mntPoint.m_Cdrom) {
|
|
UpdateCdrom(mntPoint.m_Cdrom);
|
|
}
|
|
if (mntPoint.m_Part) {
|
|
UpdatePartition(mntPoint.m_Part);
|
|
}
|
|
}
|
|
*/
|
|
}
|
|
|
|
void CExt2MgrDlg::OnDrvQuickMount()
|
|
{
|
|
CHAR drv = 0;
|
|
|
|
if (m_bFocusVolume) {
|
|
if (m_type == EXT2_VOLUME_MAGIC) {
|
|
PEXT2_VOLUME v = (PEXT2_VOLUME)m_sdev;
|
|
if (0 == v->DrvLetters) {
|
|
drv = Ext2MountVolume(v->Name);
|
|
if (drv) {
|
|
v->DrvLetters |= ((ULONGLONG) 1) << (drv - 'A');
|
|
UpdateVolume(v);
|
|
}
|
|
}
|
|
} else {
|
|
PEXT2_CDROM c = (PEXT2_CDROM) m_sdev;
|
|
if (0 == c->DrvLetters) {
|
|
drv = Ext2MountVolume(c->Name);
|
|
if (drv) {
|
|
c->DrvLetters |= ((ULONGLONG) 1) << (drv - 'A');
|
|
UpdateCdrom(c);
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
if (m_type == EXT2_CDROM_DEVICE_MAGIC ||
|
|
m_type == EXT2_CDROM_VOLUME_MAGIC ) {
|
|
PEXT2_CDROM c = (PEXT2_CDROM) m_sdev;
|
|
if (0 == c->DrvLetters) {
|
|
drv = Ext2MountVolume(c->Name);
|
|
if (drv) {
|
|
c->DrvLetters |= ((ULONGLONG) 1) << (drv - 'A');
|
|
UpdateCdrom(c);
|
|
}
|
|
}
|
|
} else {
|
|
PEXT2_PARTITION p = (PEXT2_PARTITION) m_sdev;
|
|
if (0 == p->DrvLetters) {
|
|
drv = Ext2MountVolume(p->Name);
|
|
if (drv) {
|
|
p->DrvLetters |= ((ULONGLONG) 1) << (drv - 'A');
|
|
UpdatePartition(p);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void CExt2MgrDlg::OnDonate()
|
|
{
|
|
// TODO: Add your command handler code here
|
|
CDonate Donate;
|
|
Donate.DoModal();
|
|
}
|
|
|
|
void CExt2MgrDlg::OnCopy()
|
|
{
|
|
CHAR Data[256];
|
|
BOOL rc = FALSE;
|
|
|
|
// TODO: Add your command handler code here
|
|
if (m_bFocusVolume) {
|
|
rc = m_VolumeList.QuerySubItemText(m_IndexVolume, Data, 256);
|
|
} else if (m_bFocusDisk) {
|
|
rc = m_DiskView.QuerySubItemText(m_IndexDisk, Data, 256);
|
|
}
|
|
|
|
if (rc && OpenClipboard()) {
|
|
|
|
HGLOBAL clipbuffer;
|
|
char * buffer;
|
|
clipbuffer = GlobalAlloc(GMEM_DDESHARE, strlen(Data) + 1);
|
|
if (clipbuffer) {
|
|
buffer = (char*)GlobalLock(clipbuffer);
|
|
if (buffer) {
|
|
EmptyClipboard();
|
|
memset(buffer, 0, strlen(Data) + 1);
|
|
memcpy(buffer, Data, strlen(Data) + 1);
|
|
GlobalUnlock(clipbuffer);
|
|
SetClipboardData(CF_TEXT,clipbuffer);
|
|
} else {
|
|
GlobalFree(clipbuffer);
|
|
}
|
|
}
|
|
CloseClipboard();
|
|
}
|
|
}
|
|
|
|
void CExt2MgrDlg::OnCopyAll()
|
|
{
|
|
BOOL rc = FALSE;
|
|
CString s;
|
|
|
|
s = Ext2SysInformation();
|
|
|
|
if (!s.IsEmpty() && OpenClipboard()) {
|
|
|
|
HGLOBAL clipbuffer;
|
|
char * buffer;
|
|
clipbuffer = GlobalAlloc(GMEM_DDESHARE, s.GetLength() + 1);
|
|
if (clipbuffer) {
|
|
buffer = (char*)GlobalLock(clipbuffer);
|
|
if (buffer) {
|
|
EmptyClipboard();
|
|
memcpy(buffer, (LPCSTR)s, s.GetLength() + 1);
|
|
GlobalUnlock(clipbuffer);
|
|
SetClipboardData(CF_TEXT,clipbuffer);
|
|
} else {
|
|
GlobalFree(clipbuffer);
|
|
}
|
|
}
|
|
CloseClipboard();
|
|
}
|
|
}
|
|
|
|
void CExt2MgrDlg::OnTimer(UINT_PTR nIDEvent)
|
|
{
|
|
// TODO: Add your message handler code here and/or call default
|
|
|
|
if (nIDEvent == ID_INDICATOR_TIME) {
|
|
CString s;
|
|
CTime t1;
|
|
t1 = CTime::GetCurrentTime();
|
|
s.Format(" %3.3s", t1.Format("%B"));
|
|
s += t1.Format(" %d,%Y %H:%M:%S");
|
|
m_bar.SetPaneText(1, s);
|
|
} else if (nIDEvent == 'REFR') {
|
|
if (m_bHandleChange)
|
|
PostMessage(WM_COMMAND, ID_REFRESH, 0);
|
|
KillTimer('REFR');
|
|
} else if (nIDEvent == 'REFF') {
|
|
PostMessage(WM_COMMAND, ID_REFRESH, 0);
|
|
KillTimer('REFF');
|
|
}
|
|
|
|
CDialog::OnTimer(nIDEvent);
|
|
}
|
|
|
|
PVOID CExt2MgrDlg::QuerySelectedItem(PBOOL bIsExt2)
|
|
{
|
|
CString str = "Ready";
|
|
PVOID List = NULL;
|
|
|
|
PEXT2_CDROM Cdrom = NULL;
|
|
PEXT2_DISK Disk = NULL;
|
|
PEXT2_VOLUME Volume = NULL;
|
|
PEXT2_PARTITION Part = NULL;
|
|
|
|
LVITEM lvItem;
|
|
memset(&lvItem, 0, sizeof(LVITEM));
|
|
lvItem.mask = LVIF_PARAM | LVIF_IMAGE;
|
|
|
|
m_sdev = NULL;
|
|
m_type = 0;
|
|
|
|
CMenu* pMenu = AfxGetMainWnd()->GetMenu();
|
|
CMenu* pTools = NULL;
|
|
pTools = pMenu->GetSubMenu(1);
|
|
|
|
if (bIsExt2) {
|
|
*bIsExt2 = FALSE;
|
|
}
|
|
|
|
pTools->EnableMenuItem(ID_DRV_LETTER, MF_BYCOMMAND|MF_GRAYED|MF_DISABLED);
|
|
pTools->EnableMenuItem(ID_CHANGE, MF_BYCOMMAND|MF_GRAYED|MF_DISABLED);
|
|
pTools->EnableMenuItem(ID_FORMAT, MF_BYCOMMAND|MF_GRAYED|MF_DISABLED);
|
|
pTools->EnableMenuItem(ID_PROPERTY, MF_BYCOMMAND|MF_GRAYED|MF_DISABLED);
|
|
|
|
if (m_bFocusVolume) {
|
|
|
|
if (m_IndexVolume == -1 ||
|
|
m_IndexVolume >= m_VolumeList.GetItemCount()) {
|
|
goto errorout;
|
|
}
|
|
|
|
lvItem.iItem = m_IndexVolume;
|
|
m_VolumeList.GetItem(&lvItem);
|
|
|
|
PEXT2_VOLUME Volume = (PEXT2_VOLUME) lvItem.lParam;
|
|
if (!Volume) {
|
|
goto errorout;
|
|
}
|
|
Cdrom = (PEXT2_CDROM) Volume;
|
|
m_type = Volume->Magic;
|
|
|
|
if (Volume->Magic == EXT2_VOLUME_MAGIC) {
|
|
str.Format("VOLUME: %s %s %s",
|
|
Ext2QueryVolumeLetterStrings(
|
|
Volume->DrvLetters, NULL),
|
|
Volume->FileSystem, Volume->Name);
|
|
m_sdev = (PVOID) Volume;
|
|
|
|
if (Volume->bRecognized && (Volume->EVP.bExt2 || Volume->EVP.bExt3)) {
|
|
pTools->EnableMenuItem(ID_CHANGE, MF_BYCOMMAND|MF_ENABLED);
|
|
}
|
|
pTools->EnableMenuItem(ID_FORMAT, MF_BYCOMMAND|MF_ENABLED);
|
|
pTools->EnableMenuItem(ID_DRV_LETTER, MF_BYCOMMAND|MF_ENABLED);
|
|
pTools->EnableMenuItem(ID_PROPERTY, MF_BYCOMMAND|MF_ENABLED);
|
|
|
|
if (bIsExt2 && Volume->bRecognized) {
|
|
*bIsExt2 = Volume->EVP.bExt2 || Volume->EVP.bExt3;
|
|
}
|
|
|
|
} else if (Cdrom->Magic[0] == EXT2_CDROM_DEVICE_MAGIC) {
|
|
str.Format("CDROM %d: %s", Cdrom->OrderNo,
|
|
Ext2QueryVolumeLetterStrings(
|
|
Cdrom->DrvLetters, NULL));
|
|
if (Cdrom->bIsDVD) {
|
|
str += " DVD";
|
|
}
|
|
m_sdev = (PVOID) Cdrom;
|
|
|
|
pTools->EnableMenuItem(ID_DRV_LETTER, MF_BYCOMMAND|MF_ENABLED);
|
|
pTools->EnableMenuItem(ID_PROPERTY, MF_BYCOMMAND|MF_ENABLED);
|
|
|
|
if (bIsExt2) {
|
|
*bIsExt2 = Cdrom->EVP.bExt2 || Cdrom->EVP.bExt3;
|
|
}
|
|
|
|
} else {
|
|
m_IndexVolume = -1;
|
|
}
|
|
}
|
|
|
|
if (m_bFocusDisk) {
|
|
|
|
if (m_IndexDisk == -1 ||
|
|
m_IndexDisk >= m_DiskView.GetItemCount()) {
|
|
goto errorout;
|
|
}
|
|
|
|
lvItem.iItem = m_IndexDisk;
|
|
m_DiskView.GetItem(&lvItem);
|
|
|
|
PEXT2_DISK Disk = (PEXT2_DISK) lvItem.lParam;
|
|
if (!Disk) {
|
|
goto errorout;
|
|
}
|
|
|
|
m_type = Disk->Magic;
|
|
|
|
if (Disk->Magic == EXT2_DISK_MAGIC) {
|
|
str.Format("DISK %d: %s", Disk->OrderNo, Disk->Name);
|
|
m_sdev = (PVOID) Disk;
|
|
pTools->EnableMenuItem(ID_PROPERTY, MF_BYCOMMAND|MF_ENABLED);
|
|
} else if (Disk->Magic == EXT2_PART_MAGIC) {
|
|
BOOL bDynamic = FALSE;
|
|
Part = (PEXT2_PARTITION) Disk;
|
|
Disk = Part->Disk;
|
|
Volume = Part->Volume;
|
|
if (!Volume) {
|
|
if (Disk->SDD.RemovableMedia) {
|
|
if (Disk->bEjected) {
|
|
str.Format("DISK %d: No media", Disk->OrderNo);
|
|
} else {
|
|
str.Format("DISK %d: RAW", Disk->OrderNo);
|
|
}
|
|
} else {
|
|
if (Disk->Layout) {
|
|
str.Format("DISK %d: Not recognized", Disk->OrderNo);
|
|
} else {
|
|
str.Format("DISK %d: RAW", Disk->OrderNo);
|
|
}
|
|
}
|
|
} else {
|
|
str.Format("DISK %d PARTITION %d: %s %s",
|
|
Disk->OrderNo, Part->Number,
|
|
Ext2QueryVolumeLetterStrings(
|
|
Part->DrvLetters, NULL),
|
|
Part->Volume->FileSystem
|
|
);
|
|
}
|
|
m_sdev = (PVOID) Part;
|
|
if (Volume) {
|
|
pTools->EnableMenuItem(ID_FORMAT, MF_BYCOMMAND|MF_ENABLED);
|
|
if (Volume->bRecognized && (Volume->EVP.bExt2 || Volume->EVP.bExt3))
|
|
pTools->EnableMenuItem(ID_CHANGE, MF_BYCOMMAND|MF_ENABLED);
|
|
if (!Volume->bDynamic) {
|
|
pTools->EnableMenuItem(ID_DRV_LETTER, MF_BYCOMMAND|MF_ENABLED);
|
|
}
|
|
if (bIsExt2 && Volume->bRecognized) {
|
|
*bIsExt2 = Volume->EVP.bExt2 || Volume->EVP.bExt3;
|
|
}
|
|
} else {
|
|
if (Disk->SDD.RemovableMedia) {
|
|
pTools->EnableMenuItem(ID_DRV_LETTER, MF_BYCOMMAND|MF_ENABLED);
|
|
}
|
|
}
|
|
pTools->EnableMenuItem(ID_PROPERTY, MF_BYCOMMAND|MF_ENABLED);
|
|
} else if (Disk->Magic == EXT2_DISK_NULL_MAGIC) {
|
|
Disk = (PEXT2_DISK)((PUCHAR)Disk - sizeof(ULONG));
|
|
str.Format("DISK %d: No media", Disk->OrderNo);
|
|
m_sdev = (PVOID) Disk;
|
|
pTools->EnableMenuItem(ID_PROPERTY, MF_BYCOMMAND|MF_ENABLED);
|
|
} else if (Disk->Magic == EXT2_CDROM_VOLUME_MAGIC) {
|
|
Cdrom = (PEXT2_CDROM)((PUCHAR)Disk - sizeof(ULONG));
|
|
str.Format("CDROM %d: %s", Cdrom->OrderNo,
|
|
Ext2QueryVolumeLetterStrings(
|
|
Cdrom->DrvLetters, NULL));
|
|
if (Cdrom->bIsDVD) {
|
|
str += " DVD";
|
|
}
|
|
m_sdev = (PVOID) Cdrom;
|
|
pTools->EnableMenuItem(ID_DRV_LETTER, MF_BYCOMMAND|MF_ENABLED);
|
|
pTools->EnableMenuItem(ID_PROPERTY, MF_BYCOMMAND|MF_ENABLED);
|
|
} else if (Disk->Magic == EXT2_CDROM_DEVICE_MAGIC){
|
|
Cdrom = (PEXT2_CDROM)Disk;
|
|
str.Format("CDROM %d: %s", Cdrom->OrderNo, Cdrom->Name);
|
|
pTools->EnableMenuItem(ID_DRV_LETTER, MF_BYCOMMAND|MF_ENABLED);
|
|
pTools->EnableMenuItem(ID_PROPERTY, MF_BYCOMMAND|MF_ENABLED);
|
|
m_sdev = (PVOID) Cdrom;
|
|
} else {
|
|
m_IndexDisk = -1;
|
|
}
|
|
}
|
|
|
|
errorout:
|
|
|
|
m_bar.SetPaneText(0, str);
|
|
|
|
return m_sdev;
|
|
}
|
|
|
|
void CExt2MgrDlg::OnKeyupVolumeList()
|
|
{
|
|
m_bFocusDisk = FALSE;
|
|
m_bFocusVolume = TRUE;
|
|
|
|
int item = m_VolumeList.GetSelectionMark();
|
|
if (item != -1 && item != m_IndexVolume) {
|
|
m_IndexVolume = item;
|
|
QuerySelectedItem(NULL);
|
|
}
|
|
}
|
|
|
|
void CExt2MgrDlg::OnKeyupDiskList()
|
|
{
|
|
int item = m_DiskView.GetSelectionMark();
|
|
|
|
if (item != -1 && item != m_IndexDisk) {
|
|
m_DiskView.SetSelectionMark(item);
|
|
m_IndexDisk = item;
|
|
QuerySelectedItem(NULL);
|
|
}
|
|
|
|
if (!m_bFocusDisk) {
|
|
m_DiskView.Redraw();
|
|
}
|
|
|
|
m_bFocusDisk = TRUE;
|
|
m_bFocusVolume = FALSE;
|
|
}
|
|
|
|
BOOL CExt2MgrDlg::PreTranslateMessage(MSG* pMsg)
|
|
{
|
|
// TODO: Add your specialized code here and/or call the base class
|
|
|
|
if (pMsg->message==WM_KEYDOWN) {
|
|
if (pMsg->wParam == VK_ESCAPE) {
|
|
pMsg->wParam = NULL;
|
|
PostMessage(WM_SYSCOMMAND, SC_MINIMIZE, 0);
|
|
} else if (pMsg->wParam == VK_RETURN) {
|
|
pMsg->wParam = NULL;
|
|
PostMessage(WM_COMMAND, ID_PROPERTY, 0);
|
|
}
|
|
}
|
|
|
|
if (pMsg->message==WM_SYSKEYDOWN) {
|
|
if (pMsg->wParam == VK_RETURN) {
|
|
pMsg->wParam = NULL;
|
|
PostMessage(WM_COMMAND, ID_CHANGE, 0);
|
|
}
|
|
}
|
|
|
|
if (m_hAccel != NULL) {
|
|
if (TranslateAccelerator(m_hWnd, m_hAccel, pMsg)) {
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
if (pMsg->message == WM_KEYUP) {
|
|
|
|
if (GetFocus() == (CWnd *)&m_DiskView) {
|
|
OnKeyupDiskList();
|
|
}
|
|
|
|
if (GetFocus() == (CWnd *)&m_VolumeList) {
|
|
OnKeyupVolumeList();
|
|
}
|
|
}
|
|
|
|
return CDialog::PreTranslateMessage(pMsg);
|
|
}
|
|
|
|
void CExt2MgrDlg::OnShowMain()
|
|
{
|
|
// TODO: Add your command handler code here
|
|
m_bHide = FALSE;
|
|
ShowWindow(SW_SHOW);
|
|
}
|
|
|
|
LRESULT CExt2MgrDlg::OnTerminate(WPARAM wParam,LPARAM lParam)
|
|
{
|
|
if (lParam == 0x1234) {
|
|
EndDialog(0);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
LRESULT CExt2MgrDlg::OnMountPointNotify(WPARAM wParam,LPARAM lParam)
|
|
{
|
|
if (wParam == 'DA') {
|
|
DriverLetterChangeNotify((CHAR)lParam, TRUE);
|
|
} else if (wParam == 'DR'){
|
|
DriverLetterChangeNotify((CHAR)lParam, FALSE);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void CExt2MgrDlg::OnHelp()
|
|
{
|
|
// TODO: Add your command handler code here
|
|
CHAR szFullPathName [MAX_PATH];
|
|
CHAR szDrive [MAX_PATH];
|
|
CHAR szDir [MAX_PATH];
|
|
|
|
GetModuleFileName(NULL, szFullPathName, MAX_PATH);
|
|
_splitpath(szFullPathName, szDrive, szDir, NULL, NULL);
|
|
sprintf(szFullPathName, "%s%sDocuments\\FAQ.txt", szDrive, szDir);
|
|
|
|
ShellExecute(this->GetSafeHwnd(), "open", szFullPathName, NULL, NULL, SW_SHOW);
|
|
}
|
|
|
|
void CExt2MgrDlg::OnInstallService()
|
|
{
|
|
Ext2SetManagerAsService(TRUE);
|
|
}
|
|
|
|
void CExt2MgrDlg::OnRemoveService()
|
|
{
|
|
Ext2SetManagerAsService(FALSE);
|
|
}
|
|
|
|
void CExt2MgrDlg::OnEnableAutorun()
|
|
{
|
|
Ext2SetAppAutorun(TRUE);
|
|
// Ext2SetManagerAsService(FALSE);
|
|
|
|
CMenu* pMenu = AfxGetMainWnd()->GetMenu();
|
|
CMenu* pSubFile = pMenu->GetSubMenu(0);
|
|
if (pSubFile) {
|
|
if (Ext2RunMgrForCurrentUser()) {
|
|
pSubFile->EnableMenuItem(ID_ENABLE_AUTOSTART, MF_BYCOMMAND|MF_GRAYED|MF_DISABLED);
|
|
pSubFile->EnableMenuItem(ID_DISABLE_AUTOSTART, MF_BYCOMMAND|MF_ENABLED);
|
|
} else {
|
|
pSubFile->EnableMenuItem(ID_ENABLE_AUTOSTART, MF_BYCOMMAND|MF_ENABLED);
|
|
pSubFile->EnableMenuItem(ID_DISABLE_AUTOSTART, MF_BYCOMMAND|MF_GRAYED|MF_DISABLED);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
void CExt2MgrDlg::OnDisableAutorun()
|
|
{
|
|
Ext2SetAppAutorun(FALSE);
|
|
|
|
CMenu* pMenu = AfxGetMainWnd()->GetMenu();
|
|
CMenu* pSubFile = pMenu->GetSubMenu(0);
|
|
if (pSubFile) {
|
|
if (Ext2RunMgrForCurrentUser()) {
|
|
pSubFile->EnableMenuItem(ID_ENABLE_AUTOSTART, MF_BYCOMMAND|MF_GRAYED|MF_DISABLED);
|
|
pSubFile->EnableMenuItem(ID_DISABLE_AUTOSTART, MF_BYCOMMAND|MF_ENABLED);
|
|
} else {
|
|
pSubFile->EnableMenuItem(ID_ENABLE_AUTOSTART, MF_BYCOMMAND|MF_ENABLED);
|
|
pSubFile->EnableMenuItem(ID_DISABLE_AUTOSTART, MF_BYCOMMAND|MF_GRAYED|MF_DISABLED);
|
|
}
|
|
}
|
|
}
|
|
|
|
void CExt2MgrDlg::OnPerfStat()
|
|
{
|
|
if (!m_PerfDlg) {
|
|
m_PerfDlg = new CPerfStatDlg;
|
|
if (m_PerfDlg) {
|
|
m_PerfDlg->Create(IDD_PERFSTAT_DIALOG, this);
|
|
}
|
|
}
|
|
|
|
if (m_PerfDlg) {
|
|
m_PerfDlg->ShowWindow(SW_SHOW);
|
|
m_PerfDlg->SetForegroundWindow();
|
|
}
|
|
}
|
|
|
|
void CExt2MgrDlg::OnPerfStop()
|
|
{
|
|
if (m_PerfDlg) {
|
|
Sleep(100);
|
|
delete m_PerfDlg;
|
|
m_PerfDlg = NULL;
|
|
}
|
|
}
|
|
|
|
|
|
void
|
|
CExt2MgrDlg::RegisterDeviceInterface(
|
|
GUID InterfaceClassGuid,
|
|
PHDEVNOTIFY hDevNotify
|
|
)
|
|
{
|
|
DEV_BROADCAST_DEVICEINTERFACE NotificationFilter;
|
|
|
|
ZeroMemory (&NotificationFilter, sizeof(NotificationFilter));
|
|
NotificationFilter.dbcc_size =
|
|
sizeof(DEV_BROADCAST_DEVICEINTERFACE);
|
|
NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
|
|
NotificationFilter.dbcc_classguid = InterfaceClassGuid;
|
|
|
|
*hDevNotify = RegisterDeviceNotification(
|
|
m_hWnd,
|
|
&NotificationFilter,
|
|
DEVICE_NOTIFY_WINDOW_HANDLE
|
|
);
|
|
}
|
|
|
|
|
|
void CExt2MgrDlg::OnFlush()
|
|
{
|
|
PEXT2_VOLUME volume = NULL;
|
|
PEXT2_PARTITION part = NULL;
|
|
|
|
if (m_bFocusVolume) {
|
|
if (m_type == EXT2_VOLUME_MAGIC) {
|
|
volume = (PEXT2_VOLUME) m_sdev;
|
|
}
|
|
} else {
|
|
if (m_type == EXT2_PART_MAGIC) {
|
|
part = (PEXT2_PARTITION) m_sdev;
|
|
volume = part->Volume;
|
|
}
|
|
}
|
|
|
|
if (volume) {
|
|
Ext2FlushVolume(volume->Name);
|
|
}
|
|
}
|
|
|
|
void CExt2MgrDlg::OnPartType()
|
|
{
|
|
CPartitionType PartType;
|
|
PEXT2_VOLUME volume = NULL;
|
|
PEXT2_PARTITION part = NULL;
|
|
CHAR devPath[MAX_PATH];
|
|
|
|
if (m_bFocusVolume) {
|
|
if (m_type == EXT2_VOLUME_MAGIC) {
|
|
volume = (PEXT2_VOLUME) m_sdev;
|
|
}
|
|
} else {
|
|
if (m_type == EXT2_PART_MAGIC) {
|
|
part = (PEXT2_PARTITION) m_sdev;
|
|
}
|
|
}
|
|
|
|
if (volume) {
|
|
part = volume->Part;
|
|
if (!part) {
|
|
return;
|
|
}
|
|
strcpy(devPath, volume->Name);
|
|
} else if (part) {
|
|
sprintf(devPath, "\\Device\\Harddisk%u\\Partition%u",
|
|
part->Disk->OrderNo, part->Number);
|
|
}
|
|
|
|
if (part && part->Entry &&
|
|
part->Entry->PartitionStyle == PARTITION_STYLE_MBR) {
|
|
PartType.m_Part = part;
|
|
PartType.m_sDevice = devPath;
|
|
PartType.DoModal();
|
|
|
|
/* update new partition type */
|
|
if (PartType.m_cPartType) {
|
|
|
|
for (int i=0; i < m_DiskView.GetItemCount(); i++) {
|
|
if ((ULONG_PTR)part == m_DiskView.GetItemData(i)) {
|
|
Ext2RefreshDVPT(&m_DiskView, part, i);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void CExt2MgrDlg::OnRemoveDeadLetter()
|
|
{
|
|
CDelDeadLetter DelDeadLetter;
|
|
DelDeadLetter.DoModal();
|
|
}
|