docs: def EnumMissingModules():
    """Enumerate all modules which match the patterns MODULE_PATTERNS.
  
    PyInstaller often fails to locate all dlls which are required at
    runtime. We import all the client modules here, we simply introspect
    all the modules we have loaded in our current running process, and
    all the ones matching the patterns are copied into the client
    package.
  
    Yields:
      a source file for a linked dll.
    """
    module_handle = ctypes.c_ulong()
    count = ctypes.c_ulong()
    process_handle = ctypes.windll.kernel32.OpenProcess(
        PROCESS_QUERY_INFORMATION
        | PROCESS_VM_READ, 0, os.getpid())
    ctypes.windll.psapi.EnumProcessModules(process_handle,
                                           ctypes.byref(module_handle),
                                           ctypes.sizeof(module_handle),
                                           ctypes.byref(count))
  
    # The size of a handle is pointer size (i.e. 64 bit of amd64 and 32 bit on
    # i386).
    if sys.maxsize > 2**32:
      handle_type = ctypes.c_ulonglong
    else:
      handle_type = ctypes.c_ulong
  
    module_list = (handle_type * (count.value // ctypes.sizeof(handle_type)))()
  
    ctypes.windll.psapi.EnumProcessModulesEx(process_handle,
                                             ctypes.byref(module_list),
                                             ctypes.sizeof(module_list),
                                             ctypes.byref(count), 2)
  
    for x in module_list:
      module_filename = win32process.GetModuleFileNameEx(process_handle, x)
      for pattern in MODULE_PATTERNS:
        if pattern.match(os.path.basename(module_filename)):
          yield module_filename
  
    for venv_file in FILES_FROM_VIRTUALENV:
      yield os.path.join(sys.prefix, venv_file)