📄 mmanagerdlg.cpp
字号:
volume[0] = volume_name[0];
volume[1] = volume_name[1];
volume[2] = '\\';
GetVolumeInformation(volume, NULL, 0, NULL, NULL, &FileSystemFlag, FileSystemName, 63);
if (strcmp("FFS", FileSystemName) == 0)
{
if (Unmount(volume_name) == FALSE)
return;
}
if (Mount(DevName, volume_name) == TRUE)
{
wsprintf(msg, "Mount Complete. Drive %s", volume_name);
MessageBox(msg, "Mount Manager");
}
else
{
wsprintf(msg, "Mount Failed. Drive %s", volume_name);
MessageBox(msg, "Mount Manager");
}
}
void CMmanagerDlg::OnBnClickedUnmount()
{
char msg[256];
char temp[4];
char volume_name[] = " :";
m_DriveCombo.GetLBText(m_DriveCombo.GetCurSel(), temp);
volume_name[0] = temp[0];
if(Unmount(volume_name) == TRUE)
{
wsprintf(msg, "Unmount Complete. Drive %s", volume_name);
MessageBox(msg, "Mount Manager");
}
}
/* Driver Functions */
BOOL CMmanagerDlg::LoadDriver(char *pDeviceName, char FullPath[MAX_PATH])
{
SC_HANDLE hManager, hService;
DWORD LastError;
char strPath[MAX_PATH], temp[MAX_PATH];
GetCurrentDirectory(MAX_PATH, strPath);
sprintf(temp, "\\%s.sys", pDeviceName);
strcpy(strPath + strlen(strPath), temp);
hManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (FullPath != NULL)
strcpy(strPath, FullPath);
hService = CreateService(hManager, pDeviceName, pDeviceName, SERVICE_ALL_ACCESS,
SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, strPath,
NULL, NULL, NULL, NULL, NULL);
LastError = GetLastError();
if (LastError = ERROR_SERVICE_EXISTS)
{
hService = OpenService(hManager, pDeviceName, SC_MANAGER_ALL_ACCESS);
if (!ChangeServiceConfig(hService, SERVICE_KERNEL_DRIVER, SERVICE_NO_CHANGE, SERVICE_NO_CHANGE,
strPath, NULL, NULL, NULL, NULL, NULL, NULL))
{
return FALSE;
}
}
if (!hService)
{
hService = OpenService(hManager, pDeviceName, SERVICE_ALL_ACCESS);
if (!hService)
{
CloseServiceHandle(hManager);
return FALSE;
}
}
StartService(hService, 0, NULL);
CloseServiceHandle(hService);
CloseServiceHandle(hManager);
return TRUE;
}
/* Volume Mount & Unmount Functions */
BOOL CMmanagerDlg::Mount(char *pDeviceName, char *drive)
{
if (!DefineDosDevice(
DDD_RAW_TARGET_PATH,
drive,
pDeviceName))
{
return FALSE;
}
return TRUE;
}
BOOL CMmanagerDlg::Unmount(char *drive)
{
char DosDevName[256];
HANDLE hdevice;
ULONG dwBytes;
char msg[256];
wsprintf(DosDevName, "\\\\.\\%s", drive);
hdevice = CreateFile(
DosDevName,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (hdevice == INVALID_HANDLE_VALUE)
{
wsprintf(msg, "Unmount: open %s error.\n", drive);
MessageBox(msg, "Mount Manager");
return FALSE;
}
if (!DeviceIoControl(
hdevice,
FSCTL_LOCK_VOLUME,
NULL,
0,
NULL,
0,
&dwBytes,
NULL))
{
wsprintf(msg, "Unmount: Drive %s is mounted, LockVolume error.\n", drive);
MessageBox(msg, "Mount Manager");
CloseHandle(hdevice);
return FALSE;
}
if (!DeviceIoControl(
hdevice,
FSCTL_DISMOUNT_VOLUME,
NULL,
0,
NULL,
0,
&dwBytes,
NULL))
{
wsprintf(msg, "Unmount: DisMount %s error.\n", drive);
MessageBox(msg, "Mount Manager");
CloseHandle(hdevice);
return TRUE;
}
CloseHandle(hdevice);
if (!DefineDosDevice(
DDD_REMOVE_DEFINITION,
drive,
NULL))
{
wsprintf(msg, "Unmount: Remove %s error.\n", drive);
MessageBox(msg, "Mount Manager");
return FALSE;
}
return TRUE;
}
void CMmanagerDlg::OnBnClickedAutomountcheck()
{
if (m_AutoMountCheck.GetCheck())
{
if (WinExec("ffs.sys", SW_HIDE) == ERROR_FILE_NOT_FOUND)
{
CString TempFilePath;
char FilePath[MAX_PATH];
static char BASED_CODE szFilter[] = "ffs.sys (*.sys)|ffs.sys|";
CFileDialog FileDialog(TRUE, NULL, "ffs.sys", OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
szFilter, NULL, 0);
if (FileDialog.DoModal() == IDOK)
{
TempFilePath = FileDialog.GetPathName();
lstrcpy((LPSTR)FilePath, (LPSTR)TempFilePath.operator const char*());
if (!RegisterAutoMount(DEVICE_NAME, FilePath))
{
MessageBox("Driver install failed.", "Mount Manager");
return;
}
}
else
{
m_AutoMountCheck.SetCheck(FALSE);
MessageBox("Driver open error!", "Mount Manager");
hDriver = NULL;
return;
}
}
else
{
if (!RegisterAutoMount(DEVICE_NAME, NULL))
{
MessageBox("Driver install failed.", "Mount Manager");
return;
}
}
RegisterDriveLetter();
m_DiskCombo.EnableWindow(FALSE);
m_PartitionCombo.EnableWindow(FALSE);
m_DisklabelCombo.EnableWindow(FALSE);
m_DriveCombo.EnableWindow(FALSE);
}
else
{
UnregisterAutoMount(DEVICE_NAME);
UnregisterDriveLetter();
m_DiskCombo.EnableWindow(TRUE);
m_PartitionCombo.EnableWindow(TRUE);
m_DisklabelCombo.EnableWindow(TRUE);
m_DriveCombo.EnableWindow(TRUE);
}
}
BOOL CMmanagerDlg::RegisterAutoMount(char *pDeviceName, char FullPath[MAX_PATH])
{
SC_HANDLE hManager, hService;
DWORD LastError;
char strPath[MAX_PATH], temp[MAX_PATH];
GetCurrentDirectory(MAX_PATH, strPath);
sprintf(temp, "\\%s.sys", pDeviceName);
strcpy(strPath + strlen(strPath), temp);
hManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (!hManager)
return FALSE;
if (FullPath != NULL)
strcpy(strPath, FullPath);
hService = CreateService(hManager, pDeviceName, pDeviceName, SERVICE_ALL_ACCESS,
SERVICE_KERNEL_DRIVER, SERVICE_SYSTEM_START, SERVICE_ERROR_NORMAL, strPath,
NULL, NULL, NULL, NULL, NULL);
LastError = GetLastError();
if (LastError = ERROR_SERVICE_EXISTS)
{
hService = OpenService(hManager, pDeviceName, SC_MANAGER_ALL_ACCESS);
if (!ChangeServiceConfig(hService, SERVICE_KERNEL_DRIVER, SERVICE_SYSTEM_START, SERVICE_NO_CHANGE,
strPath, NULL, NULL, NULL, NULL, NULL, NULL))
{
return FALSE;
}
}
CloseServiceHandle(hService);
CloseServiceHandle(hManager);
return TRUE;
}
BOOL CMmanagerDlg::UnregisterAutoMount(char *pDeviceName)
{
SC_HANDLE hManager, hService;
hManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
hService = OpenService(hManager, pDeviceName, SC_MANAGER_ALL_ACCESS);
if (!ChangeServiceConfig(hService, SERVICE_NO_CHANGE, SERVICE_DEMAND_START, SERVICE_NO_CHANGE,
NULL, NULL, NULL, NULL, NULL, NULL, NULL))
{
return FALSE;
}
CloseServiceHandle(hService);
CloseServiceHandle(hManager);
return TRUE;
}
BOOL CMmanagerDlg::RegisterDriveLetter()
{
HKEY Key;
int nDisk = 0;
int nPart = 0;
int nDisklabel = 0;
int nDrive = 0;
char DevName[MAX_PATH];
char temp[4];
char volume_name[] = " :";
m_DiskCombo.GetLBText(m_DiskCombo.GetCurSel(), temp);
nDisk = atoi(&temp[0]);
m_PartitionCombo.GetLBText(m_PartitionCombo.GetCurSel(), temp);
nPart = atoi(&temp[0]);
m_DisklabelCombo.GetLBText(m_DisklabelCombo.GetCurSel(), temp);
nDisklabel = atoi(&temp[0]);
m_DriveCombo.GetLBText(m_DriveCombo.GetCurSel(), temp);
volume_name[0] = temp[0];
nDrive = m_DriveCombo.GetCurSel();
sprintf(DevName,"\\Device\\Harddisk%d\\Partition%d", nDisk, nPart);
/* 磊悼角青 汲沥 历厘 (汲沥). */
AfxGetApp()->WriteProfileInt("Settings", "AutoMount", 1);
/* 叼胶农, 颇萍记, 靛扼捞宏 沥焊 历厘. */
AfxGetApp()->WriteProfileInt("Settings", "Disk", nDisk);
AfxGetApp()->WriteProfileInt("Settings", "Partition", nPart);
AfxGetApp()->WriteProfileInt("Settings", "Disklabel", nDisklabel);
AfxGetApp()->WriteProfileInt("Settings", "Drive", nDrive);
/* 矫累 橇肺弊伐 殿废 */
RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Control\\Session Manager\\DOS Devices",
0, KEY_ALL_ACCESS, &Key);
RegSetValueEx(Key, volume_name, 0, REG_SZ, (BYTE *)DevName, strlen(DevName));
/* 辑厚胶狼 Parameters俊 BSD 颇萍记 锅龋 历厘 */
RegCreateKeyEx(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\ffs\\Parameters",
0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &Key, NULL);
//RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\ffs\\Parameters",
// 0, KEY_ALL_ACCESS, &Key);
RegSetValueEx(Key, "PartitionNumber", 0, REG_DWORD, (unsigned char *)&nDisklabel, sizeof(nDisklabel));
RegCloseKey(Key);
return TRUE;
}
BOOL CMmanagerDlg::UnregisterDriveLetter()
{
HKEY Key;
char temp[4];
char volume_name[] = " :";
m_DriveCombo.GetLBText(m_DriveCombo.GetCurSel(), temp);
volume_name[0] = temp[0];
/* 磊悼角青 汲沥 历厘 (秦力). */
AfxGetApp()->WriteProfileInt("Settings", "AutoMount", 0);
/* 矫累 橇肺弊伐 昏力 */
RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Control\\Session Manager\\DOS Devices",
0, KEY_ALL_ACCESS, &Key);
RegDeleteValue(Key, volume_name);
/* 辑厚胶狼 Parameters俊 BSD 颇萍记 锅龋 昏力 */
RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\ffs\\Parameters",
0, KEY_ALL_ACCESS, &Key);
RegDeleteValue(Key, "PartitionNumber");
RegCloseKey(Key);
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -