update for HEAD-2003091401
[reactos.git] / subsys / win32k / eng / mem.c
1 /*
2  *  ReactOS W32 Subsystem
3  *  Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 ReactOS Team
4  *
5  *  This program is free software; you can redistribute it and/or modify
6  *  it under the terms of the GNU General Public License as published by
7  *  the Free Software Foundation; either version 2 of the License, or
8  *  (at your option) any later version.
9  *
10  *  This program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  *  GNU General Public License for more details.
14  *
15  *  You should have received a copy of the GNU General Public License
16  *  along with this program; if not, write to the Free Software
17  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18  */
19 /* $Id$
20  *
21  * COPYRIGHT:         See COPYING in the top level directory
22  * PROJECT:           ReactOS kernel
23  * PURPOSE:           GDI Driver Memory Management Functions
24  * FILE:              subsys/win32k/eng/mem.c
25  * PROGRAMER:         Jason Filby
26  * REVISION HISTORY:
27  *                 3/7/1999: Created
28  */
29
30 #include <ddk/ntddk.h>
31 #include <ddk/winddi.h>
32
33 #define NDEBUG
34 #include <win32k/debug1.h>
35 #include <debug.h>
36
37 typedef struct _USERMEMHEADER
38   {
39   ULONG Tag;
40   ULONG MemSize;
41   }
42 USERMEMHEADER, *PUSERMEMHEADER;
43
44 /*
45  * @implemented
46  */
47 PVOID STDCALL
48 EngAllocMem(ULONG Flags,
49             ULONG MemSize,
50             ULONG Tag)
51 {
52   PVOID newMem;
53
54   newMem = ExAllocatePoolWithTag(NonPagedPool, MemSize, Tag); // FIXME: Use PagedPool when it is implemented
55
56   if(Flags == FL_ZERO_MEMORY)
57   {
58     RtlZeroMemory(newMem, MemSize);
59   }
60
61   return newMem;
62 }
63
64 /*
65  * @implemented
66  */
67 VOID STDCALL
68 EngFreeMem(PVOID Mem)
69 {
70   ExFreePool(Mem);
71 }
72
73 /*
74  * @implemented
75  */
76 PVOID STDCALL
77 EngAllocUserMem(ULONG cj, ULONG Tag)
78 {
79   PVOID NewMem = NULL;
80   NTSTATUS Status;
81   ULONG MemSize = sizeof(USERMEMHEADER) + cj;
82   PUSERMEMHEADER Header;
83
84   Status = ZwAllocateVirtualMemory(NtCurrentProcess(), &NewMem, 0, &MemSize, MEM_COMMIT, PAGE_READWRITE);
85
86   if (! NT_SUCCESS(Status))
87     {
88       return NULL;
89     }
90
91   Header = (PUSERMEMHEADER) NewMem;
92   Header->Tag = Tag;
93   Header->MemSize = cj;
94
95   return (PVOID)(Header + 1);
96 }
97
98 /*
99  * @implemented
100  */
101 VOID STDCALL
102 EngFreeUserMem(PVOID pv)
103 {
104   PUSERMEMHEADER Header = ((PUSERMEMHEADER) pv) - 1;
105   ULONG MemSize = sizeof(USERMEMHEADER) + Header->MemSize;
106
107   ZwFreeVirtualMemory(NtCurrentProcess(), (PVOID *) &Header, &MemSize, MEM_DECOMMIT);
108 }
109
110 /*
111  * @implemented
112  */
113 HANDLE STDCALL
114 EngSecureMem(PVOID Address, ULONG Length)
115 {
116   return MmSecureVirtualMemory(Address, Length, PAGE_READWRITE);
117 }
118
119 /*
120  * @implemented
121  */
122 VOID STDCALL
123 EngUnsecureMem(HANDLE Mem)
124 {
125   return MmUnsecureVirtualMemory((PVOID) Mem);
126 }
127
128 /* EOF */