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

Last change on this file since 2016 was 1718, checked in by sandervl, 26 years ago

Fixed ReadFile & aliased memory problems

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