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
,
176 /* Lock the memory */
177 Status
= NtLockVirtualMemory(NtCurrentProcess(),
181 if (!NT_SUCCESS(Status
))
184 SetLastErrorByStatus(Status
);
197 VirtualQuery(IN LPCVOID lpAddress
,
198 OUT PMEMORY_BASIC_INFORMATION lpBuffer
,
201 /* Call the extended API */
202 return VirtualQueryEx(NtCurrentProcess(),
213 VirtualQueryEx(IN HANDLE hProcess
,
214 IN LPCVOID lpAddress
,
215 OUT PMEMORY_BASIC_INFORMATION lpBuffer
,
221 /* Query basic information */
222 Status
= NtQueryVirtualMemory(hProcess
,
224 MemoryBasicInformation
,
228 if (!NT_SUCCESS(Status
))
231 SetLastErrorByStatus(Status
);
235 /* Return the length returned */
244 VirtualUnlock(IN LPVOID lpAddress
,
250 /* Unlock the memory */
251 Status
= NtUnlockVirtualMemory(NtCurrentProcess(),
255 if (!NT_SUCCESS(Status
))
258 SetLastErrorByStatus(Status
);
276 PULONG_PTR lpdwCount
,
277 PULONG lpdwGranularity
282 Status
= NtGetWriteWatch(GetCurrentProcess(),
290 if (!NT_SUCCESS(Status
))
292 SetLastErrorByStatus(Status
);
305 LPVOID lpBaseAddress
,
311 Status
= NtResetWriteWatch(NtCurrentProcess(),
315 if (!NT_SUCCESS(Status
))
317 SetLastErrorByStatus(Status
);
329 AllocateUserPhysicalPages(
331 PULONG_PTR NumberOfPages
,
332 PULONG_PTR UserPfnArray
337 Status
= NtAllocateUserPhysicalPages(hProcess
,
341 if (!NT_SUCCESS(Status
))
343 SetLastErrorByStatus(Status
);
355 FreeUserPhysicalPages(
357 PULONG_PTR NumberOfPages
,
363 Status
= NtFreeUserPhysicalPages(hProcess
,
367 if (!NT_SUCCESS(Status
))
369 SetLastErrorByStatus(Status
);
381 MapUserPhysicalPages(
382 PVOID VirtualAddress
,
383 ULONG_PTR NumberOfPages
,
384 PULONG_PTR PageArray OPTIONAL
389 Status
= NtMapUserPhysicalPages(VirtualAddress
,
393 if (!NT_SUCCESS(Status
))
395 SetLastErrorByStatus(Status
);
407 MapUserPhysicalPagesScatter(
408 PVOID
*VirtualAddresses
,
409 ULONG_PTR NumberOfPages
,
410 PULONG_PTR PageArray OPTIONAL
415 Status
= NtMapUserPhysicalPagesScatter(VirtualAddresses
,
419 if (!NT_SUCCESS(Status
))
421 SetLastErrorByStatus(Status
);