X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=retrace%2Fdllretrace.py;h=aa7ed45ada0ffbbd143f7e42b2340828dbaede0e;hb=HEAD;hp=db1a5863390ce206b704287d44481cd41016d40b;hpb=3947e363efa3631f309b8178d4dd8b5260c25d2d;p=apitrace diff --git a/retrace/dllretrace.py b/retrace/dllretrace.py index db1a586..aa7ed45 100644 --- a/retrace/dllretrace.py +++ b/retrace/dllretrace.py @@ -26,39 +26,49 @@ from retrace import Retracer from dispatch import Dispatcher +from specs.stdapi import API -class DllRetracer(Retracer): +class DllDispatcher(Dispatcher): - def retraceApi(self, api): - print ''' -static HMODULE g_hDll = NULL; + 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'' -static PROC -_getPublicProcAddress(LPCSTR lpProcName) -{ - if (!g_hDll) { - char szDll[MAX_PATH] = {0}; - - if (!GetSystemDirectoryA(szDll, MAX_PATH)) { - return NULL; - } - - strcat(szDll, "\\\\%s"); - - g_hDll = LoadLibraryA(szDll); - if (!g_hDll) { - return NULL; - } - } - - return GetProcAddress(g_hDll, lpProcName); -} + Dispatcher.dispatchModule(self, module) -''' % api.name + def getProcAddressName(self, module, function): + assert self.isFunctionPublic(module, function) + return '_get%sProcAddress' % (module.name.upper()) - dispatcher = Dispatcher() - dispatcher.dispatch_api(api) - Retracer.retraceApi(self, api) +class DllRetracer(Retracer): + def retraceApi(self, api): + for module in api.modules: + dispatcher = DllDispatcher() + dispatcher.dispatchModule(module) + + Retracer.retraceApi(self, api)