PspCreatePicoThread

__int64 __fastcall PspCreatePicoThread(__int64 a1, __int64 a2, __int64 *a3){
  struct _EX_RUNDOWN_REF *v6; 
  _ETHREAD *CurrentThread; 
  unsigned int v8; 
  int Thread; 
  __int64 v10; 
  INT64 *v11; 
  INT64 a9; 
  PADAPTER_OBJECT DmaAdapter; 
  PVOID Object; 
  __int64 a10; 
  INT64 a6[2]; 
  __int64 v18; 
  INT64 result[66]; 
  INT32 v20[15]; 
  __int16 v21; 
  __int16 v22; 
  __int64 v23; 
  __int64 v24; 
  __int64 v25; 
  __int64 v26; 
  __int64 v27; 
  __int64 v28; 
  __int64 v29; 
  __int64 v30; 
  __int64 v31; 
  __int64 v32; 
  __int64 v33; 
  __int64 v34; 
  __int64 v35; 
  __int64 v36; 
  INT64 a12[50]; 
  memset((INT64)result, 0i64);
  v6 = 0i64;
  LODWORD(a9) = 0;
  a10 = 0i64;
  memset((INT64)a12, 0i64);
  DmaAdapter = 0i64;
  v18 = 0i64;
  *(_OWORD *)a6 = 0i64;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v8 = 0;
  Object = 0i64;
  if( !*(_QWORD *)(a1 + 184) )
  {
    v6 = (struct _EX_RUNDOWN_REF *)Object;
    Thread = -1073741811;
    goto LABEL_18;
  }
  Thread = ObReferenceObjectByHandleWithTag(
             *(HANDLE *)a1,
             2u,
             (POBJECT_TYPE)PsProcessType,
             0,
             0x72437350u,
             &Object,
             0i64);
  if( Thread >= 0 )
  {
    v6 = (struct _EX_RUNDOWN_REF *)Object;
    if( *((_QWORD *)Object + 280) )
    {
      --*((_WORD *)CurrentThread + 242);
      v8 = 1;
      if( ExAcquireRundownProtection(v6 + 139) )
      {
        v8 = 3;
        ObfReferenceObjectWithTag(v6, 0x72437350u);
        memset((INT64)v20, 0i64);
        PspCreateUserContext((INT64)v20, 0, *(_QWORD *)(a1 + 16), *(_QWORD *)(a1 + 24), *(_QWORD *)(a1 + 32));
        v10 = *(_QWORD *)(a1 + 8);
        v21 = *(_WORD *)(a1 + 56);
        v22 = *(_WORD *)(a1 + 58);
        a6[1] = *(_QWORD *)(a1 + 40);
        v18 = *(_QWORD *)(a1 + 48);
        v23 = *(_QWORD *)(a1 + 64);
        v24 = *(_QWORD *)(a1 + 72);
        v28 = *(_QWORD *)(a1 + 96);
        v27 = *(_QWORD *)(a1 + 104);
        v26 = *(_QWORD *)(a1 + 112);
        v29 = *(_QWORD *)(a1 + 120);
        v30 = *(_QWORD *)(a1 + 128);
        v31 = *(_QWORD *)(a1 + 136);
        v32 = *(_QWORD *)(a1 + 144);
        v33 = *(_QWORD *)(a1 + 152);
        v34 = *(_QWORD *)(a1 + 160);
        v35 = *(_QWORD *)(a1 + 168);
        v36 = *(_QWORD *)(a1 + 176);
        v25 = v10;
        LODWORD(a9) = 1;
        a6[0] = 0i64;
        Thread = PspAllocateThread(
                   (INT64)v6,
                   0i64,
                   0,
                   0i64,
                   v20,
                   (INT64)a6,
                   0i64,
                   0i64,
                   (INT64)&a9,
                   (INT64)&DmaAdapter,
                   0i64,
                   (INT64)a12);
        if( Thread < 0 )
        {
          DmaAdapter = 0i64;
LABEL_17:
          ExReleaseRundownProtection(v6 + 139);
          goto LABEL_18;
        }
        v11 = 0i64;
        if( a2 )
        {
          result[57] = a2;
          v11 = result;
        }
        *(_QWORD *)&DmaAdapter[94].Version = *(_QWORD *)(a1 + 184);
        Thread = PspInsertThread(
                   DmaAdapter,
                   (ULONG_PTR)v6,
                   0i64,
                   &a9,
                   0x1FFFFF,
                   0i64,
                   (__int64)v11,
                   0i64,
                   (PACCESS_STATE)a12,
                   (__int64)&a10,
                   0i64);
        if( Thread >= 0 )
        {
          _interlockedbittestandset((volatile signed __int32 *)&DmaAdapter[81], 0x14u);
          Thread = 0;
          v6 = (struct _EX_RUNDOWN_REF *)Object;
          *a3 = a10;
        }
      }
      else
      {
        Thread = -1073741558;
      }
    }
    else
    {
      Thread = -1073741816;
    }
  }
  if( DmaAdapter )
    HalPutDmaAdapter(DmaAdapter);
  if( v8 >= 2 )
    goto LABEL_17;
LABEL_18:
  if( (v8 & 1) != 0 )
    KeLeaveCriticalRegionThread((__int64)CurrentThread);
  if( v6 )
    ObfDereferenceObjectWithTag(v6, 0x72437350ui64);
  return(unsigned int)Thread;
}

Referenced by:

No references.