PnpDriverLoadingFailed

INT64 __stdcall PnpDriverLoadingFailed(PVOID ServiceHandle, UNICODE_STRING *ServiceName){
  int v2; 
  PVOID v4; 
  INT64 result; 
  unsigned int v6; 
  NTSTATUS RegistryValue; 
  unsigned int v8; 
  BOOL v9; 
  struct _DMA_ADAPTER *v10; 
  BOOL v11; 
  struct _DMA_ADAPTER *v12; 
  _DEVICE_NODE *FlushAdapterBuffers; 
  __int64 v14; 
  _ETHREAD *CurrentThread; 
  __int64 v16; 
  _PNP_DEVNODE_STATE *v17; 
  int v18; 
  _ETHREAD *v19; 
  int v20; 
  unsigned int i; 
  signed __int64 v22; 
  unsigned int *v23; 
  signed __int64 v24; 
  PVOID *Data; 
  UINT64 DataSize; 
  UINT64 DataSizea; 
  UINT64 DataSizeb; 
  UINT64 DataSizec; 
  __int64 v30; 
  struct _UNICODE_STRING ValueName; 
  void *KeyHandle; 
  unsigned int v33; 
  int v34; 
  PVOID P; 
  PVOID ServiceHandlea; 
  ULONG dwFlags; 
  NTSTRSAFE_PWSTR ppszDestEnd; 
  NTSTRSAFE_PWSTR v39; 
  PVOID v40[2]; 
  struct _OBJECT_ATTRIBUTES ObjectAttributes; 
  wchar_t pszDest[20]; 
  P = 0i64;
  v2 = 0;
  KeyHandle = 0i64;
  *(_DWORD *)(&ValueName.MaximumLength + 1) = 0;
  ServiceHandlea = ServiceHandle;
  v4 = ServiceHandle;
  v34 = 0;
  *(_OWORD *)v40 = 0i64;
  if( ServiceHandle )
  {
    *(&ObjectAttributes.Length + 1) = 0;
    memset(&ObjectAttributes.Attributes + 1, 0, 20);
    ValueName.Buffer = (wchar_t *)&stru_1407D01E0.Xmm7;
    ObjectAttributes.RootDirectory = ServiceHandle;
    ObjectAttributes.ObjectName = &ValueName;
    *(_DWORD *)&ValueName.Length = 655368;
    ObjectAttributes.Length = 48;
    ObjectAttributes.Attributes = 576;
    LODWORD(result) = ZwOpenKey(&KeyHandle, 0x20019u, &ObjectAttributes);
  }
  else
  {
    LODWORD(result) = PipOpenServiceEnumKeys(ServiceName, 0x20019ui64, &ServiceHandlea, &KeyHandle, 0);
    v4 = ServiceHandlea;
    v2 = 1;
    v34 = 1;
  }
  if( (int)result >= 0 )
  {
    ValueName.Buffer = (wchar_t *)&stru_1407D01E0.Xmm13;
    *(_DWORD *)&ValueName.Length = 2097182;
    LODWORD(DataSize) = 4;
    dwFlags = 1;
    ZwSetValueKey(KeyHandle, &ValueName, 0i64, 4ui64, &dwFlags, DataSize);
    v6 = 0;
    RegistryValue = IopGetRegistryValue(
                      KeyHandle,
                      (PWCHAR)&stru_1407D01E0.Xmm8,
                      0i64,
                      (KEY_VALUE_FULL_INFORMATION **)&P);
    if( RegistryValue < 0 )
      goto LABEL_44;
    if( *((_DWORD *)P + 1) == 4 && *((_DWORD *)P + 3) >= 4u )
      v6 = *(_DWORD *)((char *)P + *((unsigned int *)P + 2));
    ExFreePoolWithTag(P, 0);
    if( v6 )
    {
      v8 = 0;
      v33 = v6;
      do
      {
        if( (int)PipServiceInstanceToDeviceInstance(v4, ServiceName, v8, (UNICODE_STRING *)v40, Data, DataSizea) >= 0 )
        {
          v10 = (struct _DMA_ADAPTER *)PnpDeviceObjectFromDeviceInstanceWithTag((INT64)v40, 0x746C6644ui64);
          v12 = v10;
          if( v10 )
          {
            FlushAdapterBuffers = (_DEVICE_NODE *)v10[19].DmaOperations->FlushAdapterBuffers;
            if( FlushAdapterBuffers )
            {
              if( !(unsigned int)PipIsDevNodeDNStarted(FlushAdapterBuffers) )
                IopReleaseDeviceResources(v14, 1);
            }
          }
          CurrentThread = (_ETHREAD *)KeGetCurrentThread();
          --*((_WORD *)CurrentThread + 242);
          LOBYTE(v11) = 1;
          ExAcquireResourceSharedLite(&PnpRegistryDeviceResource, v11);
          if( v12 )
          {
            v16 = (__int64)v12[19].DmaOperations->FlushAdapterBuffers;
            if( v16 && (*(_DWORD *)(v16 + 396) & 1) != 0 && (unsigned int)(*(_DWORD *)(v16 + 300) - 775) <= 1 )
            {
              PoFxAbandonDevice((_DEVICE_NODE *)v16);
              PipSetDevNodeState((_DEVICE_NODE *)v16, DeviceNodeRemoved, v17);
              PipSetDevNodeProblem(v16, 24, 0);
            }
            HalPutDmaAdapter(v12);
          }
          ExFreePoolWithTag(v40[1], 0);
          ExReleaseResourceLite(&PnpRegistryDeviceResource);
          KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
          v4 = ServiceHandlea;
        }
        ++v8;
      }
      while( v8 < v6 );
      v18 = v34;
      if( v33 != v6 )
      {
        v19 = (_ETHREAD *)KeGetCurrentThread();
        --*((_WORD *)v19 + 242);
        LOBYTE(v9) = 1;
        ExAcquireResourceSharedLite(&PnpRegistryDeviceResource, v9);
        if( v33 )
        {
          v20 = 0;
          for( i = 0; i < v6; ++i )
          {
            LODWORD(v30) = i;
            ppszDestEnd = pszDest;
            RtlStringCchPrintfExW(pszDest, 0xAui64, &ppszDestEnd, 0i64, 0i64, L"%u", v30);
            ValueName.MaximumLength = 20;
            v22 = ppszDestEnd - pszDest;
            if( (_DWORD)v22 == -1 )
              ValueName.Length = 20;
            else
              ValueName.Length = 2 * v22;
            ValueName.Buffer = pszDest;
            if( IopGetRegistryValue(KeyHandle, pszDest, 0i64, (KEY_VALUE_FULL_INFORMATION **)&P) >= 0 )
            {
              v23 = (unsigned int *)P;
              if( i != v20 )
              {
                ZwDeleteValueKey(KeyHandle, &ValueName);
                LODWORD(v30) = v20;
                v39 = pszDest;
                RtlStringCchPrintfExW(pszDest, 0xAui64, &v39, 0i64, 0i64, L"%u", v30);
                ValueName.MaximumLength = 20;
                v24 = v39 - pszDest;
                if( (_DWORD)v24 == -1 )
                  ValueName.Length = 20;
                else
                  ValueName.Length = 2 * v24;
                ValueName.Buffer = pszDest;
                LODWORD(DataSizeb) = v23[3];
                ZwSetValueKey(KeyHandle, &ValueName, 0i64, 1ui64, (char *)v23 + v23[2], DataSizeb);
              }
              ExFreePoolWithTag(v23, 0);
              ++v20;
            }
          }
          v18 = v34;
        }
        ValueName.Buffer = (wchar_t *)&stru_1407D01E0.Xmm8;
        *(_DWORD *)&ValueName.Length = 786442;
        LODWORD(DataSizea) = 4;
        ZwSetValueKey(KeyHandle, &ValueName, 0i64, 4ui64, &v33, DataSizea);
        ValueName.Buffer = (wchar_t *)&stru_1407D01E0.Xmm15;
        LODWORD(DataSizec) = 4;
        *(_DWORD *)&ValueName.Length = 1703960;
        ZwSetValueKey(KeyHandle, &ValueName, 0i64, 4ui64, &v33, DataSizec);
        ExReleaseResourceLite(&PnpRegistryDeviceResource);
        KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
        v4 = ServiceHandlea;
      }
      ZwClose(KeyHandle);
      if( v18 )
        ZwClose(v4);
      return 0i64;
    }
    else
    {
LABEL_44:
      ZwClose(KeyHandle);
      if( v2 )
        ZwClose(v4);
      return(unsigned int)RegistryValue;
    }
  }
  return result;
}

Referenced by:

IopInitializeBuiltinDriver
IopLoadDriver