| 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 | //{ |
no test coverage detected