]> git.sur5r.net Git - bacula/bacula/blob - bacula/src/lib/winapi.c
Fix a memory leak.
[bacula/bacula] / bacula / src / lib / winapi.c
1 /*
2  * Windows APIs that are different for each system.
3  *   We use pointers to the entry points so that a
4  *   single binary will run on all Windows systems.
5  *
6  *     Kern Sibbald MMIII
7  */
8 /*
9    Copyright (C) 2003-2005 Kern Sibbald
10
11    This program is free software; you can redistribute it and/or
12    modify it under the terms of the GNU General Public License
13    version 2 as amended with additional clauses defined in the
14    file LICENSE in the main source directory.
15
16    This program is distributed in the hope that it will be useful,
17    but WITHOUT ANY WARRANTY; without even the implied warranty of
18    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
19    the file LICENSE for additional details.
20
21  */
22
23 #include "bacula.h"
24
25 #if defined(HAVE_CYGWIN) || defined(HAVE_WIN32)
26
27 #include "winapi.h"
28
29 #ifdef WIN32_VSS
30 #include "vss.h"   
31 #endif
32
33 // init with win9x, but maybe set to NT in InitWinAPI
34 DWORD  g_platform_id = VER_PLATFORM_WIN32_WINDOWS;
35 #ifdef WIN32_VSS
36 /* preset VSSClient to NULL */
37 VSSClient *g_pVSSClient = NULL;
38 #endif
39
40
41 /* API Pointers */
42
43 t_OpenProcessToken      p_OpenProcessToken = NULL;
44 t_AdjustTokenPrivileges p_AdjustTokenPrivileges = NULL;
45 t_LookupPrivilegeValue  p_LookupPrivilegeValue = NULL;
46
47 t_SetProcessShutdownParameters p_SetProcessShutdownParameters = NULL;
48
49 t_CreateFileA   p_CreateFileA = NULL;
50 t_CreateFileW   p_CreateFileW = NULL;
51
52 t_wunlink p_wunlink = NULL;
53 t_wmkdir p_wmkdir = NULL;
54 t_wopen p_wopen = NULL;
55
56 t_GetFileAttributesA    p_GetFileAttributesA = NULL;
57 t_GetFileAttributesW    p_GetFileAttributesW = NULL;
58
59 t_GetFileAttributesExA  p_GetFileAttributesExA = NULL;
60 t_GetFileAttributesExW  p_GetFileAttributesExW = NULL;
61
62 t_SetFileAttributesA    p_SetFileAttributesA = NULL;
63 t_SetFileAttributesW    p_SetFileAttributesW = NULL;
64 t_BackupRead            p_BackupRead = NULL;
65 t_BackupWrite           p_BackupWrite = NULL;
66 t_WideCharToMultiByte p_WideCharToMultiByte = NULL;
67 t_MultiByteToWideChar p_MultiByteToWideChar = NULL;
68
69 t_FindFirstFileA p_FindFirstFileA = NULL;
70 t_FindFirstFileW p_FindFirstFileW = NULL;
71
72 t_FindNextFileA p_FindNextFileA = NULL;
73 t_FindNextFileW p_FindNextFileW = NULL;
74
75 t_SetCurrentDirectoryA p_SetCurrentDirectoryA = NULL;
76 t_SetCurrentDirectoryW p_SetCurrentDirectoryW = NULL;
77
78 t_GetCurrentDirectoryA p_GetCurrentDirectoryA = NULL;
79 t_GetCurrentDirectoryW p_GetCurrentDirectoryW = NULL;
80
81 t_GetVolumePathNameW p_GetVolumePathNameW = NULL;
82 t_GetVolumeNameForVolumeMountPointW p_GetVolumeNameForVolumeMountPointW = NULL;
83
84 #ifdef WIN32_VSS
85 void 
86 VSSCleanup()
87 {
88    if (g_pVSSClient)
89       delete (g_pVSSClient);
90 }
91 #endif
92
93 void 
94 InitWinAPIWrapper() 
95 {
96    HMODULE hLib = LoadLibraryA("KERNEL32.DLL");
97    if (hLib) {
98       /* create file calls */
99       p_CreateFileA = (t_CreateFileA)
100           GetProcAddress(hLib, "CreateFileA");
101       p_CreateFileW = (t_CreateFileW)
102           GetProcAddress(hLib, "CreateFileW");      
103
104       /* attribute calls */
105       p_GetFileAttributesA = (t_GetFileAttributesA)
106           GetProcAddress(hLib, "GetFileAttributesA");
107       p_GetFileAttributesW = (t_GetFileAttributesW)
108           GetProcAddress(hLib, "GetFileAttributesW");
109       p_GetFileAttributesExA = (t_GetFileAttributesExA)
110           GetProcAddress(hLib, "GetFileAttributesExA");
111       p_GetFileAttributesExW = (t_GetFileAttributesExW)
112           GetProcAddress(hLib, "GetFileAttributesExW");
113       p_SetFileAttributesA = (t_SetFileAttributesA)
114           GetProcAddress(hLib, "SetFileAttributesA");
115       p_SetFileAttributesW = (t_SetFileAttributesW)
116           GetProcAddress(hLib, "SetFileAttributesW");
117       /* process calls */
118       p_SetProcessShutdownParameters = (t_SetProcessShutdownParameters)
119           GetProcAddress(hLib, "SetProcessShutdownParameters");
120       /* backup calls */
121       p_BackupRead = (t_BackupRead)
122           GetProcAddress(hLib, "BackupRead");
123       p_BackupWrite = (t_BackupWrite)
124           GetProcAddress(hLib, "BackupWrite");
125       /* char conversion calls */
126       p_WideCharToMultiByte = (t_WideCharToMultiByte)
127           GetProcAddress(hLib, "WideCharToMultiByte");
128       p_MultiByteToWideChar = (t_MultiByteToWideChar)
129           GetProcAddress(hLib, "MultiByteToWideChar");
130
131       /* find files */
132       p_FindFirstFileA = (t_FindFirstFileA)
133           GetProcAddress(hLib, "FindFirstFileA"); 
134       p_FindFirstFileW = (t_FindFirstFileW)
135           GetProcAddress(hLib, "FindFirstFileW");       
136       p_FindNextFileA = (t_FindNextFileA)
137           GetProcAddress(hLib, "FindNextFileA");
138       p_FindNextFileW = (t_FindNextFileW)
139           GetProcAddress(hLib, "FindNextFileW");
140       /* set and get directory */
141       p_SetCurrentDirectoryA = (t_SetCurrentDirectoryA)
142           GetProcAddress(hLib, "SetCurrentDirectoryA");
143       p_SetCurrentDirectoryW = (t_SetCurrentDirectoryW)
144           GetProcAddress(hLib, "SetCurrentDirectoryW");       
145       p_GetCurrentDirectoryA = (t_GetCurrentDirectoryA)
146           GetProcAddress(hLib, "GetCurrentDirectoryA");
147       p_GetCurrentDirectoryW = (t_GetCurrentDirectoryW)
148           GetProcAddress(hLib, "GetCurrentDirectoryW");      
149
150       /* some special stuff we need for VSS
151          but statically linkage doesn't work on Win 9x */
152       p_GetVolumePathNameW = (t_GetVolumePathNameW)
153           GetProcAddress(hLib, "GetVolumePathNameW");
154       p_GetVolumeNameForVolumeMountPointW = (t_GetVolumeNameForVolumeMountPointW)
155           GetProcAddress(hLib, "GetVolumeNameForVolumeMountPointW");
156     
157       FreeLibrary(hLib);
158    }
159    
160    hLib = LoadLibraryA("MSVCRT.DLL");
161    if (hLib) {
162       /* unlink */
163       p_wunlink = (t_wunlink)
164       GetProcAddress(hLib, "_wunlink");
165       /* wmkdir */
166       p_wmkdir = (t_wmkdir)
167       GetProcAddress(hLib, "_wmkdir");
168       /* wopen */
169       p_wopen = (t_wopen)
170       GetProcAddress(hLib, "_wopen");
171         
172       FreeLibrary(hLib);
173    }
174    
175    hLib = LoadLibraryA("ADVAPI32.DLL");
176    if (hLib) {
177       p_OpenProcessToken = (t_OpenProcessToken)
178          GetProcAddress(hLib, "OpenProcessToken");
179       p_AdjustTokenPrivileges = (t_AdjustTokenPrivileges)
180          GetProcAddress(hLib, "AdjustTokenPrivileges");
181       p_LookupPrivilegeValue = (t_LookupPrivilegeValue)
182          GetProcAddress(hLib, "LookupPrivilegeValueA");
183       FreeLibrary(hLib);
184    }
185
186    // do we run on win 9x ???
187    OSVERSIONINFO osversioninfo;   
188    osversioninfo.dwOSVersionInfoSize = sizeof(osversioninfo);
189
190    DWORD dwMinorVersion;
191
192    // Get the current OS version
193    if (!GetVersionEx(&osversioninfo)) {
194       g_platform_id = 0;
195       dwMinorVersion = 0;
196    } else {
197       g_platform_id = osversioninfo.dwPlatformId;
198       dwMinorVersion = osversioninfo.dwMinorVersion;
199    }
200
201    /* deinitialize some routines on win95 - they're not implemented well */
202    if (g_platform_id == VER_PLATFORM_WIN32_WINDOWS) {
203       p_BackupRead = NULL;
204       p_BackupWrite = NULL;
205
206       p_CreateFileW = NULL;          
207       p_GetFileAttributesW = NULL;          
208       p_GetFileAttributesExW = NULL;
209           
210       p_SetFileAttributesW = NULL;
211                 
212       p_FindFirstFileW = NULL;
213       p_FindNextFileW = NULL;
214       p_SetCurrentDirectoryW = NULL;
215       p_GetCurrentDirectoryW = NULL;
216
217       p_wunlink = NULL;
218       p_wmkdir = NULL;
219       p_wopen = NULL;
220
221       p_GetVolumePathNameW = NULL;
222       p_GetVolumeNameForVolumeMountPointW = NULL;
223    }   
224
225    /* decide which vss class to initialize */
226 #ifdef WIN32_VSS
227    switch (dwMinorVersion) {
228       case 1: 
229          g_pVSSClient = new VSSClientXP();
230          atexit(VSSCleanup);
231          break;
232       case 2: 
233          g_pVSSClient = new VSSClient2003();
234          atexit(VSSCleanup);
235          break;
236    }
237 #endif /* WIN32_VSS */
238 }
239
240 #endif