PiPnpRtlCmActionCallback
NTSTATUS __stdcall PiPnpRtlCmActionCallback(
HPNPCTX *hPnpCtx,
WCHAR *CmObjectName,
_CM_OBJECT_TYPE CmObjectType,
_CM_ACTION_TYPE CmActionType,
_CM_ACTION_TIME CmActionTime,
_CM_ACTION_INFORMATION *CmObjectActionInfo){
NTSTATUS v9;
__int32 v10;
__int32 v11;
__int32 v12;
unsigned __int64 v13;
NTSTATUS FilteredDeviceInterfaceList;
PNP_OBJECT_TYPE v15;
VOID **v16;
__int32 v18;
__int32 v19;
__int32 v20;
unsigned int v21;
VOID **PoolWithTag;
INT64 v23;
NTSTATUS DeviceRegProp;
_CM_ACTION_INFORMATION v25;
bool v26;
PNP_OBJECT_TYPE v27;
WCHAR *v28;
NTSTATUS v29;
WCHAR *v30;
_PI_DM_OBJECT *v31;
_PI_DM_OBJECT **v32;
_PI_DM_OBJECT *v33;
_PI_DM_OBJECT *v34;
PNP_OBJECT_TYPE v35;
WCHAR *v36;
VOID *v37;
_PI_DM_OBJECT *v38;
NTSTATUS v39;
_PI_DM_OBJECT *v40;
NTSTATUS v41;
_PI_DM_OBJECT *v42;
PNP_OBJECT_TYPE v43;
WCHAR *v44;
_PI_DM_OBJECT v45;
VOID *v46;
PNP_OBJECT_TYPE v47;
VOID **v48;
void *v49;
wchar_t *v50;
bool v51;
__int64 v52;
WCHAR *v53;
_PI_DM_OBJECT **v54;
_PI_DM_OBJECT *v55;
_PI_DM_OBJECT *v56;
_PI_DM_OBJECT *v57;
_PI_DM_OBJECT **v58;
_PI_DM_OBJECT *v59;
_PI_DM_OBJECT *v60;
INT64 v61;
bool IsNullGuid;
__int64 v63;
_ADAPTER_OBJECT *v64;
_DWORD *v65;
NTSTATUS v66;
NTSTATUS v67;
NTSTATUS v68;
_EX_PUSH_LOCK *v69;
WCHAR *v70;
_PI_DM_OBJECT **v71;
_PI_DM_OBJECT *v72;
UINT64 *CmRegPropType;
UINT8 *PropertyBuffer;
UINT64 *PropertySize;
VOID *Flags;
_DIAGNOSTIC_CONTEXT *v77;
INT64 v78;
__int128 AlreadyInList;
_PI_DM_OBJECT *a3;
_PI_DM_OBJECT *v81;
_UNICODE_STRING DestinationString;
PI_PNPRTL_INSTALLER_CLASS_CHANGE_INFO *v83;
UINT8 *a2;
_PI_PNPRTL_INTERFACE_DELETE_INFO *Info;
_PI_DM_OBJECT *Cache;
_PI_DM_OBJECT *Object;
_PI_DM_OBJECT *PushLock;
_EX_PUSH_LOCK *v89;
_EX_PUSH_LOCK *v90;
PVOID v91;
PVOID v92;
INT64 v93[3];
char v94;
int v95;
__int16 v96;
char v97;
INT64 v98[3];
char v99;
int v100;
__int16 v101;
char v102;
__int64 v103;
_GUID Guid;
v9 = -1073741822;
if( CmActionType > CM_ACTION_TYPE_ADD_DEVICE_TO_CONTAINER )
{
v18 = CmActionType - 14;
if( !v18 )
{
if( CmActionTime != CM_ACTION_TIME_PRE )
{
if( CmObjectType == CM_OBJECT_TYPE_DEVICE_CONTAINER )
{
if( *CmObjectActionInfo >= 0 )
{
v58 = (_PI_DM_OBJECT **)*((_QWORD *)CmObjectActionInfo + 1);
BYTE1(AlreadyInList) = 0;
v59 = v58[1];
if( v59 )
{
if( *v58 )
{
PiDmListRemoveObject(PiDmListDevicesInInstallerClass, v59, *v58, (UINT8 *)&AlreadyInList + 1);
if( BYTE1(AlreadyInList) )
PiDmListRemoveList(v60, v58[1]);
}
}
PiPnpRtlFreePanelRemoveInfo(v58);
}
}
else if( CmObjectType == CM_OBJECT_TYPE_MAX && *CmObjectActionInfo >= 0 )
{
v71 = (_PI_DM_OBJECT **)*((_QWORD *)CmObjectActionInfo + 1);
v72 = v71[1];
if( v72 && *v71 )
PiDmListRemoveObject(
PiDmListDevicesInInstallerClass|PiDmListInterfacesInContainer,
v72,
*v71,
(UINT8 *)&AlreadyInList + 3);
PiPnpRtlFreePanelRemoveInfo(v71);
}
return 0;
}
if( CmObjectType == CM_OBJECT_TYPE_DEVICE_CONTAINER )
{
v53 = (WCHAR *)*((_QWORD *)CmObjectActionInfo + 3);
v91 = 0i64;
FilteredDeviceInterfaceList = PiPnpRtlGatherContainerRemoveInfo(v53, CmObjectName, &v91);
v9 = FilteredDeviceInterfaceList;
if( FilteredDeviceInterfaceList < 0 )
goto LABEL_28;
v49 = v91;
}
else
{
if( CmObjectType != CM_OBJECT_TYPE_MAX )
return v9;
v70 = (WCHAR *)*((_QWORD *)CmObjectActionInfo + 3);
v92 = 0i64;
FilteredDeviceInterfaceList = PiPnpRtlGatherPanelRemoveInfo(v70, CmObjectName, &v92);
v9 = FilteredDeviceInterfaceList;
if( FilteredDeviceInterfaceList < 0 )
goto LABEL_28;
v49 = v92;
}
LABEL_125:
*((_QWORD *)CmObjectActionInfo + 1) = v49;
return v9;
}
v19 = v18 - 1;
if( v19 )
{
v20 = v19 - 1;
if( v20 )
{
if( v20 != 1 || CmActionTime != CM_ACTION_TIME_PRE || (CmObjectActionInfo[20] & 0x10000) != 0 )
return v9;
FilteredDeviceInterfaceList = PiPnpRtlGetFilteredDeviceInterfaceList(CmObjectActionInfo);
}
else
{
if( CmActionTime != CM_ACTION_TIME_PRE || (CmObjectActionInfo[18] & 0x10000) != 0 )
return v9;
FilteredDeviceInterfaceList = PiPnpRtlGetFilteredDeviceList(CmObjectActionInfo);
}
LABEL_27:
if( FilteredDeviceInterfaceList != -1073741802 )
{
LABEL_28:
*CmObjectActionInfo = FilteredDeviceInterfaceList;
return -1073741536;
}
return 0;
}
if( CmActionTime != CM_ACTION_TIME_PRE )
return v9;
if( CmObjectType == CM_OBJECT_TYPE_DEVICE_CONTAINER )
{
if( (CmObjectActionInfo[10] & 0x10000) != 0 )
return v9;
v95 = 0;
v96 = 0;
v97 = 0;
v89 = 0i64;
v68 = PiDmGetObject(5, CmObjectName, (PI_DM_OBJECT **)&v89);
if( v68 < 0 )
goto LABEL_178;
v69 = v89;
v93[1] = *((_QWORD *)CmObjectActionInfo + 3);
v93[2] = *((_QWORD *)CmObjectActionInfo + 4);
v93[0] = (INT64)hPnpCtx;
do
{
v94 = 0;
v68 = PiDmListEnumObjectsWithCallback(4i64, v69, (INT64)PiPnpRtlEnumDevicesCallback, (INT64)v93);
}
while( v68 >= 0 && v94 );
}
else
{
if( CmObjectType != CM_OBJECT_TYPE_MAX || (CmObjectActionInfo[10] & 0x10000) != 0 )
return v9;
v100 = 0;
v101 = 0;
v102 = 0;
v90 = 0i64;
v68 = PiDmGetObject(6, CmObjectName, (PI_DM_OBJECT **)&v90);
if( v68 < 0 )
goto LABEL_178;
v69 = v90;
v98[1] = *((_QWORD *)CmObjectActionInfo + 3);
v98[2] = *((_QWORD *)CmObjectActionInfo + 4);
v98[0] = (INT64)hPnpCtx;
do
{
v99 = 0;
v68 = PiDmListEnumObjectsWithCallback(6i64, v69, (INT64)PiPnpRtlEnumDevicesCallback, (INT64)v98);
}
while( v68 >= 0 && v99 );
}
if( v69 )
PiDmObjectRelease((_PI_DM_OBJECT *)v69);
LABEL_178:
*CmObjectActionInfo = v68;
return -1073741536;
}
if( CmActionType == CM_ACTION_TYPE_ADD_DEVICE_TO_CONTAINER )
{
if( CmActionTime == CM_ACTION_TIME_PRE )
return 0;
if( CmObjectType == CM_OBJECT_TYPE_DEVICE_CONTAINER )
{
if( *CmObjectActionInfo < 0 )
return 0;
Object = 0i64;
a3 = 0i64;
v38 = 0i64;
LOBYTE(AlreadyInList) = 0;
v39 = PiDmGetObject(5, CmObjectName, &Object);
v40 = Object;
if( v39 >= 0 )
{
v41 = PiDmGetObject(1, *((WCHAR **)CmObjectActionInfo + 3), &a3);
v38 = a3;
if( v41 >= 0 )
{
PiDmListAddObject(PiDmListDevicesInInstallerClass, v40, a3, (UINT8 *)&AlreadyInList);
if( !(_BYTE)AlreadyInList )
PiDmListAddList(v42, v40);
}
}
}
else
{
if( CmObjectType != CM_OBJECT_TYPE_MAX || *CmObjectActionInfo < 0 )
return 0;
PushLock = 0i64;
v81 = 0i64;
v38 = 0i64;
v66 = PiDmGetObject(6, CmObjectName, &PushLock);
v40 = PushLock;
if( v66 >= 0 )
{
v67 = PiDmGetObject(1, *((WCHAR **)CmObjectActionInfo + 3), &v81);
v38 = v81;
if( v67 >= 0 )
PiDmListAddObject(
PiDmListDevicesInInstallerClass|PiDmListInterfacesInContainer,
v40,
v81,
(UINT8 *)&AlreadyInList + 2);
}
}
if( v40 )
PiDmObjectRelease(v40);
if( !v38 )
return 0;
goto LABEL_97;
}
v10 = CmActionType - 2;
if( !v10 )
{
if( CmActionTime == CM_ACTION_TIME_PRE )
{
v27 = CmMapCmObjectTypeToPnpObjectType(CmObjectType);
v29 = PiDmAddCacheReferenceForObject(v27, v28, 0i64);
*CmObjectActionInfo = v29;
return(v29 >> 31) & 0xC0000120;
}
if( *CmObjectActionInfo < 0 || !*((_BYTE *)CmObjectActionInfo + 32) )
{
v35 = CmMapCmObjectTypeToPnpObjectType(CmObjectType);
PiDmRemoveCacheReferenceForObject(v35, v36, v37);
return 0;
}
Cache = 0i64;
v43 = CmMapCmObjectTypeToPnpObjectType(CmObjectType);
if( PiDmGetObject(v43, v44, &Cache) < 0 )
return 0;
v38 = Cache;
KsepCacheLock(Cache);
v45 = v38[8];
v38[8] = v45 | 1;
PiDmObjectReleaseLock(v38);
if( (v45 & 1) != 0 )
PiDmRemoveCacheReferenceForObject(v43, CmObjectName, v46);
LABEL_97:
PiDmObjectRelease(v38);
return 0;
}
v11 = v10 - 1;
if( !v11 )
{
if( CmActionTime != CM_ACTION_TIME_PRE )
{
if( CmObjectType == CM_OBJECT_TYPE_DEVICE )
{
v50 = (wchar_t *)*((_QWORD *)CmObjectActionInfo + 1);
DestinationString = 0i64;
Guid = 0i64;
RtlInitUnicodeString(&DestinationString, v50 + 2);
if( RtlGUIDFromString(&DestinationString, &Guid) < 0 )
Guid = 0i64;
if( *CmObjectActionInfo < 0 )
{
if( (byte_140C130BA & 0x10) != 0 )
{
IsNullGuid = PnpIsNullGuid(&Guid);
McTemplateK0zjdd_EtwWriteTransfer(
(unsigned int)-!IsNullGuid,
(const _EVENT_DESCRIPTOR *)KMPnPEvt_DeviceDelete_Failure,
v63,
CmObjectName,
(unsigned __int64)&Guid & -(__int64)!IsNullGuid,
*(_DWORD *)v50,
*CmObjectActionInfo);
}
}
else if( (byte_140C130BA & 8) != 0 )
{
v51 = PnpIsNullGuid(&Guid);
McTemplateK0zjdd_EtwWriteTransfer(
(unsigned int)-!v51,
(const _EVENT_DESCRIPTOR *)KMPnPEvt_DeviceDelete_Success,
v52,
CmObjectName,
(unsigned __int64)&Guid & -(__int64)!v51,
*(_DWORD *)v50,
*CmObjectActionInfo);
}
if( *CmObjectActionInfo >= 0 )
{
if( v50[2] )
{
v103 = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart;
PnpSetObjectProperty(
(INT64)hPnpCtx,
(INT64)(v50 + 2),
2u,
0i64,
0i64,
(__int64)&DEVPKEY_DeviceClass_LastDeleteDate,
16,
(__int64)&v103,
8,
0);
}
if( CmIsRootEnumeratedDevice(CmObjectName) )
{
RtlInitUnicodeString(&DestinationString, CmObjectName);
if( DestinationString.Length >= 2u )
{
if( *DestinationString.Buffer )
{
v64 = (_ADAPTER_OBJECT *)PnpDeviceObjectFromDeviceInstanceWithTag(
(__int64)&DestinationString,
0x746C6644u);
if( v64 )
{
v65 = *(_DWORD **)&v64->AdapterObject.ContiguousTranslationEnd.Offset;
if( v65 )
*v65 |= 1u;
HalPutDmaAdapter(v64);
}
}
}
}
}
PiPnpRtlFreeDeviceDeleteInfo(v50);
}
else if( CmObjectType == CM_OBJECT_TYPE_DEVICE_INTERFACE )
{
v54 = (_PI_DM_OBJECT **)*((_QWORD *)CmObjectActionInfo + 1);
if( *CmObjectActionInfo >= 0 && *v54 )
{
v55 = v54[1];
if( v55 )
PiDmListRemoveObject(PiDmListInterfacesInInterfaceClass, v55, *v54, 0i64);
v56 = v54[2];
if( v56 )
PiDmListRemoveObject(PiDmListInterfacesInDevice, v56, *v54, 0i64);
v57 = v54[3];
if( v57 )
PiDmListRemoveObject(PiDmListInterfacesInContainer, v57, *v54, 0i64);
}
PiPnpRtlFreeInterfaceDeleteInfo((_PI_PNPRTL_INTERFACE_DELETE_INFO *)v54);
}
return 0;
}
if( CmObjectType == CM_OBJECT_TYPE_DEVICE )
{
a2 = 0i64;
FilteredDeviceInterfaceList = PiPnpRtlGatherDeviceDeleteInfo(CmObjectName, (ULONG_PTR *)&a2);
v9 = FilteredDeviceInterfaceList;
if( FilteredDeviceInterfaceList < 0 )
goto LABEL_28;
v49 = a2;
}
else
{
if( CmObjectType != CM_OBJECT_TYPE_DEVICE_INTERFACE )
return v9;
Info = 0i64;
FilteredDeviceInterfaceList = PiPnpRtlGatherInterfaceDeleteInfo(CmObjectName, &Info);
v9 = FilteredDeviceInterfaceList;
if( FilteredDeviceInterfaceList < 0 )
goto LABEL_28;
v49 = Info;
}
goto LABEL_125;
}
v12 = v11 - 1;
if( !v12 )
{
if( CmActionTime != CM_ACTION_TIME_PRE || (CmObjectActionInfo[14] & 0x10000) != 0 )
return v9;
LODWORD(CmRegPropType) = CmObjectActionInfo[10];
FilteredDeviceInterfaceList = PiDmGetCmObjectListFromCache(
CmObjectType,
*((_QWORD *)CmObjectActionInfo + 2),
*((INT64 **)CmObjectActionInfo + 3),
*((HPNPCTX **)CmObjectActionInfo + 4),
(const WCHAR *)CmRegPropType,
(_CM_OBJECT_TYPE)*((_QWORD *)CmObjectActionInfo + 6),
PropertySize,
Flags,
(WCHAR *)v77,
v78,
(UINT64 *)AlreadyInList);
goto LABEL_27;
}
v13 = (unsigned int)(v12 - 5);
if( (_DWORD)v13 )
{
if( (_DWORD)v13 != 1 )
return v9;
if( CmActionTime != CM_ACTION_TIME_PRE )
{
if( *CmObjectActionInfo < 0 )
return v9;
LODWORD(CmRegPropType) = CmObjectActionInfo[7];
PiDmObjectUpdateCachedCmProperty(
CmObjectType,
CmObjectName,
(_CM_REG_PROP)CmObjectType,
(unsigned int)CmObjectActionInfo[6],
(UINT8 *)CmRegPropType,
*((_QWORD *)CmObjectActionInfo + 4),
CmObjectActionInfo[10],
(UINT64)Flags);
if( CmObjectType == CM_OBJECT_TYPE_DEVICE && CmObjectActionInfo[6] == 9 )
{
v32 = (_PI_DM_OBJECT **)*((_QWORD *)CmObjectActionInfo + 1);
v33 = *v32;
if( *v32 )
{
v34 = v32[1];
if( v34 )
PiDmListRemoveObject(PiDmListDevicesInInstallerClass|PiDmListInterfacesInDevice, v34, v33, 0i64);
v31 = v32[2];
if( v31 )
PiDmListAddObject(PiDmListDevicesInInstallerClass|PiDmListInterfacesInDevice, v31, *v32, 0i64);
}
PiPnpRtlFreeInstallerClassChangeInfo(v32, (INT64)v31, (CHAR *)v33);
}
return 0;
}
v9 = 0;
if( (CmObjectActionInfo[11] & 0x20000) != 0
|| ((v21 = CmObjectActionInfo[10], PoolWithTag = 0i64, DWORD1(AlreadyInList) = 0, !v21)
|| (PoolWithTag = ExAllocatePoolWithTag(1ui64, v21, 1198550608i64)) == 0i64)
&& CmObjectActionInfo[10] )
{
LABEL_56:
if( *((_QWORD *)CmObjectActionInfo + 2) )
{
LABEL_57:
if( CmObjectType != CM_OBJECT_TYPE_DEVICE || CmObjectActionInfo[6] != 9 )
return v9;
v30 = 0i64;
v83 = 0i64;
if( CmObjectActionInfo[7] == 1
&& CmObjectActionInfo[10] == 78
&& PnpIsValidGuidString(*((PCWSTR *)CmObjectActionInfo + 4)) )
{
v30 = (WCHAR *)*((_QWORD *)CmObjectActionInfo + 4);
}
FilteredDeviceInterfaceList = PiPnpRtlGatherInstallerClassChangeInfo(CmObjectName, v30, &v83);
v9 = FilteredDeviceInterfaceList;
if( FilteredDeviceInterfaceList >= 0 )
{
*((_QWORD *)CmObjectActionInfo + 1) = v83;
return v9;
}
goto LABEL_28;
}
v47 = CmMapCmObjectTypeToPnpObjectType(CmObjectType);
PiPnpRtlCacheObjectBaseKey(hPnpCtx, CmObjectName, v47, v48);
v26 = v9 < 0;
LABEL_52:
if( v26 )
return v9;
goto LABEL_57;
}
DWORD2(AlreadyInList) = CmObjectActionInfo[10];
if( CmObjectType == CM_OBJECT_TYPE_DEVICE )
{
v23 = (unsigned int)CmObjectActionInfo[6];
if( (unsigned int)(v23 - 1) > 0x24
|| !CmDevicePropertyRead((unsigned int)(CmObjectType - 1), (unsigned int)v23)
|| CmDevicePropertyWrite() )
{
LODWORD(Flags) = 0;
DeviceRegProp = CmGetDeviceRegProp(
*(&stru_140CF2E80 + 607),
CmObjectName,
*((VOID **)CmObjectActionInfo + 2),
v23,
(UINT64 *)((char *)&AlreadyInList + 4),
(UINT8 *)PoolWithTag,
(UINT64 *)&AlreadyInList + 1,
(UINT64)Flags);
goto LABEL_45;
}
}
else
{
if( CmObjectType != CM_OBJECT_TYPE_DEVICE_INSTALLER_CLASS )
{
LABEL_77:
v9 = 0;
LABEL_49:
if( PoolWithTag )
ExFreePoolWithTag(PoolWithTag, 0x47706E50u);
v26 = v9 < 0;
if( v9 )
goto LABEL_52;
goto LABEL_56;
}
v61 = (unsigned int)CmObjectActionInfo[6];
if( (unsigned int)(v61 - 1) > 0x24
|| !(unsigned __int8)CmClassPropertyRead(
(VOID *)v61,
(INT8)CmObjectName,
*(_LARGE_INTEGER **)&CmObjectType,
(VOID *)v13,
CmRegPropType,
(UINT64)PropertyBuffer,
(INT64)PropertySize,
Flags,
v77,
v78,
AlreadyInList,
*((UINT64 *)&AlreadyInList + 1),
(UINT8 *)a3)
|| CmClassPropertyWrite(v61) )
{
DeviceRegProp = CmGetInstallerClassRegProp(
*(&stru_140CF2E80 + 607),
CmObjectName,
*((VOID **)CmObjectActionInfo + 2),
(unsigned int)v61,
(UINT64 *)((char *)&AlreadyInList + 4),
(UINT8 *)PoolWithTag,
(UINT64 *)&AlreadyInList + 1,
(UINT64)Flags);
LABEL_45:
v25 = DeviceRegProp;
if( (DeviceRegProp < 0
|| *(_QWORD *)((char *)&AlreadyInList + 4) != __PAIR64__(CmObjectActionInfo[10], CmObjectActionInfo[7])
|| memcmp(PoolWithTag, *((const VOID **)CmObjectActionInfo + 4), DWORD2(AlreadyInList)))
&& (v25 != -1073741275 || CmObjectActionInfo[10])
&& v25 != -1073741790 )
{
goto LABEL_77;
}
LABEL_48:
*CmObjectActionInfo = v25;
v9 = -1073741536;
goto LABEL_49;
}
}
v25 = -1073741790;
goto LABEL_48;
}
if( CmActionTime != CM_ACTION_TIME_PRE )
{
if( *CmObjectActionInfo >= 0 )
{
LODWORD(CmRegPropType) = **((_DWORD **)CmObjectActionInfo + 4);
PiDmObjectUpdateCachedCmProperty(
CmObjectType,
CmObjectName,
(_CM_REG_PROP)CmObjectType,
(unsigned int)CmObjectActionInfo[6],
(UINT8 *)CmRegPropType,
*((_QWORD *)CmObjectActionInfo + 5),
**((_DWORD **)CmObjectActionInfo + 6),
(UINT64)Flags);
}
else if( *CmObjectActionInfo == -1073741275 )
{
LODWORD(CmRegPropType) = 0;
PiDmObjectUpdateCachedCmProperty(
CmObjectType,
CmObjectName,
(_CM_REG_PROP)CmObjectType,
(unsigned int)CmObjectActionInfo[6],
(UINT8 *)CmRegPropType,
0i64,
0,
(UINT64)Flags);
}
return 0;
}
if( (CmObjectActionInfo[14] & 0x10000) != 0 )
goto LABEL_14;
FilteredDeviceInterfaceList = PiDmObjectGetCachedCmProperty(
CmObjectType,
CmObjectName,
*(PI_DM_OBJECT **)&CmObjectType,
(_CM_REG_PROP)CmObjectActionInfo[6],
*((UINT8 **)CmObjectActionInfo + 4),
*((UINT8 **)CmObjectActionInfo + 5),
*((UINT64 **)CmObjectActionInfo + 6));
if( FilteredDeviceInterfaceList >= 0
|| FilteredDeviceInterfaceList == -1073741275
|| FilteredDeviceInterfaceList == -1073741789
|| FilteredDeviceInterfaceList == -1073741772 )
{
goto LABEL_28;
}
v9 = 0;
LABEL_14:
if( !*((_QWORD *)CmObjectActionInfo + 2) )
{
v15 = CmMapCmObjectTypeToPnpObjectType(CmObjectType);
PiPnpRtlCacheObjectBaseKey(hPnpCtx, CmObjectName, v15, v16);
}
return v9;
}Referenced by:
No references.