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.