[ROSVBOXMGMT]

Drop rosvboxmgmt hack.
Thanks, you served us well. But r70670 killed you. Too bad!

CORE-10032
ROSAPPS-303

svn path=/trunk/; revision=70672
This commit is contained in:
Pierre Schweitzer 2016-02-01 22:17:43 +00:00
parent 886fc1b808
commit 629f718914
4 changed files with 0 additions and 418 deletions

View file

@ -3,7 +3,6 @@ add_subdirectory(arping)
add_subdirectory(cat)
add_subdirectory(hackssign)
add_subdirectory(ntfsinfo)
add_subdirectory(rosvboxmgmt)
add_subdirectory(tee)
add_subdirectory(touch)
add_subdirectory(uptime)

View file

@ -1,6 +0,0 @@
add_executable(rosvboxmgmt rosvboxmgmt.c rosvboxmgmt.rc)
set_module_type(rosvboxmgmt win32cui UNICODE)
target_link_libraries(rosvboxmgmt uuid)
add_delay_importlibs(rosvboxmgmt shell32)
add_importlibs(rosvboxmgmt msvcrt kernel32 user32 ole32)
add_cd_file(TARGET rosvboxmgmt DESTINATION reactos/bin FOR all)

View file

@ -1,406 +0,0 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS VBox Shared Folders Management
* FILE: cmdutils/hackssign/client.c
* PURPOSE: Communicate with VBox mini redirector to deal with shared folders
* PROGRAMMERS: Pierre Schweitzer <pierre@reactos.org>
*/
#include <stdio.h>
#include <wchar.h>
#include <windows.h>
#include <shlobj.h>
#include <shobjidl.h>
#include <shlwapi.h>
/* DON'T CHANGE ORDER!!!! */
PCWSTR devices[3] = { L"\\\\.\\VBoxMiniRdrDN", L"\\??\\VBoxMiniRdrDN", L"\\Device\\VBoxMiniRdr" };
#define MAX_LEN 255
/* Taken from VBox header */
#define _MRX_MAX_DRIVE_LETTERS 26
#define IOCTL_MRX_VBOX_BASE FILE_DEVICE_NETWORK_FILE_SYSTEM
#define _MRX_VBOX_CONTROL_CODE(request, method, access) \
CTL_CODE(IOCTL_MRX_VBOX_BASE, request, method, access)
#define IOCTL_MRX_VBOX_ADDCONN _MRX_VBOX_CONTROL_CODE(100, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_MRX_VBOX_GETLIST _MRX_VBOX_CONTROL_CODE(103, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_MRX_VBOX_GETGLOBALLIST _MRX_VBOX_CONTROL_CODE(104, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_MRX_VBOX_GETGLOBALCONN _MRX_VBOX_CONTROL_CODE(105, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_MRX_VBOX_START _MRX_VBOX_CONTROL_CODE(106, METHOD_BUFFERED, FILE_ANY_ACCESS)
BOOL performDevIoCtl(DWORD dwIoControlCode, LPVOID lpInBuffer, DWORD nInBufferSize, LPVOID lpOutBuffer, DWORD nOutBufferSize)
{
short i;
BOOL ret;
DWORD lpBytesReturned;
HANDLE dev = INVALID_HANDLE_VALUE;
wprintf(L"Trying to open a VBoxSRV device\n");
for (i = 0; i < 3; ++i)
{
dev = CreateFile(devices[i],
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, 0, NULL);
if (dev != INVALID_HANDLE_VALUE)
{
break;
}
}
if (dev == INVALID_HANDLE_VALUE)
{
return FALSE;
}
wprintf(L"%s opened.\n", devices[i]);
ret = DeviceIoControl(dev, dwIoControlCode, lpInBuffer, nInBufferSize, lpOutBuffer, nOutBufferSize, &lpBytesReturned, NULL);
wprintf(L"Done: it %s with error: %lx\n", (ret != 0 ? L"succeed" : L"failed"), (ret != 0 ? ERROR_SUCCESS : GetLastError()));
CloseHandle(dev);
return ret;
}
int startVBoxSrv(void)
{
return (performDevIoCtl(IOCTL_MRX_VBOX_START, NULL, 0, NULL, 0) == FALSE);
}
int addConn(PCWSTR letter, PCWSTR path)
{
BOOL ret;
PWSTR inputBuffer;
DWORD inputBufferSize;
if (iswalpha(letter[0]) == 0)
{
wprintf(L"Invalid letter provided\n");
return 1;
}
if (wcschr(path, L'\\') != NULL)
{
wprintf(L"Only give the name of a share\n");
return 1;
}
inputBufferSize = (wcslen(path) + wcslen(devices[2]) + wcslen(L"\\;Z:\\vboxsvr\\")) * sizeof(WCHAR) + sizeof(UNICODE_NULL);
inputBuffer = malloc(inputBufferSize);
if (inputBuffer == NULL)
{
wprintf(L"Memory failure\n");
return 1;
}
swprintf(inputBuffer, L"%s\\;%c:\\vboxsvr\\%s", devices[2], towupper(letter[0]), path);
wprintf(L"Will create the following connection: %s\n", inputBuffer);
ret = performDevIoCtl(IOCTL_MRX_VBOX_ADDCONN, inputBuffer, inputBufferSize, NULL, 0);
free(inputBuffer);
return (ret == FALSE);
}
int getList(void)
{
short i;
BOOL ret;
DWORD outputBufferSize;
char outputBuffer[_MRX_MAX_DRIVE_LETTERS];
outputBufferSize = sizeof(outputBuffer);
ret = performDevIoCtl(IOCTL_MRX_VBOX_GETLIST, NULL, 0, &outputBuffer, outputBufferSize);
if (ret == FALSE)
{
return 1;
}
for (i = 0; i < _MRX_MAX_DRIVE_LETTERS; i += 2)
{
wprintf(L"%c: %s\t%c: %s\n", 'A' + i, (outputBuffer[i] == 0 ? L"FALSE" : L"TRUE"),
'A' + (i + 1), (outputBuffer[i + 1] == 0 ? L"FALSE" : L"TRUE"));
}
return 0;
}
PCWSTR getGlobalConn(CHAR id)
{
BOOL ret;
static WCHAR name[MAX_LEN];
ret = performDevIoCtl(IOCTL_MRX_VBOX_GETGLOBALCONN, &id, sizeof(id), name, sizeof(name));
if (ret == FALSE)
{
return NULL;
}
name[MAX_LEN - 1] = 0;
return name;
}
int getGlobalList(void)
{
short i;
BOOL ret;
DWORD outputBufferSize;
char outputBuffer[_MRX_MAX_DRIVE_LETTERS];
outputBufferSize = sizeof(outputBuffer);
memset(outputBuffer, 0, outputBufferSize);
ret = performDevIoCtl(IOCTL_MRX_VBOX_GETGLOBALLIST, NULL, 0, &outputBuffer, outputBufferSize);
if (ret == FALSE)
{
return 1;
}
for (i = 0; i < _MRX_MAX_DRIVE_LETTERS; ++i)
{
CHAR id = outputBuffer[i];
BOOL active = ((id & 0x80) == 0x80);
PCWSTR name = NULL;
if (active)
{
name = getGlobalConn(id);
}
if (name == NULL)
{
name = L"None";
}
wprintf(L"%c: %s (%s)%c", 'A' + i, (active ? L"Active" : L"Inactive"), name, (i & 1 ? '\n' : '\t'));
}
return 0;
}
BOOL createUNCShortcut(PCWSTR share)
{
HRESULT res;
IShellLink *link;
IPersistFile *persist;
WCHAR path[MAX_PATH];
WCHAR linkPath[MAX_PATH];
res = CoCreateInstance(&CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, &IID_IShellLink, (void**)&link);
if (FAILED(res))
{
return FALSE;
}
res = link->lpVtbl->QueryInterface(link, &IID_IPersistFile, (void **)&persist);
if (FAILED(res))
{
link->lpVtbl->Release(link);
return FALSE;
}
wcscpy(path, L"\\\\vboxsvr\\");
wcscat(path, share);
link->lpVtbl->SetPath(link, path);
res = SHGetFolderPathW(NULL, CSIDL_DESKTOPDIRECTORY, NULL, 0, path);
if (FAILED(res))
{
persist->lpVtbl->Release(persist);
link->lpVtbl->Release(link);
return FALSE;
}
wsprintf(linkPath, L"%s\\Browse %s (VBox).lnk", path, share);
res = persist->lpVtbl->Save(persist, linkPath, TRUE);
persist->lpVtbl->Release(persist);
link->lpVtbl->Release(link);
return SUCCEEDED(res);
}
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)
{
return 1;
}
outputBufferSize = sizeof(outputBuffer);
memset(outputBuffer, 0, outputBufferSize);
ret = performDevIoCtl(IOCTL_MRX_VBOX_GETGLOBALLIST, NULL, 0, &outputBuffer, outputBufferSize);
if (ret == FALSE)
{
return 1;
}
if (assign)
{
wchar_t path[MAX_PATH];
if (GetModuleFileName(NULL, path, ARRAYSIZE(path)) != 0)
{
*(wcsrchr(path, '\\')) = 0;
wprintf(L"Switching to %s\n", path);
SetCurrentDirectory(path);
}
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];
BOOL active = ((id & 0x80) == 0x80);
PCWSTR name = NULL;
if (active)
{
name = getGlobalConn(id);
}
if (name == NULL)
{
continue;
}
if (!assign)
{
createUNCShortcut(name);
}
else
{
assignDriveLetter(name);
}
}
return 0;
}
void printUsage(void)
{
wprintf(L"ReactOS VBox Shared Folders Management\n");
wprintf(L"\tstart: start the VBox Shared folders (mandatory prior any operation!)\n");
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"\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[])
{
PCWSTR cmd;
if (argc == 1)
{
printUsage();
return 0;
}
cmd = argv[1];
if (_wcsicmp(cmd, L"start") == 0)
{
return startVBoxSrv();
}
else if (_wcsicmp(cmd, L"addconn") == 0)
{
if (argc < 4)
{
printUsage();
return 0;
}
return addConn(argv[2], argv[3]);
}
else if (_wcsicmp(cmd, L"getlist") == 0)
{
return getList();
}
else if (_wcsicmp(cmd, L"getgloballist") == 0)
{
return getGlobalList();
}
else if (_wcsicmp(cmd, L"autolink") == 0)
{
return autoStart(FALSE);
}
else if (_wcsicmp(cmd, L"autoassign") == 0)
{
return autoStart(TRUE);
}
else
{
printUsage();
return 0;
}
}

View file

@ -1,5 +0,0 @@
#define REACTOS_STR_FILE_DESCRIPTION "ReactOS VBoxSRV management tool\0"
#define REACTOS_STR_INTERNAL_NAME "rosvboxmgmt\0"
#define REACTOS_STR_ORIGINAL_FILENAME "rosvboxmgmt.exe\0"
#include <reactos/version.rc>