+
+
+/* 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 */
+static HANDLE (WINAPI *win32func_FindFirstStreamW)(LPCWSTR lpFileName,
+ STREAM_INFO_LEVELS InfoLevel,
+ LPVOID lpFindStreamData,
+ DWORD dwFlags) = NULL;
+
+/* Vista and later */
+static BOOL (WINAPI *win32func_FindNextStreamW)(HANDLE hFindStream,
+ LPVOID lpFindStreamData) = NULL;
+
+static HMODULE hKernel32 = NULL;
+
+/* Try to dynamically load some functions */
+void
+win32_global_init()
+{
+ DWORD err;
+ bool warned;
+
+
+ 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(hKernel32, "FindFirstStreamW");
+ if (!win32func_FindFirstStreamW) {
+ WARNING("Could not find function FindFirstStreamW() in Kernel32.dll!");
+ WARNING("Capturing alternate data streams will not be supported.");
+ return;
+ }
+
+ DEBUG("Looking for 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;
+ }
+}
+
+void
+win32_global_cleanup()
+{
+ if (hKernel32 != NULL) {
+ DEBUG("Closing Kernel32.dll");
+ FreeLibrary(hKernel32);
+ hKernel32 = NULL;
+ }
+}
+