示例#1
0
    def test_load_resource(self):
        with self.load_library(win32api, u'explorer.exe') as handle:
            resource_types = win32api.EnumResourceTypes(handle)
            for resource_type in resource_types:
                resource_names = win32api.EnumResourceNames(
                    handle, resource_type)
                for resource_name in resource_names:
                    resource_languages = win32api.EnumResourceLanguages(
                        handle, resource_type, resource_name)
                    for resource_language in resource_languages:
                        expected = win32api.LoadResource(
                            handle, resource_type, resource_name,
                            resource_language)
                        resource = self.module.LoadResource(
                            handle, resource_type, resource_name,
                            resource_language)
                        # check that the #<index> format works
                        resource = self.module.LoadResource(
                            handle, self._id2str(resource_type),
                            self._id2str(resource_name),
                            resource_language)
                        self.assertEqual(resource, expected)

        with self.assertRaises(error):
            self.module.LoadResource(
                handle, resource_type, resource_name, 12435)
示例#2
0
def _GetResources(hsrc, types=None, names=None, languages=None):
    """
    Get resources from hsrc.

    types = a list of resource types to search for (None = all)
    names = a list of resource names to search for (None = all)
    languages = a list of resource languages to search for (None = all)
    Return a dict of the form {type_: {name: {language: data}}} which
    might also be empty if no matching resources were found.
    """
    if types:
        types = set(types)
    if names:
        names = set(names)
    if languages:
        languages = set(languages)
    res = {}
    try:
        # logger.debug("Enumerating resource types")
        enum_types = win32api.EnumResourceTypes(hsrc)
        if types and not "*" in types:
            enum_types = filter(lambda type_:
                                type_ in types,
                                enum_types)
        for type_ in enum_types:
            # logger.debug("Enumerating resources of type %s", type_)
            enum_names = win32api.EnumResourceNames(hsrc, type_)
            if names and not "*" in names:
                enum_names = filter(lambda name:
                                    name in names,
                                    enum_names)
            for name in enum_names:
                # logger.debug("Enumerating resources of type %s name %s", type_, name)
                enum_languages = win32api.EnumResourceLanguages(hsrc,
                                                                type_,
                                                                name)
                if languages and not "*" in languages:
                    enum_languages = filter(lambda language:
                                            language in languages,
                                            enum_languages)
                for language in enum_languages:
                    data = win32api.LoadResource(hsrc, type_, name, language)
                    if not type_ in res:
                        res[type_] = {}
                    if not name in res[type_]:
                        res[type_][name] = {}
                    res[type_][name][language] = data
    except pywintypes.error as exception:
        if exception.args[0] in (ERROR_RESOURCE_DATA_NOT_FOUND,
                                 ERROR_RESOURCE_TYPE_NOT_FOUND,
                                 ERROR_RESOURCE_NAME_NOT_FOUND,
                                 ERROR_RESOURCE_LANG_NOT_FOUND):
            # logger.info('%s: %s', exception.args[1:3])
            pass
        else:
            raise exception
    return res
示例#3
0
    def test_enum_resource_types(self):
        with self.load_library(win32api, u'shell32.dll') as handle:
            expected = win32api.EnumResourceTypes(handle)

        with self.load_library(pywin32.win32api, u'shell32.dll') as handle:
            resource_types = self.module.EnumResourceTypes(handle)

        self.assertEqual(resource_types, expected)

        with self.assertRaises(error):
            self.module.EnumResourceTypes(-3)
示例#4
0
    def ExtractAllToDir(self, extract_to):
        """Extracts all resources from our input file to a directory hierarchy
    in the directory named extract_to.

    The generated directory hierarchy is three-level, and looks like:
      resource-type/
        resource-name/
          lang-id.

    Args:
      extract_to: path to the folder to output to. This folder will be erased
          and recreated if it already exists.
    """
        _LOGGER.info('Extracting all resources from "%s" to directory "%s".',
                     self.input_file, extract_to)

        if os.path.exists(extract_to):
            _LOGGER.info('Destination directory "%s" exists, deleting',
                         extract_to)
            shutil.rmtree(extract_to)

        # Make sure the destination dir exists.
        os.makedirs(extract_to)

        # Now enumerate the resource types.
        for res_type in win32api.EnumResourceTypes(self.module):
            res_type_str = _ResIdToString(res_type)

            # And the resource names.
            for res_name in win32api.EnumResourceNames(self.module, res_type):
                res_name_str = _ResIdToString(res_name)

                # Then the languages.
                for res_lang in win32api.EnumResourceLanguages(
                        self.module, res_type, res_name):
                    res_lang_str = _ResIdToString(res_lang)

                    dest_dir = os.path.join(extract_to, res_type_str,
                                            res_lang_str)
                    dest_file = os.path.join(dest_dir, res_name_str)
                    _LOGGER.info(
                        'Extracting resource "%s", lang "%d" name "%s" '
                        'to file "%s".', res_type_str, res_lang, res_name_str,
                        dest_file)

                    # Extract each resource to a file in the output dir.
                    if not os.path.exists(dest_dir):
                        os.makedirs(dest_dir)
                    self.ExtractResource(res_type, res_lang, res_name,
                                         dest_file)
示例#5
0
    def test_enum_resource_names(self):
        with self.load_library(win32api, u'shell32.dll') as handle:
            resource_types = win32api.EnumResourceTypes(handle)
            for resource_type in resource_types:
                expected = win32api.EnumResourceNames(handle, resource_type)
                resource_names = self.module.EnumResourceNames(
                    handle, resource_type)
                self.assertEqual(resource_names, expected)
                # check that the #<index> format works
                resource_names = self.module.EnumResourceNames(
                    handle, self._id2str(resource_type))
                self.assertEqual(resource_names, expected)

        with self.assertRaises(error):
            self.module.EnumResourceNames(2, 3)
示例#6
0
def _GetResources(hsrc, types=None, names=None, languages=None):
    """
    Get resources from hsrc.
    
    types = a list of resource types to search for (None = all)
    names = a list of resource names to search for (None = all)
    languages = a list of resource languages to search for (None = all)
    Return a dict of the form {type_: {name: {language: data}}} which 
    might also be empty if no matching resources were found.
    
    """
    res = {}
    try:
        # print "I: Enumerating resource types"
        enum_types = win32api.EnumResourceTypes(hsrc)
        if types and not "*" in types:
            enum_types = filter(lambda type_: type_ in types, enum_types)
        for type_ in enum_types:
            # print "I: Enumerating resources of type", type_
            enum_names = win32api.EnumResourceNames(hsrc, type_)
            if names and not "*" in names:
                enum_names = filter(lambda name: name in names, enum_names)
            for name in enum_names:
                # print "I: Enumerating resources of type", type_, "name", name
                enum_languages = win32api.EnumResourceLanguages(
                    hsrc, type_, name)
                if languages and not "*" in languages:
                    enum_languages = filter(
                        lambda language: language in languages, enum_languages)
                for language in enum_languages:
                    data = win32api.LoadResource(hsrc, type_, name, language)
                    if not type_ in res:
                        res[type_] = {}
                    if not name in res[type_]:
                        res[type_][name] = {}
                    res[type_][name][language] = data
    except pywintypes.error, exception:
        if exception.args[0] in (ERROR_RESOURCE_DATA_NOT_FOUND,
                                 ERROR_RESOURCE_TYPE_NOT_FOUND,
                                 ERROR_RESOURCE_NAME_NOT_FOUND,
                                 ERROR_RESOURCE_LANG_NOT_FOUND):
            # print "I:", exception.args[1] + ":", \
            # exception.args[2]
            pass
        else:
            raise exception