4 * Copyright 1997 Marcus Meissner
18 #include "wine/obj_base.h"
19 #include "wine/winbase16.h"
22 #include "debugtools.h"
24 DEFAULT_DEBUG_CHANNEL(relay);
26 /* --- IUnknown implementation */
31 ICOM_VFIELD(IUnknown);
35 /******************************************************************************
36 * IUnknown_AddRef [VTABLE:IUNKNOWN.1]
38 static ULONG WINAPI IUnknown_fnAddRef(LPUNKNOWN iface) {
39 ICOM_THIS(IUnknownImpl,iface);
40 TRACE("(%p)->AddRef()\n",This);
44 /******************************************************************************
45 * IUnknown_Release [VTABLE:IUNKNOWN.2]
47 static ULONG WINAPI IUnknown_fnRelease(LPUNKNOWN iface) {
48 ICOM_THIS(IUnknownImpl,iface);
49 TRACE("(%p)->Release()\n",This);
51 HeapFree(GetProcessHeap(),0,This);
57 /******************************************************************************
58 * IUnknown_QueryInterface [VTABLE:IUNKNOWN.0]
60 static HRESULT WINAPI IUnknown_fnQueryInterface(LPUNKNOWN iface,REFIID refiid,LPVOID *obj) {
61 ICOM_THIS(IUnknownImpl,iface);
63 TRACE("(%p)->QueryInterface(%s,%p)\n",This,debugstr_guid(refiid),obj);
65 if (!memcmp(&IID_IUnknown,refiid,sizeof(IID_IUnknown))) {
69 return OLE_E_ENUM_NOMORE;
72 static ICOM_VTABLE(IUnknown) uvt =
74 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
75 IUnknown_fnQueryInterface,
80 /******************************************************************************
81 * IUnknown_Constructor [INTERNAL]
84 IUnknown_Constructor() {
87 unk = (IUnknownImpl*)HeapAlloc(GetProcessHeap(),0,sizeof(IUnknownImpl));
88 ICOM_VTBL(unk) = &uvt;
90 return (LPUNKNOWN)unk;
94 /* --- IMalloc16 implementation */
100 ICOM_VFIELD(IMalloc16);
102 /* IMalloc16 fields */
105 /******************************************************************************
106 * IMalloc16_QueryInterface [COMPOBJ.500]
108 HRESULT WINAPI IMalloc16_fnQueryInterface(IMalloc16* iface,REFIID refiid,LPVOID *obj) {
109 ICOM_THIS(IMalloc16Impl,iface);
111 TRACE("(%p)->QueryInterface(%s,%p)\n",This,debugstr_guid(refiid),obj);
112 if ( !memcmp(&IID_IUnknown,refiid,sizeof(IID_IUnknown)) ||
113 !memcmp(&IID_IMalloc,refiid,sizeof(IID_IMalloc))
118 return OLE_E_ENUM_NOMORE;
121 /******************************************************************************
122 * IMalloc16_AddRef [COMPOBJ.501]
124 ULONG WINAPI IMalloc16_fnAddRef(IMalloc16* iface) {
125 ICOM_THIS(IMalloc16Impl,iface);
126 TRACE("(%p)->AddRef()\n",This);
127 return 1; /* cannot be freed */
130 /******************************************************************************
131 * IMalloc16_Release [COMPOBJ.502]
133 ULONG WINAPI IMalloc16_fnRelease(IMalloc16* iface) {
134 ICOM_THIS(IMalloc16Impl,iface);
135 TRACE("(%p)->Release()\n",This);
136 return 1; /* cannot be freed */
139 /******************************************************************************
140 * IMalloc16_Alloc [COMPOBJ.503]
142 SEGPTR WINAPI IMalloc16_fnAlloc(IMalloc16* iface,DWORD cb) {
143 ICOM_THIS(IMalloc16Impl,iface);
144 TRACE("(%p)->Alloc(%ld)\n",This,cb);
145 return MapLS( HeapAlloc( GetProcessHeap(), 0, cb ) );
148 /******************************************************************************
149 * IMalloc16_Realloc [COMPOBJ.504]
151 SEGPTR WINAPI IMalloc16_fnRealloc(IMalloc16* iface,SEGPTR pv,DWORD cb)
154 ICOM_THIS(IMalloc16Impl,iface);
155 TRACE("(%p)->Realloc(%08lx,%ld)\n",This,pv,cb);
156 ret = MapLS( HeapReAlloc( GetProcessHeap(), 0, MapSL(pv), cb ) );
161 /******************************************************************************
162 * IMalloc16_Free [COMPOBJ.505]
164 VOID WINAPI IMalloc16_fnFree(IMalloc16* iface,SEGPTR pv)
166 void *ptr = MapSL(pv);
167 ICOM_THIS(IMalloc16Impl,iface);
168 TRACE("(%p)->Free(%08lx)\n",This,pv);
170 HeapFree( GetProcessHeap(), 0, ptr );
173 /******************************************************************************
174 * IMalloc16_GetSize [COMPOBJ.506]
176 DWORD WINAPI IMalloc16_fnGetSize(const IMalloc16* iface,SEGPTR pv)
178 ICOM_CTHIS(IMalloc16Impl,iface);
179 TRACE("(%p)->GetSize(%08lx)\n",This,pv);
180 return HeapSize( GetProcessHeap(), 0, MapSL(pv) );
183 /******************************************************************************
184 * IMalloc16_DidAlloc [COMPOBJ.507]
186 INT16 WINAPI IMalloc16_fnDidAlloc(const IMalloc16* iface,LPVOID pv) {
187 ICOM_CTHIS(IMalloc16,iface);
188 TRACE("(%p)->DidAlloc(%p)\n",This,pv);
192 /******************************************************************************
193 * IMalloc16_HeapMinimize [COMPOBJ.508]
195 LPVOID WINAPI IMalloc16_fnHeapMinimize(IMalloc16* iface) {
196 ICOM_THIS(IMalloc16Impl,iface);
197 TRACE("(%p)->HeapMinimize()\n",This);
201 /******************************************************************************
202 * IMalloc16_Constructor [VTABLE]
205 IMalloc16_Constructor()
207 static ICOM_VTABLE(IMalloc16) vt16;
208 static SEGPTR msegvt16;
210 HMODULE16 hcomp = GetModuleHandle16("COMPOBJ");
212 This = HeapAlloc( GetProcessHeap(), 0, sizeof(IMalloc16Impl) );
215 #define VTENT(x) vt16.x = (void*)GetProcAddress16(hcomp,"IMalloc16_"#x);assert(vt16.x)
216 VTENT(QueryInterface);
226 msegvt16 = MapLS( &vt16 );
228 ICOM_VTBL(This) = (ICOM_VTABLE(IMalloc16)*)msegvt16;
230 return (LPMALLOC16)MapLS( This );
234 /* --- IMalloc32 implementation */
238 /* IUnknown fields */
239 ICOM_VFIELD(IMalloc);
243 /******************************************************************************
244 * IMalloc32_QueryInterface [VTABLE]
246 static HRESULT WINAPI IMalloc_fnQueryInterface(LPMALLOC iface,REFIID refiid,LPVOID *obj) {
247 ICOM_THIS(IMalloc32Impl,iface);
249 TRACE("(%p)->QueryInterface(%s,%p)\n",This,debugstr_guid(refiid),obj);
250 if ( !memcmp(&IID_IUnknown,refiid,sizeof(IID_IUnknown)) ||
251 !memcmp(&IID_IMalloc,refiid,sizeof(IID_IMalloc))
256 return OLE_E_ENUM_NOMORE;
259 /******************************************************************************
260 * IMalloc32_AddRef [VTABLE]
262 static ULONG WINAPI IMalloc_fnAddRef(LPMALLOC iface) {
263 ICOM_THIS(IMalloc32Impl,iface);
264 TRACE("(%p)->AddRef()\n",This);
265 return 1; /* cannot be freed */
268 /******************************************************************************
269 * IMalloc32_Release [VTABLE]
271 static ULONG WINAPI IMalloc_fnRelease(LPMALLOC iface) {
272 ICOM_THIS(IMalloc32Impl,iface);
273 TRACE("(%p)->Release()\n",This);
274 return 1; /* cannot be freed */
277 /******************************************************************************
278 * IMalloc32_Alloc [VTABLE]
280 static LPVOID WINAPI IMalloc_fnAlloc(LPMALLOC iface,DWORD cb) {
282 ICOM_THIS(IMalloc32Impl,iface);
283 addr = HeapAlloc(GetProcessHeap(),0,cb);
284 TRACE("(%p)->Alloc(%ld) -> %p\n",This,cb,addr);
288 /******************************************************************************
289 * IMalloc32_Realloc [VTABLE]
291 static LPVOID WINAPI IMalloc_fnRealloc(LPMALLOC iface,LPVOID pv,DWORD cb) {
292 ICOM_THIS(IMalloc32Impl,iface);
293 TRACE("(%p)->Realloc(%p,%ld)\n",This,pv,cb);
294 return HeapReAlloc(GetProcessHeap(),0,pv,cb);
297 /******************************************************************************
298 * IMalloc32_Free [VTABLE]
300 static VOID WINAPI IMalloc_fnFree(LPMALLOC iface,LPVOID pv) {
301 ICOM_THIS(IMalloc32Impl,iface);
302 TRACE("(%p)->Free(%p)\n",This,pv);
303 HeapFree(GetProcessHeap(),0,pv);
306 /******************************************************************************
307 * IMalloc32_GetSize [VTABLE]
309 static DWORD WINAPI IMalloc_fnGetSize(LPMALLOC iface,LPVOID pv) {
310 ICOM_CTHIS(IMalloc,iface);
311 TRACE("(%p)->GetSize(%p)\n",This,pv);
312 return HeapSize(GetProcessHeap(),0,pv);
315 /******************************************************************************
316 * IMalloc32_DidAlloc [VTABLE]
318 static INT WINAPI IMalloc_fnDidAlloc(LPMALLOC iface,LPVOID pv) {
319 ICOM_CTHIS(IMalloc32Impl,iface);
320 TRACE("(%p)->DidAlloc(%p)\n",This,pv);
324 /******************************************************************************
325 * IMalloc32_HeapMinimize [VTABLE]
327 static VOID WINAPI IMalloc_fnHeapMinimize(LPMALLOC iface) {
328 ICOM_THIS(IMalloc32Impl,iface);
329 TRACE("(%p)->HeapMinimize()\n",This);
332 static ICOM_VTABLE(IMalloc) VT_IMalloc32 =
334 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
335 IMalloc_fnQueryInterface,
343 IMalloc_fnHeapMinimize
346 /******************************************************************************
347 * IMalloc32_Constructor [VTABLE]
350 IMalloc_Constructor() {
353 This = (IMalloc32Impl*)HeapAlloc(GetProcessHeap(),0,sizeof(IMalloc32Impl));
354 ICOM_VTBL(This) = &VT_IMalloc32;
356 return (LPMALLOC)This;
359 /****************************************************************************
363 /******************************************************************************
364 * IsValidInterface [OLE32.78]
367 * True, if the passed pointer is a valid interface
369 BOOL WINAPI IsValidInterface(
370 LPUNKNOWN punk /* [in] interface to be tested */
373 IsBadReadPtr(punk,4) ||
374 IsBadReadPtr(ICOM_VTBL(punk),4) ||
375 IsBadReadPtr(ICOM_VTBL(punk)->QueryInterface,9) ||
376 IsBadCodePtr((FARPROC)ICOM_VTBL(punk)->QueryInterface)