WmipGetGuidObjectInstanceInfo
NTSTATUS __stdcall WmipGetGuidObjectInstanceInfo(
_WMIGUIDOBJECT *GuidObject,
ULONG_PTR Pdo,
_UNICODE_STRING *BaseName,
UINT64 *BaseIndex){
UINT64 *v5;
_UNICODE_STRING *v6;
int DeviceInstanceName;
__int64 v8;
__int64 v9;
int v10;
wchar_t *Buffer;
_QWORD *v12;
_QWORD *v13;
__int64 v14;
__int64 v15;
_UNICODE_STRING v16;
_UNICODE_STRING Str2[4];
v5 = BaseIndex;
v6 = BaseName;
Str2[0] = 0i64;
DeviceInstanceName = IoGetDeviceInstanceName(*(PVOID *)&Pdo, Str2, BaseName);
if( DeviceInstanceName >= 0 )
{
v8 = *((_QWORD *)GuidObject + 7);
v9 = Str2[0].Length >> 1;
v10 = 0;
DeviceInstanceName = -1073741162;
KeWaitForSingleObject((UINT64)&ExBootDevicesRemovedEvent + 3072, 0, 0, 0, 0i64);
Buffer = Str2[0].Buffer;
if( *(_DWORD *)(v8 + 36) )
{
v12 = (_QWORD *)(v8 + 56);
v13 = (_QWORD *)*v12;
if( (_QWORD *)*v12 != v12 )
{
while( 1 )
{
if( (v13[2] & 1) != 0 )
{
v14 = v13[11];
v15 = -1i64;
do
++v15;
while( *(_WORD *)(v14 + 2 * v15 + 4) );
if( !wcsnicmp((const wchar_t *)(v14 + 4), Buffer, (unsigned __int16)v9)
&& (unsigned __int16)v15 == (unsigned __int16)v9 + 1
&& *(_WORD *)(v14 + 2i64 * (unsigned __int16)v15 + 2) == 95 )
{
break;
}
}
v13 = (_QWORD *)*v13;
if( v13 == v12 )
goto LABEL_11;
}
DeviceInstanceName = 0;
v10 = *(_DWORD *)v13[11];
LABEL_11:
v6 = BaseName;
}
v5 = BaseIndex;
}
KeReleaseMutex((_KMUTANT *)((char *)&ExBootDevicesRemovedEvent + 3072), 0);
if( DeviceInstanceName >= 0 )
{
v16 = Str2[0];
*(_DWORD *)v5 = v10;
Buffer = 0i64;
Str2[0].Buffer = 0i64;
DeviceInstanceName = 0;
*v6 = v16;
}
if( Buffer )
RtlFreeAnsiString(Str2);
}
return DeviceInstanceName;
}Referenced by:
IoWMIDeviceObjectToInstanceName
WmipTranslateFileHandle