NtQueryLicenseValue
NTSTATUS __stdcall NtQueryLicenseValue(
_UNICODE_STRING *ValueName,
UINT64 *Type,
VOID *Data,
UINT64 DataSize,
UINT64 *ResultDataSize){
UINT64 v5;
int v8;
char PreviousMode;
UINT64 *v10;
int v11;
unsigned __int64 Buffer;
unsigned __int64 v13;
VOID **PoolWithTag;
VOID **v15;
__int64 v16;
struct _EXP_LICENSE_STATE *ExpLicenseState;
NTSTATUS v18;
int v19;
unsigned int v20;
UINT64 v22;
size_t Size;
PVOID v24;
PVOID P;
VOID *Src[10];
INT64 v27;
UINT64 *v28;
VOID *v29;
int v30;
v30 = DataSize;
v29 = Data;
v28 = Type;
v5 = (unsigned int)DataSize;
*(_OWORD *)Src = 0i64;
v8 = 0;
P = 0i64;
LODWORD(v27) = 0;
v24 = 0i64;
Size = 0;
PreviousMode = KeGetCurrentThread()->PreviousMode;
if( ValueName && (v10 = ResultDataSize) != 0i64 && (Data || !(_DWORD)DataSize) )
{
if( (unsigned int)DataSize > 0x800000 )
{
v8 = -1073741801;
}
else if( PreviousMode )
{
if( (unsigned __int64)ValueName >= 0x7FFFFFFF0000i64 )
ValueName = (_UNICODE_STRING *)0x7FFFFFFF0000i64;
v11 = *(_DWORD *)&ValueName->Length;
LODWORD(Src[0]) = *(_DWORD *)&ValueName->Length;
Buffer = (unsigned __int64)ValueName->Buffer;
Src[1] = (VOID *)Buffer;
if( Buffer && (_WORD)v11 && (v11 & 1) == 0 )
{
if( (Buffer & 1) != 0 )
ExRaiseDatatypeMisalignment();
v13 = Buffer + (unsigned __int16)v11;
if( v13 > 0x7FFFFFFF0000i64 || v13 < Buffer )
MEMORY[0x7FFFFFFF0000] = 0;
PoolWithTag = ExAllocatePoolWithTag(1ui64, LOWORD(Src[0]), 542329939i64);
P = PoolWithTag;
if( PoolWithTag )
{
v15 = PoolWithTag;
memmove(PoolWithTag, Src[1], LOWORD(Src[0]));
Src[1] = 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((UINT64)Data, v5, 1i64), (v24 = ExAllocatePoolWithTag(1ui64, v5, 542329939i64)) == 0i64) )
{
v8 = -1073741801;
}
else
{
Buffer = (unsigned __int64)v10;
if( (unsigned __int64)v10 >= 0x7FFFFFFF0000i64 )
Buffer = 0x7FFFFFFF0000i64;
*(_DWORD *)Buffer = *(_DWORD *)Buffer;
Size = *(_DWORD *)v10;
}
}
else
{
v8 = -1073741801;
}
}
else
{
v8 = -1073741811;
}
if( v8 >= 0 )
{
ExpLicenseState = PsGetCurrentServerSiloGlobals((_KSPIN_LOCK *)Buffer)->ExpLicenseState;
if( qword_140D2C500 )
{
v18 = qword_140D2C500(ExpLicenseState, Src, &v27, v24, v5, &Size);
}
else
{
LODWORD(v22) = v5;
v18 = SLQueryLicenseValueInternal(
(INT64)ExpLicenseState,
(const _UNICODE_STRING *)Src,
(INT64)&v27,
v24,
v22,
(UINT64 *)&Size);
}
v19 = v18;
v8 = v18;
if( Type )
*(_DWORD *)Type = v27;
v20 = Size;
*(_DWORD *)v10 = Size;
if( v19 >= 0 && Data )
{
if( (unsigned int)v5 < v20 )
v8 = -1073741789;
else
memmove(Data, v24, v20);
}
}
}
else
{
v8 = ntoskrnl_27(ValueName, (INT64)Type, Data, DataSize, ResultDataSize);
}
}
else
{
v8 = -1073741811;
}
if( P )
ExFreePoolWithTag(P, 0);
if( v24 )
ExFreePoolWithTag(v24, 0);
return v8;
}Referenced by:
ExpGetNtProductTypeFromLicenseValue
MiMemoryLicense