_C_specific_handler
EXCEPTION_DISPOSITION __cdecl _C_specific_handler(
struct _EXCEPTION_RECORD *ExceptionRecord,
void *EstablisherFrame,
struct _CONTEXT *ContextRecord,
struct _DISPATCHER_CONTEXT *DispatcherContext){
__int64 v8;
unsigned __int64 v9;
unsigned int *v10;
unsigned int v11;
__int64 v12;
int v13;
unsigned int v15;
unsigned __int64 v16;
unsigned int v17;
__int64 v18;
unsigned int i;
__int64 v20;
__int64 v21[2];
KeCheckStackAndTargetAddress((PVOID)ContextRecord->_Rip);
v8 = *((_QWORD *)DispatcherContext + 1);
v9 = *(_QWORD *)DispatcherContext - v8;
v10 = (unsigned int *)*((_QWORD *)DispatcherContext + 7);
v11 = *((_DWORD *)DispatcherContext + 18);
if( (ExceptionRecord->ExceptionFlags & 0x66) != 0 )
{
v15 = *v10;
v16 = *((_QWORD *)DispatcherContext + 4) - v8;
if( v11 < *v10 )
{
v17 = *v10;
do
{
v18 = v17;
if( v9 >= v10[4 * v11 + 1] && v9 < v10[4 * v11 + 2] )
{
if( (ExceptionRecord->ExceptionFlags & 0x20) != 0 )
{
for( i = 0; i < v17; ++i )
{
if( v16 >= v10[4 * i + 1]
&& v16 < v10[4 * i + 2]
&& v10[4 * i + 4] == v10[4 * v11 + 4]
&& v10[4 * i + 3] == v10[4 * v11 + 3] )
{
break;
}
}
v18 = v15;
if( i != v15 )
return 1;
}
v20 = v10[4 * v11 + 4];
if( (_DWORD)v20 )
{
if( v16 == v20 )
return 1;
}
else
{
*((_DWORD *)DispatcherContext + 18) = v11 + 1;
LOBYTE(v18) = 1;
((void(__fastcall *)(__int64, void *))(v8 + v10[4 * v11 + 3]))(v18, EstablisherFrame);
v15 = *v10;
LODWORD(v18) = *v10;
}
}
++v11;
v17 = v18;
}
while( v11 < (unsigned int)v18 );
}
}
else
{
v21[0] = (__int64)ExceptionRecord;
v21[1] = (__int64)ContextRecord;
while( v11 < *v10 )
{
if( v9 >= v10[4 * v11 + 1] && v9 < v10[4 * v11 + 2] && v10[4 * v11 + 4] )
{
v12 = v10[4 * v11 + 3];
if( (_DWORD)v12 == 1 )
goto LABEL_10;
v13 = ((__int64(__fastcall *)(__int64 *, void *))(v8 + v12))(v21, EstablisherFrame);
if( v13 < 0 )
return 0;
if( v13 > 0 )
{
LABEL_10:
NLG_Notify(v8 + v10[4 * v11 + 4], EstablisherFrame, 1i64);
RtlUnwindEx(
EstablisherFrame,
(VOID *)(v8 + v10[4 * v11 + 4]),
ExceptionRecord,
(VOID *)ExceptionRecord->ExceptionCode,
*((_CONTEXT **)DispatcherContext + 5),
*((_UNWIND_HISTORY_TABLE **)DispatcherContext + 8));
_NLG_Return2();
}
}
++v11;
}
}
return 1;
}Referenced by:
No references.