SLGetSubscriptionPfn

NTSTATUS __stdcall SLGetSubscriptionPfn(INT64 a1, VOID **a2){
  size_t v4; 
  VOID **v5; 
  NTSTATUS v7; 
  _EX_PUSH_LOCK *v8; 
  _EX_PUSH_LOCK *v9; 
  VOID **PoolWithTag; 
  __int64 v11; 
  NTSTATUS v12; 
  PVOID P; 
  _ETHREAD *CurrentThread; 
  __int64 *v15; 
  UINT64 NumberOfBytes; 
  _ETHREAD *v17; 

  v15 = &v11;
  v12 = 0;
  P = 0i64;
  v4 = 0;
  LODWORD(NumberOfBytes) = 0;
  if( *(_BYTE *)(a1 + 46856) )
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --CurrentThread->Tcb.KernelApcDisable;
    v9 = (_EX_PUSH_LOCK *)(a1 + 46840);
    ExAcquirePushLockSharedEx((_EX_PUSH_LOCK *)(a1 + 46840), 0i64);
    if( *(_BYTE *)(a1 + 46856) )
    {
      PoolWithTag = ExAllocatePoolWithTag(1ui64, 0x82ui64, 542329939i64);
      P = PoolWithTag;
      if( !PoolWithTag )
      {
        v12 = -1073741595;
        local_unwind(v15, &loc_14094E004);
      }
      *(_OWORD *)PoolWithTag = *(_OWORD *)(a1 + 46858);
      *((_OWORD *)PoolWithTag + 1) = *(_OWORD *)(a1 + 46874);
      *((_OWORD *)PoolWithTag + 2) = *(_OWORD *)(a1 + 46890);
      *((_OWORD *)PoolWithTag + 3) = *(_OWORD *)(a1 + 46906);
      *((_OWORD *)PoolWithTag + 4) = *(_OWORD *)(a1 + 46922);
      *((_OWORD *)PoolWithTag + 5) = *(_OWORD *)(a1 + 46938);
      *((_OWORD *)PoolWithTag + 6) = *(_OWORD *)(a1 + 46954);
      *((_OWORD *)PoolWithTag + 7) = *(_OWORD *)(a1 + 46970);
      *((_WORD *)PoolWithTag + 64) = *(_WORD *)(a1 + 46986);
    }
    if( _InterlockedCompareExchange64(&v9->_bf_0, 0i64, 17i64) != 17 )
      ExfReleasePushLockShared(v9);
    v8 = v9;
  }
  else
  {
    v12 = sub_1403B8E0C(a1, &qword_140983CB0, 0i64, 0i64, 0, &NumberOfBytes);
    if( v12 == -1073741789 )
    {
      v4 = NumberOfBytes;
      v5 = ExAllocatePoolWithTag(1ui64, (unsigned int)NumberOfBytes, 542329939i64);
      P = v5;
      if( !v5 || v4 > 0x82 )
      {
        v12 = -1073741595;
        goto LABEL_7;
      }
      v12 = sub_1403B8E0C(a1, &qword_140983CB0, 0i64, v5, v4, &NumberOfBytes);
    }
    v17 = (_ETHREAD *)KeGetCurrentThread();
    --v17->Tcb.KernelApcDisable;
    ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)(a1 + 46840), 0i64);
    if( !*(_BYTE *)(a1 + 46856) )
    {
      v7 = v12;
      if( v12 >= 0 )
        memmove((VOID *)(a1 + 46858), P, v4);
      if( (int)(v7 + 0x80000000) < 0 || v7 == -1073741772 )
        *(_BYTE *)(a1 + 46856) = 1;
    }
    if( (_InterlockedExchangeAdd64((volatile signed __int64 *)(a1 + 46840), 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock((_EX_PUSH_LOCK *)(a1 + 46840));
    v8 = (_EX_PUSH_LOCK *)(a1 + 46840);
  }
  KeAbPostRelease(v8);
  KeLeaveCriticalRegionThread(KeGetCurrentThread());
  *a2 = P;
  P = 0i64;
LABEL_7:
  if( P )
    ExFreePoolWithTag(P, 0);
  return v12;
}

Referenced by:

SLQueryLicenseValueInternal