2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: Hackssign application & driver
4 * FILE: cmdutils/hackssign/client.c
5 * PURPOSE: Client: Assign drive letter to shared folders for VMware/VBox VMs
6 * PROGRAMMERS: Pierre Schweitzer <pierre@reactos.org>
15 /* DON'T MESS AROUND THIS! */
16 typedef enum _HV_TYPES
22 PCWSTR hV
[] = { L
"vmware", L
"virtualbox" };
23 PCWSTR dev
[] = { L
"\\Device\\hgfs\\;", L
"\\Device\\VBoxMiniRdr\\;" };
24 PCWSTR unc
[] = { L
":\\vmware-host\\Shared Folders\\", L
":\\vboxsvr\\" };
26 BOOL
performDevIoCtl(DWORD dwIoControlCode
, LPVOID lpInBuffer
, DWORD nInBufferSize
)
30 DWORD lpBytesReturned
;
32 dev
= CreateFile(L
"\\\\.\\hackssign",
33 GENERIC_READ
| GENERIC_WRITE
,
34 FILE_SHARE_READ
| FILE_SHARE_WRITE
,
35 NULL
, OPEN_EXISTING
, 0, NULL
);
36 if (dev
== INVALID_HANDLE_VALUE
)
38 wprintf(L
"Opening device failed\n");
42 ret
= DeviceIoControl(dev
, dwIoControlCode
, lpInBuffer
, nInBufferSize
, NULL
, 0, &lpBytesReturned
, NULL
);
43 wprintf(L
"Done: it %s with error: %lx\n", (ret
!= 0 ? L
"succeed" : L
"failed"), (ret
!= 0 ? ERROR_SUCCESS
: GetLastError()));
55 SC_HANDLE hManager
, hService
;
57 hManager
= OpenSCManager(NULL
, NULL
, SC_MANAGER_CREATE_SERVICE
);
60 wprintf(L
"Service manager opening failed\n");
64 hService
= OpenService(hManager
, L
"hackssign", SERVICE_START
| SERVICE_STOP
| DELETE
);
67 if (GetModuleFileName(NULL
, path
, MAX_PATH
) == 0)
69 wprintf(L
"Getting own path failed\n");
70 CloseServiceHandle(hManager
);
74 fileName
= wcsrchr(path
, L
'\\');
77 wprintf(L
"Invalid path: %s\n", path
);
78 CloseServiceHandle(hManager
);
83 *fileName
= UNICODE_NULL
;
84 wcscat(path
, L
"hackssign_driver.sys");
86 if (GetFileAttributes(path
) == INVALID_FILE_ATTRIBUTES
)
88 wprintf(L
"Driver not found: %s\n", path
);
89 CloseServiceHandle(hManager
);
93 hService
= CreateService(hManager
, L
"hackssign", L
"hackssign",
94 SERVICE_START
| SERVICE_STOP
| DELETE
, SERVICE_KERNEL_DRIVER
,
95 SERVICE_DEMAND_START
, SERVICE_ERROR_NORMAL
, path
, NULL
, NULL
,
99 wprintf(L
"Creating service failed\n");
100 CloseServiceHandle(hManager
);
105 if (!StartService(hService
, 0, NULL
) &&
106 GetLastError() != ERROR_SERVICE_ALREADY_RUNNING
)
108 wprintf(L
"Starting service failed\n");
109 CloseServiceHandle(hService
);
110 CloseServiceHandle(hManager
);
114 wprintf(L
"Starting service succeed\n");
115 CloseServiceHandle(hService
);
116 CloseServiceHandle(hManager
);
120 int assignLetter(WCHAR letter
, PCWSTR path
, PCWSTR device
)
127 DWORD inputBufferSize
;
128 PASSIGN_INPUT inputBuffer
;
130 for (vm
= vmVMware
; vm
< vmMax
; ++vm
)
132 if (_wcsicmp(device
, hV
[vm
]) == 0)
139 wprintf(L
"Unsupported VM type\n");
143 if (iswalpha(letter
) == 0)
145 wprintf(L
"Invalid letter provided\n");
149 capsLetter
= towupper(letter
);
150 if (capsLetter
== L
'C')
152 wprintf(L
"Looks suspicious, won't proceed\n");
159 wprintf(L
"Invalid share name\n");
163 if (wcschr(path
, L
'\\') != NULL
)
165 wprintf(L
"Only give the name of a share\n");
169 inputBufferSize
= len
* sizeof(WCHAR
) + sizeof(ASSIGN_INPUT
) + (wcslen(dev
[vm
]) + wcslen(unc
[vm
]) + 2) * sizeof(WCHAR
);
170 inputBuffer
= malloc(inputBufferSize
);
171 if (inputBuffer
== NULL
)
173 wprintf(L
"Memory failure\n");
177 inputBuffer
->letter
= capsLetter
;
178 inputBuffer
->offset
= sizeof(ASSIGN_INPUT
);
179 inputBuffer
->len
= len
* sizeof(WCHAR
) + (wcslen(dev
[vm
]) + wcslen(unc
[vm
]) + 1) * sizeof(WCHAR
);
180 str
= (PWSTR
)((ULONG_PTR
)inputBuffer
+ inputBuffer
->offset
);
181 swprintf(str
, L
"%s%c%s%s", dev
[vm
], capsLetter
, unc
[vm
], path
);
191 ret
= performDevIoCtl(FSCTL_HACKSSIGN_ASSIGN
, inputBuffer
, inputBufferSize
);
194 return (ret
== FALSE
);
197 int deleteLetter(WCHAR letter
)
201 if (iswalpha(letter
) == 0)
203 wprintf(L
"Invalid letter provided\n");
207 capsLetter
= towupper(letter
);
208 if (capsLetter
== L
'C')
210 wprintf(L
"Looks suspicious, won't proceed\n");
221 return (performDevIoCtl(FSCTL_HACKSSIGN_DELETE
, &capsLetter
, sizeof(WCHAR
)) == FALSE
);
224 void printUsage(void)
226 wprintf(L
"ReactOS Hackssign application\n");
227 wprintf(L
"\assign <letter> <share name> <vmtype>: Assign a drive letter to the share given the VM type\n");
228 wprintf(L
"\t\tVM types are: vmware or virtual\n");
229 wprintf(L
"\tdelete <letter>: delete driver letter assignation\n");
232 int wmain(int argc
, wchar_t *argv
[])
244 if (_wcsicmp(cmd
, L
"assign") == 0)
252 return assignLetter(argv
[2][0], argv
[3], argv
[4]);
254 else if (_wcsicmp(cmd
, L
"delete") == 0)
256 return deleteLetter(argv
[2][0]);