return ret;
}
-static void
+static bool
win32_modify_capture_privileges(bool enable)
{
- win32_modify_privilege(SE_BACKUP_NAME, enable);
- win32_modify_privilege(SE_SECURITY_NAME, enable);
+ return win32_modify_privilege(SE_BACKUP_NAME, enable)
+ && win32_modify_privilege(SE_SECURITY_NAME, enable);
}
-static void
+static bool
win32_modify_apply_privileges(bool enable)
{
- win32_modify_privilege(SE_RESTORE_NAME, enable);
- win32_modify_privilege(SE_SECURITY_NAME, enable);
- win32_modify_privilege(SE_TAKE_OWNERSHIP_NAME, enable);
-}
-
-static void
-win32_modify_capture_and_apply_privileges(bool enable)
-{
- win32_modify_capture_privileges(enable);
- win32_modify_apply_privileges(enable);
-}
-
-static void
-win32_acquire_capture_and_apply_privileges(void)
-{
- win32_modify_capture_and_apply_privileges(true);
+ return win32_modify_privilege(SE_RESTORE_NAME, enable)
+ && win32_modify_privilege(SE_SECURITY_NAME, enable)
+ && win32_modify_privilege(SE_TAKE_OWNERSHIP_NAME, enable);
}
static void
win32_release_capture_and_apply_privileges(void)
{
- win32_modify_capture_and_apply_privileges(false);
+ win32_modify_capture_privileges(false);
+ win32_modify_apply_privileges(false);
}
HANDLE
return win32_open_existing_file(path, FILE_READ_DATA);
}
+#ifndef WITH_NTDLL
/* Pointers to functions that are not available on all targetted versions of
* Windows (XP and later). NOTE: The WINAPI annotations seem to be important; I
* assume it specifies a certain calling convention. */
/* Vista and later */
BOOL (WINAPI *win32func_FindNextStreamW)(HANDLE hFindStream,
LPVOID lpFindStreamData) = NULL;
+#endif /* !WITH_NTDLL */
+
+/* Vista and later */
+BOOL (WINAPI *win32func_CreateSymbolicLinkW)(const wchar_t *lpSymlinkFileName,
+ const wchar_t *lpTargetFileName,
+ DWORD dwFlags) = NULL;
static OSVERSIONINFO windows_version_info = {
.dwOSVersionInfoSize = sizeof(OSVERSIONINFO),
}
/* One-time initialization for Windows capture/apply code. */
-void
+int
win32_global_init(int init_flags)
{
/* Try to acquire useful privileges. */
if (!(init_flags & WIMLIB_INIT_FLAG_DONT_ACQUIRE_PRIVILEGES)) {
- win32_acquire_capture_and_apply_privileges();
+ if (!win32_modify_capture_privileges(true))
+ if (init_flags & WIMLIB_INIT_FLAG_STRICT_CAPTURE_PRIVILEGES)
+ goto insufficient_privileges;
+ if (!win32_modify_apply_privileges(true))
+ if (init_flags & WIMLIB_INIT_FLAG_STRICT_APPLY_PRIVILEGES)
+ goto insufficient_privileges;
acquired_privileges = true;
}
hKernel32 = LoadLibrary(L"Kernel32.dll");
if (hKernel32) {
+ #ifndef WITH_NTDLL
win32func_FindFirstStreamW = (void*)GetProcAddress(hKernel32,
"FindFirstStreamW");
if (win32func_FindFirstStreamW) {
if (!win32func_FindNextStreamW)
win32func_FindFirstStreamW = NULL;
}
+ #endif /* !WITH_NTDLL */
+ win32func_CreateSymbolicLinkW = (void*)GetProcAddress(hKernel32,
+ "CreateSymbolicLinkW");
}
+ return 0;
+
+insufficient_privileges:
+ win32_release_capture_and_apply_privileges();
+ return WIMLIB_ERR_INSUFFICIENT_PRIVILEGES;
}
void