예제 #1
0
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);
}
예제 #2
0
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;
}
예제 #3
0
파일: client.c 프로젝트: GYGit/reactos
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);
}
예제 #4
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;
}
예제 #5
0
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;
}
예제 #6
0
int startVBoxSrv(void)
{
    return (performDevIoCtl(IOCTL_MRX_VBOX_START, NULL, 0, NULL, 0) == FALSE);
}
예제 #7
0
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;
}
예제 #8
0
파일: client.c 프로젝트: GYGit/reactos
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);
}