EmProviderRegisterEntry

__int64 __fastcall EmProviderRegisterEntry(__int64 a1, _QWORD *a2, __int64 a3, _QWORD *a4){
  _QWORD *v8; 
  int v9; 
  SINGLE_LIST_ENTRY *v10; 
  unsigned int v11; 
  __int64 v12; 
  _QWORD *v13; 
  __int64 v14; 
  void *v15; 
  _QWORD *PoolWithTag; 
  unsigned int v18; 
  UINT8 *v19; 
  _QWORD *v20; 
  _QWORD *v21; 
  _SINGLE_LIST_ENTRY *Next; 
  _SINGLE_LIST_ENTRY *v23; 
  _SINGLE_LIST_ENTRY *v24; 
  v8 = 0i64;
  v9 = 0;
  ExAcquirePushLockExclusiveEx((UINT64)&EmpDatabaseLock, 0i64);
  if( !a2 || !a1 || !a3 || !a4 || !*(_QWORD *)a3 || !*(_DWORD *)(a3 + 8) )
    goto LABEL_14;
  v10 = EmpSearchEntryDatabase((const GUID *)a2);
  if( !v10 )
  {
    v9 = -1073741275;
    goto LABEL_15;
  }
  v11 = *(_DWORD *)(a1 + 16);
  v12 = 0i64;
  if( v11 )
  {
    while( 1 )
    {
      v13 = *(_QWORD **)(*(_QWORD *)(a1 + 8) + 8 * v12);
      v14 = *v13 - *a2;
      if( *v13 == *a2 )
        v14 = v13[1] - a2[1];
      if( !v14 )
        break;
      v12 = (unsigned int)(v12 + 1);
      if( (unsigned int)v12 >= v11 )
        goto LABEL_14;
    }
    PoolWithTag = ExAllocatePoolWithTag(PagedPool, 0x38ui64, 0x72704D45ui64);
    v8 = PoolWithTag;
    if( PoolWithTag
      && (*PoolWithTag = v10,
          v18 = *(_DWORD *)(a3 + 8),
          *((_DWORD *)v8 + 4) = v18,
          v19 = (UINT8 *)ExAllocatePoolWithTag(PagedPool, v18, 0x72704D45ui64),
          (v8[1] = v19) != 0i64) )
    {
      memmove(v19, *(UINT8 **)a3, *((unsigned int *)v8 + 4));
      v20 = *(_QWORD **)(a1 + 64);
      v21 = v8 + 5;
      if( *v20 != a1 + 56
        || (*v21 = a1 + 56,
            v8[6] = v20,
            *v20 = v21,
            *(_QWORD *)(a1 + 64) = v21,
            Next = v10[6].Next,
            v23 = (_SINGLE_LIST_ENTRY *)(v8 + 3),
            Next->Next != &v10[5]) )
      {
        __fastfail(3u);
      }
      v23->Next = v10 + 5;
      v8[4] = Next;
      Next->Next = v23;
      v10[6].Next = v23;
      v24 = v10[9].Next;
      v10[4].Next = v23;
      while( v24 )
      {
        EmpQueueRuleUpdateState((__int64)v24[-1].Next, (__int64)v10);
        v24 = v24->Next;
      }
      *a4 = v8;
    }
    else
    {
      v9 = -1073741670;
    }
  }
  else
  {
LABEL_14:
    v9 = -1073741811;
  }
LABEL_15:
  if( (_InterlockedExchangeAdd64((volatile signed __int64 *)&EmpDatabaseLock, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock((volatile INT64 *)&EmpDatabaseLock);
  KeAbPostRelease(&EmpDatabaseLock);
  if( v9 < 0 && v8 )
  {
    v15 = (void *)v8[1];
    if( v15 )
      ExFreePoolWithTag(v15, 0x72704D45u);
    ExFreePoolWithTag(v8, 0x72704D45u);
  }
  return(unsigned int)v9;
}

Referenced by:

No references.