vitual channel program

本文详细介绍了RDP5.1中虚拟通道技术的实现方式,包括服务器端和客户端组件的工作原理,以及如何在注册表中进行配置。此外还介绍了远程控制持久虚拟通道的概念及如何禁用终端服务的某些特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

字体变小 字体变大
一.Virtual Channel的实现

RDP5.1支持虚拟通道(virtual channel,下同)技术。虚拟通道是自定义的一套与RDP协议相关联的独立的数据格式。这项技术使我们不必去改变RDP协议,而增加新的功能。

下面几种情况下最适合使用虚拟通道技术。当然,其他的一些情况也可能会使用虚拟通道,我们并不对虚拟通道机制的使用做特别的限制。
1.普通的核心设备,比如串口或打印机
2.重定向文件系统
3.用户程序,比如远程的剪切和复制
4.音频设备

一个虚拟通道程序需要一个客户端组件和一个服务器端组件构成:
1.服务器端组件运行在终端服务服务器上,它可以是一个用户程序或是一个核心设备。
2.客户端组件是一个动态连接库,当终端服务的客户端程序运行时必须把它加载到内存中。

下面几个段落描述了这些组件:
Virtual Channel Server Application
Virtual Channel Client
Virtual Channel Client Registration
Remote-Control Persistent Virtual Channels

备注:此文章的原作路径为
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcerdp/htm/ceoriImplementingVirtualChannels.asp


二.Virtual Channel Server Application
使用虚拟通道技术程序的组件必须是一个在终端服务的服务器端运行的一个客户会话中的程序。你必须提供运行这个程序的方法。以下的几个方法可以实现程序的运行,比如做一个登陆脚本,或一个在开始文件夹中的计划或脚本。当然也可以由用户自己激活程序。

你必须把虚拟通道的服务器端程序保存在注册表中,方法是在注册表下面的路径中加入一个子键。HKEY_LOCAL_MACHINE/System/CurrentControlSet/Control/TerminalServer/Addins

服务器端程序可以通过调用WTSVirtualChannelOpen来得到一个虚拟通道的句柄,在程序中可以通过这个句柄使用下面的一些方法。
WTSVirtualChannelClose
关闭虚拟通道
WTSVirtualChannelPurgeInput
清除在一个虚拟通道中,客户端发来的所有的输入数据的请求
WTSVirtualChannelPurgeOutput
清除在一个虚拟通道中,客户端发来的所有的输出数据的请求
WTSVirtualChannelQuery
返回一个指定虚拟通道的信息
WTSVirtualChannelRead
从一个虚拟通道的末端服务器中读数据
WTSVirtualChannelWrite
从一个虚拟通道的末端服务器中写数据

Virtual Channel Client
虚拟通道程序的客户端组件是一个动态连接库,这个dll在客户计算机的终端服务初始化时被加载。这个dll必须被注册到客户计算机中。更多的信息,请看下一篇文章Virtual Channel Client Registration。

客户端dll导出了一个VirtualChannelEntry函数,这个函数在终端服务初始化时被调用。这个VirtualChannelEntry入口指向一个CHANNEL_ENTRY_POINTS结构的指针。这个指针将被下面几个函数使用到,这些函数时客户dll用来访问虚拟通道的函数。

三.VirtualChannelInit
注册使用的虚拟通道的名称,并提供一个VirtualChannelInitEvent回调函数,通过这个回调,终端服务提示客户端一些事件和客户连接
VirtualChannelOpen
打开一个指定虚拟通道末端的客户,并提供VirtualChannelOpenEvent回调函数,通过这个回调终端服务提示客户端一些事件和客户连接
VirtualChannelWrite
在虚拟通道中写数据。终端服务把这些数据发送到虚拟通道的服务器端。.服务器调用WTSVirtualChannelRead函数来读取这些数据。
VirtualChannelClose
关闭一个虚拟通道

VirtualChannelEntry函数必须调用VirtualChannelInit函数来初始化一个虚拟通道的访问。当调用VirtualChannelInit时,必须通过VirtualChannelInitEvent回调函数的一个指针。终端服务在初始化完成是调用这个函数,并在与一个终端服务器建立连接后再次调用这个函数。

在连接建立之后,你可以调用VirtualChannelOpen函数来打开由VirtualChannelInit函数注册的虚拟通道。VirtualChannelOpen函数将为你的VirtualChannelOpenEvent回调函数指定一个指针。

