summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xCMakeLists.txt1
-rw-r--r--d3d.py13
-rw-r--r--ddraw.def34
-rw-r--r--ddraw.py85
-rw-r--r--trace.py16
-rw-r--r--winapi.py17
6 files changed, 102 insertions, 64 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2bb87ff..afa082c 100755
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -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 9deed97..256832f 100644
--- 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__':
diff --git a/ddraw.def b/ddraw.def
index 155162a..6186c60 100644
--- 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
diff --git a/ddraw.py b/ddraw.py
index fd8c5f5..2e17b06 100644
--- 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
])
diff --git a/trace.py b/trace.py
index 6d8432b..368462a 100644
--- 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)'
diff --git a/winapi.py b/winapi.py
index ee61982..449279f 100644
--- 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", ()),
)