WmipTranslatePDOInstanceNames

VOID __stdcall WmipTranslatePDOInstanceNames(_IRP *Irp, UINT8 MinorFunction, UINT64 MaxBufferSize, _REGENTRY *RegEntry){
  union {_IRP *MasterIrp;int IrpCount;void *SystemBuffer;} v4; 
  unsigned int v5; 
  int v6; 
  int v7; 
  unsigned int v8; 
  _ADAPTER_OBJECT *v9; 
  _ADAPTER_OBJECT *v10; 
  _WORD *v11; 
  union {_IRP *MasterIrp;int IrpCount;void *SystemBuffer;} v12; 
  unsigned int v13; 
  unsigned int v14; 
  __int64 v15; 
  unsigned int v16; 
  __int64 v17; 
  char *v18; 
  char *v19; 
  int v20; 
  __int64 v21; 
  __int64 v22; 
  _DWORD *v23; 
  unsigned int v24; 
  unsigned int v25; 
  wchar_t *v26; 
  char *v27; 
  wchar_t *v28; 
  unsigned __int64 v29; 
  __int64 v30; 
  _IRP *v31; 
  _ADAPTER_OBJECT *v32; 
  size_t Length; 
  unsigned int v34; 
  wchar_t *Buffer; 
  __int64 v36; 
  char v37; 
  char v38; 
  int v39; 
  _REGENTRY v40; 
  unsigned int v41; 
  _UNICODE_STRING *MasterIrp; 
  _UNICODE_STRING InstanceName; 
  _ADAPTER_OBJECT *v44; 
  int v47; 

  v47 = MaxBufferSize;
  v4.MasterIrp = (_IRP *)Irp->AssociatedIrp;
  v5 = 0;
  v6 = 0;
  v7 = LODWORD(Irp->IoStatus.Information) + 1;
  v37 = 0;
  MasterIrp = (_UNICODE_STRING *)v4.MasterIrp;
  InstanceName = 0i64;
  v39 = 0;
  v8 = v7 & 0xFFFFFFFE;
  v38 = 1;
  v9 = 0i64;
  v10 = 0i64;
  v11 = 0i64;
  v12.MasterIrp = v4.MasterIrp;
  v13 = 0;
  v40 = 0;
  do
  {
    v14 = 0;
    v41 = 0;
    if( v12.MasterIrp->Flags )
    {
      v15 = 0i64;
      v44 = 0i64;
      while( 1 )
      {
        v16 = v13;
        v17 = 32i64 * v14;
        v18 = *(char **)((char *)&v12.MasterIrp->AssociatedIrp.MasterIrp + v17) - WmipDataProviderPnpidGuid;
        if( !v18 )
          v18 = *(char **)((char *)&v12.MasterIrp->ThreadListEntry.Flink + v17)
              - *((_QWORD *)&WmipDataProviderPnpidGuid + 1);
        if( !v18 )
          goto LABEL_46;
        v19 = *(char **)((char *)&v12.MasterIrp->AssociatedIrp.MasterIrp + v17) - WmipDataProviderPnPIdInstanceNamesGuid;
        if( !v19 )
          v19 = *(char **)((char *)&v12.MasterIrp->ThreadListEntry.Flink + v17)
              - *((_QWORD *)&WmipDataProviderPnPIdInstanceNamesGuid + 1);
        if( !v19 )
        {
LABEL_46:
          v38 = 0;
          if( v10 )
          {
            HalPutDmaAdapter(v10);
            v4.MasterIrp = (_IRP *)MasterIrp;
            v10 = 0i64;
            v6 = v39;
            v16 = v13;
            v15 = (__int64)v44;
          }
        }
        v20 = *(_DWORD *)((char *)&v12.MasterIrp->ThreadListEntry.Blink + v17);
        if( (v20 & 0x20) == 0 )
          goto LABEL_11;
        if( !v11 )
        {
          v30 = *(unsigned int *)&v4.MasterIrp->AllocationProcessorNumber;
          v31 = v4.MasterIrp;
          while( (_DWORD)v30 )
          {
            v31 = (_IRP *)((char *)v31 + v30);
            v30 = *(unsigned int *)&v31->AllocationProcessorNumber;
          }
          v11 = (__int16 *)((char *)&v31->Type + ((*(_DWORD *)&v31->Type + 1) & 0xFFFFFFFE));
          v5 = v47 + v4.IrpCount - (_DWORD)v11;
        }
        v13 = HIDWORD((&v12.MasterIrp->ThreadListEntry.Blink)[(unsigned __int64)v17 / 8]);
        v9 = *(_ADAPTER_OBJECT **)((char *)&v12.MasterIrp->IoStatus.Pointer + v17);
        if( v16 >= v13 )
          v13 = v16;
        v40 = v13;
        if( v9 == (_ADAPTER_OBJECT *)v15 )
        {
          *(int *)((char *)&v12.MasterIrp->IoStatus.Status + v17) = v6;
          *(_DWORD *)((char *)&v12.MasterIrp->ThreadListEntry.Blink + v17) = v20 | 8;
          goto LABEL_30;
        }
        if( IoGetDeviceInstanceName(v9, &InstanceName, (_UNICODE_STRING *)v4.MasterIrp) >= 0 )
          break;
LABEL_30:
        if( MinorFunction == 11 )
        {
          HalPutDmaAdapter(v9);
          v40 = v13;
        }
LABEL_11:
        v4.MasterIrp = (_IRP *)MasterIrp;
        v14 = v41 + 1;
        v6 = v39;
        v15 = (__int64)v44;
        v41 = v14;
        if( v14 >= v12.MasterIrp->Flags )
          goto LABEL_12;
      }
      if( v38 )
      {
        if( !v10 )
        {
          ObfReferenceObject(v9);
LABEL_39:
          v32 = v9;
          if( v10 )
            v32 = v10;
          v10 = v32;
LABEL_42:
          Length = InstanceName.Length;
          v34 = InstanceName.Length + 4;
          v8 += v34;
          if( v37 || v34 > v5 )
          {
            v37 = 1;
          }
          else
          {
            *(_DWORD *)((char *)&v12.MasterIrp->ThreadListEntry.Blink + v17) |= 8u;
            Buffer = InstanceName.Buffer;
            *(int *)((char *)&v12.MasterIrp->IoStatus.Status + v17) = (_DWORD)v11 - v12.IrpCount;
            v39 = (_DWORD)v11 - v12.IrpCount;
            v36 = Length;
            v44 = v9;
            *v11 = Length + 2;
            memmove(v11 + 1, Buffer, Length);
            *(_WORD *)((char *)v11 + v36 + 2) = 95;
            v11 = (_WORD *)((char *)v11 + v36 + 4);
            v5 -= v34;
          }
          RtlFreeAnsiString(&InstanceName);
          v13 = v40;
          goto LABEL_30;
        }
        if( v10 == v9 )
          goto LABEL_39;
      }
      v38 = 0;
      if( v10 )
      {
        HalPutDmaAdapter(v10);
        v10 = 0i64;
      }
      goto LABEL_42;
    }
LABEL_12:
    v21 = *(unsigned int *)&v12.MasterIrp->AllocationProcessorNumber;
    v12.MasterIrp = (_IRP *)((char *)v12.MasterIrp + v21);
  }
  while( (_DWORD)v21 );
  if( v38 && v10 )
  {
    if( IoGetDeviceInstanceName(v9, &InstanceName, (_UNICODE_STRING *)v4.MasterIrp) >= 0 )
    {
      v22 = InstanceName.Length;
      v23 = (_DWORD *)(((unsigned __int64)v11 + 7) & 0xFFFFFFFFFFFFFFF8ui64);
      v24 = (((_DWORD)v11 + 7) & 0xFFFFFFF8) - (_DWORD)v11;
      v25 = 2 * InstanceName.Length + 96;
      v8 += v24 + v25;
      if( v37 || v25 > v5 - v24 )
      {
        v37 = 1;
      }
      else if( !*((_QWORD *)RegEntry + 3) )
      {
        ObfReferenceObject(v10);
        *((_QWORD *)RegEntry + 3) = v10;
        RegEntry[13] = v40;
        *(_DWORD *)&v12.MasterIrp->AllocationProcessorNumber = (_DWORD)v23 - v12.IrpCount;
        memset(v23, 0i64, 0x58u);
        v26 = InstanceName.Buffer;
        v23[4] = 2;
        *v23 = v25;
        v23[10] = 40;
        v27 = (char *)v23 + 90;
        v23[11] = v40;
        v23[12] = 88;
        *(_OWORD *)(v23 + 6) = WmipDataProviderPnpidGuid;
        *((_WORD *)v23 + 44) = v22 + 2;
        memmove((char *)v23 + 90, v26, v22);
        v28 = InstanceName.Buffer;
        *(_WORD *)&v27[v22] = 95;
        v23[18] = 4;
        v23[19] = 1;
        v23[20] = v22 + 92;
        *(_OWORD *)(v23 + 14) = WmipDataProviderPnPIdInstanceNamesGuid;
        *(_WORD *)&v27[v22 + 2] = v22;
        memmove((char *)v23 + v22 + 94, v28, v22);
      }
      RtlFreeAnsiString(&InstanceName);
    }
    HalPutDmaAdapter(v10);
  }
  *(_DWORD *)&MasterIrp->Length = v8;
  v29 = 4i64;
  if( !v37 )
    v29 = v8;
  Irp->IoStatus.Information = v29;
}

Referenced by:

WmipForwardWmiIrp