当VirtualChannelOpen函数调用返回后,你可以调用VirtualChannelWrite函数来写虚拟通道了。写的过程是异步的,因此你不必释放或重新分配缓冲区,直到VirtualChannelOpenEvent函数说明这个写的过程已经完成。

当你调用VirtualChannelWrite函数时,你可以通过一些用户数据来参看写过程的状态,当调用VirtualChannelOpenEvent时,终端服务将调用通过返回的用户数据通知你写的过程已经完成。在虚拟通道末端的服务器上,服务器插件调用WTSVirtualChannelRead函数来读取这些数据。

当服务器端组件把这些数据写入服务器的时候,终端服务也可以调用VirtualChannelOpenEvent函数得到相应的信息。服务器端组件是通过调用WTSVirtualChannelWrite函数把数据写入到服务器的。

客户端和服务器端组件可以在虚拟通道中写入任意大小的数据。然而,在发送数据之前,终端服务将把这些数据分割成CHANNEL_CHUNK_LENGTH字节大小的片断。终端服务为每一个数据片断调用VirtualChannelOpenEvent函数,而不是把这些数据重新建立成原是大小的包。每一次调用VirtualChannelOpenEvent显示数据片段的大小,并显示出是发送数据的开始、中间或是末尾。

VirtualChannelClose函数用来关闭一个通道。然而,你并不必须显示的使用这个函数。因为当一个哭户从服务器上断开连接时,终端服务会自动的关闭所有的通道。


四.Virtual Channel Client Registration
你必须在注册表中注册客户端dll的名称。方法是在下面路径之一加入子键.
HKEY_CURRENT_USER/Software/Microsoft/Terminal Server Client/Default/Addins
HKEY_CURRENT_USER/Software/Microsoft/Terminal Server Client/connection/Addins

加入到Default/Addins键下会应用于所有的连接。加入到connection/Addins键下仅仅应用于指定的连接。裂解可以使用连接管理器创建和管理。

子键可以是任意的名称,它必须包含一个REG_SZ或者REG_EXPAND_SZ型的值。并且也可以再加一个REG_DWORD值。REG_SZ或者REG_EXPAND_SZ值的原型如下。
Name = DLLname

如果使用一个REG_EXPAND_SZ值,那么它包括一个未扩展的环境变量,这个变量将在运行时扩展。DLLname的值是一个全路径。如果DLLname没有包括一个全路径,那么将应用标准的Dll搜索路径。

REG_DWORD值的原型如下。
RemoteControlPersistent = flag

flag的值是1或0,0是默认值。如果是1,那么这个插件将不会得到远程控制开始与结束的信息。如果是0,这个插件将不会得到远程控制开始与结束的信息。

五.Remote-Control Persistent Virtual Channels
在Windows CE .NET和Windows XP中,一个DLL可以指定一个或多个虚拟通道作为永久远程控制。这样的通道在客户的一个连接会话连接或断开时都不会被关闭。数据将继续通过这个通道被发送和接收。没有被指定为永久远程控制的虚拟通道将被关闭。永久远程控制的虚拟通道通过调用VirtualChannelInit函数指定。参阅VirtualChannelInit函数会得到更多的信息。

六.Disabling Terminal Services Features
为了增强安全性,你可以选择屏蔽终端服务的一些功能,比如当使用Remote Desktop ActiveX Control连接时的剪切板的重定向和指针的重定向。

