mirror of
https://github.com/reactos/reactos.git
synced 2025-05-06 18:31:26 +00:00
[VCDCLI] Implement support for persistent mounts
This commit is contained in:
parent
044a7022c5
commit
e8e4096eb7
1 changed files with 38 additions and 1 deletions
|
@ -10,6 +10,7 @@
|
||||||
#include <windef.h>
|
#include <windef.h>
|
||||||
#include <winbase.h>
|
#include <winbase.h>
|
||||||
#include <winsvc.h>
|
#include <winsvc.h>
|
||||||
|
#include <winreg.h>
|
||||||
#include <ndk/rtltypes.h>
|
#include <ndk/rtltypes.h>
|
||||||
#include <ndk/rtlfuncs.h>
|
#include <ndk/rtlfuncs.h>
|
||||||
#include <tchar.h>
|
#include <tchar.h>
|
||||||
|
@ -37,11 +38,12 @@ PrintUsage(int type)
|
||||||
else if (type == 1)
|
else if (type == 1)
|
||||||
{
|
{
|
||||||
_ftprintf(stdout, _T("mount usage:\n"));
|
_ftprintf(stdout, _T("mount usage:\n"));
|
||||||
_ftprintf(stdout, _T("\tmount <drive letter> <path.iso> [/u] [/j]\n"));
|
_ftprintf(stdout, _T("\tmount <drive letter> <path.iso> [/u] [/j] [/p]\n"));
|
||||||
_ftprintf(stdout, _T("\tMount the ISO image given in <path.iso> on the previously created virtual drive <drive letter>\n"));
|
_ftprintf(stdout, _T("\tMount the ISO image given in <path.iso> on the previously created virtual drive <drive letter>\n"));
|
||||||
_ftprintf(stdout, _T("\t\tDo not use colon for drive letter\n"));
|
_ftprintf(stdout, _T("\t\tDo not use colon for drive letter\n"));
|
||||||
_ftprintf(stdout, _T("\t\tUse /u to make UDF volumes not appear as such\n"));
|
_ftprintf(stdout, _T("\t\tUse /u to make UDF volumes not appear as such\n"));
|
||||||
_ftprintf(stdout, _T("\t\tUse /j to make Joliet volumes not appear as such\n"));
|
_ftprintf(stdout, _T("\t\tUse /j to make Joliet volumes not appear as such\n"));
|
||||||
|
_ftprintf(stdout, _T("\t\tUse /p to make the mounting persistent\n"));
|
||||||
}
|
}
|
||||||
else if (type == 2)
|
else if (type == 2)
|
||||||
{
|
{
|
||||||
|
@ -334,8 +336,11 @@ _tmain(int argc, const TCHAR *argv[])
|
||||||
else if (_tcscmp(argv[1], _T("mount")) == 0)
|
else if (_tcscmp(argv[1], _T("mount")) == 0)
|
||||||
{
|
{
|
||||||
DWORD i;
|
DWORD i;
|
||||||
|
HKEY hKey;
|
||||||
HANDLE hFile;
|
HANDLE hFile;
|
||||||
WCHAR Letter;
|
WCHAR Letter;
|
||||||
|
BOOLEAN bPersist;
|
||||||
|
TCHAR szBuffer[260];
|
||||||
UNICODE_STRING NtPathName;
|
UNICODE_STRING NtPathName;
|
||||||
MOUNT_PARAMETERS MountParams;
|
MOUNT_PARAMETERS MountParams;
|
||||||
|
|
||||||
|
@ -383,6 +388,7 @@ _tmain(int argc, const TCHAR *argv[])
|
||||||
MountParams.Flags = 0;
|
MountParams.Flags = 0;
|
||||||
|
|
||||||
/* Do we have to suppress anything? */
|
/* Do we have to suppress anything? */
|
||||||
|
bPersist = FALSE;
|
||||||
for (i = 4; i < argc; ++i)
|
for (i = 4; i < argc; ++i)
|
||||||
{
|
{
|
||||||
/* Make UDF uneffective */
|
/* Make UDF uneffective */
|
||||||
|
@ -395,6 +401,11 @@ _tmain(int argc, const TCHAR *argv[])
|
||||||
{
|
{
|
||||||
MountParams.Flags |= MOUNT_FLAG_SUPP_JOLIET;
|
MountParams.Flags |= MOUNT_FLAG_SUPP_JOLIET;
|
||||||
}
|
}
|
||||||
|
/* Should it be persistent? */
|
||||||
|
else if (_tcscmp(argv[i], _T("/p")) == 0)
|
||||||
|
{
|
||||||
|
bPersist = TRUE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* No longer needed */
|
/* No longer needed */
|
||||||
|
@ -425,6 +436,32 @@ _tmain(int argc, const TCHAR *argv[])
|
||||||
_ftprintf(stdout, _T("%s mounted on %c\n"), argv[3], Letter);
|
_ftprintf(stdout, _T("%s mounted on %c\n"), argv[3], Letter);
|
||||||
|
|
||||||
CloseHandle(hDev);
|
CloseHandle(hDev);
|
||||||
|
|
||||||
|
/* Should it persistent? */
|
||||||
|
if (bPersist)
|
||||||
|
{
|
||||||
|
/* Create the registry key Device<Letter> */
|
||||||
|
_stprintf(szBuffer, _T("SYSTEM\\CurrentControlSet\\Services\\Vcdrom\\Parameters\\Device%c"), Letter);
|
||||||
|
if (RegCreateKeyEx(HKEY_LOCAL_MACHINE, szBuffer, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_CREATE_SUB_KEY | KEY_SET_VALUE, NULL, &hKey, NULL) == ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
/* Set the image path */
|
||||||
|
_tcsncpy(szBuffer, MountParams.Path, MountParams.Length);
|
||||||
|
szBuffer[MountParams.Length / sizeof(TCHAR)] = 0;
|
||||||
|
RegSetValueExW(hKey, _T("IMAGE"), 0, REG_SZ, (BYTE *)szBuffer, MountParams.Length);
|
||||||
|
|
||||||
|
/* Set the drive letter */
|
||||||
|
szBuffer[0] = Letter;
|
||||||
|
szBuffer[1] = _T(':');
|
||||||
|
szBuffer[2] = 0;
|
||||||
|
RegSetValueExW(hKey, _T("DRIVE"), 0, REG_SZ, (BYTE *)szBuffer, 3 * sizeof(TCHAR));
|
||||||
|
|
||||||
|
RegCloseKey(hKey);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_ftprintf(stderr, _T("Failed to make mounting persistent: %x\n"), GetLastError());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (_tcscmp(argv[1], _T("remount")) == 0)
|
else if (_tcscmp(argv[1], _T("remount")) == 0)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue