PiUpdateDriverDBCache

VOID __stdcall PiUpdateDriverDBCache(_UNICODE_STRING *FullPath, VOID *ImageBase, INT64 Status, _GUID *Guid){
  int v5; 
  __int64 v6; 
  __int64 v7; 
  WORD *v8; 
  wchar_t *v9; 
  __int64 v10; 
  __int64 v11; 
  _QWORD *v12; 
  __int128 v13; 
  WORD *v14; 
  WORD *v15; 
  wchar_t *v16; 
  VOID **PoolWithTag; 
  _QWORD *inserted; 
  _QWORD *v19; 
  __int64 v20; 
  __int64 v21; 
  _QWORD *v22; 
  void *v23; 
  __int128 Buffer; 
  __int128 v25; 
  _BYTE v26[24]; 
  __int128 *v27; 

  Buffer = 0i64;
  v5 = (int)Guid;
  v25 = 0i64;
  memset(v26, 0, sizeof(v26));
  LODWORD(v6) = RtlImageNtHeader((UINT64)ImageBase);
  v7 = v6;
  if( !v6 )
    return;
  PiDDBCacheTable.TableContext = (void *)1;
  v8 = wcsrchr(FullPath->Buffer, 92);
  if( v8 )
    v9 = v8 + 1;
  else
    v9 = FullPath->Buffer;
  v10 = -1i64;
  *((_QWORD *)&v25 + 1) = v9;
  v11 = -1i64;
  do
    ++v11;
  while( v9[v11] );
  LOWORD(v25) = 2 * v11;
  WORD1(v25) = 2 * v11;
  v12 = RtlLookupElementGenericTableAvl(&PiDDBCacheTable, &Buffer);
  if( v12 )
  {
    v21 = *v12;
    if( *(_QWORD **)(*v12 + 8i64) != v12 )
      goto LABEL_26;
    v22 = (_QWORD *)v12[1];
    if( (_QWORD *)*v22 != v12 )
      goto LABEL_26;
    *v22 = v21;
    *(_QWORD *)(v21 + 8) = v22;
  }
  else
  {
    if( (unsigned int)RtlNumberGenericTableElementsAvl((INT64)&PiDDBCacheTable) < 0x100 )
      goto LABEL_8;
    v12 = PiDDBCacheList;
    v20 = *(_QWORD *)PiDDBCacheList;
    if( *((PVOID **)PiDDBCacheList + 1) != &PiDDBCacheList || *(PVOID *)(v20 + 8) != PiDDBCacheList )
      goto LABEL_26;
    PiDDBCacheList = *(PVOID *)PiDDBCacheList;
    *(_QWORD *)(v20 + 8) = &PiDDBCacheList;
  }
  if( v12 )
  {
    v23 = (void *)v12[3];
    RtlDeleteElementGenericTableAvl(&PiDDBCacheTable, v12);
    ExFreePoolWithTag(v23, 0);
  }
LABEL_8:
  v13 = *v27;
  v14 = FullPath->Buffer;
  *(_DWORD *)&v26[4] = v5;
  *(_OWORD *)&v26[8] = v13;
  *(_DWORD *)v26 = *(_DWORD *)(v7 + 8);
  v15 = wcsrchr(v14, 92);
  if( v15 )
    v16 = v15 + 1;
  else
    v16 = FullPath->Buffer;
  do
    ++v10;
  while( v16[v10] );
  WORD1(v25) = 2 * v10;
  LOWORD(v25) = 2 * v10;
  PoolWithTag = ExAllocatePoolWithTag(1ui64, (unsigned __int16)(2 * v10), 538996816i64);
  *((_QWORD *)&v25 + 1) = PoolWithTag;
  if( PoolWithTag )
  {
    memmove(PoolWithTag, v16, (unsigned __int16)v25);
    inserted = RtlInsertElementGenericTableAvl(&PiDDBCacheTable, &Buffer, 0x38ui64, 0i64);
    if( inserted )
    {
      v19 = (_QWORD *)qword_140D2DBE8;
      if( *(PVOID **)qword_140D2DBE8 == &PiDDBCacheList )
      {
        *inserted = &PiDDBCacheList;
        inserted[1] = v19;
        *v19 = inserted;
        qword_140D2DBE8 = (__int64)inserted;
        return;
      }
LABEL_26:
      __fastfail(3u);
    }
  }
}

Referenced by:

PiIsDriverBlocked