NtImpersonateThread

NTSTATUS __stdcall NtImpersonateThread(
        VOID *ServerThreadHandle,
        VOID *ClientThreadHandle,
        _SECURITY_QUALITY_OF_SERVICE *SecurityQos,
        INT64 a4,
        INT64 a5,
        INT64 a6,
        INT64 a7,
        INT64 a8){
  char PreviousMode; 
  NTSTATUS result; 
  int v13; 
  _ADAPTER_OBJECT *v14; 
  PVOID Object; 
  _SECURITY_QUALITY_OF_SERVICE ClientSecurityQos; 
  _SECURITY_CLIENT_CONTEXT ClientContext; 
  PVOID v18; 

  *(_QWORD *)&ClientSecurityQos.Length = 0i64;
  *(_DWORD *)&ClientSecurityQos.ContextTrackingMode = 0;
  memset(&ClientContext, 0i64, sizeof(ClientContext));
  PreviousMode = KeGetCurrentThread()->PreviousMode;
  if( PreviousMode && ((unsigned __int8)SecurityQos & 3) != 0 )
    ExRaiseDatatypeMisalignment();
  ClientSecurityQos = *SecurityQos;
  Object = 0i64;
  result = ObReferenceObjectByHandle(
             ClientThreadHandle,
             0x200ui64,
             (_OBJECT_TYPE *)PsThreadType,
             PreviousMode,
             &Object,
             0i64);
  if( result >= 0 )
  {
    v18 = 0i64;
    v13 = ObReferenceObjectByHandle(
            ServerThreadHandle,
            0x100ui64,
            (_OBJECT_TYPE *)PsThreadType,
            PreviousMode,
            &v18,
            0i64);
    v14 = (_ADAPTER_OBJECT *)Object;
    if( v13 >= 0 )
    {
      v13 = SeCreateClientSecurity((PETHREAD)Object, &ClientSecurityQos, 0, &ClientContext);
      if( v13 >= 0 )
      {
        v13 = SeImpersonateClientEx(&ClientContext, (PETHREAD)v18);
        HalPutDmaAdapter((PADAPTER_OBJECT)ClientContext.ClientToken);
      }
      HalPutDmaAdapter((PADAPTER_OBJECT)v18);
    }
    HalPutDmaAdapter(v14);
    return v13;
  }
  return result;
}

Referenced by:

No references.