]> git.cworth.org Git - apitrace/commitdiff
Several DX7 corrections.
authorJosé Fonseca <jose.r.fonseca@gmail.com>
Wed, 25 May 2011 22:21:18 +0000 (23:21 +0100)
committerJosé Fonseca <jose.r.fonseca@gmail.com>
Wed, 25 May 2011 22:21:18 +0000 (23:21 +0100)
CMakeLists.txt
d3d.py
ddraw.def
ddraw.py
trace.py
winapi.py

index 2bb87ff21fb0b66bf61e2575ef3636b9a2eac6c7..afa082cceba2c621993842d02a5950444acac52f 100755 (executable)
@@ -59,6 +59,7 @@ if (MSVC)
     add_definitions (-D_CRT_SECURE_NO_DEPRECATE -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_WARNINGS)
     add_definitions (-D_SCL_SECURE_NO_DEPRECATE -D_SCL_SECURE_NO_WARNINGS)
     add_definitions (-W4)
+    add_definitions (-wd4063) # not a valid value for switch of enum
     add_definitions (-wd4127) # conditional expression is constant
     add_definitions (-wd4244) # conversion from 'type1' to 'type2', possible loss of data
     add_definitions (-wd4505) # unreferenced local function has been removed
diff --git a/d3d.py b/d3d.py
index 9deed97f669d831b9e4816c9b19b1c3def49b9f3..256832f3d1fa203b456dbe62ba372d0ca786d315 100644 (file)
--- a/d3d.py
+++ b/d3d.py
@@ -472,6 +472,13 @@ ddraw.add_interfaces(interfaces)
 
 class DDrawTracer(DllTracer):
 
+    def trace_function_impl_body(self, function):
+        if function.name in ('AcquireDDThreadLock', 'ReleaseDDThreadLock'):
+            self.dispatch_function(function)
+            return
+
+        DllTracer.trace_function_impl_body(self, function)
+
     def wrap_arg(self, function, arg):
         if function.name == 'DirectDrawCreateEx' and arg.name == 'lplpDD':
             print '    if (*lplpDD) {'
@@ -480,12 +487,8 @@ class DDrawTracer(DllTracer):
                 print '            *lplpDD = (LPVOID) new Wrap%s((%s *)*lplpDD);' % (iface.name, iface.name)
                 print '        }'
             print '    }'
-        # Dump shaders as strings
-        if function.name in ('CreateVertexShader', 'CreatePixelShader') and arg.name == 'pFunction':
-            print '    DumpShader(%s);' % (arg.name)
-            return
 
-        DllTracer.dump_arg_instance(self, function, arg)
+        DllTracer.wrap_arg(self, function, arg)
 
 
 if __name__ == '__main__':
index 155162aeb0d64ded6db00c4ce97866e9e95871b3..6186c60244283f25a460f0363bb473a001143da2 100644 (file)
--- a/ddraw.def
+++ b/ddraw.def
@@ -1,13 +1,23 @@
 EXPORTS
