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 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; }
int deleteLetter(WCHAR letter) { WCHAR capsLetter; if (iswalpha(letter) == 0) { wprintf(L"Invalid letter provided\n"); return 1; } capsLetter = towupper(letter); if (capsLetter == L'C') { wprintf(L"Looks suspicious, won't proceed\n"); return 1; } if (!startService()) { return 1; } Sleep(500); return (performDevIoCtl(FSCTL_HACKSSIGN_DELETE, &capsLetter, sizeof(WCHAR)) == FALSE); }
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 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; }
int startVBoxSrv(void) { return (performDevIoCtl(IOCTL_MRX_VBOX_START, NULL, 0, NULL, 0) == FALSE); }
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) { 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; }
int assignLetter(WCHAR letter, PCWSTR path) { BOOL ret; DWORD len; PWSTR str; HV_TYPES vm; WCHAR capsLetter; DWORD inputBufferSize; PASSIGN_INPUT inputBuffer; vm = detectVM(); if (vm == vmMax) { wprintf(L"Unsupported VM type\n"); return 1; } if (iswalpha(letter) == 0) { wprintf(L"Invalid letter provided\n"); return 1; } capsLetter = towupper(letter); if (capsLetter == L'C') { wprintf(L"Looks suspicious, won't proceed\n"); return 1; } len = wcslen(path); if (len == 0) { wprintf(L"Invalid share name\n"); return 1; } if (wcschr(path, L'\\') != NULL) { wprintf(L"Only give the name of a share\n"); return 1; } inputBufferSize = len * sizeof(WCHAR) + sizeof(ASSIGN_INPUT) + (wcslen(dev[vm]) + wcslen(unc[vm]) + 2) * sizeof(WCHAR); inputBuffer = malloc(inputBufferSize); if (inputBuffer == NULL) { wprintf(L"Memory failure\n"); return 1; } inputBuffer->letter = capsLetter; inputBuffer->offset = sizeof(ASSIGN_INPUT); inputBuffer->len = len * sizeof(WCHAR) + (wcslen(dev[vm]) + wcslen(unc[vm]) + 1) * sizeof(WCHAR); str = (PWSTR)((ULONG_PTR)inputBuffer + inputBuffer->offset); swprintf(str, L"%s%c%s%s", dev[vm], capsLetter, unc[vm], path); if (!startService()) { free(inputBuffer); return 1; } Sleep(500); ret = performDevIoCtl(FSCTL_HACKSSIGN_ASSIGN, inputBuffer, inputBufferSize); free(inputBuffer); return (ret == FALSE); }