5 /* DON'T CHANGE ORDER!!!! */
6 PCWSTR devices
[3] = { L
"\\\\.\\VBoxMiniRdrDN", L
"\\??\\VBoxMiniRdrDN", L
"\\Device\\VBoxMiniRdr" };
8 /* Taken from VBox header */
9 #define _MRX_MAX_DRIVE_LETTERS 26
10 #define IOCTL_MRX_VBOX_BASE FILE_DEVICE_NETWORK_FILE_SYSTEM
11 #define _MRX_VBOX_CONTROL_CODE(request, method, access) \
12 CTL_CODE(IOCTL_MRX_VBOX_BASE, request, method, access)
13 #define IOCTL_MRX_VBOX_ADDCONN _MRX_VBOX_CONTROL_CODE(100, METHOD_BUFFERED, FILE_ANY_ACCESS)
14 #define IOCTL_MRX_VBOX_GETLIST _MRX_VBOX_CONTROL_CODE(103, METHOD_BUFFERED, FILE_ANY_ACCESS)
15 #define IOCTL_MRX_VBOX_GETGLOBALLIST _MRX_VBOX_CONTROL_CODE(104, METHOD_BUFFERED, FILE_ANY_ACCESS)
16 #define IOCTL_MRX_VBOX_START _MRX_VBOX_CONTROL_CODE(106, METHOD_BUFFERED, FILE_ANY_ACCESS)
18 BOOL
performDevIoCtl(DWORD dwIoControlCode
, LPVOID lpInBuffer
, DWORD nInBufferSize
, LPVOID lpOutBuffer
, DWORD nOutBufferSize
)
22 DWORD lpBytesReturned
;
23 HANDLE dev
= INVALID_HANDLE_VALUE
;
25 wprintf(L
"Trying to open a VBoxSRV device\n");
26 for (i
= 0; i
< 3; ++i
)
28 dev
= CreateFile(devices
[i
],
29 GENERIC_READ
| GENERIC_WRITE
,
30 FILE_SHARE_READ
| FILE_SHARE_WRITE
,
31 NULL
, OPEN_EXISTING
, 0, NULL
);
32 if (dev
!= INVALID_HANDLE_VALUE
)
38 if (dev
== INVALID_HANDLE_VALUE
)
43 wprintf(L
"%s opened.\n", devices
[i
]);
45 ret
= DeviceIoControl(dev
, dwIoControlCode
, lpInBuffer
, nInBufferSize
, lpOutBuffer
, nOutBufferSize
, &lpBytesReturned
, NULL
);
46 wprintf(L
"Done: it %s with error: %lx\n", (ret
!= 0 ? L
"succeed" : L
"failed"), (ret
!= 0 ? ERROR_SUCCESS
: GetLastError()));
53 int startVBoxSrv(void)
55 return (performDevIoCtl(IOCTL_MRX_VBOX_START
, NULL
, 0, NULL
, 0) == FALSE
);
58 int addConn(PCWSTR letter
, PCWSTR path
)
62 DWORD inputBufferSize
;
64 if (iswalpha(letter
[0]) == 0)
66 wprintf(L
"Invalid letter provided\n");
70 if (wcschr(path
, L
'\\') != NULL
)
72 wprintf(L
"Only give the name of a share\n");
76 inputBufferSize
= (wcslen(path
) + wcslen(devices
[2]) + wcslen(L
"\\;Z:\\vboxsvr\\")) * sizeof(WCHAR
) + sizeof(UNICODE_NULL
);
77 inputBuffer
= malloc(inputBufferSize
);
78 if (inputBuffer
== NULL
)
80 wprintf(L
"Memory failure\n");
84 swprintf(inputBuffer
, L
"%s\\;%c:\\vboxsvr\\%s", devices
[2], towupper(letter
[0]), path
);
85 wprintf(L
"Will create the following connection: %s\n", inputBuffer
);
86 ret
= performDevIoCtl(IOCTL_MRX_VBOX_ADDCONN
, inputBuffer
, inputBufferSize
, NULL
, 0);
89 return (ret
== FALSE
);
96 DWORD outputBufferSize
;
97 char outputBuffer
[_MRX_MAX_DRIVE_LETTERS
];
99 outputBufferSize
= sizeof(outputBuffer
);
100 ret
= performDevIoCtl(IOCTL_MRX_VBOX_GETLIST
, NULL
, 0, &outputBuffer
, outputBufferSize
);
106 for (i
= 0; i
< _MRX_MAX_DRIVE_LETTERS
; i
+= 2)
108 wprintf(L
"%c: %s\t%c: %s\n", 'A' + i
, (outputBuffer
[i
] == 0 ? L
"FALSE" : L
"TRUE"),
109 'A' + (i
+ 1), (outputBuffer
[i
+ 1] == 0 ? L
"FALSE" : L
"TRUE"));
115 int getGlobalList(void)
119 DWORD outputBufferSize
;
120 char outputBuffer
[_MRX_MAX_DRIVE_LETTERS
];
122 outputBufferSize
= sizeof(outputBuffer
);
123 memset(outputBuffer
, 0, outputBufferSize
);
124 ret
= performDevIoCtl(IOCTL_MRX_VBOX_GETGLOBALLIST
, NULL
, 0, &outputBuffer
, outputBufferSize
);
130 for (i
= 0; i
< _MRX_MAX_DRIVE_LETTERS
; i
+= 2)
132 wprintf(L
"%c: %s\t%c: %s\n", 'A' + i
, (outputBuffer
[i
] & 0x80 ? L
"Active" : L
"Inactive"),
133 'A' + (i
+ 1), (outputBuffer
[i
+ 1] & 0x80 ? L
"Active" : L
"Inactive"));
139 void printUsage(void)
141 wprintf(L
"ReactOS VBox Shared Folders Management\n");
142 wprintf(L
"\tstart: start the VBox Shared folders (mandatory prior any operation!)\n");
143 wprintf(L
"\taddconn <letter> <share name>: add a connection\n");
144 wprintf(L
"\tgetlist: list connections\n");
145 wprintf(L
"\tgetgloballist: list available shares\n");
148 int wmain(int argc
, wchar_t *argv
[])
160 if (_wcsicmp(cmd
, L
"start") == 0)
162 return startVBoxSrv();
164 else if (_wcsicmp(cmd
, L
"addconn") == 0)
172 return addConn(argv
[2], argv
[3]);
174 else if (_wcsicmp(cmd
, L
"getlist") == 0)
178 else if (_wcsicmp(cmd
, L
"getgloballist") == 0)
180 return getGlobalList();