NtQueryLicenseValue

INT64 __fastcall NtQueryLicenseValue(
        _UNICODE_STRING *ValueName,
        UINT64 *Type,
        VOID *Data,
        UINT64 DataSize,
        UINT64 *ResultDataSize){
  UINT64 v5; 
  int v8; 
  char v9; 
  UINT64 *v10; 
  int v11; 
  wchar_t *Buffer; 
  unsigned __int64 v13; 
  void *PoolWithTag; 
  wchar_t *v15; 
  __int64 v16; 
  __int64 v17; 
  INT64 v18; 
  int v19; 
  int v20; 
  unsigned int v21; 
  UINT64 v23; 
  char Size[12]; 
  PVOID P; 
  UNICODE_STRING v26; 
  INT64 v27; 
  UINT64 *v28; 
  VOID *v29; 
  int v30; 
  v30 = DataSize;
  v29 = Data;
  v28 = Type;
  v5 = (unsigned int)DataSize;
  v26 = 0i64;
  v8 = 0;
  P = 0i64;
  LODWORD(v27) = 0;
  memset(Size, 0, sizeof(Size));
  v9 = *((_BYTE *)KeGetCurrentThread() + 562);
  if( ValueName && (v10 = ResultDataSize) != 0i64 && (Data || !(_DWORD)DataSize) )
  {
    if( (unsigned int)DataSize > 0x800000 )
    {
      v8 = -1073741801;
    }
    else if( v9 )
    {
      if( (unsigned __int64)ValueName >= 0x7FFFFFFF0000i64 )
        ValueName = (_UNICODE_STRING *)0x7FFFFFFF0000i64;
      v11 = *(_DWORD *)&ValueName->Length;
      *(_DWORD *)&v26.Length = *(_DWORD *)&ValueName->Length;
      Buffer = ValueName->Buffer;
      v26.Buffer = Buffer;
      if( Buffer && (_WORD)v11 && (v11 & 1) == 0 )
      {
        if( ((unsigned __int8)Buffer & 1) != 0 )
          ExRaiseDatatypeMisalignment();
        v13 = (unsigned __int64)Buffer + (unsigned __int16)v11;
        if( v13 > 0x7FFFFFFF0000i64 || v13 < (unsigned __int64)Buffer )
          MEMORY[0x7FFFFFFF0000] = 0;
        PoolWithTag = ExAllocatePoolWithTag(PagedPool, v26.Length, 0x20534C53ui64);
        P = PoolWithTag;
        if( PoolWithTag )
        {
          v15 = (wchar_t *)PoolWithTag;
          memmove((UINT8 *)PoolWithTag, (UINT8 *)v26.Buffer, v26.Length);
          v26.Buffer = v15;
          if( Type )
          {
            v16 = (__int64)Type;
            if( (unsigned __int64)Type >= 0x7FFFFFFF0000i64 )
              v16 = 0x7FFFFFFF0000i64;
            *(_DWORD *)v16 = *(_DWORD *)v16;
            LODWORD(v27) = *(_DWORD *)Type;
          }
          if( Data
            && (_DWORD)v5
            && (ProbeForWrite(Data, v5, 1ui64),
                (*(_QWORD *)&Size[4] = ExAllocatePoolWithTag(PagedPool, v5, 0x20534C53ui64)) == 0i64) )
          {
            v8 = -1073741801;
          }
          else
          {
            v17 = (__int64)v10;
            if( (unsigned __int64)v10 >= 0x7FFFFFFF0000i64 )
              v17 = 0x7FFFFFFF0000i64;
            *(_DWORD *)v17 = *(_DWORD *)v17;
            *(_DWORD *)Size = *(_DWORD *)v10;
          }
        }
        else
        {
          v8 = -1073741801;
        }
      }
      else
      {
        v8 = -1073741811;
      }
      if( v8 >= 0 )
      {
        v18 = PsGetCurrentServerSiloGlobals()[113];
        if( qword_140D2C500 )
        {
          v19 = qword_140D2C500(v18, &v26, &v27, *(_QWORD *)&Size[4], v5, Size);
        }
        else
        {
          LODWORD(v23) = v5;
          v19 = SLQueryLicenseValueInternal(v18, &v26, (INT64)&v27, *(VOID **)&Size[4], v23, (UINT64 *)Size);
        }
        v20 = v19;
        v8 = v19;
        if( Type )
          *(_DWORD *)Type = v27;
        v21 = *(_DWORD *)Size;
        *(_DWORD *)v10 = *(_DWORD *)Size;
        if( v20 >= 0 && Data )
        {
          if( (unsigned int)v5 < v21 )
            v8 = -1073741789;
          else
            memmove((UINT8 *)Data, *(UINT8 **)&Size[4], v21);
        }
      }
    }
    else
    {
      v8 = ntoskrnl_27(ValueName, (INT64)Type, Data, (unsigned int)DataSize, ResultDataSize);
    }
  }
  else
  {
    v8 = -1073741811;
  }
  if( P )
    ExFreePoolWithTag(P, 0);
  if( *(_QWORD *)&Size[4] )
    ExFreePoolWithTag(*(PVOID *)&Size[4], 0);
  return(unsigned int)v8;
}

Referenced by:

ExpGetNtProductTypeFromLicenseValue
MiMemoryLicense