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

Last change on this file since 3830 was 1655, checked in by bird, 26 years ago

Applied fix from David.

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