WmipIoControl
NTSTATUS __stdcall WmipIoControl(_DEVICE_OBJECT *DeviceObject, _IRP *Irp){
_IO_STACK_LOCATION *CurrentStackLocation;
unsigned int v3;
tagWNODE_SINGLE_INSTANCE *MasterIrp;
unsigned int SecurityContext;
unsigned int v7;
__int64 Options;
ULONG Flags;
int AllDataMultiple;
int v11;
_KPROCESSOR_MODE v12;
UINT8 v13;
__int64 v15;
unsigned int v16;
_KPROCESSOR_MODE v17;
UINT8 v18;
UINT64 OutBufferLen;
UINT64 *RetSize;
_KPROCESSOR_MODE RetSizea;
UINT64 *ValidSize;
UINT64 DesiredAccess;
VOID *Handle;
_ADAPTER_OBJECT *CapturedGuidString;
_UNICODE_STRING CapturedGuidString_8;
_OBJECT_ATTRIBUTES CapturedObjectAttributes_8;
__int16 CapturedGuidBuffer[48];
CurrentStackLocation = Irp->Tail.CurrentStackLocation;
v3 = 0;
MasterIrp = (tagWNODE_SINGLE_INSTANCE *)Irp->AssociatedIrp.MasterIrp;
SecurityContext = (unsigned int)CurrentStackLocation->Parameters.SecurityContext;
v7 = *(_DWORD *)&CurrentStackLocation->Parameters.FileAttributes;
Options = CurrentStackLocation->Parameters.Options;
LODWORD(DesiredAccess) = SecurityContext;
if( v7 > 0x224158 )
{
switch( v7 )
{
case 0x224160u:
goto LABEL_79;
case 0x228008u:
v11 = WmipProbeWnodeSingleInstance(MasterIrp, (unsigned int)Options, SecurityContext, 0);
if( v11 < 0 )
goto LABEL_19;
v18 = 2;
break;
case 0x22800Cu:
v11 = WmipProbeWnodeSingleItem((tagWNODE_SINGLE_ITEM *)MasterIrp, (unsigned int)Options);
if( v11 < 0 )
goto LABEL_19;
v18 = 3;
break;
default:
switch( v7 )
{
case 0x228024u:
v11 = WmipProbeWnodeMethodItem((tagWNODE_METHOD_ITEM *)MasterIrp, (unsigned int)Options, SecurityContext);
if( v11 < 0 )
goto LABEL_19;
v13 = 9;
LOBYTE(v12) = 1;
goto LABEL_16;
case 0x22811Cu:
if( (_DWORD)Options == 22 )
{
AllDataMultiple = WmipTranslateFileHandle((WMIFHTOINSTANCENAME *)MasterIrp, &DesiredAccess);
goto LABEL_17;
}
LABEL_73:
v11 = -1073741823;
goto LABEL_21;
case 0x22812Cu:
if( SecurityContext >= 0x38 && &MasterIrp->WnodeHeader.ProviderId <= (ULONG *)((char *)MasterIrp + Options) )
{
v16 = MasterIrp->WnodeHeader.BufferSize - 1;
if( v16 <= 0xFFE && &MasterIrp->WnodeHeader.CountLost + 2 * v16 <= (ULONG *)((char *)MasterIrp + Options) )
{
LODWORD(RetSize) = SecurityContext;
AllDataMultiple = WmipQueryAllDataMultiple(
0,
0i64,
Irp,
1,
(tagWNODE_ALL_DATA *)MasterIrp,
(UINT64)RetSize,
(__int64)MasterIrp,
(__int64)&DesiredAccess);
goto LABEL_17;
}
}
break;
case 0x228130u:
if( SecurityContext >= 0x38 && &MasterIrp->WnodeHeader.ProviderId <= (ULONG *)((char *)MasterIrp + Options) )
{
v15 = MasterIrp->WnodeHeader.BufferSize - 1;
if( (unsigned int)v15 <= 0xFFE
&& &MasterIrp->WnodeHeader.Guid.Data4[24 * v15] <= (unsigned __int8 *)((char *)MasterIrp + Options) )
{
LODWORD(RetSize) = MasterIrp->WnodeHeader.BufferSize;
AllDataMultiple = WmipQuerySingleMultiple(
Irp,
1,
(UINT8 *)MasterIrp,
SecurityContext,
(WMIQSIMULTIPLE *)MasterIrp,
(UINT64)RetSize,
0i64,
0i64,
&DesiredAccess);
goto LABEL_17;
}
}
break;
case 0x228144u:
if( (unsigned int)Options < 0x10
|| SecurityContext < 0x38
|| MasterIrp->WnodeHeader.BufferSize > (unsigned int)(Options - 8) >> 3 )
{
v11 = -1073741808;
goto LABEL_19;
}
AllDataMultiple = WmipReceiveNotifications((WMIRECEIVENOTIFICATION *)MasterIrp, &DesiredAccess, Irp);
goto LABEL_17;
default:
goto LABEL_58;
}
LABEL_70:
v11 = -1073741811;
goto LABEL_19;
}
LODWORD(DesiredAccess) = Options;
LOBYTE(v17) = 1;
LODWORD(RetSize) = Options;
AllDataMultiple = WmipQuerySetExecuteSI(0i64, Irp, v17, v18, MasterIrp, (UINT64)RetSize, &DesiredAccess);
SecurityContext = 0;
goto LABEL_18;
}
switch( v7 )
{
case 0x224158u:
if( SecurityContext >= 0x10 )
{
AllDataMultiple = WmipEnumerateMofResources(&MasterIrp->WnodeHeader.BufferSize, SecurityContext, &DesiredAccess);
goto LABEL_17;
}
goto LABEL_70;
case 0x224000u:
if( SecurityContext >= 0x48 )
{
if( (unsigned int)Options >= 0x30 )
{
Flags = MasterIrp->WnodeHeader.Flags;
if( (Flags & 1) != 0 && (_DWORD)Options == MasterIrp->WnodeHeader.BufferSize && (Flags & 0xFFFFFF7E) == 0 )
{
LODWORD(OutBufferLen) = SecurityContext;
AllDataMultiple = WmipQueryAllData(
0i64,
Irp,
1,
(tagWNODE_ALL_DATA *)MasterIrp,
OutBufferLen,
&DesiredAccess);
LABEL_17:
SecurityContext = DesiredAccess;
LABEL_18:
v11 = AllDataMultiple;
goto LABEL_19;
}
}
goto LABEL_73;
}
goto LABEL_55;
case 0x224004u:
if( SecurityContext < 0x38 )
goto LABEL_55;
v11 = WmipProbeWnodeSingleInstance(MasterIrp, (unsigned int)Options, SecurityContext, 1u);
if( v11 < 0 )
goto LABEL_19;
v13 = 1;
LOBYTE(v12) = 1;
LABEL_16:
LODWORD(DesiredAccess) = Options;
LODWORD(RetSize) = SecurityContext;
AllDataMultiple = WmipQuerySetExecuteSI(0i64, Irp, v12, v13, MasterIrp, (UINT64)RetSize, &DesiredAccess);
goto LABEL_17;
case 0x224108u:
LABEL_31:
LODWORD(ValidSize) = SecurityContext;
LODWORD(RetSize) = Options;
Handle = 0i64;
LODWORD(DesiredAccess) = 0;
memset(&CapturedObjectAttributes_8, 0, sizeof(CapturedObjectAttributes_8));
CapturedGuidString = 0i64;
CapturedGuidString_8 = 0i64;
v11 = WmipProbeWmiOpenGuidBlock(
&CapturedObjectAttributes_8,
&CapturedGuidString_8,
(WCHAR *)CapturedGuidBuffer,
&DesiredAccess,
(WMIOPENGUIDBLOCK *)MasterIrp,
(UINT64)RetSize,
(UINT64)ValidSize);
if( v11 >= 0 )
{
v11 = WmipOpenBlock(
v7,
1,
&CapturedObjectAttributes_8,
(unsigned int)DesiredAccess,
(_WMIGUIDOBJECT **)&CapturedGuidString);
if( v11 >= 0 )
{
LOBYTE(RetSizea) = 1;
v11 = ObOpenObjectByPointer(
CapturedGuidString,
0i64,
0i64,
DesiredAccess,
WmipGuidObjectType,
RetSizea,
&Handle);
if( v11 >= 0 )
{
if( IoIs32bitProcess(0i64) )
MasterIrp->WnodeHeader.Version = (unsigned int)Handle;
else
MasterIrp->WnodeHeader.TimeStamp.QuadPart = (LONGLONG)Handle;
}
HalPutDmaAdapter(CapturedGuidString);
}
}
LABEL_19:
if( v11 == 259 || v11 == -1073741536 )
return v11;
goto LABEL_21;
case 0x224124u:
if( SecurityContext >= 4 )
{
MasterIrp->WnodeHeader.BufferSize = 1;
SecurityContext = 4;
v11 = 0;
goto LABEL_21;
}
goto LABEL_55;
case 0x224134u:
LABEL_79:
if( SecurityContext >= 8 )
{
AllDataMultiple = WmipEnumerateGuids(v7, MasterIrp, SecurityContext, &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( SecurityContext >= 0x10 )
{
AllDataMultiple = WmipQueryGuidInfo((WMIQUERYGUIDINFO *)MasterIrp);
SecurityContext = 16;
goto LABEL_18;
}
LABEL_55:
v11 = -1073741789;
LABEL_21:
Irp->IoStatus.Status = v11;
if( v11 >= 0 )
v3 = SecurityContext;
Irp->IoStatus.Information = v3;
IofCompleteRequest(Irp, 0);
return v11;
}Referenced by:
No references.