DrvDbGetDeviceIdMappedProperty

__int64 __fastcall DrvDbGetDeviceIdMappedProperty(
        __int64 *a1,
        __int64 a2,
        HANDLE a3,
        __int64 a4,
        _DWORD *a5,
        _WORD *a6,
        unsigned int a7,
        unsigned int *a8){
  __int64 *v10; 
  int v11; 
  __int64 v12; 
  __int64 v13; 
  char v14; 
  __int64 v15; 
  const UNICODE_STRING *v16; 
  int v17; 
  __int64 v18; 
  int RegValueMappedProperty; 
  __int64 v21; 
  __int64 v22; 
  unsigned int v23; 
  unsigned int v24; 
  unsigned int v25; 
  WCHAR *v26; 
  HANDLE v27; 
  unsigned int v28; 
  int ObjectDatabaseNodeName; 
  unsigned int v30; 
  __int64 **i; 
  __int64 *v32; 
  __int64 v33; 
  __int64 v34; 
  __int64 **v35; 
  INT64 a5a; 
  unsigned int v37; 
  unsigned int v38; 
  HANDLE Handle; 
  __int64 *a1a; 
  char v41; 
  a1a = a1;
  Handle = 0i64;
  v10 = a1;
  v37 = 0;
  *a5 = 0;
  *a8 = 0;
  v11 = *(_DWORD *)(a4 + 16);
  v38 = 0;
  v41 = 0;
  if( v11 != 2 )
  {
    if( v11 == 3 )
    {
      a1 = (__int64 *)0xBADB47CC74A2E194i64;
      v12 = *(_QWORD *)a4 - DEVPKEY_DeviceId_DriverInfMatches;
      if( *(_QWORD *)a4 == DEVPKEY_DeviceId_DriverInfMatches )
        v12 = *(_QWORD *)(a4 + 8) + 0x4524B8338B5D1E6Ci64;
      if( !v12 )
      {
        v13 = *(_QWORD *)a4 - DEVPKEY_DeviceId_DriverInfMatches;
        if( *(_QWORD *)a4 == DEVPKEY_DeviceId_DriverInfMatches )
          v13 = *(_QWORD *)(a4 + 8) + 0x4524B8338B5D1E6Ci64;
        v14 = 1;
        if( !v13 )
          goto LABEL_9;
        goto LABEL_30;
      }
    }
LABEL_65:
    v30 = 0;
    for( i = &off_140001728; ; i += 5 )
    {
      v32 = *i;
      if( *((_DWORD *)*i + 4) == v11 )
      {
        v33 = *v32 - *(_QWORD *)a4;
        if( *v32 == *(_QWORD *)a4 )
          v33 = v32[1] - *(_QWORD *)(a4 + 8);
        if( !v33 )
          break;
      }
      if( ++v30 )
        return(unsigned int)-1073741802;
    }
    v34 = 5i64 * v30;
    v35 = &(&off_140001728)[5 * v30];
    if( v35 )
    {
      if( !a3 )
      {
        RegValueMappedProperty = DrvDbOpenDeviceIdRegKey(v10, a2, 1i64, 0, (INT64)&Handle, 0i64);
        if( RegValueMappedProperty < 0 )
          goto LABEL_21;
        a3 = Handle;
      }
      RegValueMappedProperty = DrvDbGetRegValueMappedProperty(v34, a3, (__int64)v35, a5, a6, a7, a8);
      goto LABEL_21;
    }
    return(unsigned int)-1073741802;
  }
  v21 = *(_QWORD *)a4 - DEVPKEY_NODE;
  if( *(_QWORD *)a4 == DEVPKEY_NODE )
    v21 = *(_QWORD *)(a4 + 8) + 0x5008C7D4C8250077i64;
  if( !v21 )
  {
    LODWORD(a5a) = a7 >> 1;
    *a5 = 18;
    ObjectDatabaseNodeName = DrvDbGetObjectDatabaseNodeName(a1, 5i64, a2, a6, a5a, (UINT64 *)a8);
    RegValueMappedProperty = ObjectDatabaseNodeName;
    if( (int)(ObjectDatabaseNodeName + 0x80000000) < 0 || ObjectDatabaseNodeName == -1073741789 )
      *a8 *= 2;
    goto LABEL_21;
  }
  v22 = *(_QWORD *)a4 - DEVPKEY_DeviceId_DriverInfNames;
  if( *(_QWORD *)a4 == DEVPKEY_DeviceId_DriverInfNames )
    v22 = *(_QWORD *)(a4 + 8) + 0x4524B8338B5D1E6Ci64;
  if( v22 )
    goto LABEL_65;
LABEL_30:
  v14 = 0;
LABEL_9:
  if( *(_WORD *)a2 != 64 || (v26 = wcschr((WCHAR *)(a2 + 2), 0x3Au)) == 0i64 || (v15 = (__int64)(v26 + 1)) == 0 )
    v15 = a2;
  if( v15 == a2 && !v10[5] )
  {
    v16 = (const UNICODE_STRING *)v10[2];
    if( v16 == (const UNICODE_STRING *)(v10 + 2) )
      goto LABEL_20;
    while( 1 )
    {
      LODWORD(a5a) = 1;
      v17 = DrvDbOpenObjectRegKey(a1a, v16, 5i64, (WCHAR *)a2, a5a, 0, (INT64)&Handle, 0i64, 0i64);
      RegValueMappedProperty = v17;
      if( v17 >= 0 )
      {
        v41 = 1;
        RegValueMappedProperty = DrvDbGetDeviceIdDriverInfMatches(
                                   v18,
                                   Handle,
                                   (__int64)a6 + v38,
                                   (a7 - v38) >> 1,
                                   &v37,
                                   v14);
        ZwClose(Handle);
        Handle = 0i64;
        if( RegValueMappedProperty >= 0 )
          goto LABEL_32;
        if( RegValueMappedProperty != -1073741275 )
        {
          if( RegValueMappedProperty != -1073741789 )
          {
LABEL_18:
            if( (int)(RegValueMappedProperty + 0x80000000) >= 0 && RegValueMappedProperty != -1073741789 )
              goto LABEL_21;
            if( v41 )
            {
              if( *a8 )
              {
                *a5 = 8210;
                v25 = *a8 + 2;
                *a8 = v25;
                if( a6 && v25 <= a7 )
                  a6[((unsigned __int64)v25 >> 1) - 1] = 0;
                else
                  RegValueMappedProperty = -1073741789;
              }
              else
              {
                RegValueMappedProperty = -1073741275;
              }
            }
            else
            {
LABEL_20:
              RegValueMappedProperty = -1073741772;
            }
            goto LABEL_21;
          }
LABEL_32:
          v23 = 2 * v37 - 2;
          if( 2 * v37 <= 2 )
            v23 = 2 * v37;
          if( a6 )
          {
            v24 = v38;
            if( v23 + v38 < a7 )
              v24 = v23 + v38;
            v38 = v24;
          }
          *a8 += v23;
          goto LABEL_17;
        }
      }
      else if( v17 != -1073741772 )
      {
        goto LABEL_18;
      }
      RegValueMappedProperty = 0;
LABEL_17:
      v16 = *(const UNICODE_STRING **)&v16->Length;
      if( v16 == (const UNICODE_STRING *)(a1a + 2) )
        goto LABEL_18;
    }
  }
  v27 = 0i64;
  if( a3 != (HANDLE)-1i64 )
    v27 = a3;
  if( !v27 )
  {
    RegValueMappedProperty = DrvDbOpenDeviceIdRegKey(v10, a2, 1i64, 0, (INT64)&Handle, 0i64);
    if( RegValueMappedProperty < 0 )
      goto LABEL_21;
    v27 = Handle;
  }
  RegValueMappedProperty = DrvDbGetDeviceIdDriverInfMatches((__int64)a1, v27, (__int64)a6, a7 >> 1, &v37, v14);
  if( (int)(RegValueMappedProperty + 0x80000000) < 0 || RegValueMappedProperty == -1073741789 )
  {
    v28 = 2 * v37;
    *a5 = 8210;
    *a8 = v28;
  }
LABEL_21:
  if( Handle )
    ZwClose(Handle);
  return(unsigned int)RegValueMappedProperty;
}

Referenced by:

DrvDbDispatchDeviceId