NtCreateDebugObject
NTSTATUS __stdcall NtCreateDebugObject(
VOID **DebugObjectHandle,
_ACCESS_MASK DesiredAccess,
POBJECT_ATTRIBUTES ObjectAttributes,
UINT64 Flags,
VOID *a5){
char v5;
VOID **v7;
char PreviousMode;
NTSTATUS result;
PRKEVENT v10;
_EWOW64PROCESS *WoW64Process;
unsigned __int16 Machine;
VOID *v13;
VOID *v14;
UINT64 ObjectBodySize;
PVOID *Handle;
UINT64 v17;
PRKEVENT Event;
PVOID v19;
v5 = Flags;
v7 = DebugObjectHandle;
v19 = 0i64;
Event = 0i64;
PreviousMode = KeGetCurrentThread()->PreviousMode;
if( PreviousMode )
{
DebugObjectHandle = (VOID **)0x7FFFFFFF0000i64;
if( (unsigned __int64)v7 < 0x7FFFFFFF0000i64 )
DebugObjectHandle = v7;
*DebugObjectHandle = *DebugObjectHandle;
}
*v7 = 0i64;
if( (Flags & 0xFFFFFFFE) != 0 )
return -1073741811;
LODWORD(v17) = 0;
LODWORD(Handle) = 0;
LODWORD(ObjectBodySize) = 104;
LOBYTE(Flags) = PreviousMode;
LOBYTE(DebugObjectHandle) = PreviousMode;
result = ObCreateObjectEx(
(UINT64)DebugObjectHandle,
DbgkDebugObjectType,
ObjectAttributes,
Flags,
v13,
ObjectBodySize,
(UINT64)Handle,
v17,
(VOID **)&Event,
0i64);
if( result >= 0 )
{
v10 = Event;
*((_DWORD *)Event + 6) = 1;
*((_QWORD *)v10 + 4) = 0i64;
*((_DWORD *)v10 + 10) = 0;
KeInitializeEvent((INT64)v10 + 48, 1, 0);
*((_QWORD *)v10 + 11) = (char *)v10 + 80;
*((_QWORD *)v10 + 10) = (char *)v10 + 80;
KeInitializeEvent((INT64)v10, 0, 0);
if( (v5 & 1) != 0 )
*((_DWORD *)v10 + 24) = 2;
else
*((_DWORD *)v10 + 24) = 0;
WoW64Process = KeGetCurrentThread()->ApcState.Process->WoW64Process;
if( WoW64Process )
{
Machine = WoW64Process->Machine;
if( Machine == 332 || Machine == 452 )
*((_DWORD *)v10 + 24) |= 4u;
}
LODWORD(v14) = 0;
result = ObInsertObjectEx(Event, 0i64, (unsigned int)DesiredAccess, 0i64, (UINT64)v14, 0i64, &v19);
if( result >= 0 )
*v7 = v19;
}
return result;
}Referenced by:
No references.