PiDevCfgConfigureDevice
NTSTATUS __stdcall PiDevCfgConfigureDevice(
_DEVICE_NODE *DeviceNode,
PI_DEVCFG_DEVICE_CONTEXT *DeviceContext,
PI_DEVCFG_DRIVER_NODE *DriverNode,
UINT64 *ConfigFlags,
UINT64 *ConfigStatus){
_UNICODE_STRING *p_InstancePath;
PI_DEVCFG_QUERY_PROPERTY_PARAM *v8;
PI_DEVCFG_DRIVER_NODE v9;
WCHAR *v10;
INT64 v11;
int DriverConfiguration;
PI_DEVCFG_DRIVER_NODE v13;
PI_DEVCFG_DRIVER_NODE *v14;
_KEXCEPTION_FRAME *v15;
int v16;
wchar_t *v17;
PNP_OBJECT_TYPE v18;
char v19;
char v20;
_BYTE *v21;
char v22;
_DEVICE_NODE *v23;
INT64 v24;
wchar_t *v25;
UINT64 v26;
UINT64 *v27;
PI_DEVCFG_DRIVER_NODE *i;
UINT64 *v29;
UINT64 *v30;
_DEVICE_NODE *v31;
_UNICODE_STRING v32;
wchar_t *v33;
UINT64 v34;
WCHAR *v35;
WCHAR *v36;
NTSTATUS v38;
char v39;
unsigned int v40;
wchar_t *v41;
WCHAR *v42;
int v43;
wchar_t *v44;
WCHAR *v45;
char v46;
PI_DEVCFG_DRIVER_NODE *v47;
__int64 v48;
__int64 v49;
VOID *v50;
__int64 v51;
VOID *v52;
wchar_t *v53;
WCHAR *v54;
wchar_t *v55;
__int64 v56;
__int64 v57;
INT64 v58;
INT64 v59;
VOID *v60;
VOID *v61;
VOID *v62;
VOID *v63;
VOID *v64;
VOID *v65;
VOID *v66;
VOID *v67;
VOID *v68;
VOID *v69;
VOID *v70;
VOID *v71;
INT64 PropertyType;
WCHAR *v73;
WCHAR *v74;
WCHAR *v75;
WCHAR *v76;
WCHAR *v77;
WCHAR *v78;
WCHAR *v79;
WCHAR *v80;
WCHAR *v81;
WCHAR *v82;
WCHAR *v83;
WCHAR *v84;
wchar_t *PropertySize;
_DEVPROPKEY *PropertyKey;
_DEVPROPKEY *PropertyKeya;
_DEVPROPKEY *PropertyKeyb;
_DEVPROPKEY *PropertyKeyc;
_DEVPROPKEY *PropertyKeyd;
_DEVPROPKEY *PropertyKeye;
_DEVPROPKEY *PropertyKeyf;
_DEVPROPKEY *PropertyKeyg;
_DEVPROPKEY *PropertyKeyh;
_DEVPROPKEY *PropertyKeyi;
_DEVPROPKEY *PropertyKeyj;
_DEVPROPKEY *PropertyKeyk;
char v98;
char v99;
_WORD v100[5];
char v101[12];
int v102;
INT64 v103;
PI_DEVCFG_DRIVER_NODE v104;
PI_DEVCFG_DRIVER_NODE v105;
_HANDLE Handle[3];
_UNICODE_STRING StringToken;
_UNICODE_STRING DriverNodeStrongName;
_UNICODE_STRING DeviceManufacturer;
INT64 v110;
UINT64 ConfigFlagsa;
UINT64 *v112;
UINT64 *v113;
WCHAR *ClassGuidString;
_UNICODE_STRING IndirectString;
_UNICODE_STRING v116;
_UNICODE_STRING UnicodeString;
UINT64 Buffer;
PVOID P;
VOID *KeyHandle;
WCHAR *ServiceName;
_UNICODE_STRING DestinationString;
_UNICODE_STRING MultiSz;
_UNICODE_STRING v124;
_UNICODE_STRING v125;
_UNICODE_STRING v126;
_UNICODE_STRING String1;
_UNICODE_STRING v128;
_UNICODE_STRING v129;
_UNICODE_STRING v130;
_UNICODE_STRING StringValue;
_OBJECT_ATTRIBUTES ObjectAttributes;
__int128 Source2;
INT64 v134[22];
*(_QWORD *)&v101[4] = DeviceNode;
v112 = ConfigFlags;
*(_QWORD *)&Handle[1] = 0i64;
v113 = ConfigStatus;
*(_DWORD *)ConfigFlags = 1024;
p_InstancePath = &DeviceNode->InstancePath;
*(_DWORD *)&v100[1] = 1024;
*(_DWORD *)ConfigStatus = 0;
v8 = (PI_DEVCFG_QUERY_PROPERTY_PARAM *)*((_QWORD *)DeviceContext + 2);
v9 = 1024;
KeyHandle = 0i64;
*(_DWORD *)(&v130.MaximumLength + 1) = 0;
*(_QWORD *)&UnicodeString.Length = 0i64;
DriverNodeStrongName = 0i64;
UnicodeString.Buffer = 0i64;
v10 = 0i64;
*(_QWORD *)&MultiSz.Length = 0i64;
ServiceName = 0i64;
MultiSz.Buffer = 0i64;
*(_QWORD *)&v124.Length = 0i64;
Buffer = 0i64;
v124.Buffer = 0i64;
*(_QWORD *)&v125.Length = 0i64;
v125.Buffer = 0i64;
*(_QWORD *)&v126.Length = 0i64;
v126.Buffer = 0i64;
*(_QWORD *)&v128.Length = 0i64;
v128.Buffer = 0i64;
*(_QWORD *)&v129.Length = 0i64;
v129.Buffer = 0i64;
v105 = 0;
v104 = 0;
*(_DWORD *)v101 = 0;
ConfigFlagsa = 0i64;
ClassGuidString = 0i64;
Source2 = 0i64;
*(_QWORD *)&DestinationString.Length = 0i64;
DestinationString.Buffer = 0i64;
*(_QWORD *)&StringToken.Length = 0i64;
StringToken.Buffer = 0i64;
*(_QWORD *)&DeviceManufacturer.Length = 0i64;
DeviceManufacturer.Buffer = 0i64;
*(_QWORD *)&IndirectString.Length = 0i64;
IndirectString.Buffer = 0i64;
*(_QWORD *)&StringValue.Length = 0i64;
StringValue.Buffer = 0i64;
*(_QWORD *)&String1.Length = 0i64;
String1.Buffer = 0i64;
v98 = 0;
Handle[0] = 0;
v110 = 0i64;
v99 = 0;
v100[0] = 0;
P = 0i64;
v102 = 0;
*(_QWORD *)&v116.Length = 0i64;
v116.Buffer = 0i64;
LOBYTE(v100[3]) = 0;
v103 = 0i64;
*(_DWORD *)&v130.Length = 68157440;
v130.Buffer = (wchar_t *)ExAllocatePoolWithTag(1ui64, 0x410ui64, 1667526736i64);
if( !v130.Buffer )
goto LABEL_157;
if( !DriverNode )
goto LABEL_33;
DriverConfiguration = PiDevCfgQueryDriverConfiguration(DriverNode);
if( DriverConfiguration < 0 )
goto LABEL_139;
ClassGuidString = (WCHAR *)*((_QWORD *)DriverNode + 33);
if( *((_QWORD *)DriverNode + 37) )
{
if( !PnpDuplicateUnicodeString((__int64)&UnicodeString, (__int64)(DriverNode + 72)) )
goto LABEL_157;
}
if( *((_QWORD *)DriverNode + 39) )
{
if( !PnpDuplicateUnicodeString((__int64)&MultiSz, (__int64)(DriverNode + 76)) )
goto LABEL_157;
ServiceName = MultiSz.Buffer;
}
if( !*((_QWORD *)DriverNode + 41) )
goto LABEL_8;
if( !PnpDuplicateUnicodeString((__int64)&v124, (__int64)(DriverNode + 80)) )
{
LABEL_157:
DriverConfiguration = -1073741670;
goto LABEL_139;
}
Buffer = (UINT64)v124.Buffer;
LABEL_8:
if( *((_QWORD *)DriverNode + 43) && !PnpDuplicateUnicodeString((__int64)&v125, (__int64)(DriverNode + 84))
|| *((_QWORD *)DriverNode + 45) && !PnpDuplicateUnicodeString((__int64)&v126, (__int64)(DriverNode + 88)) )
{
goto LABEL_157;
}
v9 = DriverNode[96];
v13 = DriverNode[46];
v105 = DriverNode[97];
v14 = (PI_DEVCFG_DRIVER_NODE *)*((_QWORD *)DriverNode + 26);
*(_DWORD *)&v100[1] = v9;
v104 = v13;
if( v14 == DriverNode + 52 )
{
v10 = ServiceName;
}
else
{
do
{
v38 = PiDevCfgQueryDriverConfiguration(v14);
DriverConfiguration = v38;
if( v38 >= 0 )
{
if( *((_QWORD *)v14 + 37) )
{
v14[46] &= ~1u;
}
else
{
if( *((_QWORD *)v14 + 39) )
{
DriverConfiguration = PiDevCfgAppendMultiSz(&MultiSz, 0i64, (const VOID **)v14 + 38, 0);
if( DriverConfiguration < 0 )
goto LABEL_139;
}
if( *((_QWORD *)v14 + 41) )
{
DriverConfiguration = PiDevCfgAppendMultiSz(&v124, 0i64, (const VOID **)v14 + 40, 0);
if( DriverConfiguration < 0 )
goto LABEL_139;
}
if( *((_QWORD *)v14 + 43) )
{
DriverConfiguration = PiDevCfgAppendMultiSz(&v125, 0i64, (const VOID **)v14 + 42, 0);
if( DriverConfiguration < 0 )
goto LABEL_139;
}
if( *((_QWORD *)v14 + 45) )
{
DriverConfiguration = PiDevCfgAppendMultiSz(&v126, 0i64, (const VOID **)v14 + 44, 0);
if( DriverConfiguration < 0 )
goto LABEL_139;
}
v9 |= v14[96];
v105 |= v14[97];
v104 |= v14[46];
*(_DWORD *)&v100[1] = v9;
DriverConfiguration = PiDevCfgAppendMultiSz(&v128, (const VOID **)v14 + 5, 0i64, 0);
if( DriverConfiguration < 0 )
goto LABEL_139;
DriverConfiguration = PiDevCfgAppendMultiSz(&v129, (const VOID **)v14 + 49, 0i64, 0);
if( DriverConfiguration < 0 )
goto LABEL_139;
}
}
else
{
if( v38 != -1073740653 )
break;
if( !PnpBootMode || (PiDevCfgFlags & 2) == 0 )
goto LABEL_139;
v9 |= 0x400u;
DriverConfiguration = 0;
*(_DWORD *)&v100[1] = v9;
}
v14 = *(PI_DEVCFG_DRIVER_NODE **)v14;
}
while( v14 != DriverNode + 52 );
v10 = MultiSz.Buffer;
LOBYTE(v13) = v104;
ServiceName = MultiSz.Buffer;
Buffer = (UINT64)v124.Buffer;
}
if( DriverConfiguration < 0 )
goto LABEL_139;
if( (PiDevCfgFlags & 2) != 0 )
{
if( (v9 & 0x400) != 0
&& (DriverNode[102] & 2) == 0
&& (PiDevCfgOptions & 1) == 0
&& !InitIsWinPEMode
&& !PnpBootMode )
{
goto LABEL_188;
}
if( (v13 & 0x40) != 0 )
{
if( !PnpBootMode )
goto LABEL_188;
v9 |= 0x400u;
*(_DWORD *)&v100[1] = v9;
}
}
memset(v134, 0i64, 0xA8u);
LOBYTE(v59) = 1;
LODWORD(v134[1]) = 288;
LODWORD(v134[4]) = 0x1000000;
v134[2] = (INT64)L"Description";
LODWORD(v134[11]) = 0x1000000;
v15 = (_KEXCEPTION_FRAME *)*((_QWORD *)DriverNode + 3);
v134[3] = (INT64)&StringToken;
v134[9] = (INT64)L"Manufacturer";
LODWORD(v134[8]) = 288;
v134[10] = (INT64)&DeviceManufacturer;
LOBYTE(v16) = RtlpQueryRegistryValues((_KTRAP_FRAME *)0xC0000000i64, v15);
DriverConfiguration = v16;
if( v16 < 0 )
goto LABEL_139;
v17 = DeviceManufacturer.Buffer;
if( !StringToken.Buffer
&& !DeviceManufacturer.Buffer
&& *((_QWORD *)DriverNode + 21)
&& (PiDevCfgFlags & 2) != 0
&& !InitIsWinPEMode )
{
if( !PnpBootMode )
goto LABEL_188;
v9 |= 0x400u;
*(_DWORD *)&v100[1] = v9;
}
if( !StringToken.Length && StringToken.Buffer )
{
RtlFreeAnsiString(&StringToken);
v17 = DeviceManufacturer.Buffer;
}
if( !DeviceManufacturer.Length && v17 )
RtlFreeAnsiString(&DeviceManufacturer);
v18 = (int)ClassGuidString;
if( !ClassGuidString
|| (int)PnpOpenObjectRegKey(*(&stru_140CF2E80 + 607), (__int64)ClassGuidString, 2u, 131097, 0, (__int64)&Handle[1]) < 0 )
{
DriverConfiguration = 0;
goto LABEL_211;
}
memset(v134, 0i64, 0xA0u);
v134[0] = (INT64)&DEVPKEY_DeviceClass_Configurable;
LODWORD(v134[1]) = 17;
v134[2] = (INT64)&v98;
LODWORD(v134[6]) = 17;
v134[5] = (INT64)DEVPKEY_DeviceClass_PolicyExempt;
LODWORD(v59) = 4;
v134[7] = (INT64)&v99;
LODWORD(v134[3]) = 1;
v134[10] = (INT64)&DEVPKEY_DeviceClass_DefaultService;
v134[12] = (INT64)&DestinationString;
v134[15] = (INT64)DEVPKEY_DeviceClass_CompatibleFeatureScores;
v134[17] = (INT64)&P;
LODWORD(v134[8]) = 1;
LODWORD(v134[11]) = 18;
HIDWORD(v134[13]) = 6;
LODWORD(v134[16]) = 4099;
HIDWORD(v134[18]) = 2;
DriverConfiguration = PiDevCfgQueryObjectProperties(
(WCHAR *)2,
v18,
(VOID *)2,
*(PI_DEVCFG_QUERY_PROPERTY_PARAM **)&Handle[1],
(UINT64)v134,
v59);
if( DriverConfiguration < 0 )
goto LABEL_139;
v19 = v98;
DriverConfiguration = 0;
v20 = v99;
if( SLODWORD(v134[4]) < 0 )
v19 = 0;
v98 = v19;
if( SLODWORD(v134[9]) < 0 )
v20 = 0;
v99 = v20;
if( SLODWORD(v134[14]) < 0 )
{
RtlInitUnicodeString(&DestinationString, 0i64);
v19 = v98;
}
if( SLODWORD(v134[19]) >= 0 )
HIDWORD(v110) = v134[18];
else
P = 0i64;
if( !v19 )
{
PropertyKey = (_DEVPROPKEY *)((char *)&v103 + 4);
if( PnpGetObjectProperty(
*(&stru_140CF2E80 + 1214),
(INT64)ClassGuidString,
2i64,
*(INT64 *)&Handle[1],
0i64,
(INT64)&DEVPKEY_DeviceClass_ConfigurableClassVersion,
(INT64)&v103,
(INT64)Handle) >= 0
&& v103 == 0x400000007i64 )
{
if( Handle[0] )
{
PropertyKey = (_DEVPROPKEY *)((char *)&v103 + 4);
if( PnpGetObjectProperty(
*(&stru_140CF2E80 + 1214),
*((_QWORD *)DriverNode + 8),
8i64,
*((_QWORD *)DriverNode + 2),
0i64,
(INT64)&DEVPKEY_DriverPackage_ClassVersion,
(INT64)&v103,
(INT64)&v110) >= 0
&& v103 == 0x400000007i64 )
{
v39 = v98;
if( (unsigned int)v110 >= Handle[0] )
v39 = -1;
v98 = v39;
LABEL_212:
if( v39 || (PiDevCfgOptions & 1) != 0 || (PiDevCfgFlags & 2) == 0 )
goto LABEL_32;
if( PnpBootMode )
{
v9 |= 0x400u;
*(_DWORD *)&v100[1] = v9;
goto LABEL_32;
}
LABEL_188:
DriverConfiguration = -1073740651;
goto LABEL_139;
}
}
}
LABEL_211:
v39 = v98;
goto LABEL_212;
}
LABEL_32:
v21 = P;
if( P )
{
v11 = 0i64;
v40 = 0;
if( !HIDWORD(v110) )
goto LABEL_220;
do
{
if( *v21 == *((_BYTE *)DriverNode + 110) )
break;
++v40;
++v21;
}
while( v40 < HIDWORD(v110) );
if( v40 >= HIDWORD(v110) )
LABEL_220:
DriverConfiguration = -1073740764;
if( DriverConfiguration < 0 )
goto LABEL_139;
}
LABEL_33:
if( (*DeviceContext & 1) == 0 )
{
memset(v134, 0i64, 0xA0u);
v41 = p_InstancePath->Buffer;
v134[0] = (INT64)&DEVPKEY_Device_ClassGuid;
LODWORD(v59) = 3;
v134[2] = (INT64)&Source2;
LODWORD(v134[1]) = 13;
v134[5] = (INT64)&DEVPKEY_Device_InstallFlags;
v134[7] = (INT64)&v102;
v134[10] = (INT64)&DEVPKEY_Device_DriverNodeStrongName;
v134[12] = (INT64)&v116;
LODWORD(v134[3]) = 16;
LODWORD(v134[6]) = 7;
LODWORD(v134[8]) = 4;
LODWORD(v134[11]) = 18;
HIDWORD(v134[13]) = 6;
DriverConfiguration = PiDevCfgQueryObjectProperties(v42, (PNP_OBJECT_TYPE)v41, (VOID *)1, v8, (UINT64)v134, v59);
if( DriverConfiguration < 0 )
goto LABEL_139;
if( SLODWORD(v134[4]) >= 0 )
HIBYTE(v100[0]) = 1;
else
Source2 = 0i64;
v43 = v102;
if( SLODWORD(v134[9]) < 0 )
v43 = 0;
v102 = v43;
if( SLODWORD(v134[14]) < 0 )
RtlInitUnicodeString(&v116, 0i64);
}
if( !v99 )
{
if( (v102 & 4) == 0 )
goto LABEL_36;
if( !DriverNode )
goto LABEL_238;
memset(v134, 0i64, 0xA0u);
v44 = p_InstancePath->Buffer;
v134[0] = (INT64)&DEVPKEY_Device_DriverInfPath;
LODWORD(v59) = 1;
v134[2] = (INT64)&String1;
LODWORD(v134[1]) = 18;
HIDWORD(v134[3]) = 6;
DriverConfiguration = PiDevCfgQueryObjectProperties(v45, (PNP_OBJECT_TYPE)v44, (VOID *)1, v8, (UINT64)v134, v59);
if( DriverConfiguration < 0 )
goto LABEL_139;
if( SLODWORD(v134[4]) < 0 )
RtlInitUnicodeString(&String1, 0i64);
if( String1.Buffer && (unsigned __int8)RtlEqualUnicodeString(&String1, (PCUNICODE_STRING)(DriverNode + 10), 1u) )
{
LABEL_238:
v46 = -1;
v99 = -1;
}
else
{
v46 = v99;
}
if( !v46 )
{
LABEL_36:
DriverConfiguration = PiDevCfgEnforceDevicePolicy(*(_DEVICE_NODE **)&v101[4], DeviceContext, ClassGuidString);
if( DriverConfiguration < 0 )
goto LABEL_139;
}
}
if( *(_QWORD *)&Handle[1] )
{
ObjectAttributes.RootDirectory = *(void **)&Handle[1];
DriverNodeStrongName.Buffer = L"Configuration";
*(_DWORD *)&DriverNodeStrongName.Length = 1835034;
*(_QWORD *)&ObjectAttributes.Length = 48i64;
*(_QWORD *)&ObjectAttributes.Attributes = 576i64;
ObjectAttributes.ObjectName = &DriverNodeStrongName;
*(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
DriverConfiguration = ZwOpenKey(&KeyHandle, 0x20019ui64, &ObjectAttributes, v11, v58, v59, PropertyType, (INT64)v73);
if( DriverConfiguration != -1073741772 )
{
if( DriverConfiguration < 0 )
goto LABEL_139;
DriverConfiguration = PiDevCfgVerifyDeviceAllowed(*(_DEVICE_NODE **)&v101[4], KeyHandle);
if( DriverConfiguration < 0 )
goto LABEL_139;
}
}
if( (*(_DWORD *)(*(_QWORD *)(*(_QWORD *)(*(_QWORD *)&v101[4] + 32i64) + 8i64) + 16i64) & 4) != 0
&& ((PropertyKey = (_DEVPROPKEY *)((char *)&v103 + 4),
PnpGetObjectProperty(
*(&stru_140CF2E80 + 1214),
(INT64)p_InstancePath->Buffer,
1i64,
(INT64)v8,
0i64,
(INT64)&DEVPKEY_Device_Reported,
(INT64)&v103,
(INT64)v100) < 0)
|| v103 != 0x100000011i64) )
{
v22 = 0;
LOBYTE(v100[0]) = 0;
}
else
{
v22 = v100[0];
}
if( DriverNode
&& !UnicodeString.Buffer
&& !DestinationString.Buffer
&& !v22
&& (*(_DWORD *)(*(_QWORD *)&v101[4] + 560i64) & 0x100) == 0 )
{
DriverConfiguration = -1073740652;
goto LABEL_139;
}
if( (*DeviceContext & 1) == 0 )
{
if( DriverNode )
{
if( PnpIsNullGuid(&Source2) )
goto LABEL_44;
v47 = DriverNode + 60;
if( PnpIsNullGuid(DriverNode + 60) )
goto LABEL_44;
v48 = Source2 - *(_QWORD *)v47;
if( (_QWORD)Source2 == *(_QWORD *)v47 )
v48 = *((_QWORD *)&Source2 + 1) - *((_QWORD *)DriverNode + 31);
if( !v48 )
goto LABEL_44;
}
else if( !HIBYTE(v100[0]) || (*(_DWORD *)(*(_QWORD *)&v101[4] + 560i64) & 0x100) == 0 )
{
CmDeleteDeviceRegKey(*(&stru_140CF2E80 + 607), p_InstancePath->Buffer, 0x11ui64, 0i64);
}
CmDeleteDeviceRegKey(*(&stru_140CF2E80 + 607), p_InstancePath->Buffer, 0x12ui64, 0i64);
}
LABEL_44:
v23 = *(_DEVICE_NODE **)&v101[4];
if( PiDevCfgMigrateDevice(
*(_DEVICE_NODE **)&v101[4],
DeviceContext,
(_UNICODE_STRING *)((unsigned __int64)(DriverNode + 64) & -(__int64)(DriverNode != 0i64)),
(_UNICODE_STRING *)((unsigned __int64)(DriverNode + 10) & -(__int64)(DriverNode != 0i64)),
&ConfigFlagsa,
(UINT64 *)((char *)&ConfigFlagsa + 4)) >= 0 )
{
v9 |= ConfigFlagsa;
*(_DWORD *)&v100[1] = v9;
*(_DWORD *)v101 = HIDWORD(ConfigFlagsa);
}
if( (*DeviceContext & 1) == 0 )
{
PiDevCfgResetDeviceDriverSettings(
v23,
DeviceContext,
(_GUID *)((unsigned __int64)(DriverNode + 60) & -(__int64)(DriverNode != 0i64)),
*(VOID **)&Handle[1],
(_GUID *)((unsigned __int64)&Source2 & -(__int64)(HIBYTE(v100[0]) != 0)));
if( *(&stru_140CF2E80 + 607) && (v49 = *(_QWORD *)(*(&stru_140CF2E80 + 607) + 224i64)) != 0 )
v50 = *(VOID **)(v49 + 8);
else
v50 = 0i64;
RegRtlDeleteTreeInternal(v8, (WCHAR *)L"Devices", v50, 0);
if( *(&stru_140CF2E80 + 607) && (v51 = *(_QWORD *)(*(&stru_140CF2E80 + 607) + 224i64)) != 0 )
v52 = *(VOID **)(v51 + 8);
else
v52 = 0i64;
RegRtlDeleteTreeInternal(v8, (WCHAR *)L"Filters", v52, 0);
}
if( !DriverNode || PnpIsNullGuid(DriverNode + 60) )
{
if( (*DeviceContext & 1) == 0 )
{
LODWORD(PropertyKey) = 0;
LODWORD(v73) = 0;
PiDevCfgSetObjectProperty(
*(&stru_140CF2E80 + 607),
DeviceContext,
(const PNP_OBJECT_TYPE)p_InstancePath->Buffer,
(WCHAR *)1,
(WCHAR *)v8,
v60,
(UINT64)&DEVPKEY_Device_ClassGuid,
v73,
0i64,
PropertyKey);
}
}
else
{
LODWORD(PropertyKey) = 16;
LODWORD(v73) = 13;
DriverConfiguration = PiDevCfgSetObjectProperty(
*(&stru_140CF2E80 + 607),
DeviceContext,
(const PNP_OBJECT_TYPE)p_InstancePath->Buffer,
(WCHAR *)1,
(WCHAR *)v8,
v60,
(UINT64)&DEVPKEY_Device_ClassGuid,
v73,
(UINT64)(DriverNode + 60),
PropertyKey);
if( DriverConfiguration < 0 )
goto LABEL_139;
}
v25 = UnicodeString.Buffer;
if( UnicodeString.Buffer )
{
if( UnicodeString.Length )
{
LODWORD(PropertyKey) = UnicodeString.Length + 2;
PropertySize = UnicodeString.Buffer;
goto LABEL_53;
}
LABEL_155:
if( (*DeviceContext & 1) == 0 && (UnicodeString.Buffer && DestinationString.Buffer || !LOBYTE(v100[0])) )
{
LODWORD(PropertyKey) = 0;
LODWORD(v73) = 0;
PiDevCfgSetObjectProperty(
*(&stru_140CF2E80 + 607),
DeviceContext,
(const PNP_OBJECT_TYPE)p_InstancePath->Buffer,
(WCHAR *)1,
(WCHAR *)v8,
v60,
(UINT64)&DEVPKEY_Device_Service,
v73,
0i64,
PropertyKey);
}
goto LABEL_54;
}
if( !DestinationString.Buffer || !DestinationString.Length )
goto LABEL_155;
LODWORD(PropertyKey) = DestinationString.Length + 2;
PropertySize = DestinationString.Buffer;
LABEL_53:
LODWORD(v73) = 18;
DriverConfiguration = PiDevCfgSetObjectProperty(
*(&stru_140CF2E80 + 607),
DeviceContext,
(const PNP_OBJECT_TYPE)p_InstancePath->Buffer,
(WCHAR *)1,
(WCHAR *)v8,
v60,
(UINT64)&DEVPKEY_Device_Service,
v73,
(UINT64)PropertySize,
PropertyKey);
if( DriverConfiguration < 0 )
goto LABEL_139;
LABEL_54:
if( v10 )
{
LODWORD(PropertyKey) = MultiSz.Length;
LODWORD(v73) = 8210;
DriverConfiguration = PiDevCfgSetObjectProperty(
*(&stru_140CF2E80 + 607),
DeviceContext,
(const PNP_OBJECT_TYPE)p_InstancePath->Buffer,
(WCHAR *)1,
(WCHAR *)v8,
v60,
(UINT64)&DEVPKEY_Device_LowerFilters,
v73,
(UINT64)v10,
PropertyKey);
if( DriverConfiguration < 0 )
goto LABEL_139;
}
else if( (*DeviceContext & 1) == 0 )
{
LODWORD(PropertyKey) = 0;
LODWORD(v73) = 0;
PiDevCfgSetObjectProperty(
*(&stru_140CF2E80 + 607),
DeviceContext,
(const PNP_OBJECT_TYPE)p_InstancePath->Buffer,
(WCHAR *)1,
(WCHAR *)v8,
v60,
(UINT64)&DEVPKEY_Device_LowerFilters,
v73,
0i64,
PropertyKey);
}
if( Buffer )
{
LODWORD(PropertyKey) = v124.Length;
LODWORD(v73) = 8210;
DriverConfiguration = PiDevCfgSetObjectProperty(
*(&stru_140CF2E80 + 607),
DeviceContext,
(const PNP_OBJECT_TYPE)p_InstancePath->Buffer,
(WCHAR *)1,
(WCHAR *)v8,
v60,
(UINT64)&DEVPKEY_Device_UpperFilters,
v73,
Buffer,
PropertyKey);
if( DriverConfiguration < 0 )
goto LABEL_139;
}
else if( (*DeviceContext & 1) == 0 )
{
LODWORD(PropertyKey) = 0;
LODWORD(v73) = 0;
PiDevCfgSetObjectProperty(
*(&stru_140CF2E80 + 607),
DeviceContext,
(const PNP_OBJECT_TYPE)p_InstancePath->Buffer,
(WCHAR *)1,
(WCHAR *)v8,
v60,
(UINT64)&DEVPKEY_Device_UpperFilters,
v73,
0i64,
PropertyKey);
}
if( DriverNode && StringToken.Buffer )
{
DriverConfiguration = PiDevCfgBuildIndirectString(DriverNode, &StringToken, &IndirectString, &StringValue);
if( DriverConfiguration < 0 )
goto LABEL_139;
if( (v9 & 0x400) == 0 || (PiDevCfgOptions & 1) != 0 )
{
LODWORD(PropertyKey) = IndirectString.Length + 2;
LODWORD(v73) = 18;
DriverConfiguration = PiDevCfgSetObjectProperty(
*(&stru_140CF2E80 + 607),
DeviceContext,
(const PNP_OBJECT_TYPE)p_InstancePath->Buffer,
(WCHAR *)1,
(WCHAR *)v8,
v60,
(UINT64)&DEVPKEY_Device_DeviceDesc,
v73,
(UINT64)IndirectString.Buffer,
PropertyKey);
if( DriverConfiguration < 0 )
goto LABEL_139;
}
if( StringValue.Buffer )
{
LODWORD(PropertyKey) = StringValue.Length + 2;
LODWORD(v73) = 18;
DriverConfiguration = PiDevCfgSetObjectProperty(
*(&stru_140CF2E80 + 607),
DeviceContext,
(const PNP_OBJECT_TYPE)p_InstancePath->Buffer,
(WCHAR *)1,
(WCHAR *)v8,
v60,
(UINT64)&DEVPKEY_Device_DriverDesc,
v73,
(UINT64)StringValue.Buffer,
PropertyKey);
if( DriverConfiguration < 0 )
goto LABEL_139;
}
else if( (*DeviceContext & 1) == 0 )
{
LODWORD(PropertyKey) = 0;
LODWORD(v73) = 0;
PiDevCfgSetObjectProperty(
*(&stru_140CF2E80 + 607),
DeviceContext,
(const PNP_OBJECT_TYPE)p_InstancePath->Buffer,
(WCHAR *)1,
(WCHAR *)v8,
v60,
(UINT64)&DEVPKEY_Device_DriverDesc,
v73,
0i64,
PropertyKey);
}
RtlFreeAnsiString(&IndirectString);
}
else if( (*DeviceContext & 1) == 0 )
{
LODWORD(PropertyKey) = 0;
LODWORD(v73) = 0;
PiDevCfgSetObjectProperty(
*(&stru_140CF2E80 + 607),
DeviceContext,
(const PNP_OBJECT_TYPE)p_InstancePath->Buffer,
(WCHAR *)1,
(WCHAR *)v8,
v60,
(UINT64)&DEVPKEY_Device_DriverDesc,
v73,
0i64,
PropertyKey);
if( DriverNode )
goto LABEL_69;
memset(v134, 0i64, 0xA0u);
v53 = p_InstancePath->Buffer;
v134[0] = (INT64)&DEVPKEY_Device_BusReportedDeviceDesc;
LODWORD(v60) = 1;
v134[2] = (INT64)&StringToken;
LODWORD(v134[1]) = 18;
HIDWORD(v134[3]) = 6;
if( PiDevCfgQueryObjectProperties(v54, (PNP_OBJECT_TYPE)v53, (VOID *)1, v8, (UINT64)v134, (UINT64)v60) < 0
|| SLODWORD(v134[4]) < 0
|| !StringToken.Buffer )
{
LABEL_290:
if( (*DeviceContext & 1) == 0 )
{
LODWORD(PropertyKey) = 0;
LODWORD(v73) = 0;
PiDevCfgSetObjectProperty(
*(&stru_140CF2E80 + 607),
DeviceContext,
(const PNP_OBJECT_TYPE)p_InstancePath->Buffer,
(WCHAR *)1,
(WCHAR *)v8,
v60,
(UINT64)&DEVPKEY_Device_Manufacturer,
v73,
0i64,
PropertyKey);
}
goto LABEL_72;
}
LODWORD(PropertyKey) = StringToken.Length + 2;
LODWORD(v73) = 18;
DriverConfiguration = PiDevCfgSetObjectProperty(
*(&stru_140CF2E80 + 607),
DeviceContext,
(const PNP_OBJECT_TYPE)p_InstancePath->Buffer,
(WCHAR *)1,
(WCHAR *)v8,
v60,
(UINT64)&DEVPKEY_Device_DeviceDesc,
v73,
(UINT64)StringToken.Buffer,
PropertyKey);
if( DriverConfiguration < 0 )
goto LABEL_139;
}
if( !DriverNode )
goto LABEL_290;
LABEL_69:
if( !DeviceManufacturer.Buffer )
goto LABEL_290;
DriverConfiguration = PiDevCfgBuildIndirectString(DriverNode, &DeviceManufacturer, &IndirectString, 0i64);
if( DriverConfiguration < 0 )
goto LABEL_139;
LODWORD(PropertyKey) = IndirectString.Length + 2;
LODWORD(v73) = 18;
DriverConfiguration = PiDevCfgSetObjectProperty(
*(&stru_140CF2E80 + 607),
DeviceContext,
(const PNP_OBJECT_TYPE)p_InstancePath->Buffer,
(WCHAR *)1,
(WCHAR *)v8,
v60,
(UINT64)&DEVPKEY_Device_Manufacturer,
v73,
(UINT64)IndirectString.Buffer,
PropertyKey);
if( DriverConfiguration < 0 )
goto LABEL_139;
LABEL_72:
if( DriverNode && (v26 = *((_QWORD *)DriverNode + 35)) != 0 )
{
LODWORD(PropertyKey) = *((unsigned __int16 *)DriverNode + 136) + 2;
LODWORD(v73) = 18;
DriverConfiguration = PiDevCfgSetObjectProperty(
*(&stru_140CF2E80 + 607),
DeviceContext,
(const PNP_OBJECT_TYPE)p_InstancePath->Buffer,
(WCHAR *)1,
(WCHAR *)v8,
v60,
(UINT64)&DEVPKEY_Device_DriverProvider,
v73,
v26,
PropertyKey);
if( DriverConfiguration < 0 )
goto LABEL_139;
}
else if( (*DeviceContext & 1) == 0 )
{
LODWORD(PropertyKey) = 0;
LODWORD(v73) = 0;
PiDevCfgSetObjectProperty(
*(&stru_140CF2E80 + 607),
DeviceContext,
(const PNP_OBJECT_TYPE)p_InstancePath->Buffer,
(WCHAR *)1,
(WCHAR *)v8,
v60,
(UINT64)&DEVPKEY_Device_DriverProvider,
v73,
0i64,
PropertyKey);
}
if( DriverNode )
{
LODWORD(PropertyKey) = 8;
LODWORD(v73) = 16;
DriverConfiguration = PiDevCfgSetObjectProperty(
*(&stru_140CF2E80 + 607),
DeviceContext,
(const PNP_OBJECT_TYPE)p_InstancePath->Buffer,
(WCHAR *)1,
(WCHAR *)v8,
v60,
(UINT64)&DEVPKEY_Device_DriverDate,
v73,
(UINT64)(DriverNode + 28),
PropertyKey);
if( DriverConfiguration < 0 )
goto LABEL_139;
LODWORD(v61) = *((unsigned __int16 *)DriverNode + 60);
DriverConfiguration = RtlUnicodeStringPrintf(&v130, (WCHAR *)L"%u.%u.%u.%u");
if( DriverConfiguration < 0 )
goto LABEL_139;
LODWORD(PropertyKeya) = v130.Length + 2;
LODWORD(v74) = 18;
DriverConfiguration = PiDevCfgSetObjectProperty(
*(&stru_140CF2E80 + 607),
DeviceContext,
(const PNP_OBJECT_TYPE)p_InstancePath->Buffer,
(WCHAR *)1,
(WCHAR *)v8,
v61,
(UINT64)&DEVPKEY_Device_DriverVersion,
v74,
(UINT64)v130.Buffer,
PropertyKeya);
if( DriverConfiguration < 0 )
goto LABEL_139;
LODWORD(PropertyKeyb) = *((unsigned __int16 *)DriverNode + 20) + 2;
LODWORD(v75) = 18;
DriverConfiguration = PiDevCfgSetObjectProperty(
*(&stru_140CF2E80 + 607),
DeviceContext,
(const PNP_OBJECT_TYPE)p_InstancePath->Buffer,
(WCHAR *)1,
(WCHAR *)v8,
v62,
(UINT64)&DEVPKEY_Device_DriverInfPath,
v75,
*((_QWORD *)DriverNode + 6),
PropertyKeyb);
if( DriverConfiguration < 0 )
goto LABEL_139;
LODWORD(PropertyKeyc) = *((unsigned __int16 *)DriverNode + 44) + 2;
LODWORD(v76) = 18;
DriverConfiguration = PiDevCfgSetObjectProperty(
*(&stru_140CF2E80 + 607),
DeviceContext,
(const PNP_OBJECT_TYPE)p_InstancePath->Buffer,
(WCHAR *)1,
(WCHAR *)v8,
v63,
(UINT64)&DEVPKEY_Device_DriverInfSection,
v76,
*((_QWORD *)DriverNode + 12),
PropertyKeyc);
if( DriverConfiguration < 0 )
goto LABEL_139;
DriverConfiguration = PiDevCfgBuildDriverNodeStrongName(
DriverNode,
&DeviceManufacturer,
&StringToken,
&DriverNodeStrongName);
if( DriverConfiguration < 0 )
goto LABEL_139;
if( v116.Buffer && !RtlCompareUnicodeString(&v116, &DriverNodeStrongName, 1u) )
RtlFreeAnsiString(&v116);
LODWORD(PropertyKeyd) = DriverNodeStrongName.Length + 2;
LODWORD(v77) = 18;
DriverConfiguration = PiDevCfgSetObjectProperty(
*(&stru_140CF2E80 + 607),
DeviceContext,
(const PNP_OBJECT_TYPE)p_InstancePath->Buffer,
(WCHAR *)1,
(WCHAR *)v8,
v64,
(UINT64)&DEVPKEY_Device_DriverNodeStrongName,
v77,
(UINT64)DriverNodeStrongName.Buffer,
PropertyKeyd);
RtlFreeAnsiString(&DriverNodeStrongName);
if( DriverConfiguration < 0 )
goto LABEL_139;
}
else if( (*DeviceContext & 1) == 0 )
{
LODWORD(PropertyKey) = 0;
LODWORD(v73) = 0;
PiDevCfgSetObjectProperty(
*(&stru_140CF2E80 + 607),
DeviceContext,
(const PNP_OBJECT_TYPE)p_InstancePath->Buffer,
(WCHAR *)1,
(WCHAR *)v8,
v60,
(UINT64)&DEVPKEY_Device_DriverDate,
v73,
0i64,
PropertyKey);
LODWORD(PropertyKeyg) = 0;
LODWORD(v80) = 0;
PiDevCfgSetObjectProperty(
*(&stru_140CF2E80 + 607),
DeviceContext,
(const PNP_OBJECT_TYPE)p_InstancePath->Buffer,
(WCHAR *)1,
(WCHAR *)v8,
v67,
(UINT64)&DEVPKEY_Device_DriverVersion,
v80,
0i64,
PropertyKeyg);
LODWORD(PropertyKeyh) = 0;
LODWORD(v81) = 0;
PiDevCfgSetObjectProperty(
*(&stru_140CF2E80 + 607),
DeviceContext,
(const PNP_OBJECT_TYPE)p_InstancePath->Buffer,
(WCHAR *)1,
(WCHAR *)v8,
v68,
(UINT64)&DEVPKEY_Device_DriverInfPath,
v81,
0i64,
PropertyKeyh);
LODWORD(PropertyKeyi) = 0;
LODWORD(v82) = 0;
PiDevCfgSetObjectProperty(
*(&stru_140CF2E80 + 607),
DeviceContext,
(const PNP_OBJECT_TYPE)p_InstancePath->Buffer,
(WCHAR *)1,
(WCHAR *)v8,
v69,
(UINT64)&DEVPKEY_Device_DriverInfSection,
v82,
0i64,
PropertyKeyi);
LODWORD(PropertyKeyj) = 0;
LODWORD(v83) = 0;
PiDevCfgSetObjectProperty(
*(&stru_140CF2E80 + 607),
DeviceContext,
(const PNP_OBJECT_TYPE)p_InstancePath->Buffer,
(WCHAR *)1,
(WCHAR *)v8,
v70,
(UINT64)&DEVPKEY_Device_DriverNodeStrongName,
v83,
0i64,
PropertyKeyj);
}
if( !v116.Buffer || (v102 & 8) != 0 || (*(_DWORD *)(*(_QWORD *)&v101[4] + 396i64) & 0x6000) != 0 )
{
if( (*DeviceContext & 1) == 0 )
{
LODWORD(PropertyKey) = 0;
LODWORD(v73) = 0;
PiDevCfgSetObjectProperty(
*(&stru_140CF2E80 + 607),
DeviceContext,
(const PNP_OBJECT_TYPE)p_InstancePath->Buffer,
(WCHAR *)1,
(WCHAR *)v8,
v60,
(UINT64)&DEVPKEY_Device_RollbackDriverNode,
v73,
0i64,
PropertyKey);
}
}
else
{
LODWORD(PropertyKey) = v116.Length + 2;
LODWORD(v73) = 18;
DriverConfiguration = PiDevCfgSetObjectProperty(
*(&stru_140CF2E80 + 607),
DeviceContext,
(const PNP_OBJECT_TYPE)p_InstancePath->Buffer,
(WCHAR *)1,
(WCHAR *)v8,
v60,
(UINT64)&DEVPKEY_Device_RollbackDriverNode,
v73,
(UINT64)v116.Buffer,
PropertyKey);
if( DriverConfiguration < 0 )
goto LABEL_139;
}
if( v125.Buffer )
{
LODWORD(PropertyKey) = v125.Length;
LODWORD(v73) = 8210;
DriverConfiguration = PiDevCfgSetObjectProperty(
*(&stru_140CF2E80 + 607),
DeviceContext,
(const PNP_OBJECT_TYPE)p_InstancePath->Buffer,
(WCHAR *)1,
(WCHAR *)v8,
v60,
(UINT64)&DEVPKEY_Device_DriverIncludedInfs,
v73,
(UINT64)v125.Buffer,
PropertyKey);
if( DriverConfiguration < 0 )
goto LABEL_139;
}
else if( (*DeviceContext & 1) == 0 )
{
LODWORD(PropertyKey) = 0;
LODWORD(v73) = 0;
PiDevCfgSetObjectProperty(
*(&stru_140CF2E80 + 607),
DeviceContext,
(const PNP_OBJECT_TYPE)p_InstancePath->Buffer,
(WCHAR *)1,
(WCHAR *)v8,
v60,
(UINT64)&DEVPKEY_Device_DriverIncludedInfs,
v73,
0i64,
PropertyKey);
}
if( v126.Buffer )
{
LODWORD(PropertyKey) = v126.Length;
LODWORD(v73) = 8210;
DriverConfiguration = PiDevCfgSetObjectProperty(
*(&stru_140CF2E80 + 607),
DeviceContext,
(const PNP_OBJECT_TYPE)p_InstancePath->Buffer,
(WCHAR *)1,
(WCHAR *)v8,
v60,
(UINT64)&DEVPKEY_Device_DriverIncludedConfigs,
v73,
(UINT64)v126.Buffer,
PropertyKey);
if( DriverConfiguration < 0 )
goto LABEL_139;
}
else if( (*DeviceContext & 1) == 0 )
{
LODWORD(PropertyKey) = 0;
LODWORD(v73) = 0;
PiDevCfgSetObjectProperty(
*(&stru_140CF2E80 + 607),
DeviceContext,
(const PNP_OBJECT_TYPE)p_InstancePath->Buffer,
(WCHAR *)1,
(WCHAR *)v8,
v60,
(UINT64)&DEVPKEY_Device_DriverIncludedConfigs,
v73,
0i64,
PropertyKey);
}
if( v128.Buffer )
{
LODWORD(PropertyKey) = v128.Length;
LODWORD(v73) = 8210;
DriverConfiguration = PiDevCfgSetObjectProperty(
*(&stru_140CF2E80 + 607),
DeviceContext,
(const PNP_OBJECT_TYPE)p_InstancePath->Buffer,
(WCHAR *)1,
(WCHAR *)v8,
v60,
(UINT64)&DEVPKEY_Device_DriverExtendedInfs,
v73,
(UINT64)v128.Buffer,
PropertyKey);
if( DriverConfiguration < 0 )
goto LABEL_139;
}
else if( (*DeviceContext & 1) == 0 )
{
LODWORD(PropertyKey) = 0;
LODWORD(v73) = 0;
PiDevCfgSetObjectProperty(
*(&stru_140CF2E80 + 607),
DeviceContext,
(const PNP_OBJECT_TYPE)p_InstancePath->Buffer,
(WCHAR *)1,
(WCHAR *)v8,
v60,
(UINT64)&DEVPKEY_Device_DriverExtendedInfs,
v73,
0i64,
PropertyKey);
}
if( !DriverNode || DriverNode[27] == -1 )
{
if( (*DeviceContext & 1) == 0 )
{
LODWORD(PropertyKey) = 0;
LODWORD(v73) = 0;
PiDevCfgSetObjectProperty(
*(&stru_140CF2E80 + 607),
DeviceContext,
(const PNP_OBJECT_TYPE)p_InstancePath->Buffer,
(WCHAR *)1,
(WCHAR *)v8,
v60,
(UINT64)&DEVPKEY_Device_MatchingDeviceId,
v73,
0i64,
PropertyKey);
LODWORD(PropertyKeyk) = 0;
LODWORD(v84) = 0;
PiDevCfgSetObjectProperty(
*(&stru_140CF2E80 + 607),
DeviceContext,
(const PNP_OBJECT_TYPE)p_InstancePath->Buffer,
(WCHAR *)1,
(WCHAR *)v8,
v71,
(UINT64)&DEVPKEY_Device_DriverRank,
v84,
0i64,
PropertyKeyk);
}
}
else
{
LODWORD(PropertyKey) = *((unsigned __int16 *)DriverNode + 36) + 2;
LODWORD(v73) = 18;
DriverConfiguration = PiDevCfgSetObjectProperty(
*(&stru_140CF2E80 + 607),
DeviceContext,
(const PNP_OBJECT_TYPE)p_InstancePath->Buffer,
(WCHAR *)1,
(WCHAR *)v8,
v60,
(UINT64)&DEVPKEY_Device_MatchingDeviceId,
v73,
*((_QWORD *)DriverNode + 10),
PropertyKey);
if( DriverConfiguration < 0 )
goto LABEL_139;
LODWORD(PropertyKeye) = 4;
LODWORD(v78) = 7;
DriverConfiguration = PiDevCfgSetObjectProperty(
*(&stru_140CF2E80 + 607),
DeviceContext,
(const PNP_OBJECT_TYPE)p_InstancePath->Buffer,
(WCHAR *)1,
(WCHAR *)v8,
v65,
(UINT64)&DEVPKEY_Device_DriverRank,
v78,
(UINT64)(DriverNode + 27),
PropertyKeye);
if( DriverConfiguration < 0 )
goto LABEL_139;
}
if( v102 )
{
LODWORD(PropertyKey) = 0;
LODWORD(v73) = 0;
PiDevCfgSetObjectProperty(
*(&stru_140CF2E80 + 607),
DeviceContext,
(const PNP_OBJECT_TYPE)p_InstancePath->Buffer,
(WCHAR *)1,
(WCHAR *)v8,
v60,
(UINT64)&DEVPKEY_Device_InstallFlags,
v73,
0i64,
PropertyKey);
}
if( DriverNode )
{
v27 = v112;
*(_DWORD *)v112 = v9;
if( (DriverNode[46] & 8) != 0 && (PiDevCfgFlags & 2) != 0 )
*(_DWORD *)v27 = v9 | 0x400;
DriverConfiguration = PiDevCfgConfigureDeviceDriver(
*(_DEVICE_NODE **)&v101[4],
DeviceContext,
DriverNode,
(UINT64 *)&v100[1],
(UINT64 *)v101);
if( DriverConfiguration < 0 )
goto LABEL_139;
*(_DWORD *)v27 |= *(_DWORD *)&v100[1];
*(_DWORD *)v113 |= *(_DWORD *)v101;
for( i = (PI_DEVCFG_DRIVER_NODE *)*((_QWORD *)DriverNode + 26); i != DriverNode + 52; i = *(PI_DEVCFG_DRIVER_NODE **)i )
{
if( (i[46] & 1) != 0 )
{
DriverConfiguration = PiDevCfgConfigureDeviceDriver(
*(_DEVICE_NODE **)&v101[4],
DeviceContext,
i,
(UINT64 *)&v100[1],
(UINT64 *)v101);
if( DriverConfiguration < 0 )
goto LABEL_139;
*(_DWORD *)v112 |= *(_DWORD *)&v100[1];
*(_DWORD *)v113 |= *(_DWORD *)v101;
}
}
DriverConfiguration = PiDevCfgConfigureDeviceLocation(
*(_DEVICE_NODE **)&v101[4],
DeviceContext,
(UINT64 *)&v100[1],
(UINT64 *)v101);
if( DriverConfiguration < 0 )
goto LABEL_139;
v29 = v112;
v30 = v113;
*(_DWORD *)v112 |= *(_DWORD *)&v100[1];
*(_DWORD *)v30 |= *(_DWORD *)v101;
}
else
{
v31 = *(_DEVICE_NODE **)&v101[4];
v29 = v112;
if( (*(_DWORD *)(*(_QWORD *)&v101[4] + 560i64) & 0x100) != 0 )
{
v30 = v113;
*(_DWORD *)v112 = 0;
goto LABEL_110;
}
*(_DWORD *)v112 = 64;
PnpDeleteDeviceInterfaces(&p_InstancePath->Length, (__int64)v25, v24);
v30 = v113;
}
v31 = *(_DEVICE_NODE **)&v101[4];
LABEL_110:
if( v105 && !InitIsWinPEMode && PipIsDevNodeDNStarted((__int64)v31) )
*(_DWORD *)v30 |= 0x10u;
if( (v102 & 2) != 0 )
*(_DWORD *)v30 |= 0x20u;
if( HIBYTE(v100[0]) )
*(_DWORD *)v30 |= 1u;
if( KeyHandle )
{
DriverConfiguration = PiDevCfgConfigureDeviceKeys(
v31,
DeviceContext,
KeyHandle,
0xFFFFFFFFui64,
(UINT64 *)&v100[1],
(UINT64 *)v101);
if( DriverConfiguration < 0 )
goto LABEL_139;
*(_DWORD *)v29 |= *(_DWORD *)&v100[1];
*(_DWORD *)v30 |= *(_DWORD *)v101;
}
if( (*(_DWORD *)v30 & 2) == 0 && ClassGuidString && *(_QWORD *)&Handle[1] )
{
DriverConfiguration = PiDevCfgGetDeviceClassConfigFlags(ClassGuidString, *(PVOID *)&Handle[1], (INT32 *)&v100[1]);
if( DriverConfiguration < 0 )
goto LABEL_139;
*(_DWORD *)v29 |= *(_DWORD *)&v100[1];
}
if( DriverNode )
v32 = *(_UNICODE_STRING *)(DriverNode + 98);
else
v32 = *(_UNICODE_STRING *)&PiDevCfgEmptyString;
v33 = p_InstancePath->Buffer;
DriverNodeStrongName = v32;
LODWORD(PropertyKey) = v32.Length + 2;
LODWORD(v73) = 18;
DriverConfiguration = PiDevCfgSetObjectProperty(
*(&stru_140CF2E80 + 607),
DeviceContext,
(const PNP_OBJECT_TYPE)v33,
(WCHAR *)1,
(WCHAR *)v8,
v60,
(UINT64)&DEVPKEY_Device_ConfigurationId,
v73,
(UINT64)v32.Buffer,
PropertyKey);
if( DriverConfiguration >= 0 )
{
if( v129.Buffer )
{
LODWORD(PropertyKeyf) = v129.Length;
LODWORD(v79) = 8210;
DriverConfiguration = PiDevCfgSetObjectProperty(
*(&stru_140CF2E80 + 607),
DeviceContext,
(const PNP_OBJECT_TYPE)p_InstancePath->Buffer,
(WCHAR *)1,
(WCHAR *)v8,
v66,
(UINT64)&DEVPKEY_Device_ExtendedConfigurationIds,
v79,
(UINT64)v129.Buffer,
PropertyKeyf);
if( DriverConfiguration < 0 )
goto LABEL_139;
}
else if( (*DeviceContext & 1) == 0 )
{
LODWORD(PropertyKeyf) = 0;
LODWORD(v79) = 0;
PiDevCfgSetObjectProperty(
*(&stru_140CF2E80 + 607),
DeviceContext,
(const PNP_OBJECT_TYPE)p_InstancePath->Buffer,
(WCHAR *)1,
(WCHAR *)v8,
v66,
(UINT64)&DEVPKEY_Device_ExtendedConfigurationIds,
v79,
0i64,
PropertyKeyf);
}
if( DriverNode && (v34 = *((_QWORD *)DriverNode + 17)) != 0 )
{
LODWORD(PropertyKeyf) = *((unsigned __int16 *)DriverNode + 64) + 2;
LODWORD(v79) = 18;
DriverConfiguration = PiDevCfgSetObjectProperty(
*(&stru_140CF2E80 + 607),
DeviceContext,
(const PNP_OBJECT_TYPE)p_InstancePath->Buffer,
(WCHAR *)1,
(WCHAR *)v8,
v66,
(UINT64)&DEVPKEY_Device_MatchingTargetComputerId,
v79,
v34,
PropertyKeyf);
if( DriverConfiguration < 0 )
goto LABEL_139;
}
else if( (*DeviceContext & 1) == 0 )
{
LODWORD(PropertyKeyf) = 0;
LODWORD(v79) = 0;
PiDevCfgSetObjectProperty(
*(&stru_140CF2E80 + 607),
DeviceContext,
(const PNP_OBJECT_TYPE)p_InstancePath->Buffer,
(WCHAR *)1,
(WCHAR *)v8,
v66,
(UINT64)&DEVPKEY_Device_MatchingTargetComputerId,
v79,
0i64,
PropertyKeyf);
}
if( (v104 & 0x80u) != 0 )
{
v55 = p_InstancePath->Buffer;
LODWORD(PropertyKeyf) = 1;
LODWORD(v79) = 17;
LOBYTE(v100[3]) = -1;
DriverConfiguration = PiDevCfgSetObjectProperty(
*(&stru_140CF2E80 + 607),
DeviceContext,
(const PNP_OBJECT_TYPE)v55,
(WCHAR *)1,
(WCHAR *)v8,
v66,
(UINT64)&DEVPKEY_Device_DriverInGroup,
v79,
(UINT64)&v100[3],
PropertyKeyf);
if( DriverConfiguration < 0 )
goto LABEL_139;
}
else if( (*DeviceContext & 1) == 0 )
{
LODWORD(PropertyKeyf) = 0;
LODWORD(v79) = 0;
PiDevCfgSetObjectProperty(
*(&stru_140CF2E80 + 607),
DeviceContext,
(const PNP_OBJECT_TYPE)p_InstancePath->Buffer,
(WCHAR *)1,
(WCHAR *)v8,
v66,
(UINT64)&DEVPKEY_Device_DriverInGroup,
v79,
0i64,
PropertyKeyf);
}
if( UnicodeString.Buffer && UnicodeString.Length )
PipHardwareConfigActivateService(UnicodeString.Buffer);
v35 = ServiceName;
if( ServiceName )
{
while( *v35 )
{
PipHardwareConfigActivateService(v35);
if( !PnpBootMode && (DriverNode[46] & 0x10) != 0 )
PiDevCfgMakeServiceBootStart(v35);
v56 = -1i64;
do
++v56;
while( v35[v56] );
v35 += v56 + 1;
}
}
v36 = (WCHAR *)Buffer;
if( Buffer )
{
while( *v36 )
{
PipHardwareConfigActivateService(v36);
if( !PnpBootMode && (DriverNode[46] & 0x10) != 0 )
PiDevCfgMakeServiceBootStart(v36);
v57 = -1i64;
do
++v57;
while( v36[v57] );
v36 += v57 + 1;
}
}
}
LABEL_139:
RtlFreeAnsiString(&StringToken);
RtlFreeAnsiString(&DeviceManufacturer);
RtlFreeAnsiString(&DestinationString);
RtlFreeAnsiString(&UnicodeString);
RtlFreeAnsiString(&MultiSz);
RtlFreeAnsiString(&v124);
RtlFreeAnsiString(&v125);
RtlFreeAnsiString(&v126);
RtlFreeAnsiString(&v128);
RtlFreeAnsiString(&v129);
RtlFreeAnsiString(&IndirectString);
RtlFreeAnsiString(&String1);
RtlFreeAnsiString(&v116);
if( v130.Buffer )
ExFreePoolWithTag(v130.Buffer, 0);
if( P )
ExFreePoolWithTag(P, 0);
if( *(_QWORD *)&Handle[1] )
ZwClose(Handle[1]);
if( KeyHandle )
ZwClose((_HANDLE)KeyHandle);
return DriverConfiguration;
}Referenced by:
PiDevCfgProcessDevice