xref: /aosp_15_r20/external/lzma/CPP/Windows/DLL.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // Windows/DLL.cpp
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker 
5*f6dc9357SAndroid Build Coastguard Worker #include "DLL.h"
6*f6dc9357SAndroid Build Coastguard Worker 
7*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
8*f6dc9357SAndroid Build Coastguard Worker 
9*f6dc9357SAndroid Build Coastguard Worker #ifndef _UNICODE
10*f6dc9357SAndroid Build Coastguard Worker extern bool g_IsNT;
11*f6dc9357SAndroid Build Coastguard Worker #endif
12*f6dc9357SAndroid Build Coastguard Worker 
13*f6dc9357SAndroid Build Coastguard Worker extern HINSTANCE g_hInstance;
14*f6dc9357SAndroid Build Coastguard Worker 
15*f6dc9357SAndroid Build Coastguard Worker namespace NWindows {
16*f6dc9357SAndroid Build Coastguard Worker namespace NDLL {
17*f6dc9357SAndroid Build Coastguard Worker 
Free()18*f6dc9357SAndroid Build Coastguard Worker bool CLibrary::Free() throw()
19*f6dc9357SAndroid Build Coastguard Worker {
20*f6dc9357SAndroid Build Coastguard Worker   if (_module == NULL)
21*f6dc9357SAndroid Build Coastguard Worker     return true;
22*f6dc9357SAndroid Build Coastguard Worker   if (!::FreeLibrary(_module))
23*f6dc9357SAndroid Build Coastguard Worker     return false;
24*f6dc9357SAndroid Build Coastguard Worker   _module = NULL;
25*f6dc9357SAndroid Build Coastguard Worker   return true;
26*f6dc9357SAndroid Build Coastguard Worker }
27*f6dc9357SAndroid Build Coastguard Worker 
LoadEx(CFSTR path,DWORD flags)28*f6dc9357SAndroid Build Coastguard Worker bool CLibrary::LoadEx(CFSTR path, DWORD flags) throw()
29*f6dc9357SAndroid Build Coastguard Worker {
30*f6dc9357SAndroid Build Coastguard Worker   if (!Free())
31*f6dc9357SAndroid Build Coastguard Worker     return false;
32*f6dc9357SAndroid Build Coastguard Worker   #ifndef _UNICODE
33*f6dc9357SAndroid Build Coastguard Worker   if (!g_IsNT)
34*f6dc9357SAndroid Build Coastguard Worker   {
35*f6dc9357SAndroid Build Coastguard Worker     _module = ::LoadLibraryEx(fs2fas(path), NULL, flags);
36*f6dc9357SAndroid Build Coastguard Worker   }
37*f6dc9357SAndroid Build Coastguard Worker   else
38*f6dc9357SAndroid Build Coastguard Worker   #endif
39*f6dc9357SAndroid Build Coastguard Worker   {
40*f6dc9357SAndroid Build Coastguard Worker     _module = ::LoadLibraryExW(fs2us(path), NULL, flags);
41*f6dc9357SAndroid Build Coastguard Worker   }
42*f6dc9357SAndroid Build Coastguard Worker   return (_module != NULL);
43*f6dc9357SAndroid Build Coastguard Worker }
44*f6dc9357SAndroid Build Coastguard Worker 
Load(CFSTR path)45*f6dc9357SAndroid Build Coastguard Worker bool CLibrary::Load(CFSTR path) throw()
46*f6dc9357SAndroid Build Coastguard Worker {
47*f6dc9357SAndroid Build Coastguard Worker   if (!Free())
48*f6dc9357SAndroid Build Coastguard Worker     return false;
49*f6dc9357SAndroid Build Coastguard Worker   #ifndef _UNICODE
50*f6dc9357SAndroid Build Coastguard Worker   if (!g_IsNT)
51*f6dc9357SAndroid Build Coastguard Worker   {
52*f6dc9357SAndroid Build Coastguard Worker     _module = ::LoadLibrary(fs2fas(path));
53*f6dc9357SAndroid Build Coastguard Worker   }
54*f6dc9357SAndroid Build Coastguard Worker   else
55*f6dc9357SAndroid Build Coastguard Worker   #endif
56*f6dc9357SAndroid Build Coastguard Worker   {
57*f6dc9357SAndroid Build Coastguard Worker     _module = ::LoadLibraryW(fs2us(path));
58*f6dc9357SAndroid Build Coastguard Worker   }
59*f6dc9357SAndroid Build Coastguard Worker   return (_module != NULL);
60*f6dc9357SAndroid Build Coastguard Worker }
61*f6dc9357SAndroid Build Coastguard Worker 
MyGetModuleFileName(FString & path)62*f6dc9357SAndroid Build Coastguard Worker bool MyGetModuleFileName(FString &path)
63*f6dc9357SAndroid Build Coastguard Worker {
64*f6dc9357SAndroid Build Coastguard Worker   const HMODULE hModule = g_hInstance;
65*f6dc9357SAndroid Build Coastguard Worker   path.Empty();
66*f6dc9357SAndroid Build Coastguard Worker   #ifndef _UNICODE
67*f6dc9357SAndroid Build Coastguard Worker   if (!g_IsNT)
68*f6dc9357SAndroid Build Coastguard Worker   {
69*f6dc9357SAndroid Build Coastguard Worker     TCHAR s[MAX_PATH + 2];
70*f6dc9357SAndroid Build Coastguard Worker     s[0] = 0;
71*f6dc9357SAndroid Build Coastguard Worker     const DWORD size = ::GetModuleFileName(hModule, s, MAX_PATH + 1);
72*f6dc9357SAndroid Build Coastguard Worker     if (size <= MAX_PATH && size != 0)
73*f6dc9357SAndroid Build Coastguard Worker     {
74*f6dc9357SAndroid Build Coastguard Worker       path = fas2fs(s);
75*f6dc9357SAndroid Build Coastguard Worker       return true;
76*f6dc9357SAndroid Build Coastguard Worker     }
77*f6dc9357SAndroid Build Coastguard Worker   }
78*f6dc9357SAndroid Build Coastguard Worker   else
79*f6dc9357SAndroid Build Coastguard Worker   #endif
80*f6dc9357SAndroid Build Coastguard Worker   {
81*f6dc9357SAndroid Build Coastguard Worker     WCHAR s[MAX_PATH + 2];
82*f6dc9357SAndroid Build Coastguard Worker     s[0] = 0;
83*f6dc9357SAndroid Build Coastguard Worker     const DWORD size = ::GetModuleFileNameW(hModule, s, MAX_PATH + 1);
84*f6dc9357SAndroid Build Coastguard Worker     if (size <= MAX_PATH && size != 0)
85*f6dc9357SAndroid Build Coastguard Worker     {
86*f6dc9357SAndroid Build Coastguard Worker       path = us2fs(s);
87*f6dc9357SAndroid Build Coastguard Worker       return true;
88*f6dc9357SAndroid Build Coastguard Worker     }
89*f6dc9357SAndroid Build Coastguard Worker   }
90*f6dc9357SAndroid Build Coastguard Worker   return false;
91*f6dc9357SAndroid Build Coastguard Worker }
92*f6dc9357SAndroid Build Coastguard Worker 
93*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_SFX
94*f6dc9357SAndroid Build Coastguard Worker 
GetModuleDirPrefix()95*f6dc9357SAndroid Build Coastguard Worker FString GetModuleDirPrefix()
96*f6dc9357SAndroid Build Coastguard Worker {
97*f6dc9357SAndroid Build Coastguard Worker   FString s;
98*f6dc9357SAndroid Build Coastguard Worker   if (MyGetModuleFileName(s))
99*f6dc9357SAndroid Build Coastguard Worker   {
100*f6dc9357SAndroid Build Coastguard Worker     const int pos = s.ReverseFind_PathSepar();
101*f6dc9357SAndroid Build Coastguard Worker     if (pos >= 0)
102*f6dc9357SAndroid Build Coastguard Worker       s.DeleteFrom((unsigned)(pos + 1));
103*f6dc9357SAndroid Build Coastguard Worker   }
104*f6dc9357SAndroid Build Coastguard Worker   if (s.IsEmpty())
105*f6dc9357SAndroid Build Coastguard Worker     s = "." STRING_PATH_SEPARATOR;
106*f6dc9357SAndroid Build Coastguard Worker   return s;
107*f6dc9357SAndroid Build Coastguard Worker }
108*f6dc9357SAndroid Build Coastguard Worker 
109*f6dc9357SAndroid Build Coastguard Worker #endif
110*f6dc9357SAndroid Build Coastguard Worker 
111*f6dc9357SAndroid Build Coastguard Worker }}
112*f6dc9357SAndroid Build Coastguard Worker 
113*f6dc9357SAndroid Build Coastguard Worker #else // _WIN32
114*f6dc9357SAndroid Build Coastguard Worker 
115*f6dc9357SAndroid Build Coastguard Worker #include <dlfcn.h>
116*f6dc9357SAndroid Build Coastguard Worker #include <stdlib.h>
117*f6dc9357SAndroid Build Coastguard Worker 
118*f6dc9357SAndroid Build Coastguard Worker // FARPROC
GetProcAddress(HMODULE module,LPCSTR procName)119*f6dc9357SAndroid Build Coastguard Worker void *GetProcAddress(HMODULE module, LPCSTR procName)
120*f6dc9357SAndroid Build Coastguard Worker {
121*f6dc9357SAndroid Build Coastguard Worker   void *ptr = NULL;
122*f6dc9357SAndroid Build Coastguard Worker   if (module)
123*f6dc9357SAndroid Build Coastguard Worker     ptr = dlsym(module, procName);
124*f6dc9357SAndroid Build Coastguard Worker   return ptr;
125*f6dc9357SAndroid Build Coastguard Worker }
126*f6dc9357SAndroid Build Coastguard Worker 
127*f6dc9357SAndroid Build Coastguard Worker namespace NWindows {
128*f6dc9357SAndroid Build Coastguard Worker namespace NDLL {
129*f6dc9357SAndroid Build Coastguard Worker 
Free()130*f6dc9357SAndroid Build Coastguard Worker bool CLibrary::Free() throw()
131*f6dc9357SAndroid Build Coastguard Worker {
132*f6dc9357SAndroid Build Coastguard Worker   if (!_module)
133*f6dc9357SAndroid Build Coastguard Worker     return true;
134*f6dc9357SAndroid Build Coastguard Worker   const int ret = dlclose(_module);
135*f6dc9357SAndroid Build Coastguard Worker   if (ret != 0)
136*f6dc9357SAndroid Build Coastguard Worker     return false;
137*f6dc9357SAndroid Build Coastguard Worker   _module = NULL;
138*f6dc9357SAndroid Build Coastguard Worker   return true;
139*f6dc9357SAndroid Build Coastguard Worker }
140*f6dc9357SAndroid Build Coastguard Worker 
Load(CFSTR path)141*f6dc9357SAndroid Build Coastguard Worker bool CLibrary::Load(CFSTR path) throw()
142*f6dc9357SAndroid Build Coastguard Worker {
143*f6dc9357SAndroid Build Coastguard Worker   if (!Free())
144*f6dc9357SAndroid Build Coastguard Worker     return false;
145*f6dc9357SAndroid Build Coastguard Worker 
146*f6dc9357SAndroid Build Coastguard Worker   int options = 0;
147*f6dc9357SAndroid Build Coastguard Worker 
148*f6dc9357SAndroid Build Coastguard Worker   #ifdef RTLD_LOCAL
149*f6dc9357SAndroid Build Coastguard Worker     options |= RTLD_LOCAL;
150*f6dc9357SAndroid Build Coastguard Worker   #endif
151*f6dc9357SAndroid Build Coastguard Worker 
152*f6dc9357SAndroid Build Coastguard Worker   #ifdef RTLD_NOW
153*f6dc9357SAndroid Build Coastguard Worker     options |= RTLD_NOW;
154*f6dc9357SAndroid Build Coastguard Worker   #endif
155*f6dc9357SAndroid Build Coastguard Worker 
156*f6dc9357SAndroid Build Coastguard Worker   #ifdef RTLD_GROUP
157*f6dc9357SAndroid Build Coastguard Worker     #if ! (defined(hpux) || defined(__hpux))
158*f6dc9357SAndroid Build Coastguard Worker       options |= RTLD_GROUP; // mainly for solaris but not for HPUX
159*f6dc9357SAndroid Build Coastguard Worker     #endif
160*f6dc9357SAndroid Build Coastguard Worker   #endif
161*f6dc9357SAndroid Build Coastguard Worker 
162*f6dc9357SAndroid Build Coastguard Worker   _module = dlopen(path, options);
163*f6dc9357SAndroid Build Coastguard Worker   return (_module != NULL);
164*f6dc9357SAndroid Build Coastguard Worker }
165*f6dc9357SAndroid Build Coastguard Worker 
166*f6dc9357SAndroid Build Coastguard Worker /*
167*f6dc9357SAndroid Build Coastguard Worker // FARPROC
168*f6dc9357SAndroid Build Coastguard Worker void * CLibrary::GetProc(LPCSTR procName) const
169*f6dc9357SAndroid Build Coastguard Worker {
170*f6dc9357SAndroid Build Coastguard Worker   // return My_GetProcAddress(_module, procName);
171*f6dc9357SAndroid Build Coastguard Worker   return local_GetProcAddress(_module, procName);
172*f6dc9357SAndroid Build Coastguard Worker   // return NULL;
173*f6dc9357SAndroid Build Coastguard Worker }
174*f6dc9357SAndroid Build Coastguard Worker */
175*f6dc9357SAndroid Build Coastguard Worker 
176*f6dc9357SAndroid Build Coastguard Worker }}
177*f6dc9357SAndroid Build Coastguard Worker 
178*f6dc9357SAndroid Build Coastguard Worker #endif
179