-       DirectDrawCreate
-       DirectDrawCreateClipper
-       DirectDrawCreateEx
-       DirectDrawEnumerateA
-       DirectDrawEnumerateW
-       DirectDrawEnumerateExA
-       DirectDrawEnumerateExW
-    AcquireDDThreadLock
-    ReleaseDDThreadLock
-    D3DParseUnknownCommand
-    DllCanUnloadNow
-    DllGetClassObject
+        AcquireDDThreadLock
+        CompleteCreateSysmemSurface
+        D3DParseUnknownCommand
+        DDGetAttachedSurfaceLcl
+        DDInternalLock
+        DDInternalUnlock
+        DirectDrawCreate
+        DirectDrawCreateClipper
+        DirectDrawCreateEx
+        DirectDrawEnumerateA
+        DirectDrawEnumerateExA
+        DirectDrawEnumerateExW
+        DirectDrawEnumerateW
+        DllCanUnloadNow PRIVATE
+        DllGetClassObject PRIVATE
+        DSoundHelp
+        GetDDSurfaceLocal
+        GetOLEThunkData
+        GetSurfaceFromDC
+        RegisterSpecialCase
+        ReleaseDDThreadLock
+        ;SetAppCompatData
index fd8c5f5b25fd29890f84e1c1eee752b546bdf729..2e17b06edf64a71e79b255ffff767b05ebe80ff7 100644 (file)
--- a/ddraw.py
+++ b/ddraw.py
@@ -163,7 +163,7 @@ DDCAPS_DX1 = Struct("DDCAPS_DX1", [
     (DWORD, "dwAlignBoundaryDest"),
     (DWORD, "dwAlignSizeDest"),
     (DWORD, "dwAlignStrideAlign"),
-    (DWORD, "dwRops[DD_ROP_SPACE]"),
+    (Array(DWORD, "DD_ROP_SPACE"), "dwRops"),
     (DDSCAPS, "ddsCaps"),
     (DWORD, "dwMinOverlayStretch"),
     (DWORD, "dwMaxOverlayStretch"),
@@ -203,7 +203,7 @@ DDCAPS_DX3 = Struct("DDCAPS_DX3", [
     (DWORD, "dwAlignBoundaryDest"),
     (DWORD, "dwAlignSizeDest"),
     (DWORD, "dwAlignStrideAlign"),
-    (DWORD, "dwRops[DD_ROP_SPACE]"),
+    (Array(DWORD, "DD_ROP_SPACE"), "dwRops"),
     (DDSCAPS, "ddsCaps"),
     (DWORD, "dwMinOverlayStretch"),
     (DWORD, "dwMaxOverlayStretch"),
@@ -217,15 +217,15 @@ DDCAPS_DX3 = Struct("DDCAPS_DX3", [
     (DWORD, "dwSVBCaps"),
     (DWORD, "dwSVBCKeyCaps"),
     (DWORD, "dwSVBFXCaps"),
-    (DWORD, "dwSVBRops[DD_ROP_SPACE]"),
+    (Array(DWORD, "DD_ROP_SPACE"), "dwSVBRops"),
     (DWORD, "dwVSBCaps"),
     (DWORD, "dwVSBCKeyCaps"),
     (DWORD, "dwVSBFXCaps"),
-    (DWORD, "dwVSBRops[DD_ROP_SPACE]"),
+    (Array(DWORD, "DD_ROP_SPACE"), "dwVSBRops"),
     (DWORD, "dwSSBCaps"),
     (DWORD, "dwSSBCKeyCaps"),
     (DWORD, "dwSSBFXCaps"),
-    (DWORD, "dwSSBRops[DD_ROP_SPACE]"),
+    (Array(DWORD, "DD_ROP_SPACE"), "dwSSBRops"),
     (DWORD, "dwReserved4"),
     (DWORD, "dwReserved5"),
     (DWORD, "dwReserved6"),
@@ -258,7 +258,7 @@ DDCAPS_DX5 = Struct("DDCAPS_DX5", [
     (DWORD, "dwAlignBoundaryDest"),
     (DWORD, "dwAlignSizeDest"),
     (DWORD, "dwAlignStrideAlign"),
-    (DWORD, "dwRops[DD_ROP_SPACE]"),
+    (Array(DWORD, "DD_ROP_SPACE"), "dwRops"),
     (DDSCAPS, "ddsCaps"),
     (DWORD, "dwMinOverlayStretch"),
     (DWORD, "dwMaxOverlayStretch"),
@@ -272,15 +272,15 @@ DDCAPS_DX5 = Struct("DDCAPS_DX5", [
     (DWORD, "dwSVBCaps"),
     (DWORD, "dwSVBCKeyCaps"),
     (DWORD, "dwSVBFXCaps"),
-    (DWORD, "dwSVBRops[DD_ROP_SPACE]"),
+    (Array(DWORD, "DD_ROP_SPACE"), "dwSVBRops"),
     (DWORD, "dwVSBCaps"),
     (DWORD, "dwVSBCKeyCaps"),
     (DWORD, "dwVSBFXCaps"),
-    (DWORD, "dwVSBRops[DD_ROP_SPACE]"),
+    (Array(DWORD, "DD_ROP_SPACE"), "dwVSBRops"),
     (DWORD, "dwSSBCaps"),
     (DWORD, "dwSSBCKeyCaps"),
     (DWORD, "dwSSBFXCaps"),
-    (DWORD, "dwSSBRops[DD_ROP_SPACE]"),
+    (Array(DWORD, "DD_ROP_SPACE"), "dwSSBRops"),
     (DWORD, "dwMaxVideoPorts"),
     (DWORD, "dwCurrVideoPorts"),
     (DWORD, "dwSVBCaps2"),
@@ -288,7 +288,7 @@ DDCAPS_DX5 = Struct("DDCAPS_DX5", [
     (DWORD, "dwNLVBCaps2"),
     (DWORD, "dwNLVBCKeyCaps"),
     (DWORD, "dwNLVBFXCaps"),
-    (DWORD, "dwNLVBRops[DD_ROP_SPACE]"),
+    (Array(DWORD, "DD_ROP_SPACE"), "dwNLVBRops"),
 ])
 LPDDCAPS_DX5 = Pointer(DDCAPS_DX5)
 
@@ -318,7 +318,7 @@ DDCAPS_DX6 = Struct("DDCAPS_DX6", [
     (DWORD, "dwAlignBoundaryDest"),
     (DWORD, "dwAlignSizeDest"),
     (DWORD, "dwAlignStrideAlign"),
-    (DWORD, "dwRops[DD_ROP_SPACE]"),
+    (Array(DWORD, "DD_ROP_SPACE"), "dwRops"),
     (DDSCAPS, "ddsOldCaps"),
     (DWORD, "dwMinOverlayStretch"),
     (DWORD, "dwMaxOverlayStretch"),
@@ -332,15 +332,15 @@ DDCAPS_DX6 = Struct("DDCAPS_DX6", [
     (DWORD, "dwSVBCaps"),
     (DWORD, "dwSVBCKeyCaps"),
     (DWORD, "dwSVBFXCaps"),
-    (DWORD, "dwSVBRops[DD_ROP_SPACE]"),
+    (Array(DWORD, "DD_ROP_SPACE"), "dwSVBRops"),
     (DWORD, "dwVSBCaps"),
     (DWORD, "dwVSBCKeyCaps"),
     (DWORD, "dwVSBFXCaps"),
-    (DWORD, "dwVSBRops[DD_ROP_SPACE]"),
+    (Array(DWORD, "DD_ROP_SPACE"), "dwVSBRops"),
     (DWORD, "dwSSBCaps"),
     (DWORD, "dwSSBCKeyCaps"),
     (DWORD, "dwSSBFXCaps"),
-    (DWORD, "dwSSBRops[DD_ROP_SPACE]"),
+    (Array(DWORD, "DD_ROP_SPACE"), "dwSSBRops"),
     (DWORD, "dwMaxVideoPorts"),
     (DWORD, "dwCurrVideoPorts"),
     (DWORD, "dwSVBCaps2"),
@@ -348,7 +348,7 @@ DDCAPS_DX6 = Struct("DDCAPS_DX6", [
     (DWORD, "dwNLVBCaps2"),
     (DWORD, "dwNLVBCKeyCaps"),
     (DWORD, "dwNLVBFXCaps"),
-    (DWORD, "dwNLVBRops[DD_ROP_SPACE]"),
+    (Array(DWORD, "DD_ROP_SPACE"), "dwNLVBRops"),
     (DDSCAPS2, "ddsCaps"),
 ])
 LPDDCAPS_DX6 = Pointer(DDCAPS_DX6)
@@ -379,7 +379,7 @@ DDCAPS_DX7 = Struct("DDCAPS_DX7", [
     (DWORD, "dwAlignBoundaryDest"),
     (DWORD, "dwAlignSizeDest"),
     (DWORD, "dwAlignStrideAlign"),
-    (DWORD, "dwRops[DD_ROP_SPACE]"),
+    (Array(DWORD, "DD_ROP_SPACE"), "dwRops"),
     (DDSCAPS, "ddsOldCaps"),
     (DWORD, "dwMinOverlayStretch"),
     (DWORD, "dwMaxOverlayStretch"),
@@ -393,15 +393,15 @@ DDCAPS_DX7 = Struct("DDCAPS_DX7", [
     (DWORD, "dwSVBCaps"),
     (DWORD, "dwSVBCKeyCaps"),
     (DWORD, "dwSVBFXCaps"),
-    (DWORD, "dwSVBRops[DD_ROP_SPACE]"),
+    (Array(DWORD, "DD_ROP_SPACE"), "dwSVBRops"),
     (DWORD, "dwVSBCaps"),
     (DWORD, "dwVSBCKeyCaps"),
     (DWORD, "dwVSBFXCaps"),
-    (DWORD, "dwVSBRops[DD_ROP_SPACE]"),
+    (Array(DWORD, "DD_ROP_SPACE"), "dwVSBRops"),
     (DWORD, "dwSSBCaps"),
     (DWORD, "dwSSBCKeyCaps"),
     (DWORD, "dwSSBFXCaps"),
-    (DWORD, "dwSSBRops[DD_ROP_SPACE]"),
+    (Array(DWORD, "DD_ROP_SPACE"), "dwSSBRops"),
     (DWORD, "dwMaxVideoPorts"),
     (DWORD, "dwCurrVideoPorts"),
     (DWORD, "dwSVBCaps2"),
@@ -409,7 +409,7 @@ DDCAPS_DX7 = Struct("DDCAPS_DX7", [
     (DWORD, "dwNLVBCaps2"),
     (DWORD, "dwNLVBCKeyCaps"),
     (DWORD, "dwNLVBFXCaps"),
-    (DWORD, "dwNLVBRops[DD_ROP_SPACE]"),
+    (Array(DWORD, "DD_ROP_SPACE"), "dwNLVBRops"),
     (DDSCAPS2, "ddsCaps"),
 ])
 LPDDCAPS_DX7 = Pointer(DDCAPS_DX7)
@@ -479,9 +479,9 @@ DDBLTBATCH = Struct("DDBLTBATCH", [
 LPDDBLTBATCH = Pointer(DDBLTBATCH)
 
 DDGAMMARAMP = Struct("DDGAMMARAMP", [
-    (WORD, "red[256]"),
-    (WORD, "green[256]"),
-    (WORD, "blue[256]"),
+    (Array(WORD, "256"), "red"),
+    (Array(WORD, "256"), "green"),
+    (Array(WORD, "256"), "blue"),
 ])
 LPDDGAMMARAMP = Pointer(DDGAMMARAMP)
 
@@ -498,8 +498,8 @@ DDDEVICEIDENTIFIER = Struct("DDDEVICEIDENTIFIER", [
 LPDDDEVICEIDENTIFIER = Pointer(DDDEVICEIDENTIFIER)
 
 DDDEVICEIDENTIFIER2 = Struct("DDDEVICEIDENTIFIER2", [
-    (CString, "szDriver[MAX_DDDEVICEID_STRING]"),
-    (CString, "szDescription[MAX_DDDEVICEID_STRING]"),
+    (CString, "szDriver"),
+    (CString, "szDescription"),
     (LARGE_INTEGER, "liDriverVersion"),
     (DWORD, "dwVendorId"),
     (DWORD, "dwDeviceId"),
@@ -1251,13 +1251,13 @@ IDirectDraw.methods += [
     Method(HRESULT, "Compact", []),
     Method(HRESULT, "CreateClipper", [DWORD, Pointer(LPDIRECTDRAWCLIPPER), Pointer(IUnknown)]),
     Method(HRESULT, "CreatePalette", [DWORD, LPPALETTEENTRY, Pointer(LPDIRECTDRAWPALETTE) , Pointer(IUnknown)]),
-    Method(HRESULT, "CreateSurface", [LPDDSURFACEDESC, Pointer(LPDIRECTDRAWSURFACE) , Pointer(IUnknown)]),
+    Method(HRESULT, "CreateSurface", [LPDDSURFACEDESC, Out(Pointer(LPDIRECTDRAWSURFACE), "lplpDDSurface"), Pointer(IUnknown)]),
     Method(HRESULT, "DuplicateSurface", [LPDIRECTDRAWSURFACE, Pointer(LPDIRECTDRAWSURFACE)]),
     Method(HRESULT, "EnumDisplayModes", [DWORD, LPDDSURFACEDESC, LPVOID, LPDDENUMMODESCALLBACK]),
     Method(HRESULT, "EnumSurfaces", [DWORD, LPDDSURFACEDESC, LPVOID,LPDDENUMSURFACESCALLBACK]),
     Method(HRESULT, "FlipToGDISurface", []),
     Method(HRESULT, "GetCaps", [LPDDCAPS, LPDDCAPS]),
-    Method(HRESULT, "GetDisplayMode", [LPDDSURFACEDESC]),
+    Method(HRESULT, "GetDisplayMode", [Out(LPDDSURFACEDESC, "lpDDSurfaceDesc")]),
     Method(HRESULT, "GetFourCCCodes", [LPDWORD, LPDWORD]),
     Method(HRESULT, "GetGDISurface", [Pointer(LPDIRECTDRAWSURFACE)]),
     Method(HRESULT, "GetMonitorFrequency", [LPDWORD]),
@@ -1274,13 +1274,13 @@ IDirectDraw2.methods += [
     Method(HRESULT, "Compact", []),
     Method(HRESULT, "CreateClipper", [DWORD, Pointer(LPDIRECTDRAWCLIPPER) , Pointer(IUnknown)]),
     Method(HRESULT, "CreatePalette", [DWORD, LPPALETTEENTRY, Pointer(LPDIRECTDRAWPALETTE) , Pointer(IUnknown)]),
-    Method(HRESULT, "CreateSurface", [LPDDSURFACEDESC, Pointer(LPDIRECTDRAWSURFACE) , Pointer(IUnknown)]),
+    Method(HRESULT, "CreateSurface", [LPDDSURFACEDESC, Out(Pointer(LPDIRECTDRAWSURFACE), "lplpDDSurface"), Pointer(IUnknown)]),
     Method(HRESULT, "DuplicateSurface", [LPDIRECTDRAWSURFACE, Pointer(LPDIRECTDRAWSURFACE)]),
     Method(HRESULT, "EnumDisplayModes", [DWORD, LPDDSURFACEDESC, LPVOID, LPDDENUMMODESCALLBACK]),
     Method(HRESULT, "EnumSurfaces", [DWORD, LPDDSURFACEDESC, LPVOID,LPDDENUMSURFACESCALLBACK]),
     Method(HRESULT, "FlipToGDISurface", []),
     Method(HRESULT, "GetCaps", [LPDDCAPS, LPDDCAPS]),
-    Method(HRESULT, "GetDisplayMode", [LPDDSURFACEDESC]),
+    Method(HRESULT, "GetDisplayMode", [Out(LPDDSURFACEDESC, "lpDDSurfaceDesc")]),
     Method(HRESULT, "GetFourCCCodes", [LPDWORD, LPDWORD]),
     Method(HRESULT, "GetGDISurface", [Pointer(LPDIRECTDRAWSURFACE)]),
     Method(HRESULT, "GetMonitorFrequency", [LPDWORD]),
@@ -1298,13 +1298,13 @@ IDirectDraw4.methods += [
     Method(HRESULT, "Compact", []),
     Method(HRESULT, "CreateClipper", [DWORD, Pointer(LPDIRECTDRAWCLIPPER) , Pointer(IUnknown)]),
     Method(HRESULT, "CreatePalette", [DWORD, LPPALETTEENTRY, Pointer(LPDIRECTDRAWPALETTE) , Pointer(IUnknown)]),
-    Method(HRESULT, "CreateSurface", [LPDDSURFACEDESC2, Pointer(LPDIRECTDRAWSURFACE4) , Pointer(IUnknown)]),
+    Method(HRESULT, "CreateSurface", [LPDDSURFACEDESC2, Out(Pointer(LPDIRECTDRAWSURFACE4), "lplpDDSurface"), Pointer(IUnknown)]),
     Method(HRESULT, "DuplicateSurface", [LPDIRECTDRAWSURFACE4, Pointer(LPDIRECTDRAWSURFACE4)]),
     Method(HRESULT, "EnumDisplayModes", [DWORD, LPDDSURFACEDESC2, LPVOID, LPDDENUMMODESCALLBACK2]),
     Method(HRESULT, "EnumSurfaces", [DWORD, LPDDSURFACEDESC2, LPVOID,LPDDENUMSURFACESCALLBACK2]),
     Method(HRESULT, "FlipToGDISurface", []),
     Method(HRESULT, "GetCaps", [LPDDCAPS, LPDDCAPS]),
-    Method(HRESULT, "GetDisplayMode", [LPDDSURFACEDESC2]),
+    Method(HRESULT, "GetDisplayMode", [Out(LPDDSURFACEDESC2, "lpDDSurfaceDesc")]),
     Method(HRESULT, "GetFourCCCodes", [LPDWORD, LPDWORD]),
     Method(HRESULT, "GetGDISurface", [Pointer(LPDIRECTDRAWSURFACE4)]),
     Method(HRESULT, "GetMonitorFrequency", [LPDWORD]),
@@ -1319,20 +1319,20 @@ IDirectDraw4.methods += [
     Method(HRESULT, "GetSurfaceFromDC", [HDC, Pointer(LPDIRECTDRAWSURFACE4)]),
     Method(HRESULT, "RestoreAllSurfaces", []),
     Method(HRESULT, "TestCooperativeLevel", []),
-    Method(HRESULT, "GetDeviceIdentifier", [LPDDDEVICEIDENTIFIER, DWORD]),
+    Method(HRESULT, "GetDeviceIdentifier", [Out(LPDDDEVICEIDENTIFIER, "lpDDDeviceIdentifier"), DWORD]),
 ]
 
 IDirectDraw7.methods += [
     Method(HRESULT, "Compact", []),
-    Method(HRESULT, "CreateClipper", [DWORD, Pointer(LPDIRECTDRAWCLIPPER) , Pointer(IUnknown)]),
+    Method(HRESULT, "CreateClipper", [(DWORD, "dwFlags"), Out(Pointer(LPDIRECTDRAWCLIPPER), "lplpDDClipper"), (Pointer(IUnknown), "pUnkOuter")]),
     Method(HRESULT, "CreatePalette", [DWORD, LPPALETTEENTRY, Pointer(LPDIRECTDRAWPALETTE) , Pointer(IUnknown)]),
-    Method(HRESULT, "CreateSurface", [LPDDSURFACEDESC2, Pointer(LPDIRECTDRAWSURFACE7) , Pointer(IUnknown)]),
+    Method(HRESULT, "CreateSurface", [LPDDSURFACEDESC2, Out(Pointer(LPDIRECTDRAWSURFACE7), "lplpDDSurface") , Pointer(IUnknown)]),
     Method(HRESULT, "DuplicateSurface", [LPDIRECTDRAWSURFACE7, Pointer(LPDIRECTDRAWSURFACE7)]),
     Method(HRESULT, "EnumDisplayModes", [DWORD, LPDDSURFACEDESC2, LPVOID, LPDDENUMMODESCALLBACK2]),
     Method(HRESULT, "EnumSurfaces", [DWORD, LPDDSURFACEDESC2, LPVOID,LPDDENUMSURFACESCALLBACK7]),
     Method(HRESULT, "FlipToGDISurface", []),
     Method(HRESULT, "GetCaps", [LPDDCAPS, LPDDCAPS]),
-    Method(HRESULT, "GetDisplayMode", [LPDDSURFACEDESC2]),
+    Method(HRESULT, "GetDisplayMode", [Out(LPDDSURFACEDESC2, "lpDDSurfaceDesc")]),
     Method(HRESULT, "GetFourCCCodes", [LPDWORD, LPDWORD]),
     Method(HRESULT, "GetGDISurface", [Pointer(LPDIRECTDRAWSURFACE7)]),
     Method(HRESULT, "GetMonitorFrequency", [LPDWORD]),
@@ -1347,7 +1347,7 @@ IDirectDraw7.methods += [
     Method(HRESULT, "GetSurfaceFromDC", [HDC, Pointer(LPDIRECTDRAWSURFACE7)]),
     Method(HRESULT, "RestoreAllSurfaces", []),
     Method(HRESULT, "TestCooperativeLevel", []),
-    Method(HRESULT, "GetDeviceIdentifier", [LPDDDEVICEIDENTIFIER2, DWORD]),
+    Method(HRESULT, "GetDeviceIdentifier", [Out(LPDDDEVICEIDENTIFIER2, "lpDDDeviceIdentifier"), DWORD]),
     Method(HRESULT, "StartModeTest", [LPSIZE, DWORD, DWORD]),
     Method(HRESULT, "EvaluateMode", [DWORD, Pointer(DWORD)]),
 ]
@@ -1618,5 +1618,18 @@ ddraw.add_functions([
     StdFunction(DWORD, "D3DParseUnknownCommand", [(LPVOID, "lpCmd"), Out(Pointer(LPVOID), "lpRetCmd")]),
     StdFunction(HRESULT, "DllCanUnloadNow", []),
     StdFunction(HRESULT, "DllGetClassObject", [(REFCLSID, "rclsid"), (REFIID, "riid"), Out(Pointer(OpaquePointer(Void)), "ppv")]),
+
+    # XXX
+    StdFunction(HRESULT, "CompleteCreateSysmemSurface", [Int, Int]),
+    StdFunction(HRESULT, "GetSurfaceFromDC", [Int, Int, Int]),
+    StdFunction(HRESULT, "DDInternalLock", [Int, Int]),
+    StdFunction(HRESULT, "DDInternalUnlock", [Int]),
+    StdFunction(HRESULT, "DSoundHelp", [HWND, Int, Int]),
+    StdFunction(HRESULT, "GetDDSurfaceLocal", [Int, Int, Int]),
+    StdFunction(HANDLE, "GetOLEThunkData", [Int]),
+    StdFunction(HRESULT, "RegisterSpecialCase", [Int, Int, Int, Int]),
+    StdFunction(HRESULT, "DDGetAttachedSurfaceLcl", [Int, Int, Int]),
+
+    # TODO: SetAppCompatData
 ])
 
index 6d8432b826a7bb605192f42742739d31fcf70c2f..368462a917579a90c16989fef5a84dff0c6aa159 100644 (file)
--- a/trace.py
+++ b/trace.py
@@ -271,7 +271,12 @@ unwrap_instance = Unwrapper().visit
 
 class Tracer:
 
+    def __init__(self):
+        self.api = None
+
     def trace_api(self, api):
+        self.api = api
+
         self.header(api)
 
         # Includes
@@ -427,8 +432,15 @@ class Tracer:
             wrap_instance(method.type, '__result')
         print '    Trace::EndLeave();'
         if method.name == 'QueryInterface':
-            print '    if (*ppvObj == m_pInstance)'
-            print '        *ppvObj = this;'
+            print '    if (ppvObj && *ppvObj) {'
+            print '        if (*ppvObj == m_pInstance) {'
+            print '            *ppvObj = this;'
+            print '        }'
+            for iface in self.api.interfaces:
+                print '        else if (riid == IID_%s) {' % iface.name
+                print '            *ppvObj = new Wrap%s((%s *) *ppvObj);' % (iface.name, iface.name)
+                print '        }'
+            print '    }'
         if method.name == 'Release':
             assert method.type is not stdapi.Void
             print '    if (!__result)'
index ee619821aff8fd3992838d824b368fe4f5589c50..449279f25c6acc8c503754910b3307a89ee18d8e 100644 (file)
--- a/winapi.py
+++ b/winapi.py
@@ -76,14 +76,7 @@ GUID = Struct("GUID", [
     (DWORD, "Data1"),
     (WORD, "Data2"),
     (WORD, "Data3"),
-    (BYTE, "Data4[0]"),
-    (BYTE, "Data4[1]"),
-    (BYTE, "Data4[2]"),
-    (BYTE, "Data4[3]"),
-    (BYTE, "Data4[4]"),
-    (BYTE, "Data4[5]"),
-    (BYTE, "Data4[6]"),
-    (BYTE, "Data4[7]"),
+    (Array(BYTE, "8"), "Data4"),
 ])
 LPGUID = Pointer(GUID)
 
@@ -150,8 +143,14 @@ HMODULE = Opaque("HMODULE")
 
 IUnknown = Interface("IUnknown")
 
+HRESULT_com = FakeEnum(HRESULT, [
+    "S_OK",
+    "E_NOINTERFACE",
+    "E_POINTER",
+])
+
 IUnknown.methods = (
-       Method(HRESULT, "QueryInterface", ((REFIID, "riid"), (Pointer(OpaquePointer(Void)), "ppvObj"))),
+       Method(HRESULT_com, "QueryInterface", ((REFIID, "riid"), Out(Pointer(OpaquePointer(Void)), "ppvObj"))),
        Method(ULONG, "AddRef", ()),
        Method(ULONG, "Release", ()),
 )