KsepGetShimCallbacksForDriver

NTSTATUS __stdcall KsepGetShimCallbacksForDriver(VOID *BaseAddress, _KSE_IO_CALLBACKS *IoCallbacks){
  NTSTATUS v2; 
  __int64 v6; 
  unsigned int v7; 
  __int64 v8; 
  __int64 v9; 
  __int64 v10; 
  __int64 v11; 
  __int64 v12; 
  _DWORD *v13; 
  __int64 v14; 
  __int64 v15; 
  _DWORD *v16; 
  unsigned int v17; 
  __int64 v18; 
  __int64 v19; 
  __int64 v20; 
  __int64 v21; 
  __int64 v22; 
  __int64 v23; 
  int v24; 
  __int64 v25; 
  _KSE_SHIMMED_MODULE *ModuleInfo; 

  v2 = 0;
  ModuleInfo = 0i64;
  if( !IoCallbacks )
  {
    v6 = ((unsigned __int8)_InterlockedExchangeAdd(&KsepHistoryErrorsIndex, 1u) + 1) & 0x3F;
    dword_140C2A864[2 * v6] = -1073740768;
    KsepHistoryErrors[2 * v6] = 459523;
    if( (KsepDebugFlag & 4) != 0 )
      RtlAssert("IoCallbacks != NULL", "minkernel\\ntos\\kshim\\kseloader.c", 771i64, 0i64);
  }
  memset(IoCallbacks, 0i64, 0x100u);
  if( !KsepIsModuleShimmed(&Engine, BaseAddress, &ModuleInfo) )
    return -1073741275;
  v7 = ModuleInfo[6];
  v8 = *((_QWORD *)ModuleInfo + 4);
  if( v7 )
  {
    v9 = v8 + 72;
    v25 = (unsigned int)ModuleInfo[6];
    v23 = v8 + 72;
    v10 = v7;
    while( 1 )
    {
      if( (*(_DWORD *)(*(_QWORD *)v9 + 28i64) & 4) == 0 )
      {
        v11 = *(_QWORD *)(*(_QWORD *)v9 + 16i64);
        if( !v11 )
        {
          v12 = ((unsigned __int8)_InterlockedExchangeAdd(&KsepHistoryErrorsIndex, 1u) + 1) & 0x3F;
          dword_140C2A864[2 * v12] = -1073740768;
          KsepHistoryErrors[2 * v12] = 459576;
          if( (KsepDebugFlag & 4) != 0 )
          {
            RtlAssert("CurrentShim != NULL", "minkernel\\ntos\\kshim\\kseloader.c", 824i64, 0i64);
            v10 = v25;
          }
        }
        v13 = *(_DWORD **)(v11 + 48);
        v14 = 0i64;
        v24 = 0;
        if( *v13 != 4 )
          break;
      }
LABEL_48:
      v9 += 80i64;
      --v10;
      v23 = v9;
      v25 = v10;
      if( !v10 )
        goto LABEL_49;
    }
    v15 = 0i64;
    while( 1 )
    {
      v16 = v13;
      if( v13[v15] == 3 )
      {
        v17 = 0;
        if( **(_DWORD **)&v13[v15 + 4] != 2 )
          break;
      }
LABEL_46:
      v14 = (unsigned int)(v14 + 1);
      v13 = v16;
      v24 = v14;
      v15 = 6 * v14;
      if( v16[6 * v14] == 4 )
      {
        v9 = v23;
        v10 = v25;
        goto LABEL_48;
      }
    }
    v18 = 0i64;
    while( 1 )
    {
      v19 = *(_QWORD *)&v13[v15 + 4];
      switch( *(_DWORD *)(v18 + v19 + 8) )
      {
        case 1:
          if( *(_QWORD *)IoCallbacks )
          {
            v21 = ((unsigned __int8)_InterlockedExchangeAdd(&KsepHistoryErrorsIndex, 1u) + 1) & 0x3F;
            KsepHistoryErrors[2 * (unsigned int)v21] = 459604;
            goto LABEL_40;
          }
          *(_QWORD *)IoCallbacks = *(_QWORD *)(v18 + v19 + 16);
          break;
        case 2:
          if( *((_QWORD *)IoCallbacks + 1) )
          {
            v21 = ((unsigned __int8)_InterlockedExchangeAdd(&KsepHistoryErrorsIndex, 1u) + 1) & 0x3F;
            KsepHistoryErrors[2 * (unsigned int)v21] = 459619;
            goto LABEL_40;
          }
          *((_QWORD *)IoCallbacks + 1) = *(_QWORD *)(v18 + v19 + 16);
          break;
        case 3:
          if( *((_QWORD *)IoCallbacks + 2) )
          {
            v21 = ((unsigned __int8)_InterlockedExchangeAdd(&KsepHistoryErrorsIndex, 1u) + 1) & 0x3F;
            KsepHistoryErrors[2 * (unsigned int)v21] = 459634;
            goto LABEL_40;
          }
          *((_QWORD *)IoCallbacks + 2) = *(_QWORD *)(v18 + v19 + 16);
          break;
        case 4:
          if( *((_QWORD *)IoCallbacks + 3) )
          {
            v21 = ((unsigned __int8)_InterlockedExchangeAdd(&KsepHistoryErrorsIndex, 1u) + 1) & 0x3F;
            KsepHistoryErrors[2 * (unsigned int)v21] = 459649;
            goto LABEL_40;
          }
          *((_QWORD *)IoCallbacks + 3) = *(_QWORD *)(v18 + v19 + 16);
          break;
        default:
          v20 = (unsigned int)(*(_DWORD *)(v18 + v19 + 8) - 100);
          if( (unsigned int)v20 > 0x1B )
          {
            v22 = ((unsigned __int8)_InterlockedExchangeAdd(&KsepHistoryErrorsIndex, 1u) + 1) & 0x3F;
            dword_140C2A864[2 * v22] = -1073741811;
            KsepHistoryErrors[2 * v22] = 459680;
            if( (KsepDebugFlag & 2) != 0 )
              KsepDebugPrint(9i64, "KSE: Invalid callback code encountered: %u\n", *(unsigned int *)(v18 + v19 + 8));
            KsepLogError(9, "KSE: Invalid callback code encountered: %u\n", *(unsigned int *)(v18 + v19 + 8));
            break;
          }
          if( *(_QWORD *)&IoCallbacks[2 * v20 + 8] )
          {
            v21 = ((unsigned __int8)_InterlockedExchangeAdd(&KsepHistoryErrorsIndex, 1u) + 1) & 0x3F;
            KsepHistoryErrors[2 * (unsigned int)v21] = 459667;
LABEL_40:
            dword_140C2A864[2 * v21] = -1073741823;
            if( (KsepDebugFlag & 2) != 0 )
              KsepDebugPrint(9i64, "KSE: Two shims are hooking same callback! \n", v14);
            KsepLogError(9, "KSE: Two shims are hooking same callback! \n", v14);
            break;
          }
          *(_QWORD *)&IoCallbacks[2 * (unsigned int)v20 + 8] = *(_QWORD *)(v18 + v19 + 16);
          break;
      }
      v16 = *(_DWORD **)(v11 + 48);
      ++v17;
      v13 = v16;
      v18 = 32i64 * v17;
      if( *(_DWORD *)(v18 + *(_QWORD *)&v16[v15 + 4]) == 2 )
      {
        LODWORD(v14) = v24;
        goto LABEL_46;
      }
    }
  }
LABEL_49:
  KsepHistoryMessages[((unsigned __int8)_InterlockedExchangeAdd(&KsepHistoryMessagesIndex, 1u) + 1) & 0x3F] = 459700i64;
  if( (KsepDebugFlag & 1) != 0 )
    KsepDebugPrint(9i64, "KSE: GetShimCallbacks succeeded\n");
  KsepLogInfo(9, "KSE: GetShimCallbacks succeeded\n");
  return v2;
}

Referenced by:

KseShimDriverIoCallbacks