//ZwCreateThread
NTSYSAPI
NTSTATUS
NTAPI
ZwCreateThread
(
OUT PHANDLE ThreadHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN HANDLE ProcessHandle,
OUT PCLIENT_ID ClientId,
IN PCONTEXT ThreadContext,
IN PUSER_STACK UserStack,
IN BOOLEAN CreateSuspended
);
typedef NTSTATUS (*ZWCREATETHREAD)
(
OUT PHANDLE ThreadHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN HANDLE ProcessHandle,
OUT PCLIENT_ID ClientId,
IN PCONTEXT ThreadContext,
IN PUSER_STACK UserStack,
IN BOOLEAN CreateSuspended
);
ZWCREATETHREAD OldZwCreateThread;
NTSTATUS HookZwCreateThread
(
OUT PHANDLE ThreadHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN HANDLE ProcessHandle,
OUT PCLIENT_ID ClientId,
IN PCONTEXT ThreadContext,
IN PUSER_STACK UserStack,
IN BOOLEAN CreateSuspended
);
HookInjectOn()
{
DbgPrint("HookInjectOn");
OldZwCreateThread = (ZWCREATETHREAD)(SYSCALL(ZwCreateThread));
_asm
{
CLI
MOV EAX,CR0
AND EAX,NOT 10000H
MOV CR0,EAX
}
(ZWCREATETHREAD)(SYSCALL(ZwCreateThread)) = HookZwCreateThread;
_asm
{
MOV EAX,CR0
OR EAX,10000H
MOV CR0,EAX
STI
}
}