code: def get_module_by_name(self, modName):
          
  
          # Convert modName to lowercase.
          # This helps make case insensitive string comparisons.
          modName = modName.lower()
  
          # modName is an absolute pathname.
          if PathOperations.path_is_absolute(modName):
              for lib in self.iter_modules():
                  if modName == lib.get_filename().lower():
                      return lib
              return None     # Stop trying to match the name.
  
          # Get all the module names.
          # This prevents having to iterate through the module list
          #  more than once.
          modDict = [ ( lib.get_name(), lib ) for lib in self.iter_modules() ]
          modDict = dict(modDict)
  
          # modName is a base filename.
          if modName in modDict:
              return modDict[modName]
  
          # modName is a base filename without extension.
          filepart, extpart = PathOperations.split_extension(modName)
          if filepart and extpart:
              if filepart in modDict:
                  return modDict[filepart]
  
          # modName is a base address.
          try:
              baseAddress = HexInput.integer(modName)
          except ValueError:
              return None
          if self.has_module(baseAddress):
              return self.get_module(baseAddress)
  
          # Module not found.
          return None
docs: @type  modName: int
          @param modName:
              Name of the module to look for, as returned by L{Module.get_name}.
              If two or more modules with the same name are loaded, only one
              of the matching modules is returned.
  
              You can also pass a full pathname to the DLL file.
              This works correctly even if two modules with the same name
              are loaded from different paths.
  
          @rtype:  L{Module}
          @return: C{Module} object that best matches the given name.
              Returns C{None} if no C{Module} can be found.