For clarity.
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/compobj.dll16/compobj.c | 43 ++++++++++++++---------------------- 1 file changed, 17 insertions(+), 26 deletions(-)
diff --git a/dlls/compobj.dll16/compobj.c b/dlls/compobj.dll16/compobj.c index ffbd87a906..3991de4432 100644 --- a/dlls/compobj.dll16/compobj.c +++ b/dlls/compobj.dll16/compobj.c @@ -48,34 +48,25 @@ WINE_DEFAULT_DEBUG_CHANNEL(ole); typedef LPSTR LPOLESTR16; typedef LPCSTR LPCOLESTR16;
-#define STDMETHOD16CALLTYPE __cdecl -#define STDMETHOD16(m) HRESULT (STDMETHOD16CALLTYPE *m) -#define STDMETHOD16_(t,m) t (STDMETHOD16CALLTYPE *m) - #define CHARS_IN_GUID 39
-/*********************************************************************** - * IMalloc16 interface - */ - -typedef struct IMalloc16 *LPMALLOC16; +typedef struct +{ + SEGPTR QueryInterface; + SEGPTR AddRef; + SEGPTR Release; + SEGPTR Alloc; + SEGPTR Realloc; + SEGPTR Free; + SEGPTR GetSize; + SEGPTR DidAlloc; + SEGPTR HeapMinimize; +} IMalloc16Vtbl;
-#define INTERFACE IMalloc16 -DECLARE_INTERFACE_(IMalloc16,IUnknown) +typedef struct { - /*** IUnknown methods ***/ - STDMETHOD16_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; - STDMETHOD16_(ULONG,AddRef)(THIS) PURE; - STDMETHOD16_(ULONG,Release)(THIS) PURE; - /*** IMalloc16 methods ***/ - STDMETHOD16_(LPVOID,Alloc)(THIS_ DWORD cb) PURE; - STDMETHOD16_(LPVOID,Realloc)(THIS_ LPVOID pv, DWORD cb) PURE; - STDMETHOD16_(void,Free)(THIS_ LPVOID pv) PURE; - STDMETHOD16_(DWORD,GetSize)(THIS_ LPVOID pv) PURE; - STDMETHOD16_(INT16,DidAlloc)(THIS_ LPVOID pv) PURE; - STDMETHOD16_(LPVOID,HeapMinimize)(THIS) PURE; -}; -#undef INTERFACE + SEGPTR lpVtbl; +} IMalloc16, *LPMALLOC16;
static HTASK16 hETask = 0; static WORD Table_ETask[62]; @@ -220,7 +211,7 @@ IMalloc16_Constructor(void) This = HeapAlloc( GetProcessHeap(), 0, sizeof(IMalloc16Impl) ); if (!msegvt16) { -#define VTENT(x) vt16.x = (void*)GetProcAddress16(hcomp,"IMalloc16_"#x);assert(vt16.x) +#define VTENT(x) vt16.x = (SEGPTR)GetProcAddress16(hcomp,"IMalloc16_"#x);assert(vt16.x) VTENT(QueryInterface); VTENT(AddRef); VTENT(Release); @@ -233,7 +224,7 @@ IMalloc16_Constructor(void) #undef VTENT msegvt16 = MapLS( &vt16 ); } - This->IMalloc16_iface.lpVtbl = (const IMalloc16Vtbl*)msegvt16; + This->IMalloc16_iface.lpVtbl = msegvt16; This->ref = 1; return (LPMALLOC16)MapLS( This ); }
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/compobj.dll16/compobj.c | 128 ++++++++++++----------------------- 1 file changed, 43 insertions(+), 85 deletions(-)
diff --git a/dlls/compobj.dll16/compobj.c b/dlls/compobj.dll16/compobj.c index 3991de4432..dc5e315b4c 100644 --- a/dlls/compobj.dll16/compobj.c +++ b/dlls/compobj.dll16/compobj.c @@ -45,7 +45,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(ole);
-typedef LPSTR LPOLESTR16; typedef LPCSTR LPCOLESTR16;
#define CHARS_IN_GUID 39 @@ -68,6 +67,18 @@ typedef struct SEGPTR lpVtbl; } IMalloc16, *LPMALLOC16;
+static SEGPTR call_IMalloc_Alloc(SEGPTR iface, DWORD size) +{ + IMalloc16 *malloc = MapSL(iface); + IMalloc16Vtbl *vtbl = MapSL(malloc->lpVtbl); + DWORD args[2], ret; + + args[0] = iface; + args[1] = size; + WOWCallback16Ex(vtbl->Alloc, WCB16_CDECL, sizeof(args), args, &ret); + return ret; +} + static HTASK16 hETask = 0; static WORD Table_ETask[62];
@@ -268,6 +279,24 @@ HRESULT WINAPI CoCreateStandardMalloc16(DWORD dwMemContext, return S_OK; }
+/*********************************************************************** + * CoMemAlloc [COMPOBJ.151] + */ +SEGPTR WINAPI CoMemAlloc(DWORD size, MEMCTX context, DWORD unknown) +{ + SEGPTR malloc; + + TRACE("size %u, context %d, unknown %#x.\n", size, context, unknown); + if (context != MEMCTX_TASK) + FIXME("Ignoring context %d.\n", context); + if (unknown) + FIXME("Ignoring unknown parameter %#x.\n", unknown); + + if (CoGetMalloc16(0, (IMalloc16 **)&malloc)) + return 0; + return call_IMalloc_Alloc(malloc, size); +} + /****************************************************************************** * CoInitialize [COMPOBJ.2] * Set the win16 IMalloc used for memory management @@ -386,78 +415,23 @@ HRESULT WINAPI CLSIDFromString16( return S_OK; }
-/****************************************************************************** - * _xmalloc16 [internal] - * Allocates size bytes from the standard ole16 allocator. - * - * RETURNS - * the allocated segmented pointer and a HRESULT - */ -static HRESULT -_xmalloc16(DWORD size, SEGPTR *ptr) { - LPMALLOC16 mllc; - DWORD args[2]; - - if (CoGetMalloc16(0,&mllc)) - return E_OUTOFMEMORY; - - args[0] = (DWORD)mllc; - args[1] = size; - /* No need for a Callback entry, we have WOWCallback16Ex which does - * everything we need. - */ - if (!WOWCallback16Ex( - (DWORD)((const IMalloc16Vtbl*)MapSL( - (SEGPTR)((LPMALLOC16)MapSL((SEGPTR)mllc))->lpVtbl ) - )->Alloc, - WCB16_CDECL, - 2*sizeof(DWORD), - (LPVOID)args, - (LPDWORD)ptr - )) { - ERR("CallTo16 IMalloc16 (%d) failed\n",size); - return E_FAIL; - } - return S_OK; -} - -/****************************************************************************** - * StringFromCLSID [COMPOBJ.19] - * StringFromIID [COMPOBJ.14] - * Converts a GUID into the respective string representation. - * The target string is allocated using the OLE IMalloc. - * - * RETURNS - * the string representation and HRESULT +/*********************************************************************** + * StringFromCLSID [COMPOBJ.151] */ - -HRESULT WINAPI StringFromCLSID16( - REFCLSID id, /* [in] the GUID to be converted */ - LPOLESTR16 *idstr ) /* [out] a pointer to a to-be-allocated segmented pointer pointing to the resulting string */ +HRESULT WINAPI StringFromCLSID16(REFCLSID id, SEGPTR *str) { WCHAR buffer[40]; - HRESULT ret; - - ret = _xmalloc16(40,(SEGPTR*)idstr); - if (ret != S_OK) - return ret; + if (!(*str = CoMemAlloc(40, MEMCTX_TASK, 0))) + return E_OUTOFMEMORY; StringFromGUID2( id, buffer, 40 ); - WideCharToMultiByte( CP_ACP, 0, buffer, -1, MapSL((SEGPTR)*idstr), 40, NULL, NULL ); - return ret; + WideCharToMultiByte( CP_ACP, 0, buffer, -1, MapSL(*str), 40, NULL, NULL ); + return S_OK; }
-/****************************************************************************** - * ProgIDFromCLSID [COMPOBJ.62] - * - * Converts a class id into the respective Program ID. (By using a registry lookup) - * - * RETURNS - * S_OK on success - * riid associated with the progid +/*********************************************************************** + * ProgIDFromCLSID [COMPOBJ.151] */ -HRESULT WINAPI ProgIDFromCLSID16( - REFCLSID clsid, /* [in] class id as found in registry */ - LPOLESTR16 *lplpszProgID )/* [out] associated Program ID */ +HRESULT WINAPI ProgIDFromCLSID16(REFCLSID clsid, SEGPTR *str) { LPOLESTR progid; HRESULT ret; @@ -466,9 +440,8 @@ HRESULT WINAPI ProgIDFromCLSID16( if (ret == S_OK) { INT len = WideCharToMultiByte( CP_ACP, 0, progid, -1, NULL, 0, NULL, NULL ); - ret = _xmalloc16(len, (SEGPTR*)lplpszProgID); - if (ret == S_OK) - WideCharToMultiByte( CP_ACP, 0, progid, -1, MapSL((SEGPTR)*lplpszProgID), len, NULL, NULL ); + if ((*str = CoMemAlloc(len, MEMCTX_TASK, 0))) + WideCharToMultiByte( CP_ACP, 0, progid, -1, MapSL(*str), len, NULL, NULL ); CoTaskMemFree( progid ); } return ret; @@ -627,21 +600,6 @@ BOOL WINAPI COMPOBJ_DllEntryPoint(DWORD Reason, HINSTANCE16 hInst, WORD ds, WORD return TRUE; }
-/*********************************************************************** - * CoMemAlloc [COMPOBJ.151] - */ -SEGPTR WINAPI CoMemAlloc(DWORD size, DWORD dwMemContext, DWORD x) { - HRESULT hres; - SEGPTR segptr; - - /* FIXME: check context handling */ - TRACE("(%d, 0x%08x, 0x%08x)\n", size, dwMemContext, x); - hres = _xmalloc16(size, &segptr); - if (hres != S_OK) - return 0; - return segptr; -} - /****************************************************************************** * CLSIDFromProgID [COMPOBJ.61] * @@ -680,7 +638,7 @@ HRESULT WINAPI CLSIDFromProgID16(LPCOLESTR16 progid, LPCLSID riid) /****************************************************************************** * StringFromGUID2 [COMPOBJ.76] */ -INT16 WINAPI StringFromGUID216(REFGUID id, LPOLESTR16 str, INT16 cmax) +INT16 WINAPI StringFromGUID216(REFGUID id, char *str, INT16 cmax) { static const char format[] = "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}"; if (!id || cmax < CHARS_IN_GUID) return 0;
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/compobj.dll16/compobj.c | 47 ++++++++++----------------- dlls/compobj.dll16/compobj.dll16.spec | 2 +- 2 files changed, 19 insertions(+), 30 deletions(-)
diff --git a/dlls/compobj.dll16/compobj.c b/dlls/compobj.dll16/compobj.c index dc5e315b4c..701f0012ff 100644 --- a/dlls/compobj.dll16/compobj.c +++ b/dlls/compobj.dll16/compobj.c @@ -65,7 +65,7 @@ typedef struct typedef struct { SEGPTR lpVtbl; -} IMalloc16, *LPMALLOC16; +} IMalloc16;
static SEGPTR call_IMalloc_Alloc(SEGPTR iface, DWORD size) { @@ -82,7 +82,7 @@ static SEGPTR call_IMalloc_Alloc(SEGPTR iface, DWORD size) static HTASK16 hETask = 0; static WORD Table_ETask[62];
-static LPMALLOC16 currentMalloc16=NULL; +static SEGPTR compobj_malloc;
/* --- IMalloc16 implementation */
@@ -211,8 +211,7 @@ LPVOID CDECL IMalloc16_fnHeapMinimize(IMalloc16* iface) { /****************************************************************************** * IMalloc16_Constructor [VTABLE] */ -static LPMALLOC16 -IMalloc16_Constructor(void) +static SEGPTR IMalloc16_Constructor(void) { static IMalloc16Vtbl vt16; static SEGPTR msegvt16; @@ -237,7 +236,7 @@ IMalloc16_Constructor(void) } This->IMalloc16_iface.lpVtbl = msegvt16; This->ref = 1; - return (LPMALLOC16)MapLS( This ); + return MapLS(This); }
@@ -250,32 +249,24 @@ DWORD WINAPI CoBuildVersion16(void) }
/*********************************************************************** - * CoGetMalloc [COMPOBJ.4] - * - * Retrieve the current win16 IMalloc interface. - * - * RETURNS - * The current win16 IMalloc + * CoGetMalloc [COMPOBJ.4] */ -HRESULT WINAPI CoGetMalloc16( - DWORD dwMemContext, /* [in] unknown */ - LPMALLOC16 * lpMalloc /* [out] current win16 malloc interface */ -) { - if(!currentMalloc16) - currentMalloc16 = IMalloc16_Constructor(); - *lpMalloc = currentMalloc16; +HRESULT WINAPI CoGetMalloc16(MEMCTX context, SEGPTR *malloc) +{ + if (!compobj_malloc) + compobj_malloc = IMalloc16_Constructor(); + *malloc = compobj_malloc; return S_OK; }
/*********************************************************************** * CoCreateStandardMalloc [COMPOBJ.71] */ -HRESULT WINAPI CoCreateStandardMalloc16(DWORD dwMemContext, - LPMALLOC16 *lpMalloc) +HRESULT WINAPI CoCreateStandardMalloc16(MEMCTX context, SEGPTR *malloc) { /* FIXME: docu says we shouldn't return the same allocator as in * CoGetMalloc16 */ - *lpMalloc = IMalloc16_Constructor(); + *malloc = IMalloc16_Constructor(); return S_OK; }
@@ -292,19 +283,17 @@ SEGPTR WINAPI CoMemAlloc(DWORD size, MEMCTX context, DWORD unknown) if (unknown) FIXME("Ignoring unknown parameter %#x.\n", unknown);
- if (CoGetMalloc16(0, (IMalloc16 **)&malloc)) + if (CoGetMalloc16(0, &malloc)) return 0; return call_IMalloc_Alloc(malloc, size); }
-/****************************************************************************** - * CoInitialize [COMPOBJ.2] - * Set the win16 IMalloc used for memory management +/*********************************************************************** + * CoInitialize [COMPOBJ.2] */ -HRESULT WINAPI CoInitialize16( - LPVOID lpReserved /* [in] pointer to win16 malloc interface */ -) { - currentMalloc16 = (LPMALLOC16)lpReserved; +HRESULT WINAPI CoInitialize16(SEGPTR malloc) +{ + compobj_malloc = malloc; return S_OK; }
diff --git a/dlls/compobj.dll16/compobj.dll16.spec b/dlls/compobj.dll16/compobj.dll16.spec index 2ef011fcb0..8c0456504d 100644 --- a/dlls/compobj.dll16/compobj.dll16.spec +++ b/dlls/compobj.dll16/compobj.dll16.spec @@ -1,5 +1,5 @@ 1 pascal CoBuildVersion() CoBuildVersion16 -2 pascal CoInitialize(long) CoInitialize16 +2 pascal CoInitialize(segptr) CoInitialize16 3 pascal CoUninitialize() CoUninitialize16 4 pascal CoGetMalloc(long ptr) CoGetMalloc16 5 pascal CoRegisterClassObject(ptr ptr long long ptr) CoRegisterClassObject16
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/compobj.dll16/compobj.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-)
diff --git a/dlls/compobj.dll16/compobj.c b/dlls/compobj.dll16/compobj.c index 701f0012ff..44a7091ef1 100644 --- a/dlls/compobj.dll16/compobj.c +++ b/dlls/compobj.dll16/compobj.c @@ -253,8 +253,6 @@ DWORD WINAPI CoBuildVersion16(void) */ HRESULT WINAPI CoGetMalloc16(MEMCTX context, SEGPTR *malloc) { - if (!compobj_malloc) - compobj_malloc = IMalloc16_Constructor(); *malloc = compobj_malloc; return S_OK; } @@ -275,17 +273,13 @@ HRESULT WINAPI CoCreateStandardMalloc16(MEMCTX context, SEGPTR *malloc) */ SEGPTR WINAPI CoMemAlloc(DWORD size, MEMCTX context, DWORD unknown) { - SEGPTR malloc; - TRACE("size %u, context %d, unknown %#x.\n", size, context, unknown); if (context != MEMCTX_TASK) FIXME("Ignoring context %d.\n", context); if (unknown) FIXME("Ignoring unknown parameter %#x.\n", unknown);
- if (CoGetMalloc16(0, &malloc)) - return 0; - return call_IMalloc_Alloc(malloc, size); + return call_IMalloc_Alloc(compobj_malloc, size); }
/*********************************************************************** @@ -293,6 +287,8 @@ SEGPTR WINAPI CoMemAlloc(DWORD size, MEMCTX context, DWORD unknown) */ HRESULT WINAPI CoInitialize16(SEGPTR malloc) { + if (!malloc) + CoCreateStandardMalloc16(MEMCTX_TASK, &malloc); compobj_malloc = malloc; return S_OK; }
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=42554 Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/compobj.dll16/compobj.c | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-)
diff --git a/dlls/compobj.dll16/compobj.c b/dlls/compobj.dll16/compobj.c index 44a7091ef1..52e5d72688 100644 --- a/dlls/compobj.dll16/compobj.c +++ b/dlls/compobj.dll16/compobj.c @@ -67,6 +67,28 @@ typedef struct SEGPTR lpVtbl; } IMalloc16;
+static ULONG call_IMalloc_AddRef(SEGPTR iface) +{ + IMalloc16 *malloc = MapSL(iface); + IMalloc16Vtbl *vtbl = MapSL(malloc->lpVtbl); + DWORD args[1], ret; + + args[0] = iface; + WOWCallback16Ex(vtbl->AddRef, WCB16_CDECL, sizeof(args), args, &ret); + return ret; +} + +static ULONG call_IMalloc_Release(SEGPTR iface) +{ + IMalloc16 *malloc = MapSL(iface); + IMalloc16Vtbl *vtbl = MapSL(malloc->lpVtbl); + DWORD args[1], ret; + + args[0] = iface; + WOWCallback16Ex(vtbl->Release, WCB16_CDECL, sizeof(args), args, &ret); + return ret; +} + static SEGPTR call_IMalloc_Alloc(SEGPTR iface, DWORD size) { IMalloc16 *malloc = MapSL(iface); @@ -288,8 +310,9 @@ SEGPTR WINAPI CoMemAlloc(DWORD size, MEMCTX context, DWORD unknown) HRESULT WINAPI CoInitialize16(SEGPTR malloc) { if (!malloc) - CoCreateStandardMalloc16(MEMCTX_TASK, &malloc); - compobj_malloc = malloc; + CoCreateStandardMalloc16(MEMCTX_TASK, &compobj_malloc); + else + call_IMalloc_AddRef(compobj_malloc = malloc); return S_OK; }
@@ -301,8 +324,11 @@ HRESULT WINAPI CoInitialize16(SEGPTR malloc) */ void WINAPI CoUninitialize16(void) { - TRACE("()\n"); - CoFreeAllLibraries(); + TRACE("\n"); + + CoFreeAllLibraries(); + call_IMalloc_Release(compobj_malloc); + compobj_malloc = 0; }
/***********************************************************************
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=42554 Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/compobj.dll16/compobj.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/compobj.dll16/compobj.c b/dlls/compobj.dll16/compobj.c index 52e5d72688..ff82f9087b 100644 --- a/dlls/compobj.dll16/compobj.c +++ b/dlls/compobj.dll16/compobj.c @@ -275,7 +275,7 @@ DWORD WINAPI CoBuildVersion16(void) */ HRESULT WINAPI CoGetMalloc16(MEMCTX context, SEGPTR *malloc) { - *malloc = compobj_malloc; + call_IMalloc_AddRef(*malloc = compobj_malloc); return S_OK; }
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/compobj.dll16/compobj.c | 34 ++++++++++++++++----------- dlls/compobj.dll16/compobj.dll16.spec | 2 +- 2 files changed, 21 insertions(+), 15 deletions(-)
diff --git a/dlls/compobj.dll16/compobj.c b/dlls/compobj.dll16/compobj.c index ff82f9087b..a634ebe637 100644 --- a/dlls/compobj.dll16/compobj.c +++ b/dlls/compobj.dll16/compobj.c @@ -111,8 +111,8 @@ static SEGPTR compobj_malloc;
typedef struct { - IMalloc16 IMalloc16_iface; - DWORD ref; + IMalloc16 IMalloc16_iface; + LONG refcount; } IMalloc16Impl;
static inline IMalloc16Impl *impl_from_IMalloc16(IMalloc16 *iface) @@ -139,21 +139,28 @@ HRESULT CDECL IMalloc16_fnQueryInterface(IMalloc16* iface,REFIID refiid,LPVOID * /****************************************************************************** * IMalloc16_AddRef [COMPOBJ.501] */ -ULONG CDECL IMalloc16_fnAddRef(IMalloc16* iface) { - IMalloc16Impl *This = impl_from_IMalloc16(iface); - - TRACE("(%p)->AddRef()\n",This); - return 1; /* cannot be freed */ +ULONG CDECL IMalloc16_fnAddRef(IMalloc16 *iface) +{ + IMalloc16Impl *malloc = impl_from_IMalloc16(iface); + ULONG refcount = InterlockedIncrement(&malloc->refcount); + TRACE("%p increasing refcount to %u.\n", malloc, refcount); + return refcount; }
/****************************************************************************** * IMalloc16_Release [COMPOBJ.502] */ -ULONG CDECL IMalloc16_fnRelease(IMalloc16* iface) { - IMalloc16Impl *This = impl_from_IMalloc16(iface); - - TRACE("(%p)->Release()\n",This); - return 1; /* cannot be freed */ +ULONG CDECL IMalloc16_fnRelease(SEGPTR iface) +{ + IMalloc16Impl *malloc = impl_from_IMalloc16(MapSL(iface)); + ULONG refcount = InterlockedDecrement(&malloc->refcount); + TRACE("%p decreasing refcount to %u.\n", malloc, refcount); + if (!refcount) + { + UnMapLS(iface); + HeapFree(GetProcessHeap(), 0, malloc); + } + return refcount; }
/****************************************************************************** @@ -257,11 +264,10 @@ static SEGPTR IMalloc16_Constructor(void) msegvt16 = MapLS( &vt16 ); } This->IMalloc16_iface.lpVtbl = msegvt16; - This->ref = 1; + This->refcount = 1; return MapLS(This); }
- /****************************************************************************** * CoBuildVersion [COMPOBJ.1] */ diff --git a/dlls/compobj.dll16/compobj.dll16.spec b/dlls/compobj.dll16/compobj.dll16.spec index 8c0456504d..04d17155ae 100644 --- a/dlls/compobj.dll16/compobj.dll16.spec +++ b/dlls/compobj.dll16/compobj.dll16.spec @@ -209,7 +209,7 @@ # WINE internal relays (for Win16 interfaces) 500 cdecl IMalloc16_QueryInterface(ptr ptr ptr) IMalloc16_fnQueryInterface 501 cdecl IMalloc16_AddRef(ptr) IMalloc16_fnAddRef -502 cdecl IMalloc16_Release(ptr) IMalloc16_fnRelease +502 cdecl IMalloc16_Release(segptr) IMalloc16_fnRelease 503 cdecl IMalloc16_Alloc(ptr long) IMalloc16_fnAlloc 504 cdecl IMalloc16_Realloc(ptr segptr long) IMalloc16_fnRealloc 505 cdecl IMalloc16_Free(ptr segptr) IMalloc16_fnFree