PiPnpRtlObjectActionCallback
INT64 __fastcall PiPnpRtlObjectActionCallback(INT64 a1, WCHAR *a2, INT64 r8_0, INT64 a4, INT64 a5, INT64 arg28){
INT64 v6;
unsigned int v7;
unsigned int v10;
int v11;
int v12;
int v13;
int v14;
int ObjectList;
__int64 v16;
_QWORD *v17;
bool v18;
void *PoolWithTag;
unsigned int v21;
int ObjectProperty;
int v23;
int v24;
_WORD *v25;
INT64 v26;
_DWORD *a6;
_DWORD *a6a;
WCHAR *v29;
INT64 a8;
INT64 a8a;
size_t Size;
INT64 a3[3];
int v34;
v6 = arg28;
v7 = r8_0;
v10 = -1073741822;
v11 = a4 - 3;
if( !v11 )
{
if( (_DWORD)r8_0 != 7 )
return v10;
if( (_DWORD)a5 != 1 )
{
if( *(_QWORD *)(arg28 + 8) == 1i64 )
{
if( *(int *)arg28 >= 0 )
*(_BYTE *)(arg28 + 32) = 1;
else
PiDrvDbUnmountNode(a2);
*(_QWORD *)(v6 + 8) = 0i64;
}
return v10;
}
ObjectList = PiDrvDbMountNode(a2);
v10 = ObjectList;
if( ObjectList >= 0 )
{
*(_QWORD *)(v6 + 8) = 1i64;
return v10;
}
LABEL_22:
*(_DWORD *)v6 = ObjectList;
return(unsigned int)-1073741536;
}
v12 = v11 - 1;
if( !v12 )
{
if( (_DWORD)r8_0 != 7 )
return v10;
if( (_DWORD)a5 != 1 )
{
if( *(_DWORD *)arg28 != -1073741772 )
return v10;
*(_DWORD *)arg28 = 0;
return(unsigned int)-1073741536;
}
ObjectList = PiDrvDbUnmountNode(a2);
v10 = ObjectList;
if( ObjectList >= 0 )
return v10;
goto LABEL_22;
}
v13 = v12 - 1;
if( !v13 )
{
if( (_DWORD)a5 != 1 || (*(_DWORD *)(arg28 + 56) & 0x10000) != 0 )
return v10;
v24 = *(_DWORD *)(arg28 + 40);
v25 = *(_WORD **)(arg28 + 32);
if( (int)r8_0 >= 7 )
return 0;
a6a = *(_DWORD **)(arg28 + 48);
a3[0] = *(_QWORD *)(arg28 + 16);
LODWORD(v26) = v24;
a3[1] = *(_QWORD *)(arg28 + 24);
ObjectList = PiDmGetObjectList((unsigned int)r8_0, (INT64)PiDmPnpObjectMatchCallback, (INT64)a3, v25, v26, a6a);
if( ObjectList == -1073741802 )
return 0;
goto LABEL_22;
}
v14 = v13 - 3;
if( !v14 )
{
if( (_DWORD)a5 == 1 )
{
LODWORD(a8) = *(_DWORD *)(arg28 + 56);
ObjectList = PiDmObjectGetAggregatedBooleanPropertyData(
(unsigned int)r8_0,
a2,
r8_0,
*(_QWORD *)(arg28 + 24),
*(_QWORD *)(arg28 + 32),
*(_QWORD *)(arg28 + 40),
*(_QWORD *)(arg28 + 48),
a8,
*(_QWORD *)(arg28 + 64));
if( ObjectList == -1073741802 )
{
if( (*(_DWORD *)(v6 + 72) & 0x10000) != 0
|| (LODWORD(a8a) = *(_DWORD *)(v6 + 56),
ObjectList = PiDmObjectGetCachedObjectProperty(
v7,
a2,
v16,
*(_QWORD *)(v6 + 24),
*(_QWORD *)(v6 + 32),
*(_DWORD **)(v6 + 40),
*(GUID **)(v6 + 48),
a8a,
*(unsigned int **)(v6 + 64)),
ObjectList < 0)
&& ObjectList != -1073741275
&& ObjectList != -1073741772
&& ObjectList != -1073741789 )
{
v17 = (_QWORD *)(v6 + 16);
v10 = 0;
v18 = *(_QWORD *)(v6 + 16) == 0i64;
goto LABEL_13;
}
}
goto LABEL_22;
}
if( (*(_DWORD *)(arg28 + 72) & 0x10000) != 0 )
return v10;
if( *(int *)arg28 < 0 )
{
if( *(_DWORD *)arg28 == -1073741275 )
{
LODWORD(a8) = 0;
v29 = 0i64;
LODWORD(a6) = 0;
LABEL_19:
PiDmObjectUpdateCachedObjectProperty(
(unsigned int)r8_0,
a2,
r8_0,
*(_QWORD *)(arg28 + 24),
*(_QWORD *)(arg28 + 32),
(INT64)a6,
v29,
a8);
}
return 0;
}
LODWORD(a8) = **(_DWORD **)(arg28 + 64);
v29 = *(WCHAR **)(arg28 + 48);
v23 = **(_DWORD **)(arg28 + 40);
LABEL_34:
LODWORD(a6) = v23;
goto LABEL_19;
}
if( v14 != 1 )
return v10;
if( (_DWORD)a5 != 1 )
{
if( *(int *)arg28 < 0 )
return v10;
LODWORD(a8) = *(_DWORD *)(arg28 + 56);
v29 = *(WCHAR **)(arg28 + 48);
v23 = *(_DWORD *)(arg28 + 40);
goto LABEL_34;
}
v10 = 0;
if( (*(_DWORD *)(arg28 + 60) & 0x20000) != 0 )
goto LABEL_46;
v34 = 0;
PoolWithTag = 0i64;
LODWORD(Size) = 0;
v21 = *(_DWORD *)(arg28 + 56);
if( !v21 || (PoolWithTag = ExAllocatePoolWithTag(PagedPool, v21, 0x47706E50ui64)) != 0i64 )
{
if( (ObjectProperty = PnpGetObjectProperty(
PiPnpRtlCtx,
(__int64)a2,
v7,
*(_QWORD *)(v6 + 16),
*(const wchar_t **)(v6 + 24),
*(_QWORD *)(v6 + 32),
&v34,
(unsigned __int64)PoolWithTag,
*(_DWORD *)(v6 + 56),
(ULONG *)&Size,
0),
ObjectProperty >= 0)
&& v34 == *(_DWORD *)(v6 + 40)
&& (_DWORD)Size == *(_DWORD *)(v6 + 56)
&& !memcmp(PoolWithTag, *(PVOID *)(v6 + 48), (unsigned int)Size)
|| ObjectProperty == -1073741275 && !*(_DWORD *)(v6 + 40) && !*(_DWORD *)(v6 + 56) )
{
*(_DWORD *)v6 = ObjectProperty;
v10 = -1073741536;
}
else
{
v10 = 0;
}
if( PoolWithTag )
ExFreePoolWithTag(PoolWithTag, 0x47706E50u);
if( !v10 )
{
LABEL_46:
v17 = (_QWORD *)(v6 + 16);
v18 = *(_QWORD *)(v6 + 16) == 0i64;
LABEL_13:
if( v18 )
PiPnpRtlCacheObjectBaseKey(a1, a2, v7, v17);
}
}
return v10;
}Referenced by:
No references.