ObCaptureObjectStateForDuplication

NTSTATUS __stdcall ObCaptureObjectStateForDuplication(
        PVOID SourceProcess,
        VOID *SourceHandle,
        UINT64 DesiredAccess,
        UINT64 Options,
        INT8 PreviousMode,
        _OB_DUPLICATE_OBJECT_STATE *DuplicateInfo){
  char v6; 
  int v7; 
  int v10; 
  _HANDLE_TABLE *v11; 
  int v12; 
  char *v13; 
  bool v14; 
  unsigned int v15; 
  _OB_DUPLICATE_OBJECT_STATE *v16; 
  int v17; 
  __int64 v18; 
  int v19; 
  UINT64 Tag; 
  _OBJECT_HANDLE_INFORMATION SecurityDescriptor; 
  _HANDLE_TABLE_ENTRY_INFO ObjectInfo; 
  PVOID Object; 
  UINT64 AccessMask; 
  UINT64 GrantedAccess; 

  SecurityDescriptor = 0i64;
  v6 = Options;
  ObjectInfo = 0i64;
  v7 = DesiredAccess;
  Object = 0i64;
  v10 = Options & 2;
  if( (Options & 2) == 0 && (DesiredAccess & 0xCE00000) != 0 )
    return -1073741790;
  v11 = ObReferenceProcessHandleTable((_EPROCESS *)SourceProcess);
  if( !v11 )
    return -1073741558;
  LODWORD(Tag) = 1967415887;
  v12 = ObpReferenceProcessObjectByHandle(
          SourceHandle,
          (_EPROCESS *)SourceProcess,
          v11,
          PreviousMode,
          Tag,
          &Object,
          &SecurityDescriptor,
          &ObjectInfo);
  if( v12 < 0 )
  {
    ExReleaseRundownProtection((_EX_RUNDOWN_REF *)SourceProcess + 139);
    return v12;
  }
  if( (SecurityDescriptor.HandleAttributes & 4) != 0 )
    ObjectInfo.AuditMask = 0;
  v13 = (char *)Object;
  v14 = v10 == 0;
  v15 = SecurityDescriptor.GrantedAccess;
  v16 = DuplicateInfo;
  if( !v14 )
    v7 = SecurityDescriptor.GrantedAccess;
  LODWORD(AccessMask) = v7;
  v17 = SecurityDescriptor.HandleAttributes & 4 | 8;
  if( (v6 & 8) == 0 )
    v17 = SecurityDescriptor.HandleAttributes & 0xC;
  DuplicateInfo->ObjectInfo = ObjectInfo;
  v18 = ObTypeIndexTable[(unsigned __int8)ObHeaderCookie ^ (unsigned __int8)*(v13 - 24) ^ (unsigned __int64)(unsigned __int8)((unsigned __int16)((_WORD)v13 - 48) >> 8)];
  if( (v7 & 0xF0000000) != 0 )
  {
    RtlMapGenericMask(&AccessMask, (_GENERIC_MAPPING *)(v18 + 76));
    v7 = AccessMask;
  }
  LODWORD(GrantedAccess) = v7 & (*(_DWORD *)(v18 + 92) | 0x1000000);
  if( (~v15 & (unsigned int)GrantedAccess) != 0 )
  {
    ExReleaseRundownProtection((_EX_RUNDOWN_REF *)SourceProcess + 139);
    ObfDereferenceObjectWithTag(v13, 0x7544624Fui64);
    return -1073741790;
  }
  v19 = ObpIncrementHandleCountEx(ObDuplicateHandle, &GrantedAccess, SourceProcess, v13, PreviousMode, v17, 0i64);
  ExReleaseRundownProtection((_EX_RUNDOWN_REF *)SourceProcess + 139);
  if( v19 < 0 )
  {
    ObfDereferenceObjectWithTag(v13, 0x7544624Fui64);
  }
  else
  {
    v16->TargetAccess = GrantedAccess;
    v16->SourceHandle = SourceHandle;
    v16->HandleAttributes = v17;
    ObfReferenceObjectWithTag(SourceProcess, 0x7544624Fui64);
    v16->SourceProcess = (_EPROCESS *)SourceProcess;
    v16->Object = v13;
  }
  return v19;
}

Referenced by:

AlpcpCaptureHandleAttributeInternal