]> git.cworth.org Git - apitrace/blobdiff - retrace/dllretrace.py
Use skiplist-based FastCallSet within trace::CallSet
[apitrace] / retrace / dllretrace.py
index 6f26484c2f9b89394aafe7be8877d97921df30f8..aa7ed45ada0ffbbd143f7e42b2340828dbaede0e 100644 (file)
 
 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 HINSTANCE 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)