WmipTranslatePDOInstanceNames

__int64 __fastcall WmipTranslatePDOInstanceNames(__int64 a1, char a2, int a3, __int64 a4){
  unsigned int *v4; 
  unsigned int v5; 
  unsigned int v6; 
  int v7; 
  unsigned int v8; 
  DEVICE_OBJECT *v9; 
  struct _DMA_ADAPTER *v10; 
  UINT8 *v11; 
  unsigned int *v12; 
  unsigned int v13; 
  unsigned int v14; 
  __int64 v15; 
  unsigned int v16; 
  __int64 v17; 
  __int64 v18; 
  __int64 v19; 
  unsigned int v20; 
  __int64 v21; 
  __int64 v22; 
  unsigned __int64 v23; 
  unsigned int v24; 
  unsigned int v25; 
  wchar_t *v26; 
  unsigned __int64 v27; 
  wchar_t *v28; 
  __int64 result; 
  __int64 v30; 
  unsigned int *v31; 
  struct _DMA_ADAPTER *v32; 
  unsigned int Length; 
  unsigned int v34; 
  wchar_t *Buffer; 
  __int64 v36; 
  char v37; 
  char v38; 
  int v39; 
  unsigned int v40; 
  unsigned int v41; 
  unsigned int *v42; 
  struct _UNICODE_STRING UnicodeString; 
  DEVICE_OBJECT *v44; 
  v4 = *(unsigned int **)(a1 + 24);
  v5 = 0;
  v6 = 0;
  v7 = *(_DWORD *)(a1 + 56) + 1;
  v37 = 0;
  v42 = v4;
  UnicodeString = 0i64;
  v39 = 0;
  v8 = v7 & 0xFFFFFFFE;
  v38 = 1;
  v9 = 0i64;
  v10 = 0i64;
  v11 = 0i64;
  v12 = v4;
  v13 = 0;
  v40 = 0;
  do
  {
    v14 = 0;
    v41 = 0;
    if( v12[4] )
    {
      v15 = 0i64;
      v44 = 0i64;
      while( 1 )
      {
        v16 = v13;
        v17 = 8i64 * v14;
        v18 = *(_QWORD *)&v12[v17 + 6] - WmipDataProviderPnpidGuid;
        if( !v18 )
          v18 = *(_QWORD *)&v12[v17 + 8] - *((_QWORD *)&WmipDataProviderPnpidGuid + 1);
        if( !v18 )
          goto LABEL_46;
        v19 = *(_QWORD *)&v12[v17 + 6] - WmipDataProviderPnPIdInstanceNamesGuid;
        if( !v19 )
          v19 = *(_QWORD *)&v12[v17 + 8] - *((_QWORD *)&WmipDataProviderPnPIdInstanceNamesGuid + 1);
        if( !v19 )
        {
LABEL_46:
          v38 = 0;
          if( v10 )
          {
            HalPutDmaAdapter(v10);
            v4 = v42;
            v10 = 0i64;
            v6 = v39;
            v16 = v13;
            v15 = (__int64)v44;
          }
        }
        v20 = v12[v17 + 10];
        if( (v20 & 0x20) == 0 )
          goto LABEL_11;
        if( !v11 )
        {
          v30 = v4[1];
          v31 = v4;
          while( (_DWORD)v30 )
          {
            v31 = (unsigned int *)((char *)v31 + v30);
            v30 = v31[1];
          }
          v11 = (UINT8 *)v31 + ((*v31 + 1) & 0xFFFFFFFE);
          v5 = a3 + (_DWORD)v4 - (_DWORD)v11;
        }
        v13 = v12[v17 + 11];
        v9 = *(DEVICE_OBJECT **)&v12[v17 + 12];
        if( v16 >= v13 )
          v13 = v16;
        v40 = v13;
        if( v9 == (DEVICE_OBJECT *)v15 )
        {
          v12[v17 + 12] = v6;
          v12[v17 + 10] = v20 | 8;
          goto LABEL_30;
        }
        if( IoGetDeviceInstanceName(v9, &UnicodeString) >= 0 )
          break;
LABEL_30:
        if( a2 == 11 )
        {
          HalPutDmaAdapter((PADAPTER_OBJECT)v9);
          v40 = v13;
        }
LABEL_11:
        v4 = v42;
        v14 = v41 + 1;
        v6 = v39;
        v15 = (__int64)v44;
        v41 = v14;
        if( v14 >= v12[4] )
          goto LABEL_12;
      }
      if( v38 )
      {
        if( !v10 )
        {
          ObfReferenceObject(v9);
LABEL_39:
          v32 = (struct _DMA_ADAPTER *)v9;
          if( v10 )
            v32 = v10;
          v10 = v32;
LABEL_42:
          Length = UnicodeString.Length;
          v34 = UnicodeString.Length + 4;
          v8 += v34;
          if( v37 || v34 > v5 )
          {
            v37 = 1;
          }
          else
          {
            v12[v17 + 10] |= 8u;
            Buffer = UnicodeString.Buffer;
            v12[v17 + 12] = (_DWORD)v11 - (_DWORD)v12;
            v39 = (_DWORD)v11 - (_DWORD)v12;
            v36 = Length;
            v44 = v9;
            *(_WORD *)v11 = Length + 2;
            memmove(v11 + 2, (UINT8 *)Buffer, Length);
            *(_WORD *)&v11[v36 + 2] = 95;
            v11 += v36 + 4;
            v5 -= v34;
          }
          RtlFreeAnsiString(&UnicodeString);
          v13 = v40;
          goto LABEL_30;
        }
        if( v10 == (struct _DMA_ADAPTER *)v9 )
          goto LABEL_39;
      }
      v38 = 0;
      if( v10 )
      {
        HalPutDmaAdapter(v10);
        v10 = 0i64;
      }
      goto LABEL_42;
    }
LABEL_12:
    v21 = v12[1];
    v12 = (unsigned int *)((char *)v12 + v21);
  }
  while( (_DWORD)v21 );
  if( v38 && v10 )
  {
    if( IoGetDeviceInstanceName(v9, &UnicodeString) >= 0 )
    {
      v22 = UnicodeString.Length;
      v23 = (unsigned __int64)(v11 + 7) & 0xFFFFFFFFFFFFFFF8ui64;
      v24 = (((_DWORD)v11 + 7) & 0xFFFFFFF8) - (_DWORD)v11;
      v25 = 2 * UnicodeString.Length + 96;
      v8 += v24 + v25;
      if( v37 || v25 > v5 - v24 )
      {
        v37 = 1;
      }
      else if( !*(_QWORD *)(a4 + 24) )
      {
        ObfReferenceObject(v10);
        *(_QWORD *)(a4 + 24) = v10;
        *(_DWORD *)(a4 + 52) = v40;
        v12[1] = v23 - (_DWORD)v12;
        memset(v23, 0i64);
        v26 = UnicodeString.Buffer;
        *(_DWORD *)(v23 + 16) = 2;
        *(_DWORD *)v23 = v25;
        *(_DWORD *)(v23 + 40) = 40;
        v27 = v23 + 90;
        *(_DWORD *)(v23 + 44) = v40;
        *(_DWORD *)(v23 + 48) = 88;
        *(_OWORD *)(v23 + 24) = WmipDataProviderPnpidGuid;
        *(_WORD *)(v23 + 88) = v22 + 2;
        memmove((UINT8 *)(v23 + 90), (UINT8 *)v26, (unsigned int)v22);
        v28 = UnicodeString.Buffer;
        *(_WORD *)(v22 + v27) = 95;
        *(_DWORD *)(v23 + 72) = 4;
        *(_DWORD *)(v23 + 76) = 1;
        *(_DWORD *)(v23 + 80) = v22 + 92;
        *(_OWORD *)(v23 + 56) = WmipDataProviderPnPIdInstanceNamesGuid;
        *(_WORD *)(v22 + v27 + 2) = v22;
        memmove((UINT8 *)(v23 + 90 + v22 + 4), (UINT8 *)v28, (unsigned int)v22);
      }
      RtlFreeAnsiString(&UnicodeString);
    }
    HalPutDmaAdapter(v10);
  }
  *v42 = v8;
  result = 4i64;
  if( !v37 )
    result = v8;
  *(_QWORD *)(a1 + 56) = result;
  return result;
}

Referenced by:

WmipForwardWmiIrp