PiDevCfgResetDeviceDriverSettings
NTSTATUS __stdcall PiDevCfgResetDeviceDriverSettings(
_DEVICE_NODE *DeviceNode,
PI_DEVCFG_DEVICE_CONTEXT *DeviceContext,
_GUID *ClassGuid,
VOID *ClassKeyHandle,
_GUID *ClassGuidLast){
UINT64 *v5;
__int64 v8;
GUID **v9;
__int64 v10;
int v11;
_QWORD *v12;
INT64 v13;
bool v14;
const wchar_t *v15;
INT64 v16;
NTSTATUS v17;
WCHAR *v18;
__int64 v19;
VOID *v20;
_DEVICE_NODE *v21;
__int64 v23;
__int64 v24;
VOID *v25;
_OBJECT_TYPE *v26;
__int64 v27;
int v28;
WCHAR *PropertyLocaleName;
VOID *v30;
INT64 v31;
INT64 PropertyType;
WCHAR *v33;
INT64 v34;
_DEVPROPKEY *PropertyKey;
VOID *DeviceKey;
INT64 v37;
_DEVICE_NODE *DeviceNodea;
int v39;
VOID *KeyHandle;
VOID *Handle;
_UNICODE_STRING UnicodeString;
VOID *ClassKeyHandlea;
_UNICODE_STRING DestinationString;
_UNICODE_STRING ValueName;
_OBJECT_ATTRIBUTES ObjectAttributes;
INT64 Source2[2];
v5 = (UINT64 *)&off_140D2CB90;
ClassKeyHandlea = ClassKeyHandle;
DeviceNodea = DeviceNode;
DeviceKey = 0i64;
KeyHandle = 0i64;
v8 = 17i64;
*(_QWORD *)&UnicodeString.Length = 0i64;
*(_OWORD *)Source2 = 0i64;
UnicodeString.Buffer = 0i64;
Handle = 0i64;
DestinationString = 0i64;
LODWORD(v37) = 0;
v39 = 0;
do
{
LODWORD(PropertyKey) = 0;
LODWORD(v33) = 0;
PiDevCfgSetObjectProperty(
*(&stru_140CF2E80 + 607),
DeviceContext,
*((_QWORD *)DeviceContext + 1),
(WCHAR *)1,
*((WCHAR **)DeviceContext + 2),
v30,
*v5++,
v33,
0i64,
PropertyKey);
--v8;
}
while( v8 );
if( PnpGetObjectProperty(
*(&stru_140CF2E80 + 1214),
*((_QWORD *)DeviceContext + 1),
1i64,
*((_QWORD *)DeviceContext + 2),
0i64,
(INT64)&DEVPKEY_Device_BusTypeGuid,
(INT64)&v37,
(INT64)Source2) < 0
|| (_DWORD)v37 != 13 )
{
*(_OWORD *)Source2 = 0i64;
}
v9 = &off_140985DB8;
v10 = 2i64;
v11 = 0;
do
{
v12 = *(v9 - 1);
if( !v12 )
{
if( !*v9 || PnpIsNullGuid(Source2) )
goto LABEL_24;
v13 = *(_QWORD *)&(*v9)->Data1 - Source2[0];
if( !v13 )
v13 = *(_QWORD *)(*v9)->Data4 - Source2[1];
v14 = v13 == 0;
goto LABEL_12;
}
if( !ClassGuid )
goto LABEL_38;
v23 = *v12 - *(_QWORD *)&ClassGuid->Data1;
if( *v12 == *(_QWORD *)&ClassGuid->Data1 )
v23 = v12[1] - *(_QWORD *)ClassGuid->Data4;
if( v23 )
{
LABEL_38:
if( !ClassGuidLast )
goto LABEL_24;
v24 = *v12 - *(_QWORD *)&ClassGuidLast->Data1;
if( *v12 == *(_QWORD *)&ClassGuidLast->Data1 )
v24 = v12[1] - *(_QWORD *)ClassGuidLast->Data4;
v14 = v24 == 0;
LABEL_12:
if( !v14 )
goto LABEL_24;
}
LODWORD(PropertyLocaleName) = 983103;
if( CmOpenDeviceRegKey(
*(&stru_140CF2E80 + 607),
*((WCHAR **)DeviceContext + 1),
*((_CM_KEY_TYPE *)v9 + 2),
0i64,
(UINT64)PropertyLocaleName,
1u,
&DeviceKey,
0i64) < 0 )
goto LABEL_24;
v15 = (const wchar_t *)v9[2];
if( v15 )
{
RtlInitUnicodeString(&DestinationString, v15);
ObjectAttributes.RootDirectory = DeviceKey;
*(_QWORD *)&ObjectAttributes.Length = 48i64;
ObjectAttributes.ObjectName = &DestinationString;
*(_QWORD *)&ObjectAttributes.Attributes = 576i64;
KeyHandle = 0i64;
*(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
v17 = ZwOpenKey(
&KeyHandle,
0xF003Fui64,
&ObjectAttributes,
v16,
(INT64)PropertyLocaleName,
v31,
PropertyType,
v34);
ZwClose((_HANDLE)DeviceKey);
if( v17 < 0 )
goto LABEL_24;
DeviceKey = KeyHandle;
}
v18 = (WCHAR *)v9[3];
if( v18 )
{
v25 = DeviceKey;
ValueName = 0i64;
if( RtlInitUnicodeStringEx(&ValueName, v18) >= 0 )
ZwDeleteValueKey(v25, &ValueName, v26);
}
else if( v9[2] )
{
if( *(&stru_140CF2E80 + 607) && (v19 = *(_QWORD *)(*(&stru_140CF2E80 + 607) + 224i64)) != 0 )
v20 = *(VOID **)(v19 + 8);
else
v20 = 0i64;
RegRtlDeleteTreeInternal(DeviceKey, 0i64, v20, 0);
}
ZwClose((_HANDLE)DeviceKey);
LABEL_24:
v9 += 5;
--v10;
}
while( v10 );
if( !ClassGuidLast )
goto LABEL_26;
if( !ClassGuid )
goto LABEL_49;
v27 = *(_QWORD *)&ClassGuidLast->Data1 - *(_QWORD *)&ClassGuid->Data1;
if( *(_QWORD *)&ClassGuidLast->Data1 == *(_QWORD *)&ClassGuid->Data1 )
v27 = *(_QWORD *)ClassGuidLast->Data4 - *(_QWORD *)ClassGuid->Data4;
if( v27 )
{
LABEL_49:
v11 = RtlStringFromGUIDEx(ClassGuidLast, &UnicodeString, 1u);
if( v11 >= 0 )
{
v28 = PnpOpenObjectRegKey(
*(&stru_140CF2E80 + 607),
(__int64)UnicodeString.Buffer,
2u,
131097,
0,
(__int64)&Handle);
v21 = DeviceNodea;
if( v28 < 0 )
goto LABEL_27;
v11 = PiDevCfgResetDeviceKeys(DeviceNodea, DeviceContext, Handle);
if( v11 >= 0 )
goto LABEL_27;
}
}
else
{
LABEL_26:
v21 = DeviceNodea;
LABEL_27:
if( ClassGuid && ClassKeyHandlea )
v11 = PiDevCfgResetDeviceKeys(v21, DeviceContext, ClassKeyHandlea);
}
RtlFreeAnsiString(&UnicodeString);
if( Handle )
ZwClose((_HANDLE)Handle);
return v11;
}Referenced by:
PiDevCfgConfigureDevice
PpDevCfgProcessDeviceReset