2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS VBox Shared Folders Management
4 * FILE: cmdutils/hackssign/client.c
5 * PURPOSE: Communicate with VBox mini redirector to deal with shared folders
6 * PROGRAMMERS: Pierre Schweitzer <pierre@reactos.org>
16 /* DON'T CHANGE ORDER!!!! */
17 PCWSTR devices
[3] = { L
"\\\\.\\VBoxMiniRdrDN", L
"\\??\\VBoxMiniRdrDN", L
"\\Device\\VBoxMiniRdr" };
21 /* Taken from VBox header */
22 #define _MRX_MAX_DRIVE_LETTERS 26
23 #define IOCTL_MRX_VBOX_BASE FILE_DEVICE_NETWORK_FILE_SYSTEM
24 #define _MRX_VBOX_CONTROL_CODE(request, method, access) \
25 CTL_CODE(IOCTL_MRX_VBOX_BASE, request, method, access)
26 #define IOCTL_MRX_VBOX_ADDCONN _MRX_VBOX_CONTROL_CODE(100, METHOD_BUFFERED, FILE_ANY_ACCESS)
27 #define IOCTL_MRX_VBOX_GETLIST _MRX_VBOX_CONTROL_CODE(103, METHOD_BUFFERED, FILE_ANY_ACCESS)
28 #define IOCTL_MRX_VBOX_GETGLOBALLIST _MRX_VBOX_CONTROL_CODE(104, METHOD_BUFFERED, FILE_ANY_ACCESS)
29 #define IOCTL_MRX_VBOX_GETGLOBALCONN _MRX_VBOX_CONTROL_CODE(105, METHOD_BUFFERED, FILE_ANY_ACCESS)
30 #define IOCTL_MRX_VBOX_START _MRX_VBOX_CONTROL_CODE(106, METHOD_BUFFERED, FILE_ANY_ACCESS)
32 BOOL
performDevIoCtl(DWORD dwIoControlCode
, LPVOID lpInBuffer
, DWORD nInBufferSize
, LPVOID lpOutBuffer
, DWORD nOutBufferSize
)
36 DWORD lpBytesReturned
;
37 HANDLE dev
= INVALID_HANDLE_VALUE
;
39 wprintf(L
"Trying to open a VBoxSRV device\n");
40 for (i
= 0; i
< 3; ++i
)
42 dev
= CreateFile(devices
[i
],
43 GENERIC_READ
| GENERIC_WRITE
,
44 FILE_SHARE_READ
| FILE_SHARE_WRITE
,
45 NULL
, OPEN_EXISTING
, 0, NULL
);
46 if (dev
!= INVALID_HANDLE_VALUE
)
52 if (dev
== INVALID_HANDLE_VALUE
)
57 wprintf(L
"%s opened.\n", devices
[i
]);
59 ret
= DeviceIoControl(dev
, dwIoControlCode
, lpInBuffer
, nInBufferSize
, lpOutBuffer
, nOutBufferSize
, &lpBytesReturned
, NULL
);
60 wprintf(L
"Done: it %s with error: %lx\n", (ret
!= 0 ? L
"succeed" : L
"failed"), (ret
!= 0 ? ERROR_SUCCESS
: GetLastError()));
67 int startVBoxSrv(void)
69 return (performDevIoCtl(IOCTL_MRX_VBOX_START
, NULL
, 0, NULL
, 0) == FALSE
);
72 int addConn(PCWSTR letter
, PCWSTR path
)
76 DWORD inputBufferSize
;
78 if (iswalpha(letter
[0]) == 0)
80 wprintf(L
"Invalid letter provided\n");
84 if (wcschr(path
, L
'\\') != NULL
)
86 wprintf(L
"Only give the name of a share\n");
90 inputBufferSize
= (wcslen(path
) + wcslen(devices
[2]) + wcslen(L
"\\;Z:\\vboxsvr\\")) * sizeof(WCHAR
) + sizeof(UNICODE_NULL
);
91 inputBuffer
= malloc(inputBufferSize
);
92 if (inputBuffer
== NULL
)
94 wprintf(L
"Memory failure\n");
98 swprintf(inputBuffer
, L
"%s\\;%c:\\vboxsvr\\%s", devices
[2], towupper(letter
[0]), path
);
99 wprintf(L
"Will create the following connection: %s\n", inputBuffer
);
100 ret
= performDevIoCtl(IOCTL_MRX_VBOX_ADDCONN
, inputBuffer
, inputBufferSize
, NULL
, 0);
103 return (ret
== FALSE
);
110 DWORD outputBufferSize
;
111 char outputBuffer
[_MRX_MAX_DRIVE_LETTERS
];
113 outputBufferSize
= sizeof(outputBuffer
);
114 ret
= performDevIoCtl(IOCTL_MRX_VBOX_GETLIST
, NULL
, 0, &outputBuffer
, outputBufferSize
);
120 for (i
= 0; i
< _MRX_MAX_DRIVE_LETTERS
; i
+= 2)
122 wprintf(L
"%c: %s\t%c: %s\n", 'A' + i
, (outputBuffer
[i
] == 0 ? L
"FALSE" : L
"TRUE"),
123 'A' + (i
+ 1), (outputBuffer
[i
+ 1] == 0 ? L
"FALSE" : L
"TRUE"));
129 PCWSTR
getGlobalConn(CHAR id
)
132 static WCHAR name
[MAX_LEN
];
134 ret
= performDevIoCtl(IOCTL_MRX_VBOX_GETGLOBALCONN
, &id
, sizeof(id
), name
, sizeof(name
));
140 name
[MAX_LEN
- 1] = 0;
144 int getGlobalList(void)
148 DWORD outputBufferSize
;
149 char outputBuffer
[_MRX_MAX_DRIVE_LETTERS
];
151 outputBufferSize
= sizeof(outputBuffer
);
152 memset(outputBuffer
, 0, outputBufferSize
);
153 ret
= performDevIoCtl(IOCTL_MRX_VBOX_GETGLOBALLIST
, NULL
, 0, &outputBuffer
, outputBufferSize
);
159 for (i
= 0; i
< _MRX_MAX_DRIVE_LETTERS
; ++i
)
161 CHAR id
= outputBuffer
[i
];
162 BOOL active
= ((id
& 0x80) == 0x80);
167 name
= getGlobalConn(id
);
174 wprintf(L
"%c: %s (%s)%c", 'A' + i
, (active
? L
"Active" : L
"Inactive"), name
, (i
& 1 ? '\n' : '\t'));
180 BOOL
CreateUNCShortcut(PCWSTR share
)
184 IPersistFile
*persist
;
185 WCHAR path
[MAX_PATH
];
186 WCHAR linkPath
[MAX_PATH
];
188 res
= CoCreateInstance(&CLSID_ShellLink
, NULL
, CLSCTX_INPROC_SERVER
, &IID_IShellLink
, (void**)&link
);
194 res
= link
->lpVtbl
->QueryInterface(link
, &IID_IPersistFile
, (void **)&persist
);
197 link
->lpVtbl
->Release(link
);
201 wcscpy(path
, L
"\\\\vboxsvr\\");
203 link
->lpVtbl
->SetPath(link
, path
);
205 res
= SHGetFolderPathW(NULL
, CSIDL_DESKTOPDIRECTORY
, NULL
, 0, path
);
208 persist
->lpVtbl
->Release(persist
);
209 link
->lpVtbl
->Release(link
);
213 wsprintf(linkPath
, L
"%s\\Browse %s (VBox).lnk", path
, share
);
214 res
= persist
->lpVtbl
->Save(persist
, linkPath
, TRUE
);
216 persist
->lpVtbl
->Release(persist
);
217 link
->lpVtbl
->Release(link
);
219 return SUCCEEDED(res
);
226 DWORD outputBufferSize
;
227 char outputBuffer
[_MRX_MAX_DRIVE_LETTERS
];
229 if (startVBoxSrv() != 0)
234 outputBufferSize
= sizeof(outputBuffer
);
235 memset(outputBuffer
, 0, outputBufferSize
);
236 ret
= performDevIoCtl(IOCTL_MRX_VBOX_GETGLOBALLIST
, NULL
, 0, &outputBuffer
, outputBufferSize
);
243 for (i
= 0; i
< _MRX_MAX_DRIVE_LETTERS
; ++i
)
245 CHAR id
= outputBuffer
[i
];
246 BOOL active
= ((id
& 0x80) == 0x80);
251 name
= getGlobalConn(id
);
258 CreateUNCShortcut(name
);
264 void printUsage(void)
266 wprintf(L
"ReactOS VBox Shared Folders Management\n");
267 wprintf(L
"\tstart: start the VBox Shared folders (mandatory prior any operation!)\n");
268 wprintf(L
"\taddconn <letter> <share name>: add a connection\n");
269 wprintf(L
"\tgetlist: list connections\n");
270 wprintf(L
"\tgetgloballist: list available shares\n");
271 wprintf(L
"\tauto: automagically configure the VBox Shared folders and creates desktop folders\n");
274 int wmain(int argc
, wchar_t *argv
[])
286 if (_wcsicmp(cmd
, L
"start") == 0)
288 return startVBoxSrv();
290 else if (_wcsicmp(cmd
, L
"addconn") == 0)
298 return addConn(argv
[2], argv
[3]);
300 else if (_wcsicmp(cmd
, L
"getlist") == 0)
304 else if (_wcsicmp(cmd
, L
"getgloballist") == 0)
306 return getGlobalList();
308 else if (_wcsicmp(cmd
, L
"auto") == 0)