]> git.cworth.org Git - apitrace/blobdiff - retrace/dllretrace.py
specs: Allow an API to spread across multiple modules.
[apitrace] / retrace / dllretrace.py
index 51e2c682f4f2fbe5373928cb112cad3c95631cc8..926bacd250ec7017a97929aa86311e16a4a6d53a 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'_getPublicProcAddress(LPCSTR lpProcName) {'
+        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
 
-        dispatcher = Dispatcher()
-        dispatcher.dispatch_api(api)
+class DllRetracer(Retracer):
+
+    def retraceApi(self, api):
+        for module in api.modules:
+            dispatcher = DllDispatcher()
+            dispatcher.dispatchModule(module)
 
         Retracer.retraceApi(self, api)
 
+    def retraceModule(self, module):
+        api = API()
+        api.addModule(module)
+        self.retraceApi(api)