mirror of
https://github.com/bobranten/Ext4Fsd.git
synced 2025-10-29 21:18:30 -05:00
447 lines
12 KiB
C++
447 lines
12 KiB
C++
// Ext2Attribute.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "ext2mgr.h"
|
|
#include "Ext2Attribute.h"
|
|
#include "Ext2MgrDlg.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CExt2Attribute dialog
|
|
|
|
|
|
CExt2Attribute::CExt2Attribute(CWnd* pParent /*=NULL*/)
|
|
: CDialog(CExt2Attribute::IDD, pParent)
|
|
{
|
|
//{{AFX_DATA_INIT(CExt2Attribute)
|
|
m_Codepage = _T("");
|
|
m_bReadonly = FALSE;
|
|
m_FixedLetter = _T("");
|
|
m_AutoLetter = _T("");
|
|
m_sPrefix = _T("");
|
|
m_sSuffix = _T("");
|
|
m_bAutoMount = FALSE;
|
|
m_bFixMount = FALSE;
|
|
m_autoDrv = 0;
|
|
m_sUID = _T("----");
|
|
m_sGID = _T("----");
|
|
m_sEUID = _T("----");
|
|
//}}AFX_DATA_INIT
|
|
|
|
m_MainDlg = NULL;
|
|
m_EVP = NULL;
|
|
m_DevName = _T("");
|
|
m_bCdrom = FALSE;
|
|
m_fixDrv = 0;
|
|
}
|
|
|
|
|
|
void CExt2Attribute::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CExt2Attribute)
|
|
DDX_CBString(pDX, IDC_COMBO_CODEPAGE, m_Codepage);
|
|
DDX_Check(pDX, IDC_READ_ONLY, m_bReadonly);
|
|
DDX_CBString(pDX, IDC_COMBO_DRVLETTER, m_FixedLetter);
|
|
DDX_Text(pDX, IDC_EXT2_PREFIX, m_sPrefix);
|
|
DDV_MaxChars(pDX, m_sPrefix, 31);
|
|
DDX_Text(pDX, IDC_EXT2_SUFFIX, m_sSuffix);
|
|
DDV_MaxChars(pDX, m_sSuffix, 31);
|
|
DDX_Check(pDX, IDC_AUTOMOUNT, m_bAutoMount);
|
|
DDX_Check(pDX, IDC_FIXMOUNT, m_bFixMount);
|
|
DDX_CBString(pDX, IDC_COMBO_AUTOMP, m_AutoLetter);
|
|
DDX_Text(pDX, IDC_EDIT_UID, m_sUID);
|
|
DDV_MaxChars(pDX, m_sUID, 8);
|
|
DDX_Text(pDX, IDC_EDIT_GID, m_sGID);
|
|
DDV_MaxChars(pDX, m_sGID, 8);
|
|
DDX_Text(pDX, IDC_EDIT_EUID, m_sEUID);
|
|
DDV_MaxChars(pDX, m_sEUID, 8);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CExt2Attribute, CDialog)
|
|
//{{AFX_MSG_MAP(CExt2Attribute)
|
|
ON_BN_CLICKED(IDC_AUTOMOUNT, OnAutomount)
|
|
ON_BN_CLICKED(IDC_FIXMOUNT, OnFixmount)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CExt2Attribute message handlers
|
|
|
|
BOOL CExt2Attribute::OnInitDialog()
|
|
{
|
|
int i = 0;
|
|
CString s;
|
|
|
|
CDialog::OnInitDialog();
|
|
|
|
m_Codepage = m_EVP->Codepage;
|
|
m_bReadonly = m_EVP->bReadonly || m_bCdrom;
|
|
if (m_bCdrom) {
|
|
SET_WIN(IDC_READ_ONLY, FALSE);
|
|
}
|
|
|
|
if (m_bCdrom) {
|
|
m_fixDrv = Ext2QueryMountPoint(
|
|
m_DevName.GetBuffer(MAX_PATH));
|
|
} else {
|
|
m_fixDrv = Ext2QueryRegistryMountPoint(
|
|
m_DevName.GetBuffer(MAX_PATH));
|
|
}
|
|
|
|
if (m_fixDrv) {
|
|
m_bAutoMount = FALSE;
|
|
m_bFixMount = TRUE;
|
|
m_FixedLetter.Format("%c:", m_fixDrv);
|
|
} else {
|
|
m_FixedLetter = " ";
|
|
}
|
|
|
|
if (m_EVP->Flags2 & EXT2_VPROP3_USERIDS) {
|
|
m_sUID.Format("%u", m_EVP->uid);
|
|
m_sGID.Format("%u", m_EVP->gid);
|
|
if (m_EVP->EIDS) {
|
|
m_sEUID.Format("%u", m_EVP->euid);
|
|
}
|
|
}
|
|
|
|
if (m_EVP->DrvLetter) {
|
|
|
|
m_autoDrv = m_EVP->DrvLetter & 0x7F;
|
|
if (m_autoDrv >= 'a' && m_autoDrv <= 'z')
|
|
m_autoDrv = (CHAR)toupper(m_autoDrv);
|
|
else if (m_autoDrv >= 'A' && m_autoDrv <= 'Z') {
|
|
} else {
|
|
m_autoDrv = 0;
|
|
}
|
|
if (m_autoDrv == 0)
|
|
m_AutoLetter.Format(" ");
|
|
else
|
|
m_AutoLetter.Format("%C:", m_autoDrv);
|
|
m_bAutoMount = !m_bFixMount;
|
|
}
|
|
|
|
m_sPrefix = m_EVP->sHidingPrefix;
|
|
m_sSuffix = m_EVP->sHidingSuffix;
|
|
|
|
CComboBox *cbCodepage = (CComboBox *)GetDlgItem(IDC_COMBO_CODEPAGE);
|
|
if (cbCodepage) {
|
|
cbCodepage->ResetContent();
|
|
i = 0;
|
|
while (gCodepages[i]) {
|
|
cbCodepage->AddString(gCodepages[i++]);
|
|
}
|
|
}
|
|
|
|
{
|
|
CComboBox *cbDrvLetter = (CComboBox *)GetDlgItem(IDC_COMBO_DRVLETTER);
|
|
CComboBox *cbAutoLetter = (CComboBox *)GetDlgItem(IDC_COMBO_AUTOMP);
|
|
|
|
PEXT2_LETTER drvLetter = NULL;
|
|
cbDrvLetter->AddString(" ");
|
|
cbAutoLetter->AddString(" ");
|
|
|
|
if (m_autoDrv) {
|
|
m_AutoLetter.Format("%C:", m_autoDrv);
|
|
cbAutoLetter->AddString(m_AutoLetter);
|
|
}
|
|
|
|
if (m_fixDrv) {
|
|
cbDrvLetter->AddString(m_FixedLetter);
|
|
}
|
|
for (i=2; i < 26; i++) {
|
|
drvLetter = &drvLetters[i];
|
|
if (!drvLetter->bUsed) {
|
|
s.Format("%c:", drvLetter->Letter);
|
|
cbDrvLetter->AddString(s);
|
|
cbAutoLetter->AddString(s);
|
|
}
|
|
}
|
|
/*
|
|
for (i=0; i < 10; i++) {
|
|
drvLetter = &drvDigits[i];
|
|
if (!drvLetter->bUsed) {
|
|
s.Format("%c:", drvLetter->Letter);
|
|
cbDrvLetter->AddString(s);
|
|
}
|
|
}
|
|
*/
|
|
|
|
}
|
|
|
|
SET_CHECK(IDC_AUTOMOUNT, m_bAutoMount);
|
|
SET_CHECK(IDC_FIXMOUNT, m_bFixMount);
|
|
|
|
SET_WIN(IDC_COMBO_DRVLETTER, m_bFixMount);
|
|
SET_WIN(IDC_COMBO_AUTOMP, m_bAutoMount);
|
|
|
|
UpdateData(FALSE);
|
|
|
|
return TRUE; // return TRUE unless you set the focus to a control
|
|
// EXCEPTION: OCX Property Pages should return FALSE
|
|
}
|
|
|
|
void CExt2Attribute::OnCancel()
|
|
{
|
|
// TODO: Add extra cleanup here
|
|
|
|
CDialog::OnCancel();
|
|
}
|
|
|
|
BOOL IsStringAllDigits(CString s)
|
|
{
|
|
for (int i = 0; i < s.GetLength(); i++) {
|
|
if (!isdigit(s.GetAt(i)))
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
void CExt2Attribute::OnOK()
|
|
{
|
|
NT::NTSTATUS status;
|
|
HANDLE Handle = NULL;
|
|
CHAR DrvLetter = 0;
|
|
CString str;
|
|
BOOL rc = FALSE;
|
|
BOOL dc = FALSE;
|
|
|
|
UpdateData(TRUE);
|
|
|
|
if (m_Codepage.IsEmpty()) {
|
|
m_Codepage = "default";
|
|
}
|
|
|
|
CComboBox *cbCodepage = (CComboBox *)GetDlgItem(IDC_COMBO_CODEPAGE);
|
|
if (cbCodepage) {
|
|
int rc = cbCodepage->FindStringExact(-1, m_Codepage);
|
|
if (rc == CB_ERR) {
|
|
AfxMessageBox("Invalid codepage type: "+m_Codepage, MB_OK|MB_ICONWARNING);
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (m_EVP->bReadonly && m_EVP->bExt3 && !m_bReadonly) {
|
|
str = "Are you sure to enable writing support"
|
|
" on this EXT3 volume with Ext2Fsd ?";
|
|
if (AfxMessageBox(str, MB_YESNO) != IDYES) {
|
|
m_EVP->bExt3Writable = FALSE;
|
|
} else {
|
|
m_EVP->bExt3Writable = TRUE;
|
|
}
|
|
}
|
|
|
|
/* initialize structures to communicate with ext2fsd service*/
|
|
m_EVP->Magic = EXT2_VOLUME_PROPERTY_MAGIC;
|
|
m_EVP->Command = APP_CMD_SET_PROPERTY3;
|
|
m_EVP->Flags = 0;
|
|
m_EVP->Flags2 = 0;
|
|
m_EVP->bReadonly = (BOOLEAN)m_bReadonly;
|
|
memset(m_EVP->Codepage, 0, CODEPAGE_MAXLEN);
|
|
strcpy((CHAR *)m_EVP->Codepage, m_Codepage.GetBuffer(CODEPAGE_MAXLEN));
|
|
|
|
/* initialize hiding filter patterns */
|
|
if (m_sPrefix.IsEmpty()) {
|
|
m_EVP->bHidingPrefix = FALSE;
|
|
memset(m_EVP->sHidingPrefix, 0, HIDINGPAT_LEN);
|
|
} else {
|
|
strcpy( m_EVP->sHidingPrefix,
|
|
m_sPrefix.GetBuffer(m_sPrefix.GetLength()));
|
|
m_EVP->bHidingPrefix = TRUE;
|
|
}
|
|
|
|
if (m_sSuffix.IsEmpty()) {
|
|
m_EVP->bHidingSuffix = FALSE;
|
|
memset(m_EVP->sHidingSuffix, 0, HIDINGPAT_LEN);
|
|
} else {
|
|
strcpy(m_EVP->sHidingSuffix,
|
|
m_sSuffix.GetBuffer(m_sSuffix.GetLength()));
|
|
m_EVP->bHidingSuffix = TRUE;
|
|
}
|
|
|
|
if (m_bFixMount) {
|
|
|
|
if (!m_FixedLetter.IsEmpty() && m_FixedLetter.GetAt(0) != ' ') {
|
|
DrvLetter = m_FixedLetter.GetAt(0);
|
|
} else {
|
|
DrvLetter = 0;
|
|
}
|
|
|
|
if (DrvLetter != m_fixDrv) {
|
|
|
|
if (m_fixDrv != 0) {
|
|
Ext2SetRegistryMountPoint(&m_fixDrv, NULL, FALSE);
|
|
Ext2RemoveDriveLetter(DrvLetter);
|
|
}
|
|
|
|
if (DrvLetter != 0) {
|
|
Ext2SetRegistryMountPoint(&DrvLetter, m_DevName.GetBuffer(MAX_PATH), TRUE);
|
|
}
|
|
}
|
|
|
|
if (DrvLetter && !m_fixDrv) {
|
|
Ext2MountVolumeAs(m_DevName.GetBuffer(MAX_PATH), DrvLetter);
|
|
dc = TRUE;
|
|
}
|
|
} else {
|
|
|
|
if (m_fixDrv != 0) {
|
|
Ext2RemoveDriveLetter(m_fixDrv);
|
|
Ext2SetRegistryMountPoint(&m_fixDrv, NULL, FALSE);
|
|
}
|
|
}
|
|
|
|
if (!m_sUID.IsEmpty() && !m_sGID.IsEmpty()) {
|
|
if (IsStringAllDigits(m_sUID) &&
|
|
IsStringAllDigits(m_sGID)) {
|
|
m_EVP->Flags2 |= EXT2_VPROP3_USERIDS;
|
|
m_EVP->uid = (USHORT)atoi(m_sUID.GetBuffer(8));
|
|
m_EVP->gid = (USHORT)atoi(m_sGID.GetBuffer(8));
|
|
if (!m_sEUID.IsEmpty() &&
|
|
IsStringAllDigits(m_sEUID)) {
|
|
m_EVP->EIDS = TRUE;
|
|
m_EVP->euid = (USHORT)atoi(m_sEUID.GetBuffer(8));
|
|
}
|
|
}
|
|
}
|
|
|
|
if (m_bAutoMount) {
|
|
|
|
if (m_bCdrom) {
|
|
m_EVP->DrvLetter = 0;
|
|
Ext2StorePropertyinRegistry(m_EVP);
|
|
goto store_evp;
|
|
}
|
|
|
|
if (!m_AutoLetter.IsEmpty() && m_AutoLetter.GetAt(0) != ' ') {
|
|
DrvLetter = m_AutoLetter.GetAt(0);
|
|
} else {
|
|
DrvLetter = 0;
|
|
}
|
|
|
|
if (DrvLetter > 'Z' || DrvLetter < 'A') {
|
|
DrvLetter = 0;
|
|
}
|
|
m_EVP->DrvLetter = DrvLetter | 0x80;
|
|
m_EVP->Flags2 |= EXT2_VPROP3_AUTOMOUNT;
|
|
Ext2StorePropertyinRegistry(m_EVP);
|
|
|
|
if (m_autoDrv) {
|
|
if (DrvLetter && Ext2IsDrvLetterAvailable(DrvLetter)) {
|
|
Ext2RemoveDriveLetter(m_autoDrv);
|
|
Ext2MountVolumeAs(m_DevName.GetBuffer(MAX_PATH), DrvLetter);
|
|
dc = TRUE;
|
|
}
|
|
} else {
|
|
if (DrvLetter && Ext2IsDrvLetterAvailable(DrvLetter)) {
|
|
Ext2MountVolumeAs(m_DevName.GetBuffer(MAX_PATH), DrvLetter);
|
|
dc = TRUE;
|
|
} else {
|
|
Ext2MountVolume(m_DevName.GetBuffer(MAX_PATH));
|
|
dc = TRUE;
|
|
}
|
|
}
|
|
|
|
} else {
|
|
|
|
m_EVP->DrvLetter =0 ;
|
|
Ext2StorePropertyinRegistry(m_EVP);
|
|
|
|
if (m_autoDrv && !Ext2IsDrvLetterAvailable(m_autoDrv)) {
|
|
Ext2RemoveDriveLetter(m_autoDrv);
|
|
dc = TRUE;
|
|
}
|
|
}
|
|
|
|
store_evp:
|
|
|
|
status = Ext2Open(m_DevName.GetBuffer(m_DevName.GetLength()),
|
|
&Handle, EXT2_DESIRED_ACCESS);
|
|
if (!NT_SUCCESS(status)) {
|
|
str.Format("Ext2Fsd service is not started.\n");
|
|
AfxMessageBox(str, MB_OK | MB_ICONSTOP);
|
|
rc = TRUE;
|
|
goto errorout;
|
|
}
|
|
|
|
rc = Ext2SetExt2Property(Handle, m_EVP);
|
|
|
|
if (rc) {
|
|
/* don't bother user at all */
|
|
#if 0
|
|
str = "Ext2 volume settings updated successfully!";
|
|
if (dc) {
|
|
str += "\r\n\r\nFixed mountpoint needs reboot to take into affect.";
|
|
}
|
|
AfxMessageBox(str, MB_OK | MB_ICONINFORMATION);
|
|
#endif
|
|
} else {
|
|
AfxMessageBox("Failed to save the Ext2 settings !",
|
|
MB_OK | MB_ICONWARNING);
|
|
}
|
|
|
|
errorout:
|
|
|
|
Ext2Close(&Handle);
|
|
|
|
if (rc) {
|
|
CDialog::OnOK();
|
|
}
|
|
}
|
|
|
|
void CExt2Attribute::OnAutomount()
|
|
{
|
|
UpdateData(TRUE);
|
|
SET_WIN(IDC_COMBO_AUTOMP, m_bAutoMount);
|
|
/*
|
|
if (m_bAutoMount) {
|
|
AfxMessageBox("This function is still in experiment. You'd better set a\r\n"
|
|
"fixed mountpoint for fixed disk or set partition type to\r\n"
|
|
"0x07 (NTFS) or FAT for non-bootable partition. For removable\r\n"
|
|
"disks like usb-disk it's better to use the second method.");
|
|
}
|
|
*/
|
|
|
|
if (m_bAutoMount) {
|
|
/*
|
|
CComboBox *cbAutoLetter = (CComboBox *)GetDlgItem(IDC_COMBO_AUTOMP);
|
|
if (cbAutoLetter && cbAutoLetter->GetCurSel() == CB_ERR) {
|
|
cbAutoLetter->SetCurSel(1);
|
|
}
|
|
*/
|
|
m_bFixMount = FALSE;
|
|
SET_CHECK(IDC_FIXMOUNT, FALSE);
|
|
SET_WIN(IDC_COMBO_DRVLETTER, FALSE);
|
|
|
|
UpdateData(FALSE);
|
|
}
|
|
}
|
|
|
|
void CExt2Attribute::OnFixmount()
|
|
{
|
|
UpdateData(TRUE);
|
|
SET_WIN(IDC_COMBO_DRVLETTER, m_bFixMount);
|
|
|
|
if (m_bFixMount) {
|
|
/*
|
|
CComboBox *cbDrvLetter = (CComboBox *)GetDlgItem(IDC_COMBO_DRVLETTER);
|
|
if (cbDrvLetter && cbDrvLetter->GetCurSel() == CB_ERR) {
|
|
cbDrvLetter->SetCurSel(1);
|
|
}
|
|
*/
|
|
m_bAutoMount = FALSE;
|
|
SET_CHECK(IDC_AUTOMOUNT, FALSE);
|
|
SET_WIN(IDC_COMBO_AUTOMP, FALSE);
|
|
|
|
UpdateData(FALSE);
|
|
}
|
|
} |