PiProcessDriverInstance

NTSTATUS __fastcall PiProcessDriverInstance(
        _UNICODE_STRING *DeviceInstanceName,
        _UNICODE_STRING *ServiceKeyName,
        CHAR *a3){
  int DevInstMatch; 
  VOID *v6; 
  _OBJECT_TYPE *v7; 
  wchar_t *Buffer; 
  CHAR v9; 
  wchar_t *v10; 
  VOID **v11; 
  unsigned __int64 Length; 
  unsigned __int64 v13; 
  VOID **PoolWithTag; 
  signed __int64 v15; 
  INT64 v17; 
  bool v18; 
  UINT64 v19; 
  INT64 CreateEnum; 
  UINT64 pszFormat; 
  UINT64 pszFormata; 
  UINT64 pszFormatb; 
  INT64 v24; 
  INT64 v25; 
  UINT64 Count; 
  _UNICODE_STRING ValueName; 
  UINT64 MatchingInstance; 
  VOID *ServiceEnumHandle; 
  _UNICODE_STRING MatchingValueName; 
  __int16 pszDest[12]; 

  LODWORD(Count) = 0;
  LODWORD(MatchingInstance) = 0;
  ServiceEnumHandle = 0i64;
  MatchingValueName = 0i64;
  ValueName = 0i64;
  DevInstMatch = PipOpenServiceEnumKeys(ServiceKeyName, 0xF003Fui64, 0i64, &ServiceEnumHandle, 1u);
  if( DevInstMatch >= 0 )
  {
    v6 = ServiceEnumHandle;
    DevInstMatch = PiFindDevInstMatch(
                     ServiceEnumHandle,
                     DeviceInstanceName,
                     &Count,
                     &MatchingValueName,
                     &MatchingInstance);
    if( DevInstMatch < 0 )
    {
LABEL_17:
      ZwClose((_HANDLE)v6);
      return DevInstMatch;
    }
    Buffer = MatchingValueName.Buffer;
    v9 = *a3;
    if( MatchingValueName.Buffer )
    {
      if( v9 )
      {
LABEL_14:
        if( Buffer )
          RtlFreeAnsiString(&MatchingValueName);
        goto LABEL_16;
      }
      ZwDeleteValueKey(v6, &MatchingValueName, v7);
      v18 = (_DWORD)Count == 1;
      v19 = (unsigned int)(Count - 1);
      LODWORD(Count) = Count - 1;
      if( !v18 )
        PiRearrangeDeviceInstances(v6, v19, (unsigned int)MatchingInstance, v17, CreateEnum, pszFormat, v24, v25);
    }
    else
    {
      if( !v9 )
      {
LABEL_16:
        DevInstMatch = 0;
        goto LABEL_17;
      }
      v10 = DeviceInstanceName->Buffer;
      v11 = 0i64;
      Length = DeviceInstanceName->Length;
      v13 = Length >> 1;
      if( v10[(Length >> 1) - 1] )
      {
        PoolWithTag = ExAllocatePoolWithTag(
                        (unsigned int)(LODWORD(MatchingValueName.Buffer) + 1),
                        Length + 2,
                        538996816i64);
        v11 = PoolWithTag;
        if( PoolWithTag )
        {
          memmove(PoolWithTag, v10, Length);
          LODWORD(Length) = Length + 2;
          *((_WORD *)v11 + v13) = 0;
          v10 = (wchar_t *)v11;
        }
      }
      ServiceEnumHandle = pszDest;
      RtlStringCchPrintfExW((WCHAR *)pszDest, 0xAui64, (WCHAR **)&ServiceEnumHandle, 0i64, 0i64, (WCHAR *)L"%u");
      v15 = ((_BYTE *)ServiceEnumHandle - (_BYTE *)pszDest) >> 1;
      ValueName.MaximumLength = 20;
      if( (_DWORD)v15 == -1 )
        ValueName.Length = 20;
      else
        ValueName.Length = 2 * v15;
      LODWORD(pszFormata) = Length;
      ValueName.Buffer = (wchar_t *)pszDest;
      ZwSetValueKey(v6, &ValueName, 0i64, 1ui64, v10, pszFormata);
      if( v11 )
        ExFreePoolWithTag(v11, 0);
      LODWORD(Count) = Count + 1;
    }
    *(_DWORD *)&ValueName.Length = 786442;
    ValueName.Buffer = (wchar_t *)&stru_1407D01E0._Xmm8;
    LODWORD(pszFormat) = 4;
    ZwSetValueKey(v6, &ValueName, 0i64, 4ui64, &Count, pszFormat);
    LODWORD(pszFormatb) = 4;
    ValueName.Buffer = (wchar_t *)&stru_1407D01E0._Xmm15;
    *(_DWORD *)&ValueName.Length = 1703960;
    ZwSetValueKey(v6, &ValueName, 0i64, 4ui64, &Count, pszFormatb);
    Buffer = MatchingValueName.Buffer;
    goto LABEL_14;
  }
  return DevInstMatch;
}

Referenced by:

No references.