NtAlpcCreateSecurityContext

NTSTATUS __stdcall NtAlpcCreateSecurityContext(VOID *PortHandle, UINT64 Flags, _ALPC_SECURITY_ATTR *SecurityAttribute){
  _ETHREAD *CurrentThread; 
  char PreviousMode; 
  __int64 v7; 
  __m128i v8; 
  unsigned __int64 v9; 
  unsigned __int64 v10; 
  __int64 v11; 
  int v12; 
  _SECURITY_QUALITY_OF_SERVICE *v13; 
  _ADAPTER_OBJECT *v14; 
  unsigned __int64 v16; 
  _KALPC_SECURITY_DATA *SecurityDataPointer; 
  int v18; 
  __int128 v19; 
  __int64 v20; 
  PVOID Object; 

  v19 = 0i64;
  v20 = 0i64;
  SecurityDataPointer = 0i64;
  v18 = 0;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --CurrentThread->Tcb.KernelApcDisable;
  if( (_DWORD)Flags )
  {
    v12 = -1073741811;
  }
  else
  {
    PreviousMode = KeGetCurrentThread()->PreviousMode;
    if( PreviousMode )
    {
      if( ((unsigned __int8)SecurityAttribute & 7) != 0 )
        ExRaiseDatatypeMisalignment();
      v7 = 0x7FFFFFFF0000i64;
      if( (unsigned __int64)SecurityAttribute < 0x7FFFFFFF0000i64 )
        v7 = (__int64)SecurityAttribute;
      *(_BYTE *)v7 = *(_BYTE *)v7;
      *(_BYTE *)(v7 + 23) = *(_BYTE *)(v7 + 23);
      v8 = *(__m128i *)SecurityAttribute;
      v20 = *((_QWORD *)SecurityAttribute + 2);
      v9 = _mm_srli_si128(v8, 8).m128i_u64[0];
      v10 = v9;
      if( v9 )
      {
        v11 = v9;
        if( v9 >= 0x7FFFFFFF0000i64 )
          v11 = 0x7FFFFFFF0000i64;
        SecurityDataPointer = *(_KALPC_SECURITY_DATA **)v11;
        v18 = *(_DWORD *)(v11 + 8);
      }
    }
    else
    {
      v16 = _mm_srli_si128(*(__m128i *)SecurityAttribute, 8).m128i_u64[0];
      v10 = v16;
      if( v16 )
      {
        SecurityDataPointer = *(_KALPC_SECURITY_DATA **)v16;
        v18 = *(_DWORD *)(v16 + 8);
      }
    }
    Object = 0i64;
    v12 = ObReferenceObjectByHandle(PortHandle, 1ui64, AlpcPortObjectType, PreviousMode, &Object, 0i64);
    if( v12 >= 0 )
    {
      if( !v10 )
      {
        SecurityDataPointer = *(_KALPC_SECURITY_DATA **)((char *)Object + 260);
        v18 = *((_DWORD *)Object + 67);
      }
      LOBYTE(v13) = 1;
      v14 = (_ADAPTER_OBJECT *)Object;
      v12 = AlpcpCreateSecurityContext((_ALPC_PORT *)Object, (UINT8)KeGetCurrentThread(), v13, &SecurityDataPointer);
      if( v12 >= 0 )
      {
        *((_QWORD *)SecurityAttribute + 2) = MEMORY[8];
        AlpcpDereferenceBlobEx(0i64, 1i64);
      }
      HalPutDmaAdapter(v14);
    }
  }
  KeLeaveCriticalRegionThread(KeGetCurrentThread());
  return v12;
}

Referenced by:

No references.