def _parsePEFileOutput( binary_filename, scan_dirs, is_main_executable, source_dir, original_dir, use_cache, update_cache, ): # This is complex, as it also includes the caching mechanism # pylint: disable=too-many-branches,too-many-locals result = OrderedSet() if use_cache or update_cache: cache_filename = _getCacheFilename( dependency_tool="pefile", is_main_executable=is_main_executable, source_dir=source_dir, original_dir=original_dir, binary_filename=binary_filename, ) if use_cache: with withFileLock(): if not os.path.exists(cache_filename): use_cache = False if use_cache: # TODO: We are lazy with the format, pylint: disable=eval-used extracted = eval(getFileContents(cache_filename)) else: if Options.isShowProgress(): info("Analysing dependencies of '%s'." % binary_filename) extracted = getPEFileInformation(binary_filename) if update_cache: with withFileLock(): with open(cache_filename, "w") as cache_file: print(repr(extracted), file=cache_file) # Add native system directory based on pe file architecture and os architecture # Python 32: system32 = syswow64 = 32 bits systemdirectory # Python 64: system32 = 64 bits systemdirectory, syswow64 = 32 bits systemdirectory # Get DLL imports from PE file for dll_name in extracted["DLLs"]: dll_name = dll_name.upper() # Try determine DLL path from scan dirs for scan_dir in scan_dirs: dll_filename = os.path.normcase( os.path.abspath(os.path.join(scan_dir, dll_name)) ) if os.path.isfile(dll_filename): break else: if dll_name.startswith("API-MS-WIN-") or dll_name.startswith("EXT-MS-WIN-"): continue # Found via RC_MANIFEST as copied from Python. if dll_name == "MSVCR90.DLL": continue if dll_name.startswith("python") and dll_name.endswith(".dll"): dll_filename = os.path.join( os.environ["SYSTEMROOT"], "SysWOW64" if getArchitecture() == "x86_64" else "System32", dll_name, ) dll_filename = os.path.normcase(dll_filename) else: continue if dll_filename not in result: result.add(dll_filename) # TODO: Shouldn't be here. blocked = Plugins.removeDllDependencies( dll_filename=binary_filename, dll_filenames=result ) for to_remove in blocked: result.discard(to_remove) return result
def main(): parser = OptionParser() parser.add_option( "--verbose", action="store_true", dest="verbose", default=False, help="""\ Be verbose in output. Default is %default.""", ) parser.add_option( "--pefile", action="store_true", dest="pefile", default=False, help="""\ Use pefile dependencies. Default is %default.""", ) options, positional_args = parser.parse_args() if not positional_args: sys.exit("No DLLs given.") for filename in positional_args: print("Filename:", filename) print("Version Information:", getWindowsDLLVersion(filename)) print("DLLs directly dependended (pefile):", getPEFileInformation(filename)) print("SXS information (manifests):") sxs = getSxsFromDLL(filename=filename, with_data=True) if sxs: print(sxs) print("DLLs recursively dependended (pefile):") if options.pefile: with TimerReport( message="Finding dependencies for %s took %%.2f seconds" % filename): from nuitka import Options Options.options.dependency_tool = "pefile" r = detectBinaryPathDLLsWindowsPE( is_main_executable=False, source_dir="notexist", original_dir=os.path.dirname(filename), binary_filename=filename, package_name=None, use_cache=False, update_cache=True, ) Options.options.dependency_tool = "depends.exe" for dll_filename in sorted(r): print(" ", dll_filename) print("Total: %d" % len(r)) print("DLLs recursively dependended (depends.exe):") with TimerReport( message="Finding dependencies for %s took %%.2f seconds" % filename): r = detectBinaryPathDLLsWindowsDependencyWalker( is_main_executable=False, source_dir="notexist", original_dir=os.path.dirname(filename), binary_filename=filename, package_name=None, use_cache=False, update_cache=False, ) for dll_filename in sorted(r): print(" ", dll_filename) print("Total: %d" % len(r))