NtCreateMutant
NTSTATUS __stdcall NtCreateMutant(
VOID **MutantHandle,
_ACCESS_MASK DesiredAccess,
POBJECT_ATTRIBUTES ObjectAttributes,
BOOL InitialOwner,
VOID *a5){
VOID **v7;
char PreviousMode;
UINT64 v9;
int inserted;
VOID *v12;
VOID *v13;
UINT64 ObjectBodySize;
PVOID *Handle;
UINT64 v16;
INT64 Object;
PVOID v18;
v7 = MutantHandle;
v18 = 0i64;
Object = 0i64;
PreviousMode = KeGetCurrentThread()->PreviousMode;
if( PreviousMode )
{
MutantHandle = (VOID **)0x7FFFFFFF0000i64;
if( (unsigned __int64)v7 < 0x7FFFFFFF0000i64 )
MutantHandle = v7;
*MutantHandle = *MutantHandle;
}
LODWORD(v16) = 0;
LODWORD(Handle) = 0;
LODWORD(ObjectBodySize) = 56;
LOBYTE(v9) = PreviousMode;
LOBYTE(MutantHandle) = PreviousMode;
inserted = ObCreateObjectEx(
(UINT64)MutantHandle,
ExMutantObjectType,
ObjectAttributes,
v9,
v12,
ObjectBodySize,
(UINT64)Handle,
v16,
(VOID **)&Object,
0i64);
if( inserted >= 0 )
{
KeInitializeMutantEx(Object, InitialOwner);
LODWORD(v13) = 0;
inserted = ObInsertObjectEx((VOID *)Object, 0i64, (unsigned int)DesiredAccess, 0i64, (UINT64)v13, 0i64, &v18);
LODWORD(Object) = inserted;
if( inserted >= 0 )
*v7 = v18;
}
return inserted;
}Referenced by:
No references.