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