WmipIoControl
INT64 __stdcall WmipIoControl(_DEVICE_OBJECT *DeviceObject, _IRP *Irp){
_DWORD *v2;
ACCESS_MASK v3;
tagWNODE_SINGLE_INSTANCE *v4;
ACCESS_MASK v6;
unsigned int v7;
__int64 v8;
ULONG Flags;
int AllDataMultiple;
int v11;
UINT8 v12;
__int64 v14;
__int64 v15;
unsigned int v16;
UINT8 v17;
POBJECT_TYPE ObjectType;
UINT64 AccessMode;
ACCESS_MASK DesiredAccess[2];
void *Handle;
PADAPTER_OBJECT Object;
__int128 Object_8;
__int128 v24[3];
__int16 v25[48];
v2 = (_DWORD *)*((_QWORD *)Irp + 23);
v3 = 0;
v4 = (tagWNODE_SINGLE_INSTANCE *)*((_QWORD *)Irp + 3);
v6 = v2[2];
v7 = v2[6];
v8 = (unsigned int)v2[4];
DesiredAccess[0] = v6;
if( v7 > 0x224158 )
{
switch( v7 )
{
case 0x224160u:
goto LABEL_79;
case 0x228008u:
v11 = WmipProbeWnodeSingleInstance(v4, (unsigned int)v8, v6, 0);
if( v11 < 0 )
goto LABEL_19;
v17 = 2;
break;
case 0x22800Cu:
v11 = WmipProbeWnodeSingleItem((tagWNODE_SINGLE_ITEM *)v4, (unsigned int)v8);
if( v11 < 0 )
goto LABEL_19;
v17 = 3;
break;
default:
switch( v7 )
{
case 0x228024u:
v11 = WmipProbeWnodeMethodItem((tagWNODE_METHOD_ITEM *)v4, (unsigned int)v8, v6);
if( v11 < 0 )
goto LABEL_19;
v12 = 9;
goto LABEL_16;
case 0x22811Cu:
if( (_DWORD)v8 == 22 )
{
AllDataMultiple = WmipTranslateFileHandle((__int64)v4, DesiredAccess);
goto LABEL_17;
}
LABEL_73:
v11 = -1073741823;
goto LABEL_21;
case 0x22812Cu:
if( v6 >= 0x38 && &v4->WnodeHeader.ProviderId <= (ULONG *)((char *)v4 + v8) )
{
v16 = v4->WnodeHeader.BufferSize - 1;
if( v16 <= 0xFFE && &v4->WnodeHeader.CountLost + 2 * v16 <= (ULONG *)((char *)v4 + v8) )
{
LODWORD(AccessMode) = v6;
AllDataMultiple = WmipQueryAllDataMultiple(
0i64,
0i64,
Irp,
1,
v4,
AccessMode,
(INT64)v4,
(INT64)DesiredAccess);
goto LABEL_17;
}
}
break;
case 0x228130u:
if( v6 >= 0x38 && &v4->WnodeHeader.ProviderId <= (ULONG *)((char *)v4 + v8) )
{
v15 = v4->WnodeHeader.BufferSize - 1;
if( (unsigned int)v15 <= 0xFFE
&& &v4->WnodeHeader.Guid.Data4[24 * v15] <= (unsigned __int8 *)((char *)v4 + v8) )
{
AllDataMultiple = WmipQuerySingleMultiple(
Irp,
1,
(__int64)v4,
v6,
(__int64)v4,
v4->WnodeHeader.BufferSize,
0i64,
0i64,
(int *)DesiredAccess);
goto LABEL_17;
}
}
break;
case 0x228144u:
if( (unsigned int)v8 < 0x10 || v6 < 0x38 || v4->WnodeHeader.BufferSize > (unsigned int)(v8 - 8) >> 3 )
{
v11 = -1073741808;
goto LABEL_19;
}
AllDataMultiple = WmipReceiveNotifications(&v4->WnodeHeader.BufferSize, DesiredAccess, (__int64)Irp);
goto LABEL_17;
default:
goto LABEL_58;
}
LABEL_70:
v11 = -1073741811;
goto LABEL_19;
}
DesiredAccess[0] = v8;
LODWORD(AccessMode) = v8;
AllDataMultiple = WmipQuerySetExecuteSI(0i64, Irp, 1, v17, (INT64)v4, AccessMode, (INT64)DesiredAccess);
v6 = 0;
goto LABEL_18;
}
switch( v7 )
{
case 0x224158u:
if( v6 >= 0x10 )
{
AllDataMultiple = WmipEnumerateMofResources((UINT64 *)&v4->WnodeHeader.BufferSize, v6, DesiredAccess);
goto LABEL_17;
}
goto LABEL_70;
case 0x224000u:
if( v6 >= 0x48 )
{
if( (unsigned int)v8 >= 0x30 )
{
Flags = v4->WnodeHeader.Flags;
if( (Flags & 1) != 0 && (_DWORD)v8 == v4->WnodeHeader.BufferSize && (Flags & 0xFFFFFF7E) == 0 )
{
LODWORD(ObjectType) = v6;
AllDataMultiple = WmipQueryAllData(0i64, Irp, 1, v4, (UINT64)ObjectType, (INT64)DesiredAccess);
LABEL_17:
v6 = DesiredAccess[0];
LABEL_18:
v11 = AllDataMultiple;
goto LABEL_19;
}
}
goto LABEL_73;
}
goto LABEL_55;
case 0x224004u:
if( v6 < 0x38 )
goto LABEL_55;
v11 = WmipProbeWnodeSingleInstance(v4, (unsigned int)v8, v6, 1u);
if( v11 < 0 )
goto LABEL_19;
v12 = 1;
LABEL_16:
DesiredAccess[0] = v8;
LODWORD(AccessMode) = v6;
AllDataMultiple = WmipQuerySetExecuteSI(0i64, Irp, 1, v12, (INT64)v4, AccessMode, (INT64)DesiredAccess);
goto LABEL_17;
case 0x224108u:
LABEL_31:
Handle = 0i64;
DesiredAccess[0] = 0;
memset(v24, 0, sizeof(v24));
Object = 0i64;
Object_8 = 0i64;
v11 = WmipProbeWmiOpenGuidBlock(
(__int64)v24,
(__int64)&Object_8,
v25,
DesiredAccess,
&v4->WnodeHeader.BufferSize,
v8,
v6);
if( v11 >= 0 )
{
LOBYTE(v14) = 1;
v11 = WmipOpenBlock(v7, v14, (__int64)v24, DesiredAccess[0], &Object);
if( v11 >= 0 )
{
v11 = ObOpenObjectByPointer(Object, 0, 0i64, DesiredAccess[0], WmipGuidObjectType, 1, &Handle);
if( v11 >= 0 )
{
if( IoIs32bitProcess(0i64) )
v4->WnodeHeader.Version = (unsigned int)Handle;
else
v4->WnodeHeader.TimeStamp.QuadPart = (LONGLONG)Handle;
}
HalPutDmaAdapter(Object);
}
}
LABEL_19:
if( v11 == 259 || v11 == -1073741536 )
return(unsigned int)v11;
goto LABEL_21;
case 0x224124u:
if( v6 >= 4 )
{
v4->WnodeHeader.BufferSize = 1;
v6 = 4;
v11 = 0;
goto LABEL_21;
}
goto LABEL_55;
case 0x224134u:
LABEL_79:
if( v6 >= 8 )
{
AllDataMultiple = WmipEnumerateGuids(v7, v4, v6, DesiredAccess);
goto LABEL_17;
}
goto LABEL_55;
}
if( v7 != 2244920 )
{
if( v7 != 2244924 && v7 != 2244928 )
{
LABEL_58:
v11 = -1073741808;
goto LABEL_21;
}
goto LABEL_31;
}
if( v6 >= 0x10 )
{
AllDataMultiple = WmipQueryGuidInfo((__int64)v4);
v6 = 16;
goto LABEL_18;
}
LABEL_55:
v11 = -1073741789;
LABEL_21:
*((_DWORD *)Irp + 12) = v11;
if( v11 >= 0 )
v3 = v6;
*((_QWORD *)Irp + 7) = v3;
IofCompleteRequest(Irp, 0);
return(unsigned int)v11;
}Referenced by:
No references.