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