PiPnpRtlObjectEventCreate

INT64 __fastcall PiPnpRtlObjectEventCreate(WCHAR *a1, INT64 a2, INT64 a3, CHAR **a4){
  unsigned int v4; 
  CHAR *v8; 
  NTSTATUS v9; 
  _CM_KEY_CONTROL_BLOCK **v10; 
  _CM_KEY_CONTROL_BLOCK *v11; 
  int Object; 
  UINT *v14; 
  VOID *v15; 
  VOID **v16; 
  void *PoolWithTag; 
  _DWORD *v18; 
  PVOID v19; 
  UINT64 inserted; 
  _POOL_TYPE v21; 
  _GENERIC_MAPPING *v22; 
  _CM_TRANS *SearchResult; 
  PVOID v24; 
  PVOID P; 
  PVOID NodeOrParent; 
  INT64 *Buffer; 
  INT64 v28[10]; 
  INT64 result[14]; 
  v4 = a2;
  memset((INT64)result, 0i64);
  memset((INT64)v28, 0i64);
  NodeOrParent = 0i64;
  LODWORD(SearchResult) = 0;
  v8 = 0i64;
  Buffer = v28;
  *a4 = 0i64;
  v24 = 0i64;
  v9 = PiDmInitializeComparisonObject(a1, v4, (INT64)result);
  if( v9 >= 0 )
  {
    v28[1] = (INT64)result;
    LODWORD(v10) = RtlLookupElementGenericTableFullAvl(
                     (RTL_AVL_TABLE *)(a3 + 24),
                     &Buffer,
                     &NodeOrParent,
                     (TABLE_SEARCH_RESULT *)&SearchResult);
    if( v10 )
      v11 = *v10;
    else
      v11 = 0i64;
    if( v11 )
      goto LABEL_5;
    Object = PiDmGetObject(v4, a1, (INT64 *)&v24);
    v9 = Object;
    if( Object == -1073741772 )
    {
      v8 = (CHAR *)v24;
      v9 = 0;
      goto LABEL_14;
    }
    if( Object < 0 )
    {
      v8 = (CHAR *)v24;
LABEL_18:
      if( v11 )
        PiPnpRtlObjectEventRelease(v11, v14, v15, v16, v21, v22, SearchResult, (_CM_KCB_UOW *)v24);
      goto LABEL_20;
    }
    PoolWithTag = ExAllocatePoolWithTag(PagedPool, 0xF0ui64, 0x41706E50ui64);
    P = PoolWithTag;
    v18 = PoolWithTag;
    if( PoolWithTag )
    {
      memset((INT64)PoolWithTag, 0i64);
      v19 = v24;
      *v18 = 1;
      v18[18] = 5;
      v8 = 0i64;
      *((_QWORD *)v18 + 1) = v19;
      LODWORD(v22) = (_DWORD)SearchResult;
      v21 = (int)NodeOrParent;
      inserted = RtlInsertElementGenericTableFullAvl((RTL_BITMAP *)(a3 + 24), (UINT64)&P, 8ui64);
      v11 = (_CM_KEY_CONTROL_BLOCK *)P;
      if( inserted )
      {
LABEL_5:
        *a4 = (CHAR *)v11;
        return(unsigned int)v9;
      }
      v9 = -1073741670;
      goto LABEL_18;
    }
    v8 = (CHAR *)v24;
    v9 = -1073741670;
  }
LABEL_20:
  *a4 = 0i64;
LABEL_14:
  if( v8 )
    PiDmObjectRelease(v8);
  return(unsigned int)v9;
}

Referenced by:

PiPnpRtlCacheObjectBaseKey
PiPnpRtlEnsureObjectCached
PiPnpRtlObjectEventWorker