mirror of
https://github.com/reactos/reactos.git
synced 2025-02-22 08:25:03 +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;
|
||||
}
|
||||
|
||||
BOOL CreateUNCShortcut(PCWSTR share)
|
||||
BOOL createUNCShortcut(PCWSTR share)
|
||||
{
|
||||
HRESULT res;
|
||||
IShellLink *link;
|
||||
|
@ -219,12 +219,68 @@ BOOL CreateUNCShortcut(PCWSTR share)
|
|||
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;
|
||||
BOOL ret;
|
||||
DWORD outputBufferSize;
|
||||
char outputBuffer[_MRX_MAX_DRIVE_LETTERS];
|
||||
OFSTRUCT ofs;
|
||||
|
||||
if (startVBoxSrv() != 0)
|
||||
{
|
||||
|
@ -239,7 +295,20 @@ int autoStart(void)
|
|||
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)
|
||||
{
|
||||
CHAR id = outputBuffer[i];
|
||||
|
@ -255,7 +324,14 @@ int autoStart(void)
|
|||
continue;
|
||||
}
|
||||
|
||||
CreateUNCShortcut(name);
|
||||
if (!assign)
|
||||
{
|
||||
createUNCShortcut(name);
|
||||
}
|
||||
else
|
||||
{
|
||||
assignDriveLetter(name);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -268,7 +344,8 @@ void printUsage(void)
|
|||
wprintf(L"\taddconn <letter> <share name>: add a connection\n");
|
||||
wprintf(L"\tgetlist: list connections\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[])
|
||||
|
@ -305,9 +382,13 @@ int wmain(int argc, wchar_t *argv[])
|
|||
{
|
||||
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
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue