source: trunk/src/ole32/taskmem.cpp@ 291

Last change on this file since 291 was 291, checked in by davidr, 26 years ago

Updated clsid handling to correctly draw textual clsid's
Fixed GUID instansiation.
Moved initialisation to OLE32.CPP
Added many new APIs incl. CoCreateInstance & CoGetClassObject.
Many partially implemented stubs completed and moved to OLE32.CPP
Running Object Table implemented (Moniker.cpp)
IMalloc & Task Memory implemented.

File size: 7.5 KB
Line 
1/*
2 *
3 * Project Odin Software License can be found in LICENSE.TXT
4 *
5 */
6/*
7 * COM/OLE memory management functions.
8 *
9 * 7/7/99
10 *
11 * Copyright 1999 David J. Raison
12 *
13 * Some portions from Wine Implementation
14 * Copyright 1997 Marcus Meissner
15 */
16
17#include "ole32.h"
18
19#include "oString.h"
20
21// ======================================================================
22// Prototypes.
23// ======================================================================
24static HRESULT WIN32API IMalloc_fnQueryInterface(LPMALLOC iface, REFIID refiid, LPVOID * obj) ;
25static ULONG WIN32API IMalloc_fnAddRef(LPMALLOC iface) ;
26static ULONG WIN32API IMalloc_fnRelease(LPMALLOC iface) ;
27static LPVOID WIN32API IMalloc_fnAlloc(LPMALLOC iface, DWORD cb);
28static LPVOID WIN32API IMalloc_fnRealloc(LPMALLOC iface, LPVOID pv, DWORD cb);
29static VOID WIN32API IMalloc_fnFree(LPMALLOC iface, LPVOID pv);
30static DWORD WIN32API IMalloc_fnGetSize(const IMalloc* iface, LPVOID pv);
31static INT WIN32API IMalloc_fnDidAlloc(const IMalloc* iface, LPVOID pv);
32static LPVOID WIN32API IMalloc_fnHeapMinimize(LPMALLOC iface);
33static LPMALLOC IMalloc_Constructor();
34
35// ======================================================================
36// Local Data
37// ======================================================================
38typedef struct
39{
40 /* IUnknown fields */
41 ICOM_VTABLE(IMalloc)* lpvtbl;
42 DWORD ref;
43} IMallocImpl;
44
45static ICOM_VTABLE(IMalloc) VT_IMalloc =
46{
47 IMalloc_fnQueryInterface,
48 IMalloc_fnAddRef,
49 IMalloc_fnRelease,
50 IMalloc_fnAlloc,
51 IMalloc_fnRealloc,
52 IMalloc_fnFree,
53 IMalloc_fnGetSize,
54 IMalloc_fnDidAlloc,
55 IMalloc_fnHeapMinimize
56};
57
58LPMALLOC currentMalloc32 = NULL;
59
60// ======================================================================
61// Public API's
62// ======================================================================
63
64// ----------------------------------------------------------------------
65// CoTaskMemAlloc
66// ----------------------------------------------------------------------
67LPVOID WIN32API CoTaskMemAlloc(ULONG cb)
68{
69 dprintf(("OLE32: CoTaskMemAlloc(%lu)", cb));
70
71 return HeapAlloc(GetProcessHeap(), 0, cb);
72}
73
74// ----------------------------------------------------------------------
75// CoTaskMemFree
76// ----------------------------------------------------------------------
77void WIN32API CoTaskMemFree(void *pv)
78{
79 dprintf(("OLE32: CoTaskMemFree"));
80
81 HeapFree(GetProcessHeap(), 0, pv);
82}
83
84// ----------------------------------------------------------------------
85// CoTaskMemRealloc
86// ----------------------------------------------------------------------
87LPVOID WIN32API CoTaskMemRealloc(LPVOID pv, ULONG cb)
88{
89 dprintf(("OLE32: CoTaskMemRealloc(%lu)", cb));
90
91 return HeapReAlloc(GetProcessHeap(), 0, pv, cb);
92}
93
94// ----------------------------------------------------------------------
95// CoGetMalloc
96// ----------------------------------------------------------------------
97HRESULT WIN32API CoGetMalloc(DWORD dwMemContext, LPMALLOC *ppMalloc)
98{
99 dprintf(("OLE32: CoGetMalloc"));
100
101 if(!currentMalloc32)
102 currentMalloc32 = IMalloc_Constructor();
103
104 *ppMalloc = currentMalloc32;
105 return S_OK;
106}
107
108// ----------------------------------------------------------------------
109// IsValidInterface32
110// ----------------------------------------------------------------------
111BOOL WIN32API IsValidInterface( LPUNKNOWN punk) /* [in] interface to be tested */
112{
113 dprintf(("OLE32: IsValidInterface"));
114
115 return !(IsBadReadPtr(punk, 4)
116 || IsBadReadPtr(punk->lpvtbl, 4)
117 || IsBadReadPtr(punk->lpvtbl->fnQueryInterface, 9)
118 || IsBadCodePtr((FARPROC)punk->lpvtbl->fnQueryInterface) );
119}
120
121// ======================================================================
122// IMalloc implementation
123// ======================================================================
124
125// ----------------------------------------------------------------------
126// IMalloc_Constructor
127// ----------------------------------------------------------------------
128static LPMALLOC IMalloc_Constructor()
129{
130 IMallocImpl* This;
131
132 This = (IMallocImpl*)HeapAlloc(GetProcessHeap(), 0, sizeof(IMallocImpl));
133 This->lpvtbl = &VT_IMalloc;
134 This->ref = 1;
135 return (LPMALLOC)This;
136}
137
138// ----------------------------------------------------------------------
139// IMalloc_fnQueryInterface
140// ----------------------------------------------------------------------
141static HRESULT WIN32API IMalloc_fnQueryInterface(LPMALLOC iface, REFIID refiid, LPVOID * obj)
142{
143 ICOM_THIS(IMallocImpl, iface);
144
145 oStringA tRefiid(refiid);
146 dprintf(("OLE32: IMalloc_fnQueryInterface(%s)", (char *)tRefiid));
147
148 if (!memcmp(&IID_IUnknown, refiid, sizeof(IID_IUnknown))
149 || !memcmp(&IID_IMalloc, refiid, sizeof(IID_IMalloc)))
150 {
151 *obj = This;
152 return S_OK;
153 }
154 return OLE_E_ENUM_NOMORE;
155}
156
157// ----------------------------------------------------------------------
158// IMalloc_fnAddRef
159// ----------------------------------------------------------------------
160static ULONG WIN32API IMalloc_fnAddRef(LPMALLOC iface)
161{
162 ICOM_THIS(IMallocImpl, iface);
163
164 dprintf(("OLE32: IMalloc_fnAddRef"));
165
166 return 1; /* cannot be freed */
167}
168
169// ----------------------------------------------------------------------
170// IMalloc_fnRelease
171// ----------------------------------------------------------------------
172static ULONG WIN32API IMalloc_fnRelease(LPMALLOC iface)
173{
174 ICOM_THIS(IMallocImpl, iface);
175
176 dprintf(("OLE32: IMalloc_fnRelease"));
177
178 return 1; /* cannot be freed */
179}
180
181// ----------------------------------------------------------------------
182// IMalloc_fnAlloc
183// ----------------------------------------------------------------------
184static LPVOID WIN32API IMalloc_fnAlloc(LPMALLOC iface, DWORD cb)
185{
186 ICOM_THIS(IMallocImpl, iface);
187
188 dprintf(("OLE32: IMalloc_fnAlloc"));
189
190 return HeapAlloc(GetProcessHeap(), 0, cb);
191}
192
193// ----------------------------------------------------------------------
194// IMalloc_fnRealloc
195// ----------------------------------------------------------------------
196static LPVOID WIN32API IMalloc_fnRealloc(LPMALLOC iface, LPVOID pv, DWORD cb)
197{
198 ICOM_THIS(IMallocImpl, iface);
199
200 dprintf(("OLE32: IMalloc_fnRealloc"));
201
202 return HeapReAlloc(GetProcessHeap(), 0, pv, cb);
203}
204
205// ----------------------------------------------------------------------
206// IMalloc_fnFree
207// ----------------------------------------------------------------------
208static VOID WIN32API IMalloc_fnFree(LPMALLOC iface, LPVOID pv)
209{
210 ICOM_THIS(IMallocImpl, iface);
211
212 dprintf(("OLE32: IMalloc_fnFree"));
213
214 HeapFree(GetProcessHeap(), 0, pv);
215}
216
217// ----------------------------------------------------------------------
218// IMalloc_fnGetSize
219// ----------------------------------------------------------------------
220static DWORD WIN32API IMalloc_fnGetSize(const IMalloc* iface, LPVOID pv)
221{
222 ICOM_THIS(IMallocImpl, iface);
223
224 dprintf(("OLE32: IMalloc_fnGetSize"));
225
226 return HeapSize(GetProcessHeap(), 0, pv);
227}
228
229// ----------------------------------------------------------------------
230// IMalloc_fnDidAlloc
231// ----------------------------------------------------------------------
232static INT WIN32API IMalloc_fnDidAlloc(const IMalloc* iface, LPVOID pv)
233{
234 ICOM_THIS(IMallocImpl, iface);
235
236 dprintf(("OLE32: IMalloc_fnDidAlloc"));
237
238 return -1;
239}
240
241// ----------------------------------------------------------------------
242// IMalloc_fnHeapMinimize
243// ----------------------------------------------------------------------
244static LPVOID WIN32API IMalloc_fnHeapMinimize(LPMALLOC iface)
245{
246 ICOM_THIS(IMallocImpl, iface);
247
248 dprintf(("OLE32: IMalloc_fnHeapMinimize"));
249
250 return NULL;
251}
252
Note: See TracBrowser for help on using the repository browser.