2 * PROJECT: ReactOS Win32 Base API
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: dll/win32/kernel32/mem/virtual.c
5 * PURPOSE: Handles virtual memory APIs
6 * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)
9 /* INCLUDES ******************************************************************/
16 /* FUNCTIONS *****************************************************************/
23 VirtualAllocEx(IN HANDLE hProcess
,
26 IN DWORD flAllocationType
,
31 /* Allocate the memory */
32 Status
= NtAllocateVirtualMemory(hProcess
,
38 if (!NT_SUCCESS(Status
))
41 SetLastErrorByStatus(Status
);
45 /* Return the allocated address */
54 VirtualAlloc(IN LPVOID lpAddress
,
56 IN DWORD flAllocationType
,
59 /* Call the extended API */
60 return VirtualAllocEx(GetCurrentProcess(),
72 VirtualFreeEx(IN HANDLE hProcess
,
79 if (dwSize
== 0 || !(dwFreeType
& MEM_RELEASE
))
82 Status
= NtFreeVirtualMemory(hProcess
,
86 if (!NT_SUCCESS(Status
))
89 SetLastErrorByStatus(Status
);
97 SetLastErrorByStatus(STATUS_INVALID_PARAMETER
);
106 VirtualFree(IN LPVOID lpAddress
,
110 /* Call the extended API */
111 return VirtualFreeEx(GetCurrentProcess(),
122 VirtualProtect(IN LPVOID lpAddress
,
124 IN DWORD flNewProtect
,
125 OUT PDWORD lpflOldProtect
)
127 /* Call the extended API */
128 return VirtualProtectEx(GetCurrentProcess(),
140 VirtualProtectEx(IN HANDLE hProcess
,
143 IN DWORD flNewProtect
,
144 OUT PDWORD lpflOldProtect
)
148 /* Change the protection */
149 Status
= NtProtectVirtualMemory(hProcess
,
153 (PULONG
)lpflOldProtect
);
154 if (!NT_SUCCESS(Status
))
157 SetLastErrorByStatus(Status
);
170 VirtualLock(IN LPVOID lpAddress
,
174 ULONG RegionSize
= dwSize
;
175 PVOID BaseAddress
= lpAddress
;
177 /* Lock the memory */
178 Status
= NtLockVirtualMemory(NtCurrentProcess(),
182 if (!NT_SUCCESS(Status
))
185 SetLastErrorByStatus(Status
);
198 VirtualQuery(IN LPCVOID lpAddress
,
199 OUT PMEMORY_BASIC_INFORMATION lpBuffer
,
202 /* Call the extended API */
203 return VirtualQueryEx(NtCurrentProcess(),
214 VirtualQueryEx(IN HANDLE hProcess
,
215 IN LPCVOID lpAddress
,
216 OUT PMEMORY_BASIC_INFORMATION lpBuffer
,
222 /* Query basic information */
223 Status
= NtQueryVirtualMemory(hProcess
,
225 MemoryBasicInformation
,
229 if (!NT_SUCCESS(Status
))
232 SetLastErrorByStatus(Status
);
236 /* Return the length returned */
245 VirtualUnlock(IN LPVOID lpAddress
,
249 ULONG RegionSize
= dwSize
;
250 PVOID BaseAddress
= lpAddress
;
252 /* Lock the memory */
253 Status
= NtUnlockVirtualMemory(NtCurrentProcess(),
257 if (!NT_SUCCESS(Status
))
260 SetLastErrorByStatus(Status
);
278 PULONG_PTR lpdwCount
,
279 PULONG lpdwGranularity
284 Status
= NtGetWriteWatch(GetCurrentProcess(),
292 if (!NT_SUCCESS(Status
))
294 SetLastErrorByStatus(Status
);
307 LPVOID lpBaseAddress
,
313 Status
= NtResetWriteWatch(NtCurrentProcess(),
317 if (!NT_SUCCESS(Status
))
319 SetLastErrorByStatus(Status
);
331 AllocateUserPhysicalPages(
333 PULONG_PTR NumberOfPages
,
334 PULONG_PTR UserPfnArray
339 Status
= NtAllocateUserPhysicalPages(hProcess
,
343 if (!NT_SUCCESS(Status
))
345 SetLastErrorByStatus(Status
);
357 FreeUserPhysicalPages(
359 PULONG_PTR NumberOfPages
,
365 Status
= NtFreeUserPhysicalPages(hProcess
,
369 if (!NT_SUCCESS(Status
))
371 SetLastErrorByStatus(Status
);
383 MapUserPhysicalPages(
384 PVOID VirtualAddress
,
385 ULONG_PTR NumberOfPages
,
386 PULONG_PTR PageArray OPTIONAL
391 Status
= NtMapUserPhysicalPages(VirtualAddress
,
395 if (!NT_SUCCESS(Status
))
397 SetLastErrorByStatus(Status
);
409 MapUserPhysicalPagesScatter(
410 PVOID
*VirtualAddresses
,
411 ULONG_PTR NumberOfPages
,
412 PULONG_PTR PageArray OPTIONAL
417 Status
= NtMapUserPhysicalPagesScatter(VirtualAddresses
,
421 if (!NT_SUCCESS(Status
))
423 SetLastErrorByStatus(Status
);