ObSetHandleAttributes

NTSTATUS __stdcall ObSetHandleAttributes(VOID *Handle, _OBJECT_HANDLE_FLAG_INFORMATION *HandleFlags, INT8 PreviousMode){
  unsigned __int64 v4; 
  char v5; 
  char v6; 
  _EPROCESS *Process; 
  VOID *v8; 
  INT64 v9; 
  _HANDLE_TABLE *ObjectTable; 
  _ETHREAD *CurrentThread; 
  _HANDLE_TABLE_ENTRY *v12; 
  _HANDLE_TABLE_ENTRY *v13; 
  unsigned __int64 v14; 
  unsigned int v15; 
  UINT64 v16; 
  NTSTATUS v17; 
  int v19[8]; 
  _KAPC_STATE decode_size; 

  memset(&decode_size, 0, sizeof(decode_size));
  v4 = (unsigned __int64)Handle;
  v5 = 0;
  v6 = 0;
  Process = KeGetCurrentThread()->ApcState.Process;
  if( ObpIsKernelHandle(Handle, PreviousMode) )
  {
    v4 ^= 0xFFFFFFFF80000000ui64;
    ObjectTable = HandleTable;
    if( Process != PsInitialSystemProcess )
    {
      KiStackAttachProcess(PsInitialSystemProcess, 0i64, &decode_size);
      v5 = 1;
    }
  }
  else if( KeGetCurrentThread()->ApcStateIndex == 1 )
  {
    ObjectTable = ObReferenceProcessHandleTable(Process);
    if( !ObjectTable )
      return -1073741816;
    v6 = 1;
  }
  else
  {
    ObjectTable = KeGetCurrentThread()->ApcState.Process->ObjectTable;
  }
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --CurrentThread->Tcb.KernelApcDisable;
  v12 = ExMapHandleToPointer(
          ObjectTable,
          (VOID *)v4,
          v8,
          v9,
          decode_size.ApcListHead[0].Flink,
          (INT64)decode_size.ApcListHead[0].Blink,
          decode_size.ApcListHead[1].Flink);
  v13 = v12;
  if( v12 )
  {
    v14 = (v12->LowValue >> 16) & 0xFFFFFFFFFFFFFFF0ui64;
    if( !HandleFlags->Inherit
      || (*(_DWORD *)(ObTypeIndexTable[(unsigned __int8)ObHeaderCookie ^ *(unsigned __int8 *)(v14 + 24) ^ (unsigned __int64)BYTE1(v14)]
                    + 72) & 2) == 0 )
    {
      v15 = HandleFlags->Inherit != 0 ? 2 : 0;
      v16 = v15 | 1;
      if( !HandleFlags->ProtectFromClose )
        v16 = v15;
      ExSetHandleAttributes(v13, v16, 3ui64);
    }
    _InterlockedExchangeAdd64(&v13->VolatileLowValue, 1ui64);
    _InterlockedOr(v19, 0);
    if( ObjectTable->HandleContentionEvent._bf_0 )
      ExfUnblockPushLock(&ObjectTable->HandleContentionEvent._bf_0, 0i64);
    v17 = 0;
  }
  else
  {
    v17 = -1073741790;
  }
  KeLeaveCriticalRegionThread(&CurrentThread->Tcb);
  if( v5 )
    KiUnstackDetachProcess(&decode_size, 0i64);
  if( v6 )
    ExReleaseRundownProtection(&Process->RundownProtect);
  return v17;
}

Referenced by:

NtSetInformationObject