MCPcopy Create free account
hub / github.com/NoMercy-ac/NoMercy / OperateProcessMemory

Function OperateProcessMemory

Source/Client/NM_Sys/API/ProcessesUtils.cpp:302–391  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

300
301 _IRQL_requires_max_(APC_LEVEL)
302 NTSTATUS OperateProcessMemory(PEPROCESS Process, __in_data_source(USER_MODE) PVOID BaseAddress, PVOID Buffer, ULONG Size, MEMORY_OPERATION_TYPE Operation)
303 {
304 if (!Process)
305 return STATUS_INVALID_PARAMETER_1;
306
307 if (!BaseAddress || AddressRange::IsKernelAddress(BaseAddress))
308 return STATUS_INVALID_PARAMETER_2;
309
310 if (!Buffer)
311 return STATUS_INVALID_PARAMETER_3;
312
313 if (!Size)
314 return STATUS_INVALID_PARAMETER_4;
315
316 // Attempt to lock process memory from freeing:
317 HANDLE hProcessSecure = NULL;
318 if (!VirtualMemory::SecureProcessMemory(Process, BaseAddress, Size, PAGE_READONLY, &hProcessSecure))
319 return STATUS_NOT_LOCKED;
320
321 // Attempt to lock buffer memory if it is usermode memory:
322 HANDLE hBufferSecure = NULL;
323 BOOLEAN IsBufferUsermode = AddressRange::IsUserAddress(Buffer);
324 if (IsBufferUsermode)
325 {
326 if (!VirtualMemory::SecureMemory(Buffer, Size, PAGE_READWRITE, &hBufferSecure))
327 {
328 VirtualMemory::UnsecureProcessMemory(Process, hProcessSecure);
329 return STATUS_NOT_LOCKED;
330 }
331 }
332
333 // Attempt to map process memory:
334 Mdl::MAPPING_INFO ProcessMapping = {};
335 NTSTATUS Status = Mdl::MapMemory(&ProcessMapping, Process, NULL, BaseAddress, Size);
336
337 if (!NT_SUCCESS(Status))
338 {
339 VirtualMemory::UnsecureProcessMemory(Process, hProcessSecure);
340
341 if (IsBufferUsermode)
342 VirtualMemory::UnsecureMemory(hBufferSecure);
343
344 return STATUS_NOT_MAPPED_VIEW;
345 }
346
347 // Attempt to map buffer memory:
348 Mdl::MAPPING_INFO BufferMapping = {};
349
350 Status = Mdl::MapMemory(&BufferMapping, NULL, NULL, Buffer, Size);
351 if (!NT_SUCCESS(Status))
352 {
353 Mdl::UnmapMemory(&ProcessMapping);
354
355 VirtualMemory::UnsecureProcessMemory(Process, hProcessSecure);
356
357 if (IsBufferUsermode)
358 VirtualMemory::UnsecureMemory(hBufferSecure);
359

Callers 2

ReadProcessMemoryFunction · 0.85
WriteProcessMemoryFunction · 0.85

Calls 8

IsKernelAddressFunction · 0.85
SecureProcessMemoryFunction · 0.85
IsUserAddressFunction · 0.85
SecureMemoryFunction · 0.85
UnsecureProcessMemoryFunction · 0.85
MapMemoryFunction · 0.85
UnsecureMemoryFunction · 0.85
UnmapMemoryFunction · 0.85

Tested by

no test coverage detected