PopCaptureReasonContext
NTSTATUS __stdcall PopCaptureReasonContext(
_COUNTED_REASON_CONTEXT *Context,
INT8 PreviousMode,
UINT8 *ImportantTimer,
_DIAGNOSTIC_CONTEXT **ReturnContext){
UINT64 v7;
ULONG StringCount;
PUNICODE_STRING ReasonStrings;
signed int Flags;
unsigned __int64 v11;
ULONG v12;
_DIAGNOSTIC_CONTEXT *PoolWithQuotaTag;
WCHAR *v14;
_DIAGNOSTIC_CONTEXT *v15;
unsigned __int64 v16;
_COUNTED_REASON_CONTEXT::$3195086162F21FBC862C66B8DD0AB9D0 *p_ResourceFileName;
UINT8 *v18;
char v19;
int v20;
WCHAR *v21;
char *v22;
int v23;
unsigned __int16 *p_Length;
__int64 v26;
unsigned __int64 v27;
unsigned __int64 v28;
__int64 v29;
UINT8 *BufferEnd;
UINT8 *BufferEnda;
INT64 v32;
INT64 v33;
INT64 v34;
__int128 v35;
INT64 v36;
__int128 v37;
WCHAR *BufferStart;
WCHAR *PreviousModea;
UINT8 *v40;
_DIAGNOSTIC_CONTEXT **v41;
v41 = ReturnContext;
v40 = ImportantTimer;
LOBYTE(PreviousModea) = PreviousMode;
BufferStart = 0i64;
v37 = 0i64;
*ReturnContext = 0i64;
v7 = 32i64;
if( ImportantTimer )
*ImportantTimer = 0;
StringCount = 0;
ReasonStrings = 0i64;
if( Context )
{
if( Context->Version )
return -1073741811;
Flags = Context->Flags;
if( (Flags & 1) != 0 )
{
if( (((unsigned __int8)Context->ResourceFileName.Length + 2) & 1) != 0 )
return -1073741811;
v7 = Context->ResourceFileName.Length + 66i64;
}
else
{
if( (Flags & 2) != 0 )
{
if( ((LOBYTE(Context->ResourceFileName.Length) + 2) & 1) == 0 )
{
StringCount = Context->StringCount;
v7 = Context->ResourceFileName.Length + 66i64;
v11 = 16i64 * StringCount;
if( v11 <= 0xFFFFFFFF )
{
ReasonStrings = Context->ReasonStrings;
if( PreviousMode && (_DWORD)v11 )
{
if( ((unsigned __int8)ReasonStrings & 3) != 0 )
ExRaiseDatatypeMisalignment();
v28 = (unsigned __int64)ReasonStrings + (unsigned int)v11;
if( v28 > 0x7FFFFFFF0000i64 || v28 < (unsigned __int64)ReasonStrings )
MEMORY[0x7FFFFFFF0000] = 0;
}
v12 = 0;
if( !StringCount )
goto LABEL_12;
p_Length = &ReasonStrings->Length;
while( 1 )
{
v26 = *p_Length;
if( v26 + v7 + 2 < v7 )
break;
++v12;
p_Length += 8;
v7 += v26 + 2;
if( v12 >= StringCount )
goto LABEL_12;
}
}
}
return -1073741811;
}
if( Flags >= 0 )
return -1073741811;
}
}
else
{
Flags = 0x80000000;
}
LABEL_12:
if( PreviousMode )
PoolWithQuotaTag = (_DIAGNOSTIC_CONTEXT *)ExAllocatePoolWithQuotaTag((POOL_TYPE)9, v7, 0x78435250ui64);
else
PoolWithQuotaTag = (_DIAGNOSTIC_CONTEXT *)ExAllocatePoolWithTag(1ui64, v7, 2017677904i64);
v15 = PoolWithQuotaTag;
if( PoolWithQuotaTag )
{
*ReturnContext = PoolWithQuotaTag;
if( Flags < 0 )
{
PoolWithQuotaTag->ReasonSize = 0i64;
return 0;
}
v16 = ((unsigned __int64)&PoolWithQuotaTag[1].CallerType + 7) & 0xFFFFFFFFFFFFFFF8ui64;
p_ResourceFileName = (_COUNTED_REASON_CONTEXT::$3195086162F21FBC862C66B8DD0AB9D0 *)&Context->ResourceFileName;
PoolWithQuotaTag->ReasonSize = (unsigned __int64)PoolWithQuotaTag + v7 - v16;
*(_DWORD *)v16 = Flags;
BufferStart = (WCHAR *)(v16 + 32);
BufferEnd = (UINT8 *)PoolWithQuotaTag + v7;
v18 = (UINT8 *)PoolWithQuotaTag + v7;
*(_QWORD *)(v16 + 8) = 32i64;
if( (Flags & 1) != 0 )
{
LOBYTE(v14) = (_BYTE)PreviousModea;
v20 = PopSafeCopyUnicodeString(
&p_ResourceFileName->ResourceFileName,
&BufferStart,
v18,
v14,
(UINT64)BufferEnd,
v32,
v34,
v36);
if( v20 >= 0 )
{
LABEL_19:
if( v40 )
*v40 = (Context->Flags & 4) != 0;
return 0;
}
}
else
{
v19 = (char)PreviousModea;
LOBYTE(v14) = (_BYTE)PreviousModea;
v20 = PopSafeCopyUnicodeString(
&p_ResourceFileName->ResourceFileName,
&BufferStart,
v18,
v14,
(UINT64)BufferEnd,
v32,
v34,
v36);
if( v20 >= 0 )
{
*(_WORD *)(v16 + 16) = Context->ResourceReasonId;
v22 = (char *)BufferStart - v16;
*(_DWORD *)(v16 + 20) = StringCount;
*(_QWORD *)(v16 + 24) = v22;
v23 = 0;
if( !StringCount )
goto LABEL_19;
while( 1 )
{
v27 = (unsigned __int64)&ReasonStrings[v23];
if( v19 )
{
DWORD1(v35) = 0;
if( v27 >= 0x7FFFFFFF0000i64 )
v27 = 0x7FFFFFFF0000i64;
LODWORD(v35) = *(_DWORD *)v27;
v29 = *(_QWORD *)(v27 + 8);
v27 = (unsigned __int64)&v37;
*((_QWORD *)&v35 + 1) = v29;
v37 = v35;
}
LOBYTE(v21) = v19;
v20 = PopSafeCopyUnicodeString(
(_UNICODE_STRING *)v27,
&BufferStart,
BufferEnda,
v21,
(UINT64)BufferEnda,
v33,
v35,
*((INT64 *)&v35 + 1));
if( v20 < 0 )
break;
if( ++v23 >= StringCount )
goto LABEL_19;
}
}
}
ExFreePoolWithTag(v15, 0x78435250u);
*v41 = 0i64;
return v20;
}
return -1073741670;
}Referenced by:
PoCaptureReasonContext