from retrace import Retracer
from dispatch import Dispatcher
+from specs.stdapi import API
+
+
+class DllDispatcher(Dispatcher):
+
+ def dispatchModule(self, module):
+ tag = module.name.upper()
+ print r'const char *g_sz%sDllName = NULL;' % (tag,)
+ print r'HMODULE g_h%sModule = NULL;' % (tag,)
+ print r''
+ print r'static PROC'
+ print r'_get%sProcAddress(LPCSTR lpProcName) {' % tag
+ print r' if (!g_h%sModule) {' % tag
+ print r' if (g_sz%sDllName) {' % tag
+ print r' g_h%sModule = LoadLibraryA(g_sz%sDllName);' % (tag, tag)
+ print r' if (!g_h%sModule) {' % tag
+ print r' os::log("warning: failed to load %%s\n", g_sz%sDllName);' % tag
+ print r' }'
+ print r' }'
+ print r' if (!g_h%sModule) {' % tag
+ print r' g_h%sModule = LoadLibraryA("%s.dll");' % (tag, module.name)
+ print r' }'
+ print r' if (!g_h%sModule) {' % tag
+ print r' os::log("error: failed to load %s.dll\n");' % module.name
+ print r' exit(1);'
+ print r' }'
+ print r' }'
+ print r' return GetProcAddress(g_h%sModule, lpProcName);' % tag
+ print r'}'
+ print r''
+
+ Dispatcher.dispatchModule(self, module)
+
+ def getProcAddressName(self, module, function):
+ assert self.isFunctionPublic(module, function)
+ return '_get%sProcAddress' % (module.name.upper())
class DllRetracer(Retracer):
def retraceApi(self, api):
- print r'''
-static LPCSTR g_szDll = "%s";
-static HMODULE g_hDll = NULL;
-
-static PROC
-_getPublicProcAddress(LPCSTR lpProcName)
-{
- if (!g_hDll) {
- g_hDll = LoadLibraryA(g_szDll);
- if (!g_hDll) {
- os::log("error: failed to load %%s\n", g_szDll);
- exit(1);
- return NULL;
- }
- }
-
- return GetProcAddress(g_hDll, lpProcName);
-}
-
-''' % api.name.upper()
-
- dispatcher = Dispatcher()
- dispatcher.dispatch_api(api)
+ for module in api.modules:
+ dispatcher = DllDispatcher()
+ dispatcher.dispatchModule(module)
Retracer.retraceApi(self, api)
-