NtQuerySecurityPolicy
NTSTATUS __stdcall NtQuerySecurityPolicy(
_UNICODE_STRING *Provider,
_UNICODE_STRING *Key,
_UNICODE_STRING *ValueName,
_SECURE_SETTING_VALUE_TYPE *ValueType,
VOID *Value,
UINT64 *ValueSize){
VOID *PoolWithQuotaTag;
char PreviousMode;
int v11;
UINT64 *v12;
VOID *v13;
size_t v14;
UINT64 Length;
VOID *v17;
_UNICODE_STRING *CapturedArray;
PVOID P;
PVOID v20;
CapturedArray = 0i64;
P = 0i64;
PoolWithQuotaTag = 0i64;
v17 = 0i64;
v20 = 0i64;
Length = 0i64;
PreviousMode = KeGetCurrentThread()->PreviousMode;
v11 = SepCaptureUnicodeStringArray(Provider, 1ui64, PreviousMode, (const _UNICODE_STRING **)&CapturedArray);
if( v11 >= 0 )
{
v11 = SepCaptureUnicodeStringArray(Key, 1ui64, PreviousMode, (const _UNICODE_STRING **)&P);
if( v11 >= 0 )
{
v11 = SepCaptureUnicodeStringArray(ValueName, 1ui64, PreviousMode, (const _UNICODE_STRING **)&v20);
if( v11 >= 0 )
{
if( PreviousMode == 1 )
{
ProbeForWrite((UINT64)ValueType, 4i64, 4i64);
v12 = ValueSize;
if( ((unsigned __int8)ValueSize & 3) != 0 )
ExRaiseDatatypeMisalignment();
if( (unsigned __int64)ValueSize + 4 > 0x7FFFFFFF0000i64 || (UINT64 *)((char *)ValueSize + 4) < ValueSize )
MEMORY[0x7FFFFFFF0000] = 0;
LODWORD(Length) = *(_DWORD *)ValueSize;
ProbeForWrite((UINT64)ValueSize, 4i64, 4i64);
v13 = Value;
if( Value )
ProbeForWrite((UINT64)Value, (unsigned int)Length, 1i64);
if( Value )
{
PoolWithQuotaTag = ExAllocatePoolWithQuotaTag((POOL_TYPE)9, (unsigned int)Length, 0x20206553ui64);
v17 = PoolWithQuotaTag;
if( !PoolWithQuotaTag )
{
v11 = -1073741670;
goto LABEL_28;
}
}
}
else
{
v13 = Value;
PoolWithQuotaTag = Value;
v17 = Value;
v12 = ValueSize;
LODWORD(Length) = *(_DWORD *)ValueSize;
}
if( qword_140C1D958 )
{
if( !PoolWithQuotaTag || (_DWORD)Length )
v11 = qword_140C1D958(CapturedArray, P, v20, (char *)&Length + 4, PoolWithQuotaTag, &Length);
else
v11 = -1073741811;
}
else
{
v11 = -1073741637;
}
if( (int)(v11 + 0x80000000) < 0 || v11 == -1073741789 )
{
*ValueType = SHIDWORD(Length);
v14 = Length;
*(_DWORD *)v12 = Length;
if( v13 )
{
if( PreviousMode == 1 && v11 >= 0 )
memmove(v13, PoolWithQuotaTag, v14);
}
}
}
}
}
LABEL_28:
if( PreviousMode == 1 )
{
if( CapturedArray )
ExFreePoolWithTag(CapturedArray, 0);
if( P )
ExFreePoolWithTag(P, 0);
if( v20 )
ExFreePoolWithTag(v20, 0);
}
if( PoolWithQuotaTag && PreviousMode == 1 )
ExFreePoolWithTag(PoolWithQuotaTag, 0);
return v11;
}Referenced by:
No references.