怎么屏蔽终端服务的功能
1.在客户计算机的注册表中加入下面的键。
HKEY_LOCAL_MACHINE/Software/Microsoft/Terminal Server/DisableClipRedirection
HKEY_LOCAL_MACHINE/Software/Microsoft/Terminal Server/DisablePrinterRedirection
2.把这两个键的值设置为0。
Looking for: ['mfix==25.1.2', 'mfix-solver=25.1.2'] warning libmamba Cache file "/home/ps/miniforge3/pkgs/cache/497deca9.json" was modified by another program warning libmamba Cache file "/home/ps/miniforge3/pkgs/cache/09cdf8bf.json" was modified by another program warning libmamba Could not parse mod/etag header warning libmamba Could not parse mod/etag header warning libmamba Could not parse mod/etag header warning libmamba Could not parse mod/etag header warning libmamba Cache file "/home/ps/miniforge3/pkgs/cache/47929eba.json" was modified by another program warning libmamba Cache file "/home/ps/miniforge3/pkgs/cache/3e39a7aa.json" was modified by another program warning libmamba Cache file "/home/ps/miniforge3/pkgs/cache/2ce54b42.json" was modified by another program warning libmamba Cache file "/home/ps/miniforge3/pkgs/cache/4ea078d6.json" was modified by another program https://mirrors.ustc.edu.cn/anaconda/cloud/menpo.. https://mfix.netl.doe.gov/s3/09d9e2e6/acf3d1bd18.. https://mirrors.ustc.edu.cn/anaconda/cloud/bioco.. https://mfix.netl.doe.gov/s3/09d9e2e6/acf3d1bd18.. https://mirrors.ustc.edu.cn/anaconda/pkgs/main/n.. https://mirrors.aliyun.com/pypi/simple/linux-64 0.4s https://mirrors.ustc.edu.cn/anaconda/pkgs/main/l.. 17.6s https://mirrors.ustc.edu.cn/anaconda/cloud/msys2.. https://mirrors.aliyun.com/pypi/simple/noarch 0.6s Multi-download failed. Reason: Transfer finalized, status: 404 [https://mirrors.aliyun.com/pypi/simple/noarch/repodata.json] 2318 bytes # >>>>>>>>>>>>>>>>>>>>>> ERROR REPORT <<<<<<<<<<<<<<<<<<<<<< Traceback (most recent call last): File "/home/ps/miniforge3/lib/python3.10/site-packages/conda/exceptions.py", line 1132, in __call__ return func(*args, **kwargs) File "/home/ps/miniforge3/lib/python3.10/site-packages/mamba/mamba.py", line 941, in exception_converter raise e File "/home/ps/miniforge3/lib/python3.10/site-packages/mamba/mamba.py", line 934, in exception_converter exit_code = _wrapped_main(*args, **kwargs) File "/home/ps/miniforge3/lib/python3.10/site-packages/mamba/mamba.py", line 892, in _wrapped_main result = do_call(parsed_args, p) File "/home/ps/miniforge3/lib/python3.10/site-packages/mamba/mamba.py", line 758, in do_call exit_code = create(args, parser) File "/home/ps/miniforge3/lib/python3.10/site-packages/mamba/mamba.py", line 632, in create return install(args, parser, "create") File "/home/ps/miniforge3/lib/python3.10/site-packages/mamba/mamba.py", line 499, in install index = load_channels(pool, channels, repos) File "/home/ps/miniforge3/lib/python3.10/site-packages/mamba/utils.py", line 129, in load_channels index = get_index( File "/home/ps/miniforge3/lib/python3.10/site-packages/mamba/utils.py", line 110, in get_index is_downloaded = dlist.download(api.MAMBA_DOWNLOAD_FAILFAST) RuntimeError: Multi-download failed. Reason: Transfer finalized, status: 404 [https://mirrors.aliyun.com/pypi/simple/noarch/repodata.json] 2318 bytes `$ /home/ps/miniforge3/bin/mamba create -n mfix-25.1.2 mfix==25.1.2 mfix-solver=25.1.2 -c conda-forge -c https://mfix.netl.doe.gov/s3/09d9e2e6/acf3d1bd18d1e8d1637bad33e96216d6//conda/dist` environment variables: CIO_TEST=<not set> CONDA_DEFAULT_ENV=base CONDA_EXE=/home/ps/miniforge3/bin/conda CONDA_PREFIX=/home/ps/miniforge3 CONDA_PROMPT_MODIFIER=(base) CONDA_PYTHON_EXE=/home/ps/miniforge3/bin/python CONDA_ROOT=/home/ps/miniforge3 CONDA_SHLVL=1 CURL_CA_BUNDLE=<not set> LD_LIBRARY_PATH=/usr/local/cuda-12.0/lib64: LD_PRELOAD=<not set> PATH=/home/ps/miniforge3/bin:/home/ps/miniforge3/condabin:/home/ps/.local/b in:/home/ps/bin:/usr/local/cuda- 12.0/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin REQUESTS_CA_BUNDLE=<not set> SSL_CERT_FILE=<not set> WINDOWPATH=2 active environment : base active env location : /home/ps/miniforge3 shell level : 1 user config file : /home/ps/.condarc populated config files : /home/ps/miniforge3/.condarc /home/ps/.condarc conda version : 23.3.1 conda-build version : not installed python version : 3.10.12.final.0 virtual packages : __archspec=1=x86_64 __cuda=12.2=0 __glibc=2.28=0 __linux=4.18.0=0 __unix=0=0 base environment : /home/ps/miniforge3 (writable) conda av data dir : /home/ps/miniforge3/etc/conda conda av metadata url : None channel URLs : https://conda.anaconda.org/conda-forge/linux-64 https://conda.anaconda.org/conda-forge/noarch https://mfix.netl.doe.gov/s3/09d9e2e6/acf3d1bd18d1e8d1637bad33e96216d6//conda/dist/linux-64 https://mfix.netl.doe.gov/s3/09d9e2e6/acf3d1bd18d1e8d1637bad33e96216d6//conda/dist/noarch http://pypi.douban.com/simple/linux-64 http://pypi.douban.com/simple/noarch https://mirrors.aliyun.com/pypi/simple/linux-64 https://mirrors.aliyun.com/pypi/simple/noarch https://mirrors.ustc.edu.cn/anaconda/cloud/linux-64 https://mirrors.ustc.edu.cn/anaconda/cloud/noarch https://mirrors.ustc.edu.cn/anaconda/cloud/menpo/linux-64 https://mirrors.ustc.edu.cn/anaconda/cloud/menpo/noarch https://mirrors.ustc.edu.cn/anaconda/cloud/bioconda/linux-64 https://mirrors.ustc.edu.cn/anaconda/cloud/bioconda/noarch https://mirrors.ustc.edu.cn/anaconda/cloud/msys2/linux-64 https://mirrors.ustc.edu.cn/anaconda/cloud/msys2/noarch https://mirrors.ustc.edu.cn/anaconda/cloud/conda-forge/linux-64 https://mirrors.ustc.edu.cn/anaconda/cloud/conda-forge/noarch https://mirrors.ustc.edu.cn/anaconda/pkgs/free/linux-64 https://mirrors.ustc.edu.cn/anaconda/pkgs/free/noarch https://mirrors.ustc.edu.cn/anaconda/pkgs/main/linux-64 https://mirrors.ustc.edu.cn/anaconda/pkgs/main/noarch https://repo.anaconda.com/pkgs/main/linux-64 https://repo.anaconda.com/pkgs/main/noarch https://repo.anaconda.com/pkgs/r/linux-64 https://repo.anaconda.com/pkgs/r/noarch package cache : /home/ps/miniforge3/pkgs /home/ps/.conda/pkgs envs directories : /home/ps/miniforge3/envs /home/ps/.conda/envs platform : linux-64 user-agent : conda/23.3.1 requests/2.31.0 CPython/3.10.12 Linux/4.18.0-348.el8.x86_64 centos/8.5.2111 glibc/2.28 UID:GID : 1000:1000 netrc file : None offline mode : False An unexpected error has occurred. Conda has prepared the above report.
07-18
<think>我们参考用户提供的引用资料,特别是引用[1]和引用[4]中关于mamba安装报错的解决方法。 用户的问题:使用mamba创建环境安装mfix时出现Multi-download failed和404错误。 分析: 1. 报错信息:Multi-download failed 和 404错误,这通常与网络问题或缓存有关。 2. 引用[1]中提到,使用mamba安装Prokka时出现类似错误,最终建议使用conda安装。 3. 引用[4]中提到,mamba安装失败可能是因为环境路径不在conda的默认搜索路径中,需要修改.condarc文件。 然而,用户的问题是关于安装mfix和mfix-solver,我们首先尝试以下步骤: 步骤1:清理mamba缓存并重试 步骤2:检查网络连接,特别是conda通道的设置 步骤3:如果mamba持续失败,考虑使用conda安装 步骤4:检查环境路径设置,确保环境创建在正确的位置 详细步骤: 1. 清理缓存: 运行命令:`mamba clean --all` 清除缓存,然后重试安装。 2. 检查通道和网络: 确保使用的通道(channels)正确,并且网络可以访问这些通道。可以尝试添加国内镜像源(如清华源、中科大源)以提高下载速度。 3. 使用conda代替mamba: 如果mamba持续失败,可以尝试使用conda命令安装。虽然conda可能慢一些,但稳定性更高。 4. 修改.condarc文件: 参考引用[4],检查环境路径设置,确保conda能够找到创建的环境。在.condarc文件中添加正确的环境路径。 具体操作: 方法一:使用mamba清理缓存后重试 ```bash mamba clean --all -y mamba create -n mfix_env mfix mfix-solver ``` 方法二:使用conda安装 ```bash conda create -n mfix_env mfix mfix-solver ``` 方法三:检查并修改.condarc文件 打开或创建~/.condarc文件,添加环境路径(根据引用[4]中的示例): ```yaml envs_dirs: - /path/to/your/anaconda3/envs # 替换为你的实际路径,如/home/user/anaconda3/envs - /user/.conda/envs - /user/anaconda3/envs/mamba/envs/ # 如果之前mamba创建的环境在这里,也要加上 ``` 注意:如果用户使用的是国内网络,建议添加国内镜像源到.condarc,例如: ```yaml channels: - defaults show_channel_urls: true default_channels: - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2 custom_channels: conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud pytorch-lts: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud ``` 然后再次尝试使用mamba或conda创建环境。 如果以上方法都不行,可以尝试手动安装: 1. 创建环境:`conda create -n mfix_env python=3.8` (指定一个合适的Python版本) 2. 激活环境:`conda activate mfix_env` 3. 尝试单独安装:`conda install -c conda-forge mfix mfix-solver` 注意:mfix和mfix-solver可能在conda-forge频道上,所以确保添加了conda-forge频道。 引用资料中,用户提到使用conda安装成功的情况(引用[1]),所以如果mamba不行,conda是可行的备选方案。 最后,如果用户遇到特定的404错误,可能是由于该版本的包在服务器上不存在,可以尝试指定其他版本。 总结:优先尝试清理缓存和修改镜像源,如果不行则使用conda安装,并检查环境路径设置。</think>### 解决 Mamba 安装 MFIX 时出现 Multi-download failed 和 404 错误 #### 问题原因分析 1. **网络问题**:404 错误表示安装包下载失败,通常由网络不稳定、镜像源配置错误或软件源服务器问题导致[^1][^4] 2. **缓存异常**:`file size doesn't match expectation` 表明本地缓存文件损坏或不完整[^1] 3. **环境路径冲突**:Mamba 创建的环境可能不在 Conda 默认搜索路径中[^4] 4. **软件源不可用**:特定版本的 MFIX 包可能已被移除或服务器暂时不可用 --- #### 解决方案(逐步操作) ##### 方法一:优先尝试 Conda 直接安装(推荐) ```bash # 创建新环境 conda create -n mfix_env python=3.9 # 激活环境 conda activate mfix_env # 安装 MFIX 套件 conda install -c conda-forge mfix mfix-solver ``` > **优势**:Conda 比 Mamba 更稳定,引用[1]和[3]均显示 Conda 能解决类似问题[^1][^3] ##### 方法二:修复 Mamba 环境 1. **清理缓存** ```bash mamba clean --all -y # 清除所有缓存 rm -rf ~/.mamba/pkgs # 手动删除缓存目录 ``` 2. **添加国内镜像源**(加速下载) ```bash conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/ conda config --set show_channel_urls yes ``` 3. **配置环境路径** 编辑 `~/.condarc` 文件,添加: ```yaml envs_dirs: - /your/conda/path/envs # 替换为实际路径 - ~/.conda/envs - /opt/anaconda3/envs # 典型路径示例 ``` > 参考引用[4]解决路径问题[^4] 4. **重试安装** ```bash mamba create -n mfix_env -c conda-forge mfix mfix-solver ``` ##### 方法三:手动安装(终极方案) 1. 从 [MFIX 官网](https://mfix.netl.doe.gov) 下载离线包 2. 创建环境后手动安装: ```bash conda activate mfix_env conda install --use-local /path/to/mfix-23.1.tar.bz2 ``` --- #### 预防措施 1. **网络检查**: ```bash ping repo.anaconda.com # 测试服务器连通性 ``` 2. **版本验证**: ```bash mamba search -c conda-forge mfix --info # 确认可用版本 ``` 3. **环境隔离**: ```bash micromamba create -n mfix_env # 使用更轻量级环境 ``` > 关键提示:若多次尝试失败,**优先使用 Conda 替代 Mamba**,多数用户反馈 Conda 更稳定(参考引用[1]和[3][^1][^3]) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值