PiPnpRtlGatherInterfaceDeleteInfo

NTSTATUS __stdcall PiPnpRtlGatherInterfaceDeleteInfo(WCHAR *InterfaceId, PI_PNPRTL_INTERFACE_DELETE_INFO **Info){
  WCHAR *v2; 
  VOID **PoolWithTag; 
  int Object; 
  NTSTATUS ObjectProperty; 
  UINT64 v8; 
  int v9; 
  NTSTATUS v10; 
  UINT64 v11; 
  INT64 v13; 
  WCHAR *ObjectName; 
  INT64 v15[2]; 
  WCHAR GuidString[40]; 

  v2 = 0i64;
  v13 = 0i64;
  ObjectName = 0i64;
  *(_OWORD *)v15 = 0i64;
  PoolWithTag = ExAllocatePoolWithTag(1ui64, 0x20ui64, 1198550608i64);
  *Info = (PI_PNPRTL_INTERFACE_DELETE_INFO *)PoolWithTag;
  if( PoolWithTag )
  {
    *(_OWORD *)PoolWithTag = 0i64;
    *((_OWORD *)PoolWithTag + 1) = 0i64;
    Object = PiDmGetObject(3, InterfaceId, (PI_DM_OBJECT **)*Info);
    if( (int)(Object + 0x80000000) < 0 || Object == -1073741772 )
    {
      ObjectProperty = PnpGetObjectProperty(
                         *(&stru_140CF2E80 + 1214),
                         (INT64)InterfaceId,
                         3i64,
                         0i64,
                         0i64,
                         (INT64)&DEVPKEY_DeviceInterface_ClassGuid,
                         (INT64)&v13 + 4,
                         (INT64)v15);
      Object = ObjectProperty;
      if( ObjectProperty == -1073741772
        || ObjectProperty == -1073741275
        || ObjectProperty >= 0
        && (PnpStringFromGuid((const _GUID *)v15, GuidString, v8) < 0
         || (Object = PiDmGetObject(4, GuidString, (PI_DM_OBJECT **)*Info + 1), (int)(Object + 0x80000000) < 0)
         || Object == -1073741772) )
      {
        v9 = PnpGetObjectProperty(
               0x47706E50u,
               0xC8ui64,
               (INT64)InterfaceId,
               3u,
               0i64,
               0i64,
               (INT64)&DEVPKEY_Device_InstanceId,
               (INT64)&v13 + 4,
               (__int64)&ObjectName,
               (__int64)&v13);
        v2 = ObjectName;
        Object = v9;
        if( v9 == -1073741772
          || v9 == -1073741275
          || v9 >= 0
          && ((Object = PiDmGetObject(1, ObjectName, (PI_DM_OBJECT **)*Info + 2), (int)(Object + 0x80000000) < 0)
           || Object == -1073741772) )
        {
          v10 = PnpGetObjectProperty(
                  *(&stru_140CF2E80 + 1214),
                  (INT64)InterfaceId,
                  3i64,
                  0i64,
                  0i64,
                  (INT64)&DEVPKEY_Device_ContainerId,
                  (INT64)&v13 + 4,
                  (INT64)v15);
          Object = v10;
          if( v10 == -1073741772 || v10 == -1073741275 )
          {
            Object = 0;
            goto LABEL_21;
          }
          if( v10 >= 0 )
          {
            Object = PnpStringFromGuid((const _GUID *)v15, GuidString, v11);
            if( Object >= 0 )
            {
              Object = PiDmGetObject(5, GuidString, (PI_DM_OBJECT **)*Info + 3);
              if( Object == -1073741772 )
              {
                Object = 0;
                goto LABEL_18;
              }
LABEL_21:
              if( Object >= 0 )
                goto LABEL_18;
            }
          }
        }
      }
    }
  }
  else
  {
    Object = -1073741670;
  }
  PiPnpRtlFreeInterfaceDeleteInfo(*Info);
  *Info = 0i64;
LABEL_18:
  if( v2 )
    ExFreePoolWithTag(v2, 0x47706E50u);
  return Object;
}

Referenced by:

PiPnpRtlCmActionCallback