PiPnpRtlObjectActionCallback
NTSTATUS __stdcall PiPnpRtlObjectActionCallback(INT64 a1, WCHAR *a2, INT64 a3, INT64 a4, INT64 a5, INT64 a6){
INT64 v6;
unsigned int v7;
NTSTATUS v10;
int v11;
int v12;
int v13;
int v14;
NTSTATUS ObjectList;
WCHAR *v16;
VOID **v17;
bool v18;
VOID **PoolWithTag;
unsigned int v21;
NTSTATUS ObjectProperty;
int v23;
int v24;
PI_DM_OBJECT *v25;
VOID *v26;
INT64 v27;
UINT8 *v28;
VOID *v29;
WCHAR *v30;
UINT64 *PropertySize;
UINT64 *PropertySizea;
UINT64 v33;
UINT64 *v34;
int MatchCallbackRoutine[2];
__int64 v36;
INT64 v37;
v6 = a6;
v7 = a3;
v10 = -1073741822;
v11 = a4 - 3;
if( !v11 )
{
if( (_DWORD)a3 != 7 )
return v10;
if( (_DWORD)a5 != 1 )
{
if( *(_QWORD *)(a6 + 8) == 1i64 )
{
if( *(int *)a6 >= 0 )
*(_BYTE *)(a6 + 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 -1073741536;
}
v12 = v11 - 1;
if( !v12 )
{
if( (_DWORD)a3 != 7 )
return v10;
if( (_DWORD)a5 != 1 )
{
if( *(_DWORD *)a6 != -1073741772 )
return v10;
*(_DWORD *)a6 = 0;
return -1073741536;
}
ObjectList = PiDrvDbUnmountNode(a2);
v10 = ObjectList;
if( ObjectList >= 0 )
return v10;
goto LABEL_22;
}
v13 = v12 - 1;
if( !v13 )
{
if( (_DWORD)a5 != 1 || (*(_DWORD *)(a6 + 56) & 0x10000) != 0 )
return v10;
v24 = *(_DWORD *)(a6 + 40);
v25 = *(PI_DM_OBJECT **)(a6 + 32);
if( (int)a3 >= 7 )
return 0;
v28 = *(UINT8 **)(a6 + 48);
*(_QWORD *)MatchCallbackRoutine = *(_QWORD *)(a6 + 16);
LODWORD(v26) = v24;
v36 = *(_QWORD *)(a6 + 24);
ObjectList = PiDmGetObjectList(
a3,
(INT64)PiDmPnpObjectMatchCallback,
(INT64 *)MatchCallbackRoutine,
v25,
v26,
v28,
v29,
(WCHAR *)PropertySize,
v33,
v34);
if( ObjectList == -1073741802 )
return 0;
goto LABEL_22;
}
v14 = v13 - 3;
if( !v14 )
{
if( (_DWORD)a5 == 1 )
{
LODWORD(PropertySize) = *(_DWORD *)(a6 + 56);
ObjectList = PiDmObjectGetAggregatedBooleanPropertyData(
a3,
a2,
(WCHAR *)a3,
*(_DEVPROPKEY **)(a6 + 24),
*(UINT64 **)(a6 + 32),
*(UINT8 **)(a6 + 40),
*(_QWORD *)(a6 + 48),
PropertySize);
if( ObjectList == -1073741802 )
{
if( (*(_DWORD *)(v6 + 72) & 0x10000) != 0
|| (LODWORD(PropertySizea) = *(_DWORD *)(v6 + 56),
ObjectList = PiDmObjectGetCachedObjectProperty(
v7,
a2,
v16,
*(_DEVPROPKEY **)(v6 + 24),
*(UINT64 **)(v6 + 32),
*(UINT8 **)(v6 + 40),
*(_QWORD *)(v6 + 48),
PropertySizea),
ObjectList < 0)
&& ObjectList != -1073741275
&& ObjectList != -1073741772
&& ObjectList != -1073741789 )
{
v17 = (VOID **)(v6 + 16);
v10 = 0;
v18 = *(_QWORD *)(v6 + 16) == 0i64;
goto LABEL_13;
}
}
goto LABEL_22;
}
if( (*(_DWORD *)(a6 + 72) & 0x10000) != 0 )
return v10;
if( *(int *)a6 < 0 )
{
if( *(_DWORD *)a6 == -1073741275 )
{
LODWORD(PropertySize) = 0;
v30 = 0i64;
LODWORD(v27) = 0;
LABEL_19:
PiDmObjectUpdateCachedObjectProperty(
(unsigned int)a3,
a2,
a3,
*(_QWORD *)(a6 + 24),
*(_QWORD *)(a6 + 32),
v27,
v30,
(UINT64)PropertySize);
}
return 0;
}
LODWORD(PropertySize) = **(_DWORD **)(a6 + 64);
v30 = *(WCHAR **)(a6 + 48);
v23 = **(_DWORD **)(a6 + 40);
LABEL_34:
LODWORD(v27) = v23;
goto LABEL_19;
}
if( v14 != 1 )
return v10;
if( (_DWORD)a5 != 1 )
{
if( *(int *)a6 < 0 )
return v10;
LODWORD(PropertySize) = *(_DWORD *)(a6 + 56);
v30 = *(WCHAR **)(a6 + 48);
v23 = *(_DWORD *)(a6 + 40);
goto LABEL_34;
}
v10 = 0;
if( (*(_DWORD *)(a6 + 60) & 0x20000) != 0 )
goto LABEL_46;
LODWORD(v37) = 0;
PoolWithTag = 0i64;
v21 = *(_DWORD *)(a6 + 56);
if( !v21 || (PoolWithTag = ExAllocatePoolWithTag(1ui64, v21, 1198550608i64)) != 0i64 )
{
if( (ObjectProperty = PnpGetObjectProperty(
*(&stru_140CF2E80 + 1214),
(INT64)a2,
v7,
*(_QWORD *)(v6 + 16),
*(_QWORD *)(v6 + 24),
*(_QWORD *)(v6 + 32),
(INT64)&v37,
(INT64)PoolWithTag),
ObjectProperty >= 0)
&& (_DWORD)v37 == *(_DWORD *)(v6 + 40)
&& !*(_DWORD *)(v6 + 56)
&& !memcmp(PoolWithTag, *(const VOID **)(v6 + 48), 0i64)
|| 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 = (VOID **)(v6 + 16);
v18 = *(_QWORD *)(v6 + 16) == 0i64;
LABEL_13:
if( v18 )
PiPnpRtlCacheObjectBaseKey((HPNPCTX *)a1, a2, v7, v17);
}
}
return v10;
}Referenced by:
No references.