X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Fwin32.c;h=0c5c51cdb47594afcc5d7738f26b76bf418538ca;hp=75867e89d9d86b99c1124343cebb086f04c1bef2;hb=8d2bd90a2c9a151edc1619bf35be46b2fdda3e36;hpb=7d01645312c14c8d79a7e7b059838c3211dfd193 diff --git a/src/win32.c b/src/win32.c index 75867e89..0c5c51cd 100644 --- a/src/win32.c +++ b/src/win32.c @@ -60,6 +60,8 @@ static HANDLE (WINAPI *win32func_FindFirstStreamW)(LPCWSTR lpFileName, static BOOL (WINAPI *win32func_FindNextStreamW)(HANDLE hFindStream, LPVOID lpFindStreamData) = NULL; +static HMODULE hKernel32 = NULL; + /* Try to dynamically load some functions */ void win32_global_init() @@ -67,34 +69,43 @@ win32_global_init() DWORD err; bool warned; - DEBUG("Loading Kernel32.dll"); - HMODULE lib = LoadLibraryA("Kernel32.dll"); - if (lib == NULL) { - err = GetLastError(); - WARNING("Can't load Kernel32.dll"); - win32_error(err); - return; + if (hKernel32 == NULL) { + DEBUG("Loading Kernel32.dll"); + hKernel32 = LoadLibraryA("Kernel32.dll"); + if (hKernel32 == NULL) { + err = GetLastError(); + WARNING("Can't load Kernel32.dll"); + win32_error(err); + return; + } } DEBUG("Looking for FindFirstStreamW"); - win32func_FindFirstStreamW = (void*)GetProcAddress(lib, "FindFirstStreamW"); + win32func_FindFirstStreamW = (void*)GetProcAddress(hKernel32, "FindFirstStreamW"); if (!win32func_FindFirstStreamW) { WARNING("Could not find function FindFirstStreamW() in Kernel32.dll!"); WARNING("Capturing alternate data streams will not be supported."); - goto out_free_lib; + return; } DEBUG("Looking for FindNextStreamW"); - win32func_FindNextStreamW = (void*)GetProcAddress(lib, "FindNextStreamW"); + win32func_FindNextStreamW = (void*)GetProcAddress(hKernel32, "FindNextStreamW"); if (!win32func_FindNextStreamW) { WARNING("Could not find function FindNextStreamW() in Kernel32.dll!"); WARNING("Capturing alternate data streams will not be supported."); win32func_FindFirstStreamW = NULL; } -out_free_lib: - DEBUG("Closing Kernel32.dll"); - FreeLibrary(lib); +} + +void +win32_global_cleanup() +{ + if (hKernel32 != NULL) { + DEBUG("Closing Kernel32.dll"); + FreeLibrary(hKernel32); + hKernel32 = NULL; + } } static const char *access_denied_msg = @@ -148,7 +159,7 @@ win32_open_file_data_only(const wchar_t *path) } int -win32_read_file(const mbchar *filename, +win32_read_file(const utf16lechar *win32_filename, void *handle, u64 offset, size_t size, void *buf) { HANDLE h = handle; @@ -162,7 +173,7 @@ win32_read_file(const mbchar *filename, if (ReadFile(h, buf, size, &bytesRead, NULL) && bytesRead == size) return 0; err = GetLastError(); - ERROR("Error reading \"%s\"", filename); + ERROR("Error reading \"%ls\"", win32_filename); win32_error(err); return WIMLIB_ERR_READ; }