comparison src/win_gaim.c @ 6890:4eee806af511

[gaim-migrate @ 7436] Checking for Dll Hell on gaim startup.. committer: Tailor Script <tailor@pidgin.im>
author Herman Bloggs <hermanator12002@yahoo.com>
date Thu, 18 Sep 2003 22:12:36 +0000
parents 5aeba37b303c
children e28728795a45
comparison
equal deleted inserted replaced
6889:25bedecc872c 6890:4eee806af511
6 * Description: Entry point for win32 gaim, and various win32 dependant 6 * Description: Entry point for win32 gaim, and various win32 dependant
7 * routines. 7 * routines.
8 */ 8 */
9 #include <windows.h> 9 #include <windows.h>
10 #include <stdlib.h> 10 #include <stdlib.h>
11 #include <glib.h> 11 #include <string.h>
12 #include <stdio.h>
12 13
13 /* 14 /*
14 * GLOBALS 15 * GLOBALS
15 */ 16 */
16 __declspec(dllimport) HINSTANCE gaimexe_hInstance; 17 __declspec(dllimport) HINSTANCE gaimexe_hInstance;
17 18
18 /* 19 /*
19 * LOCALS 20 * LOCALS
20 */ 21 */
22 static char msg1[] = "The following duplicate of ";
23 static char msg2[] = " has been found in your dll search path and will likely\x0d\x0a"
24 "cause Gaim to malfunction:\x0d\x0a\x0d\x0a";
25
26 static char msg3[] = "\x0d\x0a\x0d\x0aWould you like to rename this dll to ";
27 static char msg4[] = ".prob in order to avoid any possible conflicts?\x0d\x0a"
28 "\x0d\x0a"
29 "Note: Doing so will likely cause the application that installed this dll to stop functioning.\x0d\x0a"
30 "You may wish to inform the author of the responsible application so that future versions\x0d\x0a"
31 "do not cause 'Dll Hell'.";
21 32
22 /* 33 /*
23 * PROTOTYPES 34 * PROTOTYPES
24 */ 35 */
25 extern int gaim_main( int, char** ); 36 int (*gaim_main)( HINSTANCE, int, char** ) = NULL;
26 extern char* wgaim_install_dir(); 37
38 static void check_dll(char* dll, char* orig) {
39 char tmp[MAX_PATH];
40 char *last;
41
42 if(SearchPath(NULL, dll, NULL, MAX_PATH, tmp, &last)) {
43 char* patha = (char*)malloc(strlen(orig) + strlen(dll) + 4);
44 strcpy(patha, orig);
45 strcat(patha, "\\");
46 strcat(patha, dll);
47 /* Make sure that 2 paths are not the same */
48 if(strcasecmp(patha, tmp) != 0) {
49 char *warning = (char*)malloc(strlen(msg1)+
50 strlen(msg2)+
51 strlen(msg3)+
52 strlen(msg4)+
53 strlen(tmp)+
54 (strlen(dll)*2)+4);
55 sprintf(warning, "%s%s%s%s%s%s%s", msg1, dll, msg2, tmp, msg3, dll, msg4);
56 if(MessageBox(NULL, warning, "Gaim Warning", MB_YESNO | MB_TOPMOST)==IDYES) {
57 char *newname = (char*)malloc(strlen(tmp)+6);
58 /* Rename offending dll */
59 sprintf(newname, "%s%s", tmp, ".prob");
60 if(rename(tmp, newname) != 0) {
61 MessageBox(NULL, "Error renaming file.", NULL, MB_OK | MB_TOPMOST);
62 }
63 else
64 check_dll(dll, orig);
65 free(newname);
66 }
67 free(warning);
68 }
69 free(patha);
70 }
71 }
72
73 static void dll_hell_check(char* gtkpath) {
74 HANDLE myHandle;
75 WIN32_FIND_DATA fd;
76 char* srchstr = (char*)malloc(strlen(gtkpath) + 8);
77
78 sprintf(srchstr, "%s%s", gtkpath, "\\*.dll");
79 myHandle = FindFirstFile(srchstr, &fd );
80 if(myHandle != INVALID_HANDLE_VALUE) {
81 check_dll(fd.cFileName, gtkpath);
82 while(FindNextFile(myHandle, &fd)) {
83 check_dll(fd.cFileName, gtkpath);
84 }
85 }
86 free(srchstr);
87 }
88
89 BOOL read_reg_string(HKEY key, char* sub_key, char* val_name, LPBYTE data, LPDWORD data_len) {
90 HKEY hkey;
91 BOOL ret = FALSE;
92 int retv;
93
94 if(ERROR_SUCCESS == RegOpenKeyEx(key,
95 sub_key,
96 0, KEY_QUERY_VALUE, &hkey)) {
97 if(ERROR_SUCCESS == (retv=RegQueryValueEx(hkey, val_name, 0, NULL, data, data_len)))
98 ret = TRUE;
99 else {
100 printf("Error reading registry string value: %d\n", retv);
101 }
102 RegCloseKey(key);
103 }
104 return ret;
105 }
106
107 void run_dll_check() {
108 char path[MAX_PATH];
109 DWORD plen = MAX_PATH;
110 int gotreg=FALSE;
111
112 /* Dll Hell Check.. Only run check if we are the same gaim as found in the
113 gaim registry key */
114 if(!(gotreg = read_reg_string(HKEY_LOCAL_MACHINE, "SOFTWARE\\gaim", "", (LPBYTE)&path, &plen)))
115 gotreg = read_reg_string(HKEY_CURRENT_USER, "SOFTWARE\\gaim", "", (LPBYTE)&path, &plen);
116
117 if(gotreg) {
118 char modpath[MAX_PATH];
119
120 strcat(path, "\\gaim.exe");
121 GetModuleFileName(NULL, modpath, MAX_PATH);
122 if(strcasecmp(path, modpath) == 0) {
123 plen = MAX_PATH;
124 if(!(gotreg = read_reg_string(HKEY_LOCAL_MACHINE, "SOFTWARE\\GTK\\2.0", "Path", (LPBYTE)&path, &plen)))
125 gotreg = read_reg_string(HKEY_CURRENT_USER, "SOFTWARE\\GTK\\2.0", "Path", (LPBYTE)&path, &plen);
126 if(gotreg) {
127 strcat(path, "\\bin");
128 dll_hell_check(path);
129 }
130 }
131 }
132 }
27 133
28 #ifdef __GNUC__ 134 #ifdef __GNUC__
29 # ifndef _stdcall 135 # ifndef _stdcall
30 # define _stdcall __attribute__((stdcall)) 136 # define _stdcall __attribute__((stdcall))
31 # endif 137 # endif
35 WinMain (struct HINSTANCE__ *hInstance, 141 WinMain (struct HINSTANCE__ *hInstance,
36 struct HINSTANCE__ *hPrevInstance, 142 struct HINSTANCE__ *hPrevInstance,
37 char *lpszCmdLine, 143 char *lpszCmdLine,
38 int nCmdShow) 144 int nCmdShow)
39 { 145 {
40 char* drmingw; 146 char gaimdir[MAX_PATH];
41 gaimexe_hInstance = hInstance; 147 char *point;
148 HMODULE hmod;
42 149
43 /* Load exception handler if we have it */ 150 /* If GAIM_NO_DLL_CHECK is set, don't run the dll check */
44 drmingw = g_build_filename(wgaim_install_dir(), "exchndl.dll", NULL); 151 if(!getenv("GAIM_NO_DLL_CHECK"))
45 LoadLibrary(drmingw); 152 run_dll_check();
46 g_free(drmingw);
47 153
48 return gaim_main (__argc, __argv); 154 /* Load exception handler if we have it */
155 GetModuleFileName(NULL, gaimdir, MAX_PATH);
156 if((point=strstr(gaimdir, "gaim.exe"))) {
157 point[0] = '\0';
158 strcat(gaimdir, "exchndl.dll");
159 LoadLibrary(gaimdir);
160 }
161
162 /* Now we are ready for Gaim .. */
163 if((hmod=LoadLibrary("gaim.dll"))) {
164 gaim_main = (void*)GetProcAddress(hmod, "gaim_main");
165 }
166
167 if(!gaim_main) {
168 MessageBox(NULL, "Error loading gaim.dll entry point.", NULL, MB_OK | MB_TOPMOST);
169 return 0;
170 }
171 else
172 return gaim_main (hInstance, __argc, __argv);
49 } 173 }
50 174