source: trunk/src/user32/initterm.cpp

Last change on this file was 21976, checked in by dmik, 13 years ago

Fix some DLL init code that would return incorrect result on failure.

File size: 6.0 KB
Line 
1/* $Id: initterm.cpp,v 1.34 2003-01-21 11:22:08 sandervl Exp $
2 *
3 * USER32 DLL entry point
4 *
5 * Copyright 1998 Sander van Leeuwen
6 * Copyright 1998 Peter Fitzsimmons
7 *
8 * Project Odin Software License can be found in LICENSE.TXT
9 */
10
11#define INCL_DOSMODULEMGR
12#define INCL_DOSPROCESS
13#define INCL_DOSSEMAPHORES
14#define INCL_DOSMISC
15#define INCL_DOSERRORS
16#define INCL_WINSHELLDATA
17#define INCL_WINERRORS
18#define INCL_GPILCIDS
19#include <os2wrap.h> //Odin32 OS/2 api wrappers
20#include <stdlib.h>
21#include <stdio.h>
22#include <string.h>
23#include <odin.h>
24#include <misc.h> /*PLF Wed 98-03-18 23:18:29*/
25#include <win32type.h>
26#include <win32api.h>
27#include <winconst.h>
28#include <odinlx.h>
29#include <spy.h>
30#include <monitor.h>
31#include <exitlist.h>
32#include <initdll.h>
33#include <stats.h>
34
35#include "pmwindow.h"
36#include "win32wdesktop.h"
37#include "win32wndhandle.h"
38#include "syscolor.h"
39#include "initterm.h"
40#include "auxthread.h"
41
42#define DBG_LOCALLOG DBG_initterm
43#include "dbglocal.h"
44
45extern "C" INT __cdecl wsnprintfA(LPSTR,UINT,LPCSTR,...);
46
47// Win32 resource table (produced by wrc)
48extern DWORD user32_PEResTab;
49
50DWORD hInstanceUser32 = 0;
51
52BOOL fVersionWarp3 = FALSE;
53
54#define FONTSDIRECTORY "Fonts"
55#define REGPATH "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Fonts"
56
57static void MigrateWindowsFonts()
58{
59 HKEY hkFonts,hkOS2Fonts;
60 char buffer[512];
61 UINT len;
62
63 if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, REGPATH ,0, KEY_ALL_ACCESS, &hkFonts) == 0)
64 {
65 DWORD dwIndex, dwType;
66 char subKeyName[255], dataArray[512];
67 DWORD sizeOfSubKeyName = 254, sizeOfDataArray = 511;
68
69 // loop over all values of the current key
70 for (dwIndex=0;
71 RegEnumValueA(hkFonts, dwIndex, subKeyName, &sizeOfSubKeyName, NULL, &dwType ,(LPBYTE)dataArray, &sizeOfDataArray) != ERROR_NO_MORE_ITEMS_W;
72 ++dwIndex, sizeOfSubKeyName = 254, sizeOfDataArray = 511)
73 {
74 HDIR hdirFindHandle = HDIR_CREATE;
75 FILEFINDBUF3 FindBuffer = {0};
76 ULONG ulResultBufLen = sizeof(FILEFINDBUF3);
77 ULONG ulFindCount = 1, ret;
78 APIRET rc = NO_ERROR;
79
80 GetWindowsDirectoryA( buffer, sizeof(buffer) );
81 wsnprintfA( buffer, sizeof(buffer), "%s\\%s\\%s", buffer, FONTSDIRECTORY, dataArray );
82
83 rc = DosFindFirst( buffer, &hdirFindHandle, FILE_NORMAL,&FindBuffer, ulResultBufLen, &ulFindCount, FIL_STANDARD);
84 //Check that file actaully exist
85 if ( rc == NO_ERROR && !(FindBuffer.attrFile & FILE_DIRECTORY))
86 {
87 //Check OS/2 INI profile for font entry
88 len = PrfQueryProfileString(HINI_PROFILE, "PM_Fonts", dataArray,
89 NULL, (PVOID)subKeyName, (LONG)sizeof(subKeyName));
90
91 //If it doesn't exist OR if it's outdated
92 if(len == 0 || strcmp(subKeyName, buffer))
93 {
94 dprintf(("Migrating font %s to OS/2",dataArray));
95
96 ret = GpiLoadFonts(0, buffer);
97 if(ret == FALSE) {
98 dprintf(("GpiLoadFonts %s failed with %x", buffer, WinGetLastError(0)));
99 }
100 }
101 }
102 DosFindClose(hdirFindHandle);
103 }
104 RegCloseKey(hkFonts);
105 }
106}
107
108static BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad)
109{
110 switch (fdwReason)
111 {
112 case DLL_PROCESS_ATTACH:
113 case DLL_THREAD_ATTACH:
114 case DLL_THREAD_DETACH:
115 return TRUE;
116 case DLL_PROCESS_DETACH:
117 {
118 StopAuxThread();
119 return TRUE;
120 }
121 default:
122 break;
123 }
124 return FALSE;
125}
126
127ULONG SYSTEM DLL_InitUser32(ULONG hModule)
128{
129 APIRET rc;
130
131 ULONG version[2];
132 rc = DosQuerySysInfo(QSV_VERSION_MAJOR, QSV_VERSION_MINOR, version, sizeof(version));
133 if (rc == 0)
134 {
135 if (version[0] >= 20 && version[1] <= 30)
136 fVersionWarp3 = TRUE;
137 }
138
139 STATS_InitializeUSER32();
140
141 ParseLogStatusUSER32();
142
143 if (!InitializeKernel32())
144 return -1;
145
146 CheckVersionFromHMOD(PE2LX_VERSION, hModule); /*PLF Wed 98-03-18 05:28:48*/
147
148 hInstanceUser32 = RegisterLxDll(hModule, DllMain, (PVOID)&user32_PEResTab,
149 USER32_MAJORIMAGE_VERSION, USER32_MINORIMAGE_VERSION,
150 IMAGE_SUBSYSTEM_WINDOWS_GUI);
151 if (hInstanceUser32 == 0)
152 return -1;
153
154 dprintf(("user32 init %s %s (%x)", __DATE__, __TIME__, DLL_InitUser32));
155
156 //SvL: Try to start communication with our message spy queue server
157 InitSpyQueue();
158
159 //SvL: Init win32 PM classes
160 //PH: initializes HAB!
161 if (FALSE == InitPM())
162 return -1;
163
164 InitializeWindowHandles();
165
166 //SvL: 18-7-'98, Register system window classes (button, listbox etc etc)
167 //CB: register internal classes
168 RegisterSystemClasses(hModule);
169
170 //CB: initialize PM monitor driver
171 MONITOR_Initialize(&MONITOR_PrimaryMonitor);
172
173 //PF: migrate windows fonts
174 MigrateWindowsFonts();
175
176 InitClipboardFormats();
177
178 RasEntry (RAS_EVENT_User32InitComplete, &hInstanceUser32, sizeof (hInstanceUser32));
179
180 return EXITLIST_USER32;
181}
182
183void SYSTEM DLL_TermUser32(ULONG hModule)
184{
185 dprintf(("user32 exit\n"));
186
187 //SvL: Causes PM hangs on some (a lot?) machines. Reason unknown.
188 //// RestoreCursor();
189
190 //Destroy CD notification window
191 WinDestroyWindow(hwndCD);
192 DestroyDesktopWindow();
193 Win32BaseWindow::DestroyAll();
194 UnregisterSystemClasses();
195 Win32WndClass::DestroyAll();
196 MONITOR_Finalize(&MONITOR_PrimaryMonitor);
197 SYSCOLOR_Save();
198 CloseSpyQueue();
199 FinalizeWindowHandles();
200 STATS_DumpStatsUSER32();
201 dprintf(("user32 exit done\n"));
202
203 if (hInstanceUser32) {
204 UnregisterLxDll(hInstanceUser32);
205 }
206 STATS_UninitializeUSER32();
207}
208
209ULONG SYSTEM DLL_Init(ULONG hModule)
210{
211 if (DLL_InitDefault(hModule) == -1)
212 return -1;
213 return DLL_InitUser32(hModule);
214}
215
216void SYSTEM DLL_Term(ULONG hModule)
217{
218 DLL_TermUser32(hModule);
219 DLL_TermDefault(hModule);
220}
Note: See TracBrowser for help on using the repository browser.