// Ext2MgrDlg.cpp : implementation file // #include "stdafx.h" #include "Ext2Mgr.h" #include "PartitionType.h" #include "DelDeadLetter.h" #include "Ext2MgrDlg.h" #include "DlgView.h" #include #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 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: 2.50 ("; s += __DATE__; s += ")\0"; SET_TEXT(IDC_PROGRAM, s); // Set the target URL // m_lMail.SetLinkUrl("mailto:Matt Wu?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 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_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 }; /* 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; DWORD dwStyle = 0; CDialog::OnInitDialog(); /* set windows identifier */ SetWindowLong(this->GetSafeHwnd(), DWL_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 /* initialize the disk view */ dwStyle=GetWindowLong(m_DiskView.GetSafeHwnd(),GWL_STYLE); dwStyle&=~LVS_TYPEMASK; dwStyle|=(LVS_REPORT | LVS_OWNERDRAWFIXED); SetWindowLong(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=GetWindowLong(m_VolumeList.GetSafeHwnd(),GWL_STYLE); dwStyle&=~LVS_TYPEMASK; dwStyle|= (LVS_REPORT | LVS_AUTOARRANGE); SetWindowLong(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, 2); CRect rect; GetClientRect(&rect); m_bar.SetPaneInfo(0,ID_INDICATOR_MESSAGE, SBPS_NORMAL,rect.Width()-150); m_bar.SetPaneInfo(1,ID_INDICATOR_TIME,SBPS_STRETCH ,0); m_bar.GetStatusBarCtrl().SetBkColor(RGB(180,180,180)); 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); RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST, ID_INDICATOR_TIME); /* 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(); Ext2MountingVolumes(); } } else { return FALSE; } m_bHandleChange = TRUE; /* updating the volume list */ Ext2RefreshVolumeList(&m_VolumeList); /* updating the disk list */ Ext2RefreshDiskList(&m_DiskView); if (IsVista()) { CMenu* pMenu = AfxGetMainWnd()->GetMenu(); CMenu* pSubFile = pMenu->GetSubMenu(0); if (pSubFile) { pSubFile->EnableMenuItem(ID_INSTALL_SERVICE, MF_BYCOMMAND|MF_GRAYED|MF_DISABLED); pSubFile->EnableMenuItem(ID_REMOVE_SERVICE, 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, (BOOLEAN *)&m_bReadonly, (BOOLEAN *)&m_bExt3Writable, (CHAR *)m_Codepage.GetBuffer(CODEPAGE_MAXLEN), (CHAR *)m_sPrefix.GetBuffer(HIDINGPAT_LEN), (CHAR *)m_sSuffix.GetBuffer(HIDINGPAT_LEN), (BOOLEAN *)&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 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) { PostMessage(WM_COMMAND, ID_REFRESH, 0); } 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); } 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() { CRect rect; #if 0 if (bFirst) { OnSize(SIZE_RESTORED, 520, 408); SetWindowPos(this, 0, 0, 520, 408, SWP_NOZORDER | SWP_NOMOVE | SWP_SHOWWINDOW | SWP_DRAWFRAME ); bFirst = FALSE; } #endif GetClientRect(&rect); 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[] = {IDOK, IDCANCEL, ID_HELP, 0}; CDialog::OnSize(nType, cx, cy); return; // create an instance of the CRect object CRect rect, cr; // store the dialog's new size information in the object GetWindowRect(&rect); while (ctlId[i]) { CWnd *pWnd = GetDlgItem(ctlId[i++]); if (pWnd) { pWnd->GetWindowRect(&cr); ScreenToClient(&cr); cr.bottom -= cr.top; cr.right -= cr.left; pWnd->SetWindowPos(pWnd, cr.left, cy - cr.bottom - 5, cr.right, cr.bottom, SWP_NOZORDER | SWP_SHOWWINDOW); } } } 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; /* cleanup all the disk/volume structures */ Ext2CleanupDisks(); Ext2CleanupCdroms(); Ext2CleanupVolumes(); Ext2CleanupDrvLetters(); /* loading system configurations */ if (Ext2QuerySysConfig()) { Ext2LoadDisks(); Ext2LoadCdroms(); if (Ext2LoadVolumes()) { Ext2LoadRemovableVolumes(); Ext2LoadDrvLetters(); Ext2LoadCdromDrvLetters(); Ext2LoadAllVolumeDrvLetters(); Ext2LoadAllDiskPartitions(); Ext2MountingVolumes(); if (g_bAutoRemoveDeadLetters) { Ext2AutoRemoveDeadLetters(); } } } 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, (BOOLEAN *)&m_bReadonly, (BOOLEAN *)&m_bExt3Writable, (CHAR *)m_Codepage.GetBuffer(CODEPAGE_MAXLEN), (CHAR *)m_sPrefix.GetBuffer(HIDINGPAT_LEN), (CHAR *)m_sSuffix.GetBuffer(HIDINGPAT_LEN), (BOOLEAN *)&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, (BOOLEAN *)&m_bReadonly, (BOOLEAN *)&m_bExt3Writable, (CHAR *)m_Codepage.GetBuffer(CODEPAGE_MAXLEN), (CHAR *)m_sPrefix.GetBuffer(HIDINGPAT_LEN), (CHAR *)m_sSuffix.GetBuffer(HIDINGPAT_LEN), (BOOLEAN *)&m_bAutoMount ); g_bAutoMount = m_bAutoMount; } } void CExt2MgrDlg::OnChangeProperty() { CExt2Attribute EA; PEXT2_VOLUME_PROPERTY2 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 BOOLEAN 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; 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); } s.LoadString(IDS_CHANGE_DRVLETTER); m_Menu.AppendMenu(MF_STRING, ID_DRV_LETTER, (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; BOOLEAN bAddSpace = FALSE; if (volume && volume->bRecognized && (volume->EVP.bExt2 || volume->EVP.bExt3)) { s.LoadString(IDS_EXT2_MANAGEMENT); m_Menu.AppendMenu(MF_STRING, ID_CHANGE, (LPCTSTR)s); bAddSpace = TRUE; } if (volume && !volume->bDynamic) { s.LoadString(IDS_CHANGE_DRVLETTER); m_Menu.AppendMenu(MF_STRING, ID_DRV_LETTER, (LPCTSTR)s); bAddSpace = TRUE; } if (bAddSpace) { m_Menu.AppendMenu(MF_SEPARATOR, 0, ""); } if (part->Entry) { s.LoadString(IDS_FLUSH_BUFFER); m_Menu.AppendMenu(MF_STRING, ID_FLUSH_BUFFER, (LPCTSTR)s); 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 BOOLEAN 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; if (volume->bRecognized && (volume->EVP.bExt2 || volume->EVP.bExt3)) { s.LoadString(IDS_EXT2_MANAGEMENT); m_Menu.AppendMenu(MF_STRING, ID_CHANGE, (LPCTSTR)s); } s.LoadString(IDS_CHANGE_DRVLETTER); m_Menu.AppendMenu(MF_STRING, ID_DRV_LETTER, (LPCTSTR)s); m_Menu.AppendMenu(MF_SEPARATOR, 0, ""); s.LoadString(IDS_FLUSH_BUFFER); m_Menu.AppendMenu(MF_STRING, ID_FLUSH_BUFFER, (LPCTSTR)s); if (Ext2QueryVolumePartition(volume)) { 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; 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); } s.LoadString(IDS_CHANGE_DRVLETTER); m_Menu.AppendMenu(MF_STRING, ID_DRV_LETTER, (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, BOOLEAN 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, BOOLEAN 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, BOOLEAN bArrival ) { ULONGLONG LetterMask = 0; ULONG i; if (!m_bHandleChange) { return; } if (bArrival) { if (!drvLetter->bUsed) { Ext2CleanDrvLetter(drvLetter); Ext2QueryDrvLetter(drvLetter); } } if (!drvLetter->bUsed) { return; } 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 (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) { Ext2CleanDrvLetter(drvLetter); } } 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 (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 (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::OnDonate() { // TODO: Add your command handler code here Ext2VolumeArrivalNotify("\\Device\\WllVolumeZ"); CDonate Donate; Donate.DoModal(); } void CExt2MgrDlg::OnCopy() { CHAR Data[256]; BOOLEAN 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() { BOOLEAN 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 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); } CDialog::OnTimer(nIDEvent); } PVOID CExt2MgrDlg::QuerySelectedItem(PBOOLEAN 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) { BOOLEAN 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); } void CExt2MgrDlg::OnDisableAutorun() { Ext2SetAppAutorun(FALSE); } 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)part == m_DiskView.GetItemData(i)) { Ext2RefreshDVPT(&m_DiskView, part, i); break; } } } } } void CExt2MgrDlg::OnRemoveDeadLetter() { CDelDeadLetter DelDeadLetter; DelDeadLetter.DoModal(); }