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

📄 mmanagerdlg.cpp

📁 FSD file system driver
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	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 + -