15 PVOID kernelAddress = NULL;
16 NTSTATUS status = STATUS_SUCCESS;
19 KeStackAttachProcess(targetProcess, &apcState);
23 mdl = IoAllocateMdl(TargetAddress, (ULONG)Size, FALSE, FALSE, NULL);
25 status = STATUS_INSUFFICIENT_RESOURCES;
31 MmProbeAndLockPages(mdl, KernelMode, IoWriteAccess);
34 kernelAddress = MmGetSystemAddressForMdlSafe(mdl, NormalPagePriority);
36 status = STATUS_INSUFFICIENT_RESOURCES;
41 RtlCopyMemory(kernelAddress, DataToWrite, Size);
43 __except (EXCEPTION_EXECUTE_HANDLER) {
44 status = GetExceptionCode();
50 MmUnmapLockedPages(kernelAddress, mdl);
53 if (mdl->MdlFlags & MDL_PAGES_LOCKED) {
60 KeUnstackDetachProcess(&apcState);
63 ObDereferenceObject(targetProcess);
71 HANDLE processHandle = NULL;
73 SIZE_T allocSize = Size;
74 PVOID baseAddress = NULL;
77 status = ObOpenObjectByPointer(targetProcess,
85 if (NT_SUCCESS(status)) {
87 status = ZwAllocateVirtualMemory(processHandle,
91 MEM_COMMIT | MEM_RESERVE,
94 if (NT_SUCCESS(status)) {
96 *AllocatedAddress = baseAddress;
100 ZwClose(processHandle);
104 ObDereferenceObject(targetProcess);