SLGetSubscriptionPfn

INT64 __fastcall SLGetSubscriptionPfn(INT64 a1, VOID **a2){
  unsigned int v4; 
  void *v5; 
  unsigned int v7; 
  INT64 *v8; 
  INT64 *v9; 
  _OWORD *PoolWithTag; 
  __int64 v11; 
  UINT64 a5; 
  unsigned int v13; 
  PVOID P; 
  _ETHREAD *CurrentThread; 
  __int64 *v16; 
  SIZE_T NumberOfBytes; 
  _ETHREAD *v18; 
  v16 = &v11;
  v13 = 0;
  P = 0i64;
  v4 = 0;
  LODWORD(NumberOfBytes) = 0;
  if( *(_BYTE *)(a1 + 46856) )
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --*((_WORD *)CurrentThread + 242);
    v9 = (INT64 *)(a1 + 46840);
    ExAcquirePushLockSharedEx(a1 + 46840, 0i64);
    if( *(_BYTE *)(a1 + 46856) )
    {
      PoolWithTag = ExAllocatePoolWithTag(PagedPool, 0x82ui64, 0x20534C53ui64);
      P = PoolWithTag;
      if( !PoolWithTag )
      {
        v13 = -1073741595;
        local_unwind(v16, &loc_14094E004);
      }
      *PoolWithTag = *(_OWORD *)(a1 + 46858);
      PoolWithTag[1] = *(_OWORD *)(a1 + 46874);
      PoolWithTag[2] = *(_OWORD *)(a1 + 46890);
      PoolWithTag[3] = *(_OWORD *)(a1 + 46906);
      PoolWithTag[4] = *(_OWORD *)(a1 + 46922);
      PoolWithTag[5] = *(_OWORD *)(a1 + 46938);
      PoolWithTag[6] = *(_OWORD *)(a1 + 46954);
      PoolWithTag[7] = *(_OWORD *)(a1 + 46970);
      *((_WORD *)PoolWithTag + 64) = *(_WORD *)(a1 + 46986);
    }
    if( _InterlockedCompareExchange64(v9, 0i64, 17i64) != 17 )
      ExfReleasePushLockShared(v9);
    v8 = v9;
  }
  else
  {
    LODWORD(a5) = 0;
    v13 = sub_1403B8E0C(a1, &qword_140983CB0, 0i64, 0i64, a5, &NumberOfBytes);
    if( v13 == -1073741789 )
    {
      v4 = NumberOfBytes;
      v5 = ExAllocatePoolWithTag(PagedPool, (unsigned int)NumberOfBytes, 0x20534C53ui64);
      P = v5;
      if( !v5 || v4 > 0x82 )
      {
        v13 = -1073741595;
        goto LABEL_7;
      }
      LODWORD(a5) = v4;
      v13 = sub_1403B8E0C(a1, &qword_140983CB0, 0i64, (UINT8 *)v5, a5, &NumberOfBytes);
    }
    v18 = (_ETHREAD *)KeGetCurrentThread();
    --*((_WORD *)v18 + 242);
    ExAcquirePushLockExclusiveEx(a1 + 46840, 0i64);
    if( !*(_BYTE *)(a1 + 46856) )
    {
      v7 = v13;
      if( (v13 & 0x80000000) == 0 )
        memmove((UINT8 *)(a1 + 46858), (UINT8 *)P, v4);
      if( (int)(v7 + 0x80000000) < 0 || v7 == -1073741772 )
        *(_BYTE *)(a1 + 46856) = 1;
    }
    if( (_InterlockedExchangeAdd64((volatile signed __int64 *)(a1 + 46840), 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock((volatile INT64 *)(a1 + 46840));
    v8 = (INT64 *)(a1 + 46840);
  }
  KeAbPostRelease(v8);
  KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
  *a2 = P;
  P = 0i64;
LABEL_7:
  if( P )
    ExFreePoolWithTag(P, 0);
  return v13;
}

Referenced by:

SLQueryLicenseValueInternal