KsepEngineGetShimsFromRegistry

INT64 __fastcall KsepEngineGetShimsFromRegistry(INT64 a1, INT64 a2, INT64 a3, _DWORD *a4){
  UNICODE_STRING *v4; 
  _QWORD *v6; 
  WCHAR *v8; 
  UINT64 *v9; 
  WCHAR *v10; 
  int DriverShims; 
  int v13; 
  __int64 v14; 
  UNICODE_STRING *v15; 
  UNICODE_STRING *v16; 
  __int64 i; 
  __int64 v18; 
  UNICODE_STRING *v19; 
  _QWORD *v20; 
  UNICODE_STRING *Strings; 
  UINT64 BufferLength; 
  UINT64 StringsCount; 
  INT64 v24; 
  v24 = a3;
  BufferLength = 0i64;
  v4 = 0i64;
  Strings = 0i64;
  LODWORD(StringsCount) = 0;
  v6 = (_QWORD *)a3;
  if( (*(_DWORD *)(a1 + 8) & 1) != 0 )
  {
    DriverShims = -1073741275;
    goto LABEL_5;
  }
  KsepPoolAllocatePaged(0x800ui64);
  v10 = v8;
  if( !v8 )
  {
    DriverShims = -1073741801;
    goto LABEL_5;
  }
  DriverShims = KsepRegistryQueryDriverShims(*(PWCHAR *)(a2 + 8), v8, v9);
  if( DriverShims >= 0 )
  {
    v13 = KsepStringSplitMultiString(v10, BufferLength, &Strings, &StringsCount);
    v14 = (unsigned int)StringsCount;
    DriverShims = v13;
    if( v13 >= 0 )
    {
      KsepPoolAllocatePaged(80i64 * (unsigned int)StringsCount);
      v15 = Strings;
      v4 = v16;
      if( !v16 )
      {
        DriverShims = -1073741801;
LABEL_20:
        if( v15 )
        {
          if( (_DWORD)v14 )
          {
            v19 = v15;
            do
            {
              KsepStringFree(v19++);
              --v14;
            }
            while( v14 );
          }
          KsepPoolFreePaged(v15);
        }
        v6 = (_QWORD *)v24;
        goto LABEL_4;
      }
      for( i = 0i64; (unsigned int)i < (unsigned int)v14; i = (unsigned int)(i + 1) )
      {
        if( KsepStringDuplicate(&v4[5 * i + 1], v15[(unsigned int)i].Buffer) < 0 )
          break;
        *(_DWORD *)(&v4[5 * i + 4].MaximumLength + 1) = 0;
      }
      DriverShims = KsepDbGetShimInfo((INT64)v4, (unsigned int)v14);
      if( DriverShims >= 0 )
      {
        v20 = (_QWORD *)v24;
        DriverShims = 0;
        *a4 = v14;
        *v20 = v4;
        goto LABEL_20;
      }
      v18 = ((unsigned __int8)_InterlockedExchangeAdd(&KsepHistoryErrorsIndex, 1u) + 1) & 0x3F;
      KsepHistoryErrors[2 * v18 + 1] = DriverShims;
      KsepHistoryErrors[2 * v18] = 132101;
      if( (KsepDebugFlag & 2) != 0 )
        KsepDebugPrint(0i64, "KSE: Cannot resolve registry shims to Sdb: 0x%x\n", (unsigned int)DriverShims);
      KsepLogError(0, "KSE: Cannot resolve registry shims to Sdb: 0x%x\n", (unsigned int)DriverShims);
      v14 = (unsigned int)StringsCount;
    }
    v15 = Strings;
    goto LABEL_20;
  }
LABEL_4:
  KsepPoolFreePaged(v10);
  if( DriverShims < 0 )
  {
LABEL_5:
    KsepPoolFreePaged(v4);
    *v6 = 0i64;
    *a4 = 0;
  }
  return(unsigned int)DriverShims;
}

Referenced by:

KsepGetShimsForDriver