_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.