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 typedef BOOL (*HV_DET
)(void);
25 HANDLE dev
= CreateFile(L
"\\\\.\\hgfs",
26 GENERIC_READ
| GENERIC_WRITE
,
27 FILE_SHARE_READ
| FILE_SHARE_WRITE
,
28 NULL
, OPEN_EXISTING
, 0, NULL
);
29 if (dev
!= INVALID_HANDLE_VALUE
)
31 wprintf(L
"VMware detected\n");
40 HANDLE dev
= CreateFile(L
"\\\\.\\VBoxMiniRdrDN",
41 GENERIC_READ
| GENERIC_WRITE
,
42 FILE_SHARE_READ
| FILE_SHARE_WRITE
,
43 NULL
, OPEN_EXISTING
, 0, NULL
);
44 if (dev
!= INVALID_HANDLE_VALUE
)
46 wprintf(L
"VirtualBox detected\n");
53 PCWSTR dev
[] = { L
"\\Device\\hgfs\\;", L
"\\Device\\VBoxMiniRdr\\;" };
54 PCWSTR unc
[] = { L
":\\vmware-host\\Shared Folders\\", L
":\\vboxsvr\\" };
55 HV_DET det
[] = { isVMware
, isVBox
};
57 HV_TYPES
detectVM(void)
61 for (vm
= vmVMware
; vm
< vmMax
; ++vm
)
63 if (det
[vm
]() == TRUE
)
72 BOOL
performDevIoCtl(DWORD dwIoControlCode
, LPVOID lpInBuffer
, DWORD nInBufferSize
)
76 DWORD lpBytesReturned
;
78 dev
= CreateFile(L
"\\\\.\\hackssign",
79 GENERIC_READ
| GENERIC_WRITE
,
80 FILE_SHARE_READ
| FILE_SHARE_WRITE
,
81 NULL
, OPEN_EXISTING
, 0, NULL
);
82 if (dev
== INVALID_HANDLE_VALUE
)
84 wprintf(L
"Opening device failed\n");
88 ret
= DeviceIoControl(dev
, dwIoControlCode
, lpInBuffer
, nInBufferSize
, NULL
, 0, &lpBytesReturned
, NULL
);
89 wprintf(L
"Done: it %s with error: %lx\n", (ret
!= 0 ? L
"succeed" : L
"failed"), (ret
!= 0 ? ERROR_SUCCESS
: GetLastError()));
100 WCHAR path
[MAX_PATH
];
101 SC_HANDLE hManager
, hService
;
103 hManager
= OpenSCManager(NULL
, NULL
, SC_MANAGER_CREATE_SERVICE
);
104 if (hManager
== NULL
)
106 wprintf(L
"Service manager opening failed\n");
110 hService
= OpenService(hManager
, L
"hackssign", SERVICE_START
| SERVICE_STOP
| DELETE
);
111 if (hService
== NULL
)
113 if (GetModuleFileName(NULL
, path
, MAX_PATH
) == 0)
115 wprintf(L
"Getting own path failed\n");
116 CloseServiceHandle(hManager
);
120 fileName
= wcsrchr(path
, L
'\\');
121 if (fileName
== NULL
)
123 wprintf(L
"Invalid path: %s\n", path
);
124 CloseServiceHandle(hManager
);
129 *fileName
= UNICODE_NULL
;
130 wcscat(path
, L
"hackssign_driver.sys");
132 if (GetFileAttributes(path
) == INVALID_FILE_ATTRIBUTES
)
134 wprintf(L
"Driver not found: %s\n", path
);
135 CloseServiceHandle(hManager
);
139 hService
= CreateService(hManager
, L
"hackssign", L
"hackssign",
140 SERVICE_START
| SERVICE_STOP
| DELETE
, SERVICE_KERNEL_DRIVER
,
141 SERVICE_DEMAND_START
, SERVICE_ERROR_NORMAL
, path
, NULL
, NULL
,
143 if (hService
== NULL
)
145 wprintf(L
"Creating service failed\n");
146 CloseServiceHandle(hManager
);
151 if (!StartService(hService
, 0, NULL
) &&
152 GetLastError() != ERROR_SERVICE_ALREADY_RUNNING
)
154 wprintf(L
"Starting service failed\n");
155 CloseServiceHandle(hService
);
156 CloseServiceHandle(hManager
);
160 wprintf(L
"Starting service succeed\n");
161 CloseServiceHandle(hService
);
162 CloseServiceHandle(hManager
);
166 int assignLetter(WCHAR letter
, PCWSTR path
)
173 DWORD inputBufferSize
;
174 PASSIGN_INPUT inputBuffer
;
179 wprintf(L
"Unsupported VM type\n");
183 if (iswalpha(letter
) == 0)
185 wprintf(L
"Invalid letter provided\n");
189 capsLetter
= towupper(letter
);
190 if (capsLetter
== L
'C')
192 wprintf(L
"Looks suspicious, won't proceed\n");
199 wprintf(L
"Invalid share name\n");
203 if (wcschr(path
, L
'\\') != NULL
)
205 wprintf(L
"Only give the name of a share\n");
209 inputBufferSize
= len
* sizeof(WCHAR
) + sizeof(ASSIGN_INPUT
) + (wcslen(dev
[vm
]) + wcslen(unc
[vm
]) + 2) * sizeof(WCHAR
);
210 inputBuffer
= malloc(inputBufferSize
);
211 if (inputBuffer
== NULL
)
213 wprintf(L
"Memory failure\n");
217 inputBuffer
->letter
= capsLetter
;
218 inputBuffer
->offset
= sizeof(ASSIGN_INPUT
);
219 inputBuffer
->len
= len
* sizeof(WCHAR
) + (wcslen(dev
[vm
]) + wcslen(unc
[vm
]) + 1) * sizeof(WCHAR
);
220 str
= (PWSTR
)((ULONG_PTR
)inputBuffer
+ inputBuffer
->offset
);
221 swprintf(str
, L
"%s%c%s%s", dev
[vm
], capsLetter
, unc
[vm
], path
);
231 ret
= performDevIoCtl(FSCTL_HACKSSIGN_ASSIGN
, inputBuffer
, inputBufferSize
);
234 return (ret
== FALSE
);
237 int deleteLetter(WCHAR letter
)
241 if (iswalpha(letter
) == 0)
243 wprintf(L
"Invalid letter provided\n");
247 capsLetter
= towupper(letter
);
248 if (capsLetter
== L
'C')
250 wprintf(L
"Looks suspicious, won't proceed\n");
261 return (performDevIoCtl(FSCTL_HACKSSIGN_DELETE
, &capsLetter
, sizeof(WCHAR
)) == FALSE
);
271 wprintf(L
"Unsupported VM type\n");
278 void printUsage(void)
280 wprintf(L
"ReactOS Hackssign application\n");
281 wprintf(L
"\tassign <letter> <share name>: Assign a drive letter to the share\n");
282 wprintf(L
"\tdelete <letter>: delete driver letter assignation\n");
283 wprintf(L
"\tdetect: detect VM type\n");
286 int wmain(int argc
, wchar_t *argv
[])
298 if (_wcsicmp(cmd
, L
"assign") == 0)
306 return assignLetter(argv
[2][0], argv
[3]);
308 else if (_wcsicmp(cmd
, L
"delete") == 0)
316 return deleteLetter(argv
[2][0]);
318 else if (_wcsicmp(cmd
, L
"detect") == 0)