source: trunk/src/kernel32/heap.cpp@ 62

Last change on this file since 62 was 62, checked in by phaller, 26 years ago

Fix: Trap in LocalReAlloc fixed, handle can't always be taken for memory address and vs. vsa

File size: 12.5 KB
Line 
1/*
2 *
3 * Project Odin Software License can be found in LICENSE.TXT
4 *
5 */
6/*
7 * Win32 heap API functions for OS/2
8 *
9 * Copyright 1998 Sander van Leeuwen
10 *
11 */
12#include <os2win.h>
13#include <stdlib.h>
14#include <string.h>
15#include <misc.h>
16#define _WIN32
17#include "os2heap.h"
18
19static HANDLE processheap = NULL;
20OS2Heap *OS2ProcessHeap = NULL;
21
22//******************************************************************************
23//******************************************************************************
24LPVOID WIN32API HeapAlloc(HANDLE hHeap, DWORD dwFlags, DWORD dwBytes)
25{
26 OS2Heap *curheap = OS2Heap::find(hHeap);
27
28// dprintf(("HeapAlloc %X bytes", dwBytes));
29 if(curheap == NULL)
30 return(NULL);
31
32 return(curheap->Alloc(dwFlags, dwBytes));
33}
34//******************************************************************************
35//******************************************************************************
36LPVOID WIN32API HeapReAlloc(HANDLE hHeap, DWORD dwFlags, LPVOID lpMem, DWORD dwBytes)
37{
38 OS2Heap *curheap = OS2Heap::find(hHeap);
39
40 if(curheap == NULL)
41 return(NULL);
42
43 return(curheap->ReAlloc(dwFlags, lpMem, dwBytes));
44}
45//******************************************************************************
46//******************************************************************************
47BOOL WIN32API HeapFree(HANDLE hHeap, DWORD dwFlags, LPVOID lpMem)
48{
49 OS2Heap *curheap = OS2Heap::find(hHeap);
50
51 if(curheap == NULL)
52 return(FALSE);
53
54 return(curheap->Free(dwFlags, lpMem));
55}
56//******************************************************************************
57//******************************************************************************
58HANDLE WIN32API HeapCreate(DWORD flOptions, DWORD dwInitialSize, DWORD dwMaximumSize)
59{
60 OS2Heap *curheap;
61
62 //Create Open32 heap for it's handle
63 HANDLE hHeap = O32_HeapCreate(flOptions, 0, 4096);
64 if(hHeap == NULL)
65 return(NULL);
66
67 curheap = new OS2Heap(hHeap, flOptions, dwInitialSize, dwMaximumSize);
68 if(curheap == NULL) {
69 O32_HeapDestroy(hHeap);
70 return(NULL);
71 }
72 if(curheap->getHeapHandle() == NULL) {
73 O32_HeapDestroy(hHeap);
74 delete curheap;
75 return(NULL);
76 }
77 return(curheap->getHeapHandle());
78}
79//******************************************************************************
80//******************************************************************************
81BOOL WIN32API HeapDestroy(HANDLE hHeap)
82{
83 OS2Heap *curheap = OS2Heap::find(hHeap);
84
85 if(curheap == NULL)
86 return(FALSE);
87
88 O32_HeapDestroy(curheap->getHeapHandle());
89 delete curheap;
90 return(TRUE);
91}
92//******************************************************************************
93//******************************************************************************
94DWORD WIN32API HeapSize(HANDLE hHeap, DWORD arg2, PVOID arg3)
95{
96 OS2Heap *curheap = OS2Heap::find(hHeap);
97
98 if(curheap == NULL)
99 return(0);
100 return curheap->Size(arg2, arg3);
101}
102//******************************************************************************
103//TODO: Check this!!!
104//******************************************************************************
105DWORD WIN32API HeapCompact(HANDLE hHeap, DWORD dwFlags)
106{
107 dprintf(("KERNEL32: HeapCompact: Unknown API - stub\n"));
108 return(0);
109}
110//******************************************************************************
111//******************************************************************************
112BOOL WIN32API HeapValidate(HANDLE hHeap, DWORD dwFlags, LPCVOID lpMem)
113{
114 dprintf(("KERNEL32: HeapValidate - stub\n"));
115 return(TRUE);
116}
117//******************************************************************************
118//******************************************************************************
119BOOL WIN32API HeapUnlock(HANDLE hHeap)
120{
121 dprintf(("KERNEL32: HeapUnlock - stub (TRUE)\n"));
122 return(TRUE);
123}
124//******************************************************************************
125//******************************************************************************
126BOOL WIN32API HeapLock(HANDLE hHeap)
127{
128 dprintf(("KERNEL32: HeapLock - stub (TRUE)\n"));
129 return(TRUE);
130}
131//******************************************************************************
132// LPPROCESS_HEAP_ENTRY lpEntry
133//******************************************************************************
134BOOL WIN32API HeapWalk(HANDLE hHeap, void *lpEntry)
135{
136 dprintf(("KERNEL32: HeapWalk - stub (TRUE)\n"));
137 return(TRUE);
138}
139//******************************************************************************
140//******************************************************************************
141HANDLE WIN32API GetProcessHeap(VOID)
142{
143 HANDLE hHeap;
144
145 dprintf(("KERNEL32: OS2GetProcessHeap\n"));
146 //SvL: Only one process heap per process
147 if(processheap == NULL) {
148 //TODO: I haven't thought real hard about this. I added it just to make "hdr.exe" happy.
149 hHeap = O32_HeapCreate(HEAP_GENERATE_EXCEPTIONS, 1, 0x4000);
150 OS2ProcessHeap = new OS2Heap(hHeap, HEAP_GENERATE_EXCEPTIONS, 0x4000, 0);
151 if(OS2ProcessHeap == NULL) {
152 O32_HeapDestroy(hHeap);
153 return(NULL);
154 }
155 processheap = hHeap;
156 }
157 return(processheap);
158}
159//******************************************************************************
160//******************************************************************************
161HLOCAL WIN32API LocalAlloc(UINT fuFlags, DWORD cbBytes)
162{
163 HLOCAL lmem;
164 DWORD dwFlags = 0;
165
166 if(processheap == NULL) {
167 if(GetProcessHeap() == NULL)
168 return(NULL);
169 }
170 if(fuFlags & LMEM_ZEROINIT)
171 dwFlags = HEAP_ZERO_MEMORY;
172
173 lmem = (HLOCAL)OS2ProcessHeap->Alloc(dwFlags, cbBytes, fuFlags);
174
175 dprintf(("KERNEL32: LocalAlloc flags %X, size %d returned %X\n", dwFlags, cbBytes, lmem));
176
177 return(lmem);
178}
179//******************************************************************************
180//******************************************************************************
181HLOCAL WIN32API LocalDiscard(HLOCAL hMem)
182{
183 dprintf(("KERNEL32: LocalDiscard\n"));
184
185// return O32_LocalDiscard(arg1);
186 return(hMem); //TODO: Possible memory leak
187}
188//******************************************************************************
189//******************************************************************************
190UINT WIN32API LocalFlags(HLOCAL hMem)
191{
192 dprintf(("KERNEL32: LocalFlags %X\n", hMem));
193
194 return OS2ProcessHeap->GetFlags((LPVOID)hMem);
195}
196//******************************************************************************
197//******************************************************************************
198HLOCAL WIN32API LocalFree(HLOCAL hMem)
199{
200 dprintf(("KERNEL32: LocalFree %X\n", hMem));
201
202 if(OS2ProcessHeap->GetLockCnt((LPVOID)hMem) != 0) {
203 dprintf(("LocalFree, lock count != 0\n"));
204 return(hMem); //TODO: SetLastError
205 }
206 if(OS2ProcessHeap->Free(0, (LPVOID)hMem) == FALSE) {
207 return(hMem); //TODO: SetLastError
208 }
209 return NULL; //success
210}
211//******************************************************************************
212//******************************************************************************
213HLOCAL WIN32API LocalHandle(PCVOID lpMem)
214{
215 dprintf(("KERNEL32: LocalHandle\n"));
216
217 return (HLOCAL)lpMem;
218}
219//******************************************************************************
220//******************************************************************************
221BOOL WIN32API LocalUnlock(HLOCAL hMem)
222{
223 dprintf(("KERNEL32: LocalUnlock %X\n", hMem));
224
225 return OS2ProcessHeap->Unlock((LPVOID)hMem);
226}
227//******************************************************************************
228//TODO: cbBytes==0 && fuFlags & LMEM_MOVEABLE not handled!!
229//******************************************************************************
230HLOCAL WIN32API LocalReAlloc(HLOCAL hMem, DWORD cbBytes, UINT fuFlags)
231{
232 HLOCAL hLocalNew;
233 LPVOID lpMem;
234
235 dprintf(("KERNEL32: LocalReAlloc %X %d %X\n", hMem, cbBytes, fuFlags));
236
237 //SvL: 8-8-'98: Notepad bugfix (assumes address is identical when new size < old size)
238 if(OS2ProcessHeap->Size(0, (LPVOID)hMem) > cbBytes)
239 return hMem;
240
241 hLocalNew = LocalAlloc(fuFlags, cbBytes);
242 if (hLocalNew != 0)
243 {
244 lpMem = LocalLock(hLocalNew);
245
246 if (lpMem != NULL) /* copy memory if successful */
247 memcpy(lpMem,
248 (LPVOID)hMem,
249 min(cbBytes, OS2ProcessHeap->Size(0, (LPVOID)hMem))
250 );
251
252 LocalUnlock(hLocalNew);
253 OS2ProcessHeap->Free(0, (LPVOID)hMem);
254 }
255 return(hLocalNew);
256}
257//******************************************************************************
258//******************************************************************************
259UINT WIN32API LocalSize(HLOCAL hMem)
260{
261 dprintf(("KERNEL32: LocalSize %X\n", hMem));
262
263 return OS2ProcessHeap->Size(0, (PVOID)hMem);
264}
265//******************************************************************************
266//******************************************************************************
267PVOID WIN32API LocalLock(HLOCAL hMem)
268{
269 dprintf(("KERNEL32: LocalLock %X\n", hMem));
270
271 OS2ProcessHeap->Lock((LPVOID)hMem);
272 return (PVOID)hMem;
273}
274//******************************************************************************
275
276//******************************************************************************
277//* this function is here for completeness, some stupid software requires it.
278UINT WIN32API LocalShrink(HLOCAL hMem,
279 UINT cbNewSize)
280{
281 dprintf(("KERNEL32: LocalShrink %X, %08xh - stub (cbNewSize)\n",
282 hMem,
283 cbNewSize));
284
285 return cbNewSize;
286}
287//******************************************************************************
288
289//******************************************************************************
290//* this function is here for completeness, mIRC/32 requires it.
291UINT WIN32API LocalCompact(UINT cbNewSize)
292{
293 dprintf(("KERNEL32: LocalCompact %08xh - stub (cbNewSize)\n",
294 cbNewSize));
295
296 return cbNewSize;
297}
298//******************************************************************************
299//******************************************************************************
300HGLOBAL WIN32API GlobalAlloc(UINT fuFlags, DWORD dwBytes)
301{
302 dprintf(("KERNEL32: GlobalAlloc %d\n", dwBytes));
303
304 return O32_GlobalAlloc(fuFlags, dwBytes);
305}
306//******************************************************************************
307//******************************************************************************
308HGLOBAL WIN32API GlobalFree( HGLOBAL arg1)
309{
310 dprintf(("KERNEL32: GlobalFree\n"));
311
312 return O32_GlobalFree(arg1);
313}
314//******************************************************************************
315//******************************************************************************
316HGLOBAL WIN32API GlobalHandle( LPCVOID arg1)
317{
318 dprintf(("KERNEL32: OS2GlobalHandle\n"));
319
320 return O32_GlobalHandle((LPVOID)arg1);
321}
322//******************************************************************************
323//******************************************************************************
324UINT WIN32API GlobalFlags(HGLOBAL arg1)
325{
326 dprintf(("KERNEL32: OS2GlobalFlags\n"));
327
328 return O32_GlobalFlags(arg1);
329}
330//******************************************************************************
331//******************************************************************************
332DWORD WIN32API GlobalCompact(DWORD dwMinFree)
333{
334 dprintf(("KERNEL32: GlobalCompact, OBSOLETE - stub\n"));
335
336 return(0);
337}
338//******************************************************************************
339//******************************************************************************
340PVOID WIN32API GlobalLock(HGLOBAL arg1)
341{
342 dprintf(("KERNEL32: GlobalLock\n"));
343
344 return O32_GlobalLock(arg1);
345}
346//******************************************************************************
347//******************************************************************************
348HGLOBAL WIN32API GlobalReAlloc(HGLOBAL arg1, DWORD arg2, UINT arg3)
349{
350 dprintf(("KERNEL32: GlobalReAlloc\n"));
351
352 return O32_GlobalReAlloc(arg1, arg2, arg3);
353}
354//******************************************************************************
355//******************************************************************************
356DWORD WIN32API GlobalSize(HGLOBAL arg1)
357{
358 dprintf(("KERNEL32: GlobalSize\n"));
359
360 return O32_GlobalSize(arg1);
361}
362//******************************************************************************
363//******************************************************************************
364BOOL WIN32API GlobalUnlock(HGLOBAL arg1)
365{
366 dprintf(("KERNEL32: GlobalUnlock\n"));
367
368 return O32_GlobalUnlock(arg1);
369}
370//******************************************************************************
371//******************************************************************************
Note: See TracBrowser for help on using the repository browser.