X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=retrace%2Fdllretrace.py;h=aa7ed45ada0ffbbd143f7e42b2340828dbaede0e;hb=3801952b80cd7a7160f6410518f6e3740d461b60;hp=abcd2028b98b2d7b308e20501a1bf74481a9e069;hpb=b5efee195a250aba3ecb16b7e6b9e30787406609;p=apitrace diff --git a/retrace/dllretrace.py b/retrace/dllretrace.py index abcd202..aa7ed45 100644 --- a/retrace/dllretrace.py +++ b/retrace/dllretrace.py @@ -26,34 +26,49 @@ 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) -