This searches the uninstall keys in the registry to find
        a match in the sub keys, it will return a dict with the
        display name as the key and the version as the value
        .. sectionauthor:: Damon Atkins <https://github.com/damon-atkins>
        .. versionadded:: Carbon

def __get_software_details(self, user_pkgs):
        '''
        This searches the uninstall keys in the registry to find
        a match in the sub keys, it will return a dict with the
        display name as the key and the version as the value
        .. sectionauthor:: Damon Atkins <https://github.com/damon-atkins>
        .. versionadded:: Carbon
        '''

        # FUNCTION MAIN CODE #
        # Search 64bit, on 64bit platform, on 32bit its ignored.
        if platform.architecture()[0] == '32bit':
            # Handle Python 32bit on 64&32 bit platform and Python 64bit
            if win32process.IsWow64Process():  # pylint: disable=no-member
                # 32bit python on a 64bit platform
                use_32bit_lookup = {True: 0, False: win32con.KEY_WOW64_64KEY}
                arch_list = [True, False]
            else:
                # 32bit python on a 32bit platform
                use_32bit_lookup = {True: 0, False: None}
                arch_list = [True]

        else:
            # Python is 64bit therefore most be on 64bit System.
            use_32bit_lookup = {True: win32con.KEY_WOW64_32KEY, False: 0}
            arch_list = [True, False]

        # Process software installed for the machine i.e. all users.
        for arch_flag in arch_list:
            key_search = 'Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall'
            log.debug('SYSTEM processing 32bit:%s', arch_flag)
            handle = win32api.RegOpenKeyEx(  # pylint: disable=no-member
                        win32con.HKEY_LOCAL_MACHINE,
                        key_search,
                        0,
                        win32con.KEY_READ | use_32bit_lookup[arch_flag])
            reg_key_all, _, _, _ = zip(*win32api.RegEnumKeyEx(handle))  # pylint: disable=no-member
            win32api.RegCloseKey(handle)  # pylint: disable=no-member
            for reg_key in reg_key_all:
                self.__collect_software_info(None, reg_key, arch_flag)

        if not user_pkgs:
            return

        # Process software installed under all USERs, this adds significate processing time.
        # There is not 32/64 bit registry redirection under user tree.
        log.debug('Processing user software... please wait')
        handle_sid = win32api.RegOpenKeyEx(  # pylint: disable=no-member
                        win32con.HKEY_USERS,
                        '',
                        0,
                        win32con.KEY_READ)
        sid_all = []
        for index in range(win32api.RegQueryInfoKey(handle_sid)[0]):  # pylint: disable=no-member
            sid_all.append(win32api.RegEnumKey(handle_sid, index))  # pylint: disable=no-member

        for sid in sid_all:
            if self.__sid_pattern.match(sid) is not None:  # S-1-5-18 needs to be ignored?
                user_uninstall_path = '{0}\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall'.format(sid)
                try:
                    handle = win32api.RegOpenKeyEx(  # pylint: disable=no-member
                                handle_sid,
                                user_uninstall_path,
                                0,
                                win32con.KEY_READ)
                except pywintypes.error as exc:  # pylint: disable=no-member
                    if exc.winerror == winerror.ERROR_FILE_NOT_FOUND:
                        # Not Found Uninstall under SID
                        log.debug('Not Found %s', user_uninstall_path)
                        continue
                    else:
                        raise
                try:
                    reg_key_all, _, _, _ = zip(*win32api.RegEnumKeyEx(handle))  # pylint: disable=no-member
                except ValueError:
                    log.debug('No Entries Found %s', user_uninstall_path)
                    reg_key_all = []
                win32api.RegCloseKey(handle)  # pylint: disable=no-member
                for reg_key in reg_key_all:
                    self.__collect_software_info(sid, reg_key, False)
        win32api.RegCloseKey(handle_sid)  # pylint: disable=no-member
        return