PiPnpRtlCmActionCallback
INT64 __fastcall PiPnpRtlCmActionCallback(INT64 rcx0, WCHAR *a2, INT64 a3, INT64 r9_0, INT64 arg20, INT64 a1){
int v6;
unsigned int v9;
int v10;
int v11;
int v12;
int v13;
int FilteredDeviceInterfaceList;
int v15;
_QWORD *v16;
int v18;
int v19;
int v20;
unsigned int v21;
void *PoolWithTag;
int v23;
int DeviceRegProp;
int v25;
bool v26;
unsigned int v27;
WCHAR *v28;
int v29;
WCHAR *v30;
UINT64 v31;
UINT64 *v32;
CHAR *v33;
ULONG_PTR v34;
unsigned int v35;
WCHAR *v36;
CHAR *v37;
INT64 v38;
int v39;
CHAR *v40;
int v41;
INT64 v42;
INT64 v43;
unsigned int v44;
WCHAR *v45;
int v46;
CHAR *v47;
int v48;
_QWORD *v49;
__int64 v50;
WCHAR *v51;
UINT8 v52;
INT64 v53;
WCHAR v54;
WCHAR *v55;
ULONG_PTR *v56;
ULONG_PTR v57;
ULONG_PTR v58;
ULONG_PTR v59;
ULONG_PTR *v60;
ULONG_PTR v61;
INT64 v62;
INT64 v63;
int v64;
UINT8 IsNullGuid;
INT64 v66;
struct _DMA_ADAPTER *v67;
_DWORD *v68;
int v69;
int v70;
int Object;
CHAR *v72;
WCHAR *v73;
ULONG_PTR *v74;
ULONG_PTR v75;
INT64 a5;
INT64 a7;
_DWORD a4[4];
INT64 v79;
INT64 v80;
struct _UNICODE_STRING DestinationString;
INT64 *v82;
INT64 v83;
INT64 *v84;
INT64 v85;
PVOID P;
INT64 v87;
PVOID v88;
INT64 v89;
CHAR **v90;
__int64 v91;
__int64 v92[3];
char v93;
int v94;
__int16 v95;
char v96;
__int64 v97[3];
char v98;
int v99;
__int16 v100;
char v101;
__int64 v102;
GUID Guid;
v6 = a3;
v9 = -1073741822;
if( (int)r9_0 > 13 )
{
v18 = r9_0 - 14;
if( !v18 )
{
if( (_DWORD)arg20 != 1 )
{
if( (_DWORD)a3 == 5 )
{
if( *(int *)a1 >= 0 )
{
v60 = *(ULONG_PTR **)(a1 + 8);
BYTE1(a4[0]) = 0;
v61 = v60[1];
if( v61 )
{
if( *v60 )
{
PiDmListRemoveObject(4u, v61, *v60, (__int64)a4 + 1);
if( BYTE1(a4[0]) )
PiDmListRemoveList(v62, v60[1], v63, *v60);
}
}
PiPnpRtlFreePanelRemoveInfo(v60);
}
}
else if( (_DWORD)a3 == 6 && *(int *)a1 >= 0 )
{
v74 = *(ULONG_PTR **)(a1 + 8);
v75 = v74[1];
if( v75 && *v74 )
PiDmListRemoveObject(6u, v75, *v74, (__int64)a4 + 3);
PiPnpRtlFreePanelRemoveInfo(v74);
}
return 0;
}
if( (_DWORD)a3 == 5 )
{
v55 = *(WCHAR **)(a1 + 24);
v90 = 0i64;
FilteredDeviceInterfaceList = PiPnpRtlGatherContainerRemoveInfo(v55, a2, &v90);
v9 = FilteredDeviceInterfaceList;
if( FilteredDeviceInterfaceList < 0 )
goto LABEL_28;
v50 = (__int64)v90;
}
else
{
if( (_DWORD)a3 != 6 )
return v9;
v73 = *(WCHAR **)(a1 + 24);
v91 = 0i64;
FilteredDeviceInterfaceList = PiPnpRtlGatherPanelRemoveInfo(v73, a2);
v9 = FilteredDeviceInterfaceList;
if( FilteredDeviceInterfaceList < 0 )
goto LABEL_28;
v50 = v91;
}
LABEL_125:
*(_QWORD *)(a1 + 8) = v50;
return v9;
}
v19 = v18 - 1;
if( v19 )
{
v20 = v19 - 1;
if( v20 )
{
if( v20 != 1 || (_DWORD)arg20 != 1 || (*(_DWORD *)(a1 + 80) & 0x10000) != 0 )
return v9;
FilteredDeviceInterfaceList = PiPnpRtlGetFilteredDeviceInterfaceList(a1);
}
else
{
if( (_DWORD)arg20 != 1 || (*(_DWORD *)(a1 + 72) & 0x10000) != 0 )
return v9;
FilteredDeviceInterfaceList = PiPnpRtlGetFilteredDeviceList(a1);
}
LABEL_27:
if( FilteredDeviceInterfaceList != -1073741802 )
{
LABEL_28:
*(_DWORD *)a1 = FilteredDeviceInterfaceList;
return(unsigned int)-1073741536;
}
return 0;
}
if( (_DWORD)arg20 != 1 )
return v9;
if( (_DWORD)a3 == 5 )
{
if( (*(_DWORD *)(a1 + 40) & 0x10000) != 0 )
return v9;
v94 = 0;
v95 = 0;
v96 = 0;
v88 = 0i64;
Object = PiDmGetObject(5i64, a2, (INT64 *)&v88);
if( Object < 0 )
goto LABEL_178;
v72 = (CHAR *)v88;
v92[1] = *(_QWORD *)(a1 + 24);
v92[2] = *(_QWORD *)(a1 + 32);
v92[0] = rcx0;
do
{
v93 = 0;
Object = PiDmListEnumObjectsWithCallback(
4,
(ULONG_PTR)v72,
(__int64(__fastcall *)(_QWORD, __int64, char *))PiPnpRtlEnumDevicesCallback,
(__int64)v92);
}
while( Object >= 0 && v93 );
}
else
{
if( (_DWORD)a3 != 6 || (*(_DWORD *)(a1 + 40) & 0x10000) != 0 )
return v9;
v99 = 0;
v100 = 0;
v101 = 0;
v89 = 0i64;
Object = PiDmGetObject(6i64, a2, &v89);
if( Object < 0 )
goto LABEL_178;
v72 = (CHAR *)v89;
v97[1] = *(_QWORD *)(a1 + 24);
v97[2] = *(_QWORD *)(a1 + 32);
v97[0] = rcx0;
do
{
v98 = 0;
Object = PiDmListEnumObjectsWithCallback(
6,
(ULONG_PTR)v72,
(__int64(__fastcall *)(_QWORD, __int64, char *))PiPnpRtlEnumDevicesCallback,
(__int64)v97);
}
while( Object >= 0 && v98 );
}
if( v72 )
PiDmObjectRelease(v72);
LABEL_178:
*(_DWORD *)a1 = Object;
return(unsigned int)-1073741536;
}
if( (_DWORD)r9_0 == 13 )
{
if( (_DWORD)arg20 == 1 )
return 0;
if( (_DWORD)a3 == 5 )
{
if( *(int *)a1 < 0 )
return 0;
P = 0i64;
v79 = 0i64;
v38 = 0i64;
LOBYTE(a4[0]) = 0;
v39 = PiDmGetObject(5i64, a2, (INT64 *)&P);
v40 = (CHAR *)P;
if( v39 >= 0 )
{
v41 = PiDmGetObject(1i64, *(WCHAR **)(a1 + 24), &v79);
v38 = v79;
if( v41 >= 0 )
{
PiDmListAddObject(4u, (UINT64)v40, v79, (__int64)a4);
if( !LOBYTE(a4[0]) )
PiDmListAddList(v42, (UINT64)v40, v43, v38);
}
}
}
else
{
if( (_DWORD)a3 != 6 || *(int *)a1 < 0 )
return 0;
v87 = 0i64;
v80 = 0i64;
v38 = 0i64;
v69 = PiDmGetObject(6i64, a2, &v87);
v40 = (CHAR *)v87;
if( v69 >= 0 )
{
v70 = PiDmGetObject(1i64, *(WCHAR **)(a1 + 24), &v80);
v38 = v80;
if( v70 >= 0 )
PiDmListAddObject(6u, (UINT64)v40, v80, (__int64)a4 + 2);
}
}
if( v40 )
PiDmObjectRelease(v40);
if( !v38 )
return 0;
goto LABEL_97;
}
v10 = r9_0 - 2;
if( !v10 )
{
if( (_DWORD)arg20 == 1 )
{
v27 = CmMapCmObjectTypeToPnpObjectType(a3);
v29 = PiDmAddCacheReferenceForObject(v27, v28, 0i64);
*(_DWORD *)a1 = v29;
return(v29 >> 31) & 0xC0000120;
}
if( *(int *)a1 < 0 || !*(_BYTE *)(a1 + 32) )
{
v35 = CmMapCmObjectTypeToPnpObjectType(a3);
PiDmRemoveCacheReferenceForObject(v35, v36, v37);
return 0;
}
v85 = 0i64;
v44 = CmMapCmObjectTypeToPnpObjectType(a3);
if( (int)PiDmGetObject(v44, v45, &v85) < 0 )
return 0;
v38 = v85;
KsepCacheLock(v85);
v46 = *(_DWORD *)(v38 + 32);
*(_DWORD *)(v38 + 32) = v46 | 1;
PiDmObjectReleaseLock(v38);
if( (v46 & 1) != 0 )
PiDmRemoveCacheReferenceForObject(v44, a2, v47);
LABEL_97:
PiDmObjectRelease((CHAR *)v38);
return 0;
}
v11 = v10 - 1;
if( !v11 )
{
if( (_DWORD)arg20 != 1 )
{
if( (_DWORD)a3 == 1 )
{
v51 = *(WCHAR **)(a1 + 8);
DestinationString = 0i64;
Guid = 0i64;
RtlInitUnicodeString(&DestinationString, v51 + 2, 1u);
if( RtlGUIDFromString(&DestinationString, &Guid) < 0 )
Guid = 0i64;
if( *(int *)a1 < 0 )
{
if( (byte_140C130BA & 0x10) != 0 )
{
IsNullGuid = PnpIsNullGuid(&Guid);
McTemplateK0zjdd_EtwWriteTransfer(
(unsigned int)-(IsNullGuid == 0),
(const EVENT_DESCRIPTOR *)KMPnPEvt_DeviceDelete_Failure,
v66,
a2,
(unsigned __int64)&Guid & -(__int64)(IsNullGuid == 0),
*(_DWORD *)v51,
*(_DWORD *)a1);
}
}
else if( (byte_140C130BA & 8) != 0 )
{
v52 = PnpIsNullGuid(&Guid);
McTemplateK0zjdd_EtwWriteTransfer(
(unsigned int)-(v52 == 0),
&KMPnPEvt_DeviceDelete_Success,
v53,
a2,
(unsigned __int64)&Guid & -(__int64)(v52 == 0),
*(_DWORD *)v51,
*(_DWORD *)a1);
}
if( *(int *)a1 >= 0 )
{
if( v51[2] )
{
v102 = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart;
PnpSetObjectProperty(
rcx0,
(__int64)(v51 + 2),
2u,
0i64,
0i64,
(__int64)DEVPKEY_DeviceClass_LastDeleteDate,
16,
(__int64)&v102,
8u,
0);
}
if( CmIsRootEnumeratedDevice(a2) )
{
RtlInitUnicodeString(&DestinationString, a2, v54);
if( DestinationString.Length >= 2u )
{
if( *DestinationString.Buffer )
{
v67 = (struct _DMA_ADAPTER *)PnpDeviceObjectFromDeviceInstanceWithTag(
(INT64)&DestinationString,
0x746C6644ui64);
if( v67 )
{
v68 = *(_DWORD **)&v67[4].Version;
if( v68 )
*v68 |= 1u;
HalPutDmaAdapter(v67);
}
}
}
}
}
PiPnpRtlFreeDeviceDeleteInfo(v51);
}
else if( (_DWORD)a3 == 3 )
{
v56 = *(ULONG_PTR **)(a1 + 8);
if( *(int *)a1 >= 0 && *v56 )
{
v57 = v56[1];
if( v57 )
PiDmListRemoveObject(0, v57, *v56, 0i64);
v58 = v56[2];
if( v58 )
PiDmListRemoveObject(1u, v58, *v56, 0i64);
v59 = v56[3];
if( v59 )
PiDmListRemoveObject(2u, v59, *v56, 0i64);
}
PiPnpRtlFreeInterfaceDeleteInfo(v56);
}
return 0;
}
if( (_DWORD)a3 == 1 )
{
v83 = 0i64;
FilteredDeviceInterfaceList = PiPnpRtlGatherDeviceDeleteInfo(a2, (INT64)&v83);
v9 = FilteredDeviceInterfaceList;
if( FilteredDeviceInterfaceList < 0 )
goto LABEL_28;
v50 = v83;
}
else
{
if( (_DWORD)a3 != 3 )
return v9;
v84 = 0i64;
FilteredDeviceInterfaceList = PiPnpRtlGatherInterfaceDeleteInfo(a2, &v84);
v9 = FilteredDeviceInterfaceList;
if( FilteredDeviceInterfaceList < 0 )
goto LABEL_28;
v50 = (__int64)v84;
}
goto LABEL_125;
}
v12 = v11 - 1;
if( !v12 )
{
if( (_DWORD)arg20 != 1 || (*(_DWORD *)(a1 + 56) & 0x10000) != 0 )
return v9;
FilteredDeviceInterfaceList = PiDmGetCmObjectListFromCache(
(unsigned int)a3,
*(_QWORD *)(a1 + 16),
*(_QWORD *)(a1 + 24),
*(_QWORD *)(a1 + 32),
*(_DWORD *)(a1 + 40),
*(_QWORD *)(a1 + 48));
goto LABEL_27;
}
v13 = v12 - 5;
if( v13 )
{
if( v13 != 1 )
return v9;
if( (_DWORD)arg20 != 1 )
{
if( *(int *)a1 < 0 )
return v9;
LODWORD(a7) = *(_DWORD *)(a1 + 40);
LODWORD(a5) = *(_DWORD *)(a1 + 28);
PiDmObjectUpdateCachedCmProperty(
(unsigned int)a3,
a2,
a3,
*(unsigned int *)(a1 + 24),
a5,
*(const WCHAR **)(a1 + 32),
a7);
if( v6 == 1 && *(_DWORD *)(a1 + 24) == 9 )
{
v32 = *(UINT64 **)(a1 + 8);
v33 = (CHAR *)*v32;
if( *v32 )
{
v34 = v32[1];
if( v34 )
PiDmListRemoveObject(5u, v34, (ULONG_PTR)v33, 0i64);
v31 = v32[2];
if( v31 )
PiDmListAddObject(5u, v31, *v32, 0i64);
}
PiPnpRtlFreeInstallerClassChangeInfo((CHAR **)v32, v31, v33);
}
return 0;
}
v9 = 0;
if( (*(_DWORD *)(a1 + 44) & 0x20000) != 0
|| ((v21 = *(_DWORD *)(a1 + 40), PoolWithTag = 0i64, a4[1] = 0, !v21)
|| (PoolWithTag = ExAllocatePoolWithTag(PagedPool, v21, 0x47706E50ui64)) == 0i64)
&& *(_DWORD *)(a1 + 40) )
{
LABEL_56:
if( *(_QWORD *)(a1 + 16) )
{
LABEL_57:
if( v6 != 1 || *(_DWORD *)(a1 + 24) != 9 )
return v9;
v30 = 0i64;
v82 = 0i64;
if( *(_DWORD *)(a1 + 28) == 1 && *(_DWORD *)(a1 + 40) == 78 && PnpIsValidGuidString(*(const WCHAR **)(a1 + 32)) )
v30 = *(WCHAR **)(a1 + 32);
FilteredDeviceInterfaceList = PiPnpRtlGatherInstallerClassChangeInfo(a2, v30, &v82);
v9 = FilteredDeviceInterfaceList;
if( FilteredDeviceInterfaceList >= 0 )
{
*(_QWORD *)(a1 + 8) = v82;
return v9;
}
goto LABEL_28;
}
v48 = CmMapCmObjectTypeToPnpObjectType(v6);
PiPnpRtlCacheObjectBaseKey(rcx0, a2, v48, v49);
v26 = (v9 & 0x80000000) != 0;
LABEL_52:
if( v26 )
return v9;
goto LABEL_57;
}
a4[2] = *(_DWORD *)(a1 + 40);
if( v6 == 1 )
{
v23 = *(_DWORD *)(a1 + 24);
if( (unsigned int)(v23 - 1) > 0x24
|| !CmDevicePropertyRead((unsigned int)(v6 - 1), v23)
|| CmDevicePropertyWrite() )
{
DeviceRegProp = CmGetDeviceRegProp(
PiPnpRtlCtx,
a2,
*(_QWORD *)(a1 + 16),
v23,
(__int64)&a4[1],
(__int64)PoolWithTag,
(__int64)&a4[2],
0);
goto LABEL_45;
}
}
else
{
if( v6 != 2 )
{
LABEL_77:
v9 = 0;
LABEL_49:
if( PoolWithTag )
ExFreePoolWithTag(PoolWithTag, 0x47706E50u);
v26 = (v9 & 0x80000000) != 0;
if( v9 )
goto LABEL_52;
goto LABEL_56;
}
v64 = *(_DWORD *)(a1 + 24);
if( (unsigned int)(v64 - 1) > 0x24 || !CmClassPropertyRead(v64) || CmClassPropertyWrite(v64) )
{
DeviceRegProp = CmGetInstallerClassRegProp(
PiPnpRtlCtx,
(__int64)a2,
*(_QWORD *)(a1 + 16),
v64,
(__int64)&a4[1],
(__int64)PoolWithTag,
(__int64)&a4[2]);
LABEL_45:
v25 = DeviceRegProp;
if( (DeviceRegProp < 0
|| *(_QWORD *)&a4[1] != __PAIR64__(*(_DWORD *)(a1 + 40), *(_DWORD *)(a1 + 28))
|| memcmp(PoolWithTag, *(PVOID *)(a1 + 32), a4[2]))
&& (v25 != -1073741275 || *(_DWORD *)(a1 + 40))
&& v25 != -1073741790 )
{
goto LABEL_77;
}
LABEL_48:
*(_DWORD *)a1 = v25;
v9 = -1073741536;
goto LABEL_49;
}
}
v25 = -1073741790;
goto LABEL_48;
}
if( (_DWORD)arg20 != 1 )
{
if( *(int *)a1 >= 0 )
{
LODWORD(a7) = **(_DWORD **)(a1 + 48);
LODWORD(a5) = **(_DWORD **)(a1 + 32);
PiDmObjectUpdateCachedCmProperty(
(unsigned int)a3,
a2,
a3,
*(unsigned int *)(a1 + 24),
a5,
*(const WCHAR **)(a1 + 40),
a7);
}
else if( *(_DWORD *)a1 == -1073741275 )
{
LODWORD(a7) = 0;
LODWORD(a5) = 0;
PiDmObjectUpdateCachedCmProperty((unsigned int)a3, a2, a3, *(unsigned int *)(a1 + 24), a5, 0i64, a7);
}
return 0;
}
if( (*(_DWORD *)(a1 + 56) & 0x10000) != 0 )
goto LABEL_14;
FilteredDeviceInterfaceList = PiDmObjectGetCachedCmProperty(
(unsigned int)a3,
(INT64)a2,
a3,
*(unsigned int *)(a1 + 24),
*(_QWORD *)(a1 + 32),
*(_QWORD *)(a1 + 40),
*(_QWORD *)(a1 + 48));
if( FilteredDeviceInterfaceList >= 0
|| FilteredDeviceInterfaceList == -1073741275
|| FilteredDeviceInterfaceList == -1073741789
|| FilteredDeviceInterfaceList == -1073741772 )
{
goto LABEL_28;
}
v9 = 0;
LABEL_14:
if( !*(_QWORD *)(a1 + 16) )
{
v15 = CmMapCmObjectTypeToPnpObjectType(v6);
PiPnpRtlCacheObjectBaseKey(rcx0, a2, v15, v16);
}
return v9;
}Referenced by:
No references.