PsAssignImpersonationToken

INT64 __stdcall PsAssignImpersonationToken(_ETHREAD *Thread, PVOID Token){
  _ETHREAD *CurrentThread; 
  unsigned int v4; 
  INT64 result; 
  KPROCESSOR_MODE v6; 
  struct _DMA_ADAPTER *v7; 
  PVOID Object; 
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  if( !Token )
  {
    PsImpersonateClient(Thread, 0i64, 0, 0, SecurityImpersonation);
    return 0;
  }
  v6 = *((_BYTE *)CurrentThread + 562);
  Object = 0i64;
  LODWORD(result) = ObReferenceObjectByHandle(Token, 4u, (POBJECT_TYPE)SeTokenObjectType, v6, &Object, 0i64);
  if( (int)result >= 0 )
  {
    v7 = (struct _DMA_ADAPTER *)Object;
    if( *((_DWORD *)Object + 48) != 2 )
    {
      HalPutDmaAdapter((PADAPTER_OBJECT)Object);
      return 3221225640i64;
    }
    v4 = PsImpersonateClient(Thread, Object, 0, 0, (_SECURITY_IMPERSONATION_LEVEL)*((_DWORD *)Object + 49));
    HalPutDmaAdapter(v7);
    return v4;
  }
  return result;
}

Referenced by:

NtSetInformationThread