MCPcopy Create free account
hub / github.com/Astronaut00/DoubleDataPointer / WriteProcessMemory

Function WriteProcessMemory

Driver/core.cpp:199–228  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

197 }
198
199 NTSTATUS WriteProcessMemory(int pid, uint64_t Address, uint64_t AllocatedBuffer, SIZE_T size, SIZE_T* written)
200 {
201 PEPROCESS pProcess = NULL;
202 if (pid == 0) return STATUS_UNSUCCESSFUL;
203
204 NTSTATUS NtRet = PsLookupProcessByProcessId((HANDLE)pid, &pProcess);
205 if (NtRet != STATUS_SUCCESS) return NtRet;
206
207 ULONG_PTR process_dirbase = GetProcessCr3(pProcess);
208 ObDereferenceObject(pProcess);
209
210 SIZE_T CurOffset = 0;
211 SIZE_T TotalSize = size;
212 while (TotalSize)
213 {
214 uint64_t CurPhysAddr = TranslateLinearAddress(process_dirbase, (ULONG64)Address + CurOffset);
215 if (!CurPhysAddr) return STATUS_UNSUCCESSFUL;
216
217 ULONG64 WriteSize = min(PAGE_SIZE - (CurPhysAddr & 0xFFF), TotalSize);
218 SIZE_T BytesWritten = 0;
219 NtRet = WritePhysicalAddress(CurPhysAddr, (PVOID)((ULONG64)AllocatedBuffer + CurOffset), WriteSize, &BytesWritten);
220 TotalSize -= BytesWritten;
221 CurOffset += BytesWritten;
222 if (NtRet != STATUS_SUCCESS) break;
223 if (BytesWritten == 0) break;
224 }
225
226 *written = CurOffset;
227 return NtRet;
228 }
229
230 //NTSTATUS GetModuleBaseAddress(int processId, const char* moduleName, uint64_t* baseAddress)
231 //{

Calls 3

GetProcessCr3Function · 0.85
TranslateLinearAddressFunction · 0.85
WritePhysicalAddressFunction · 0.85

Tested by

no test coverage detected