WmipQuerySetExecuteSI
NTSTATUS __stdcall WmipQuerySetExecuteSI(
VOID *GuidObject,
PIRP Irp,
_KPROCESSOR_MODE AccessMode,
UINT8 MinorFunction,
VOID *Wnode,
UINT64 OutBufferSize,
UINT64 *ValidSize){
UINT64 *v7;
INT8 v8;
__int64 v11;
UINT64 v12;
int v13;
NTSTATUS v14;
int v15;
tagInstanceSet **v16;
UINT64 v17;
NTSTATUS v18;
unsigned __int64 *p_Information;
__int64 v20;
volatile signed __int64 **v21;
VOID *v23;
UINT64 v24;
NTSTATUS v25;
unsigned __int64 *v26;
UINT8 *IsDynamic;
UINT8 InternalGuid;
char v29[7];
UINT64 ProviderIdCount;
UINT64 *v31;
tagInstanceSet **ProviderIdList;
_IO_STATUS_BLOCK Iosb;
char v34[128];
v7 = ValidSize;
v8 = AccessMode;
v31 = ValidSize;
v11 = MinorFunction;
memset(v34, 0i64, sizeof(v34));
v12 = *((unsigned int *)DesiredAccessForFunction + v11);
v13 = 0;
v29[0] = 0;
InternalGuid = 0;
Iosb = 0i64;
if( GuidObject )
{
v14 = ObReferenceObjectByPointer(GuidObject, v12, WmipGuidObjectType, v8);
}
else
{
v23 = (VOID *)*((_QWORD *)Wnode + 2);
ProviderIdCount = 0i64;
v14 = ObReferenceObjectByHandle(v23, v12, WmipGuidObjectType, v8, (VOID **)&ProviderIdCount, 0i64);
GuidObject = (VOID *)ProviderIdCount;
}
v15 = v14;
if( v14 < 0 )
return v15;
LODWORD(ProviderIdCount) = 16;
ProviderIdList = (tagInstanceSet **)v34;
v15 = WmipPrepareWnodeSI(
(_WMIGUIDOBJECT *)GuidObject,
(tagWNODE_SINGLE_INSTANCE *)Wnode,
&ProviderIdCount,
(VOID **)&ProviderIdList,
v29,
&InternalGuid);
if( v15 >= 0 )
{
if( InternalGuid )
{
*((_DWORD *)Wnode + 11) |= 0x100u;
*(_DWORD *)Wnode = 48;
Irp->IoStatus.Information = 48i64;
}
else if( v29[0] )
{
if( (_BYTE)v11 == 3 || (v15 = -1073741162, (_BYTE)v11 == 9) )
v15 = -1073741161;
v16 = ProviderIdList;
if( (_DWORD)ProviderIdCount )
{
while( 1 )
{
v17 = (unsigned int)v16[v13][20];
*((_DWORD *)Wnode + 1) = v17;
if( Irp )
{
LODWORD(IsDynamic) = OutBufferSize;
v18 = WmipForwardWmiIrp(Irp, v11, (unsigned int)v17, (char *)Wnode + 24, (UINT64)IsDynamic, Wnode);
p_Information = &Irp->IoStatus.Information;
}
else
{
v18 = WmipSendWmiIrp(v11, v17, (char *)Wnode + 24, (unsigned int)OutBufferSize, Wnode, &Iosb);
p_Information = &Iosb.Information;
}
if( v18 >= 0 )
*(_DWORD *)v31 = *(_DWORD *)p_Information;
if( (unsigned int)(v18 + 1073741163) > 1 )
break;
if( ++v13 >= (unsigned int)ProviderIdCount )
goto LABEL_18;
}
v15 = v18;
LABEL_18:
v20 = (unsigned int)ProviderIdCount;
v21 = (volatile signed __int64 **)v16;
do
{
WmipUnreferenceEntry((__int64)&stru_140C00F40 + 4496, *v21++);
--v20;
}
while( v20 );
}
if( v16 != (tagInstanceSet **)v34 && v16 )
ExFreePoolWithTag(v16, 0);
v7 = v31;
}
else
{
v24 = *((unsigned int *)Wnode + 1);
if( Irp )
{
LODWORD(IsDynamic) = OutBufferSize;
v25 = WmipForwardWmiIrp(Irp, v11, (unsigned int)v24, (char *)Wnode + 24, (UINT64)IsDynamic, Wnode);
v26 = &Irp->IoStatus.Information;
}
else
{
v25 = WmipSendWmiIrp(v11, v24, (char *)Wnode + 24, (unsigned int)OutBufferSize, Wnode, &Iosb);
v26 = &Iosb.Information;
}
v15 = v25;
if( v25 < 0 )
{
LABEL_25:
*((_DWORD *)Wnode + 1) = 0;
goto LABEL_26;
}
*(_DWORD *)ValidSize = *(_DWORD *)v26;
}
if( v15 >= 0 && *(_DWORD *)v7 > (unsigned int)OutBufferSize )
v15 = -1073741811;
goto LABEL_25;
}
LABEL_26:
if( GuidObject )
HalPutDmaAdapter((PADAPTER_OBJECT)GuidObject);
return v15;
}Referenced by:
IoWMIExecuteMethod
IoWMIQuerySingleInstance
IoWMISetSingleInstance
IoWMISetSingleItem
WmipIoControl
WmipQuerySingleMultiple