PiPnpRtlCmActionCallback

INT64 __fastcall PiPnpRtlCmActionCallback(INT64 rcx0, WCHAR *a2, INT64 a3, INT64 r9_0, INT64 arg20, INT64 a1){
  int v6; 
  unsigned int v9; 
  int v10; 
  int v11; 
  int v12; 
  int v13; 
  int FilteredDeviceInterfaceList; 
  int v15; 
  _QWORD *v16; 
  int v18; 
  int v19; 
  int v20; 
  unsigned int v21; 
  void *PoolWithTag; 
  int v23; 
  int DeviceRegProp; 
  int v25; 
  bool v26; 
  unsigned int v27; 
  WCHAR *v28; 
  int v29; 
  WCHAR *v30; 
  UINT64 v31; 
  UINT64 *v32; 
  CHAR *v33; 
  ULONG_PTR v34; 
  unsigned int v35; 
  WCHAR *v36; 
  CHAR *v37; 
  INT64 v38; 
  int v39; 
  CHAR *v40; 
  int v41; 
  INT64 v42; 
  INT64 v43; 
  unsigned int v44; 
  WCHAR *v45; 
  int v46; 
  CHAR *v47; 
  int v48; 
  _QWORD *v49; 
  __int64 v50; 
  WCHAR *v51; 
  UINT8 v52; 
  INT64 v53; 
  WCHAR v54; 
  WCHAR *v55; 
  ULONG_PTR *v56; 
  ULONG_PTR v57; 
  ULONG_PTR v58; 
  ULONG_PTR v59; 
  ULONG_PTR *v60; 
  ULONG_PTR v61; 
  INT64 v62; 
  INT64 v63; 
  int v64; 
  UINT8 IsNullGuid; 
  INT64 v66; 
  struct _DMA_ADAPTER *v67; 
  _DWORD *v68; 
  int v69; 
  int v70; 
  int Object; 
  CHAR *v72; 
  WCHAR *v73; 
  ULONG_PTR *v74; 
  ULONG_PTR v75; 
  INT64 a5; 
  INT64 a7; 
  _DWORD a4[4]; 
  INT64 v79; 
  INT64 v80; 
  struct _UNICODE_STRING DestinationString; 
  INT64 *v82; 
  INT64 v83; 
  INT64 *v84; 
  INT64 v85; 
  PVOID P; 
  INT64 v87; 
  PVOID v88; 
  INT64 v89; 
  CHAR **v90; 
  __int64 v91; 
  __int64 v92[3]; 
  char v93; 
  int v94; 
  __int16 v95; 
  char v96; 
  __int64 v97[3]; 
  char v98; 
  int v99; 
  __int16 v100; 
  char v101; 
  __int64 v102; 
  GUID Guid; 
  v6 = a3;
  v9 = -1073741822;
  if( (int)r9_0 > 13 )
  {
    v18 = r9_0 - 14;
    if( !v18 )
    {
      if( (_DWORD)arg20 != 1 )
      {
        if( (_DWORD)a3 == 5 )
        {
          if( *(int *)a1 >= 0 )
          {
            v60 = *(ULONG_PTR **)(a1 + 8);
            BYTE1(a4[0]) = 0;
            v61 = v60[1];
            if( v61 )
            {
              if( *v60 )
              {
                PiDmListRemoveObject(4u, v61, *v60, (__int64)a4 + 1);
                if( BYTE1(a4[0]) )
                  PiDmListRemoveList(v62, v60[1], v63, *v60);
              }
            }
            PiPnpRtlFreePanelRemoveInfo(v60);
          }
        }
        else if( (_DWORD)a3 == 6 && *(int *)a1 >= 0 )
        {
          v74 = *(ULONG_PTR **)(a1 + 8);
          v75 = v74[1];
          if( v75 && *v74 )
            PiDmListRemoveObject(6u, v75, *v74, (__int64)a4 + 3);
          PiPnpRtlFreePanelRemoveInfo(v74);
        }
        return 0;
      }
      if( (_DWORD)a3 == 5 )
      {
        v55 = *(WCHAR **)(a1 + 24);
        v90 = 0i64;
        FilteredDeviceInterfaceList = PiPnpRtlGatherContainerRemoveInfo(v55, a2, &v90);
        v9 = FilteredDeviceInterfaceList;
        if( FilteredDeviceInterfaceList < 0 )
          goto LABEL_28;
        v50 = (__int64)v90;
      }
      else
      {
        if( (_DWORD)a3 != 6 )
          return v9;
        v73 = *(WCHAR **)(a1 + 24);
        v91 = 0i64;
        FilteredDeviceInterfaceList = PiPnpRtlGatherPanelRemoveInfo(v73, a2);
        v9 = FilteredDeviceInterfaceList;
        if( FilteredDeviceInterfaceList < 0 )
          goto LABEL_28;
        v50 = v91;
      }
LABEL_125:
      *(_QWORD *)(a1 + 8) = v50;
      return v9;
    }
    v19 = v18 - 1;
    if( v19 )
    {
      v20 = v19 - 1;
      if( v20 )
      {
        if( v20 != 1 || (_DWORD)arg20 != 1 || (*(_DWORD *)(a1 + 80) & 0x10000) != 0 )
          return v9;
        FilteredDeviceInterfaceList = PiPnpRtlGetFilteredDeviceInterfaceList(a1);
      }
      else
      {
        if( (_DWORD)arg20 != 1 || (*(_DWORD *)(a1 + 72) & 0x10000) != 0 )
          return v9;
        FilteredDeviceInterfaceList = PiPnpRtlGetFilteredDeviceList(a1);
      }
LABEL_27:
      if( FilteredDeviceInterfaceList != -1073741802 )
      {
LABEL_28:
        *(_DWORD *)a1 = FilteredDeviceInterfaceList;
        return(unsigned int)-1073741536;
      }
      return 0;
    }
    if( (_DWORD)arg20 != 1 )
      return v9;
    if( (_DWORD)a3 == 5 )
    {
      if( (*(_DWORD *)(a1 + 40) & 0x10000) != 0 )
        return v9;
      v94 = 0;
      v95 = 0;
      v96 = 0;
      v88 = 0i64;
      Object = PiDmGetObject(5i64, a2, (INT64 *)&v88);
      if( Object < 0 )
        goto LABEL_178;
      v72 = (CHAR *)v88;
      v92[1] = *(_QWORD *)(a1 + 24);
      v92[2] = *(_QWORD *)(a1 + 32);
      v92[0] = rcx0;
      do
      {
        v93 = 0;
        Object = PiDmListEnumObjectsWithCallback(
                   4,
                   (ULONG_PTR)v72,
                   (__int64(__fastcall *)(_QWORD, __int64, char *))PiPnpRtlEnumDevicesCallback,
                   (__int64)v92);
      }
      while( Object >= 0 && v93 );
    }
    else
    {
      if( (_DWORD)a3 != 6 || (*(_DWORD *)(a1 + 40) & 0x10000) != 0 )
        return v9;
      v99 = 0;
      v100 = 0;
      v101 = 0;
      v89 = 0i64;
      Object = PiDmGetObject(6i64, a2, &v89);
      if( Object < 0 )
        goto LABEL_178;
      v72 = (CHAR *)v89;
      v97[1] = *(_QWORD *)(a1 + 24);
      v97[2] = *(_QWORD *)(a1 + 32);
      v97[0] = rcx0;
      do
      {
        v98 = 0;
        Object = PiDmListEnumObjectsWithCallback(
                   6,
                   (ULONG_PTR)v72,
                   (__int64(__fastcall *)(_QWORD, __int64, char *))PiPnpRtlEnumDevicesCallback,
                   (__int64)v97);
      }
      while( Object >= 0 && v98 );
    }
    if( v72 )
      PiDmObjectRelease(v72);
LABEL_178:
    *(_DWORD *)a1 = Object;
    return(unsigned int)-1073741536;
  }
  if( (_DWORD)r9_0 == 13 )
  {
    if( (_DWORD)arg20 == 1 )
      return 0;
    if( (_DWORD)a3 == 5 )
    {
      if( *(int *)a1 < 0 )
        return 0;
      P = 0i64;
      v79 = 0i64;
      v38 = 0i64;
      LOBYTE(a4[0]) = 0;
      v39 = PiDmGetObject(5i64, a2, (INT64 *)&P);
      v40 = (CHAR *)P;
      if( v39 >= 0 )
      {
        v41 = PiDmGetObject(1i64, *(WCHAR **)(a1 + 24), &v79);
        v38 = v79;
        if( v41 >= 0 )
        {
          PiDmListAddObject(4u, (UINT64)v40, v79, (__int64)a4);
          if( !LOBYTE(a4[0]) )
            PiDmListAddList(v42, (UINT64)v40, v43, v38);
        }
      }
    }
    else
    {
      if( (_DWORD)a3 != 6 || *(int *)a1 < 0 )
        return 0;
      v87 = 0i64;
      v80 = 0i64;
      v38 = 0i64;
      v69 = PiDmGetObject(6i64, a2, &v87);
      v40 = (CHAR *)v87;
      if( v69 >= 0 )
      {
        v70 = PiDmGetObject(1i64, *(WCHAR **)(a1 + 24), &v80);
        v38 = v80;
        if( v70 >= 0 )
          PiDmListAddObject(6u, (UINT64)v40, v80, (__int64)a4 + 2);
      }
    }
    if( v40 )
      PiDmObjectRelease(v40);
    if( !v38 )
      return 0;
    goto LABEL_97;
  }
  v10 = r9_0 - 2;
  if( !v10 )
  {
    if( (_DWORD)arg20 == 1 )
    {
      v27 = CmMapCmObjectTypeToPnpObjectType(a3);
      v29 = PiDmAddCacheReferenceForObject(v27, v28, 0i64);
      *(_DWORD *)a1 = v29;
      return(v29 >> 31) & 0xC0000120;
    }
    if( *(int *)a1 < 0 || !*(_BYTE *)(a1 + 32) )
    {
      v35 = CmMapCmObjectTypeToPnpObjectType(a3);
      PiDmRemoveCacheReferenceForObject(v35, v36, v37);
      return 0;
    }
    v85 = 0i64;
    v44 = CmMapCmObjectTypeToPnpObjectType(a3);
    if( (int)PiDmGetObject(v44, v45, &v85) < 0 )
      return 0;
    v38 = v85;
    KsepCacheLock(v85);
    v46 = *(_DWORD *)(v38 + 32);
    *(_DWORD *)(v38 + 32) = v46 | 1;
    PiDmObjectReleaseLock(v38);
    if( (v46 & 1) != 0 )
      PiDmRemoveCacheReferenceForObject(v44, a2, v47);
LABEL_97:
    PiDmObjectRelease((CHAR *)v38);
    return 0;
  }
  v11 = v10 - 1;
  if( !v11 )
  {
    if( (_DWORD)arg20 != 1 )
    {
      if( (_DWORD)a3 == 1 )
      {
        v51 = *(WCHAR **)(a1 + 8);
        DestinationString = 0i64;
        Guid = 0i64;
        RtlInitUnicodeString(&DestinationString, v51 + 2, 1u);
        if( RtlGUIDFromString(&DestinationString, &Guid) < 0 )
          Guid = 0i64;
        if( *(int *)a1 < 0 )
        {
          if( (byte_140C130BA & 0x10) != 0 )
          {
            IsNullGuid = PnpIsNullGuid(&Guid);
            McTemplateK0zjdd_EtwWriteTransfer(
              (unsigned int)-(IsNullGuid == 0),
              (const EVENT_DESCRIPTOR *)KMPnPEvt_DeviceDelete_Failure,
              v66,
              a2,
              (unsigned __int64)&Guid & -(__int64)(IsNullGuid == 0),
              *(_DWORD *)v51,
              *(_DWORD *)a1);
          }
        }
        else if( (byte_140C130BA & 8) != 0 )
        {
          v52 = PnpIsNullGuid(&Guid);
          McTemplateK0zjdd_EtwWriteTransfer(
            (unsigned int)-(v52 == 0),
            &KMPnPEvt_DeviceDelete_Success,
            v53,
            a2,
            (unsigned __int64)&Guid & -(__int64)(v52 == 0),
            *(_DWORD *)v51,
            *(_DWORD *)a1);
        }
        if( *(int *)a1 >= 0 )
        {
          if( v51[2] )
          {
            v102 = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart;
            PnpSetObjectProperty(
              rcx0,
              (__int64)(v51 + 2),
              2u,
              0i64,
              0i64,
              (__int64)DEVPKEY_DeviceClass_LastDeleteDate,
              16,
              (__int64)&v102,
              8u,
              0);
          }
          if( CmIsRootEnumeratedDevice(a2) )
          {
            RtlInitUnicodeString(&DestinationString, a2, v54);
            if( DestinationString.Length >= 2u )
            {
              if( *DestinationString.Buffer )
              {
                v67 = (struct _DMA_ADAPTER *)PnpDeviceObjectFromDeviceInstanceWithTag(
                                               (INT64)&DestinationString,
                                               0x746C6644ui64);
                if( v67 )
                {
                  v68 = *(_DWORD **)&v67[4].Version;
                  if( v68 )
                    *v68 |= 1u;
                  HalPutDmaAdapter(v67);
                }
              }
            }
          }
        }
        PiPnpRtlFreeDeviceDeleteInfo(v51);
      }
      else if( (_DWORD)a3 == 3 )
      {
        v56 = *(ULONG_PTR **)(a1 + 8);
        if( *(int *)a1 >= 0 && *v56 )
        {
          v57 = v56[1];
          if( v57 )
            PiDmListRemoveObject(0, v57, *v56, 0i64);
          v58 = v56[2];
          if( v58 )
            PiDmListRemoveObject(1u, v58, *v56, 0i64);
          v59 = v56[3];
          if( v59 )
            PiDmListRemoveObject(2u, v59, *v56, 0i64);
        }
        PiPnpRtlFreeInterfaceDeleteInfo(v56);
      }
      return 0;
    }
    if( (_DWORD)a3 == 1 )
    {
      v83 = 0i64;
      FilteredDeviceInterfaceList = PiPnpRtlGatherDeviceDeleteInfo(a2, (INT64)&v83);
      v9 = FilteredDeviceInterfaceList;
      if( FilteredDeviceInterfaceList < 0 )
        goto LABEL_28;
      v50 = v83;
    }
    else
    {
      if( (_DWORD)a3 != 3 )
        return v9;
      v84 = 0i64;
      FilteredDeviceInterfaceList = PiPnpRtlGatherInterfaceDeleteInfo(a2, &v84);
      v9 = FilteredDeviceInterfaceList;
      if( FilteredDeviceInterfaceList < 0 )
        goto LABEL_28;
      v50 = (__int64)v84;
    }
    goto LABEL_125;
  }
  v12 = v11 - 1;
  if( !v12 )
  {
    if( (_DWORD)arg20 != 1 || (*(_DWORD *)(a1 + 56) & 0x10000) != 0 )
      return v9;
    FilteredDeviceInterfaceList = PiDmGetCmObjectListFromCache(
                                    (unsigned int)a3,
                                    *(_QWORD *)(a1 + 16),
                                    *(_QWORD *)(a1 + 24),
                                    *(_QWORD *)(a1 + 32),
                                    *(_DWORD *)(a1 + 40),
                                    *(_QWORD *)(a1 + 48));
    goto LABEL_27;
  }
  v13 = v12 - 5;
  if( v13 )
  {
    if( v13 != 1 )
      return v9;
    if( (_DWORD)arg20 != 1 )
    {
      if( *(int *)a1 < 0 )
        return v9;
      LODWORD(a7) = *(_DWORD *)(a1 + 40);
      LODWORD(a5) = *(_DWORD *)(a1 + 28);
      PiDmObjectUpdateCachedCmProperty(
        (unsigned int)a3,
        a2,
        a3,
        *(unsigned int *)(a1 + 24),
        a5,
        *(const WCHAR **)(a1 + 32),
        a7);
      if( v6 == 1 && *(_DWORD *)(a1 + 24) == 9 )
      {
        v32 = *(UINT64 **)(a1 + 8);
        v33 = (CHAR *)*v32;
        if( *v32 )
        {
          v34 = v32[1];
          if( v34 )
            PiDmListRemoveObject(5u, v34, (ULONG_PTR)v33, 0i64);
          v31 = v32[2];
          if( v31 )
            PiDmListAddObject(5u, v31, *v32, 0i64);
        }
        PiPnpRtlFreeInstallerClassChangeInfo((CHAR **)v32, v31, v33);
      }
      return 0;
    }
    v9 = 0;
    if( (*(_DWORD *)(a1 + 44) & 0x20000) != 0
      || ((v21 = *(_DWORD *)(a1 + 40), PoolWithTag = 0i64, a4[1] = 0, !v21)
       || (PoolWithTag = ExAllocatePoolWithTag(PagedPool, v21, 0x47706E50ui64)) == 0i64)
      && *(_DWORD *)(a1 + 40) )
    {
LABEL_56:
      if( *(_QWORD *)(a1 + 16) )
      {
LABEL_57:
        if( v6 != 1 || *(_DWORD *)(a1 + 24) != 9 )
          return v9;
        v30 = 0i64;
        v82 = 0i64;
        if( *(_DWORD *)(a1 + 28) == 1 && *(_DWORD *)(a1 + 40) == 78 && PnpIsValidGuidString(*(const WCHAR **)(a1 + 32)) )
          v30 = *(WCHAR **)(a1 + 32);
        FilteredDeviceInterfaceList = PiPnpRtlGatherInstallerClassChangeInfo(a2, v30, &v82);
        v9 = FilteredDeviceInterfaceList;
        if( FilteredDeviceInterfaceList >= 0 )
        {
          *(_QWORD *)(a1 + 8) = v82;
          return v9;
        }
        goto LABEL_28;
      }
      v48 = CmMapCmObjectTypeToPnpObjectType(v6);
      PiPnpRtlCacheObjectBaseKey(rcx0, a2, v48, v49);
      v26 = (v9 & 0x80000000) != 0;
LABEL_52:
      if( v26 )
        return v9;
      goto LABEL_57;
    }
    a4[2] = *(_DWORD *)(a1 + 40);
    if( v6 == 1 )
    {
      v23 = *(_DWORD *)(a1 + 24);
      if( (unsigned int)(v23 - 1) > 0x24
        || !CmDevicePropertyRead((unsigned int)(v6 - 1), v23)
        || CmDevicePropertyWrite() )
      {
        DeviceRegProp = CmGetDeviceRegProp(
                          PiPnpRtlCtx,
                          a2,
                          *(_QWORD *)(a1 + 16),
                          v23,
                          (__int64)&a4[1],
                          (__int64)PoolWithTag,
                          (__int64)&a4[2],
                          0);
        goto LABEL_45;
      }
    }
    else
    {
      if( v6 != 2 )
      {
LABEL_77:
        v9 = 0;
LABEL_49:
        if( PoolWithTag )
          ExFreePoolWithTag(PoolWithTag, 0x47706E50u);
        v26 = (v9 & 0x80000000) != 0;
        if( v9 )
          goto LABEL_52;
        goto LABEL_56;
      }
      v64 = *(_DWORD *)(a1 + 24);
      if( (unsigned int)(v64 - 1) > 0x24 || !CmClassPropertyRead(v64) || CmClassPropertyWrite(v64) )
      {
        DeviceRegProp = CmGetInstallerClassRegProp(
                          PiPnpRtlCtx,
                          (__int64)a2,
                          *(_QWORD *)(a1 + 16),
                          v64,
                          (__int64)&a4[1],
                          (__int64)PoolWithTag,
                          (__int64)&a4[2]);
LABEL_45:
        v25 = DeviceRegProp;
        if( (DeviceRegProp < 0
           || *(_QWORD *)&a4[1] != __PAIR64__(*(_DWORD *)(a1 + 40), *(_DWORD *)(a1 + 28))
           || memcmp(PoolWithTag, *(PVOID *)(a1 + 32), a4[2]))
          && (v25 != -1073741275 || *(_DWORD *)(a1 + 40))
          && v25 != -1073741790 )
        {
          goto LABEL_77;
        }
LABEL_48:
        *(_DWORD *)a1 = v25;
        v9 = -1073741536;
        goto LABEL_49;
      }
    }
    v25 = -1073741790;
    goto LABEL_48;
  }
  if( (_DWORD)arg20 != 1 )
  {
    if( *(int *)a1 >= 0 )
    {
      LODWORD(a7) = **(_DWORD **)(a1 + 48);
      LODWORD(a5) = **(_DWORD **)(a1 + 32);
      PiDmObjectUpdateCachedCmProperty(
        (unsigned int)a3,
        a2,
        a3,
        *(unsigned int *)(a1 + 24),
        a5,
        *(const WCHAR **)(a1 + 40),
        a7);
    }
    else if( *(_DWORD *)a1 == -1073741275 )
    {
      LODWORD(a7) = 0;
      LODWORD(a5) = 0;
      PiDmObjectUpdateCachedCmProperty((unsigned int)a3, a2, a3, *(unsigned int *)(a1 + 24), a5, 0i64, a7);
    }
    return 0;
  }
  if( (*(_DWORD *)(a1 + 56) & 0x10000) != 0 )
    goto LABEL_14;
  FilteredDeviceInterfaceList = PiDmObjectGetCachedCmProperty(
                                  (unsigned int)a3,
                                  (INT64)a2,
                                  a3,
                                  *(unsigned int *)(a1 + 24),
                                  *(_QWORD *)(a1 + 32),
                                  *(_QWORD *)(a1 + 40),
                                  *(_QWORD *)(a1 + 48));
  if( FilteredDeviceInterfaceList >= 0
    || FilteredDeviceInterfaceList == -1073741275
    || FilteredDeviceInterfaceList == -1073741789
    || FilteredDeviceInterfaceList == -1073741772 )
  {
    goto LABEL_28;
  }
  v9 = 0;
LABEL_14:
  if( !*(_QWORD *)(a1 + 16) )
  {
    v15 = CmMapCmObjectTypeToPnpObjectType(v6);
    PiPnpRtlCacheObjectBaseKey(rcx0, a2, v15, v16);
  }
  return v9;
}

Referenced by:

No references.