mirror of
https://github.com/reactos/reactos.git
synced 2025-06-06 01:40:36 +00:00
[ROSVBOXMGMT]
Introduce another automagic thing. Instead of creating shortlinks once shared folders have been enumerated, just assign them a drive letter! See it in action: https://twitter.com/HeisSpiter/status/685229912748371968 Choose the one you prefer for 0.4.0 :-) CORE-10032 ROSAPPS-303 svn path=/trunk/; revision=70536
This commit is contained in:
parent
63025d14ef
commit
5e903370dc
1 changed files with 88 additions and 7 deletions
|
@ -177,7 +177,7 @@ int getGlobalList(void)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL CreateUNCShortcut(PCWSTR share)
|
BOOL createUNCShortcut(PCWSTR share)
|
||||||
{
|
{
|
||||||
HRESULT res;
|
HRESULT res;
|
||||||
IShellLink *link;
|
IShellLink *link;
|
||||||
|
@ -219,12 +219,68 @@ BOOL CreateUNCShortcut(PCWSTR share)
|
||||||
return SUCCEEDED(res);
|
return SUCCEEDED(res);
|
||||||
}
|
}
|
||||||
|
|
||||||
int autoStart(void)
|
BOOL assignDriveLetter(PCWSTR share)
|
||||||
|
{
|
||||||
|
DWORD driveMap;
|
||||||
|
char drive;
|
||||||
|
wchar_t cmdLine[MAX_PATH];
|
||||||
|
STARTUPINFOW startupInfo;
|
||||||
|
PROCESS_INFORMATION processInformation;
|
||||||
|
BOOL ok = FALSE;
|
||||||
|
|
||||||
|
driveMap = GetLogicalDrives();
|
||||||
|
|
||||||
|
for (drive = _MRX_MAX_DRIVE_LETTERS - 1; drive >= 0; ++drive)
|
||||||
|
{
|
||||||
|
if (!(driveMap & (1 << drive)))
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (drive < 0)
|
||||||
|
{
|
||||||
|
wprintf(L"Failed finding an appropriate drive for shared folder\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
drive += 'A';
|
||||||
|
|
||||||
|
wsprintf(cmdLine, L"hackssign_client.exe assign %c %s", drive, share);
|
||||||
|
RtlZeroMemory(&startupInfo, sizeof(startupInfo));
|
||||||
|
startupInfo.cb = sizeof(STARTUPINFOW);
|
||||||
|
|
||||||
|
if (!CreateProcessW(NULL,
|
||||||
|
(PVOID)cmdLine,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
FALSE,
|
||||||
|
0,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
&startupInfo,
|
||||||
|
&processInformation))
|
||||||
|
{
|
||||||
|
wprintf(L"Failed starting hackssign_client.exe\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ok = (WaitForSingleObject(processInformation.hProcess, -1) == WAIT_OBJECT_0);
|
||||||
|
CloseHandle(processInformation.hProcess);
|
||||||
|
CloseHandle(processInformation.hThread);
|
||||||
|
|
||||||
|
wprintf(L"%c assigned to %s\n", drive, share);
|
||||||
|
|
||||||
|
return ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
int autoStart(BOOL assign)
|
||||||
{
|
{
|
||||||
short i;
|
short i;
|
||||||
BOOL ret;
|
BOOL ret;
|
||||||
DWORD outputBufferSize;
|
DWORD outputBufferSize;
|
||||||
char outputBuffer[_MRX_MAX_DRIVE_LETTERS];
|
char outputBuffer[_MRX_MAX_DRIVE_LETTERS];
|
||||||
|
OFSTRUCT ofs;
|
||||||
|
|
||||||
if (startVBoxSrv() != 0)
|
if (startVBoxSrv() != 0)
|
||||||
{
|
{
|
||||||
|
@ -239,7 +295,20 @@ int autoStart(void)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
CoInitialize(NULL);
|
if (assign)
|
||||||
|
{
|
||||||
|
if (OpenFile("hackssign_client.exe", &ofs, OF_EXIST) != 1)
|
||||||
|
{
|
||||||
|
wprintf(L"hackssign_client.exe not found, falling back to links\n");
|
||||||
|
assign = FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!assign)
|
||||||
|
{
|
||||||
|
CoInitialize(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < _MRX_MAX_DRIVE_LETTERS; ++i)
|
for (i = 0; i < _MRX_MAX_DRIVE_LETTERS; ++i)
|
||||||
{
|
{
|
||||||
CHAR id = outputBuffer[i];
|
CHAR id = outputBuffer[i];
|
||||||
|
@ -255,7 +324,14 @@ int autoStart(void)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
CreateUNCShortcut(name);
|
if (!assign)
|
||||||
|
{
|
||||||
|
createUNCShortcut(name);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
assignDriveLetter(name);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -268,7 +344,8 @@ void printUsage(void)
|
||||||
wprintf(L"\taddconn <letter> <share name>: add a connection\n");
|
wprintf(L"\taddconn <letter> <share name>: add a connection\n");
|
||||||
wprintf(L"\tgetlist: list connections\n");
|
wprintf(L"\tgetlist: list connections\n");
|
||||||
wprintf(L"\tgetgloballist: list available shares\n");
|
wprintf(L"\tgetgloballist: list available shares\n");
|
||||||
wprintf(L"\tauto: automagically configure the VBox Shared folders and creates desktop folders\n");
|
wprintf(L"\tautolink: automagically configure the VBox Shared folders and creates desktop folders\n");
|
||||||
|
wprintf(L"\tautoassign: automagically configure the VBox Shared folders and assigns drive letters\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
int wmain(int argc, wchar_t *argv[])
|
int wmain(int argc, wchar_t *argv[])
|
||||||
|
@ -305,9 +382,13 @@ int wmain(int argc, wchar_t *argv[])
|
||||||
{
|
{
|
||||||
return getGlobalList();
|
return getGlobalList();
|
||||||
}
|
}
|
||||||
else if (_wcsicmp(cmd, L"auto") == 0)
|
else if (_wcsicmp(cmd, L"autolink") == 0)
|
||||||
{
|
{
|
||||||
return autoStart();
|
return autoStart(FALSE);
|
||||||
|
}
|
||||||
|
else if (_wcsicmp(cmd, L"autoassign") == 0)
|
||||||
|
{
|
||||||
|
return autoStart(TRUE);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue