X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Fwin32_common.c;h=e3dace38946f8f912b4ded844662c49bc8bef4ad;hb=8fc9b6f370468126f775fe5d0845dd4417c15a42;hp=a996378a82e4826a9eeab6a4e69d7d40d1594844;hpb=b79609d7660ef30bdfba091f839e61b256059a80;p=wimlib diff --git a/src/win32_common.c b/src/win32_common.c index a996378a..e3dace38 100644 --- a/src/win32_common.c +++ b/src/win32_common.c @@ -479,38 +479,26 @@ out: 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_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_privileges(false); + win32_modify_apply_privileges(false); } HANDLE @@ -532,6 +520,7 @@ win32_open_file_data_only(const wchar_t *path) 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. */ @@ -545,6 +534,12 @@ HANDLE (WINAPI *win32func_FindFirstStreamW)(LPCWSTR lpFileName, /* 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), @@ -563,14 +558,17 @@ windows_version_is_at_least(unsigned major, unsigned minor) } /* One-time initialization for Windows capture/apply code. */ -void +int win32_global_init(int init_flags) { - DWORD err; - /* 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; } @@ -582,6 +580,7 @@ win32_global_init(int init_flags) hKernel32 = LoadLibrary(L"Kernel32.dll"); if (hKernel32) { + #ifndef WITH_NTDLL win32func_FindFirstStreamW = (void*)GetProcAddress(hKernel32, "FindFirstStreamW"); if (win32func_FindFirstStreamW) { @@ -590,8 +589,15 @@ win32_global_init(int init_flags) 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