【现象描述】
问题1:TC登陆虚拟机后,使用USB蒙恬手写笔,在虚拟机上安装手写笔驱动后,发现手写笔无法被识别。
问题2:打开所有鼠标、键盘直接放通到虚拟机后,手写笔可以被识别到,但发现和USB鼠标存在冲突,导致鼠标移动到屏幕的左边缘后就“粘住”了,无法移动。
问题3:使用过程中,发现安装手写笔驱动后,虚拟机的“断开”按钮消失了。
问题4:找到了“断开”按钮消失的原因,但“断开”出现后,手写笔在全屏模式下无法使用。
【原因分析】
1、 由于手写笔采用USB接入,并且手写板的设备class和鼠标键盘的class一样的都为03,可
以在物理机的“控制面板”->“管理工具”->“计算机管理”->“USB人体学输入设备”,选择手写笔设备,进入“属性”->“详细信息”里查到。
2、 在tc中,我们是将鼠标键盘的class id屏蔽了,目的不让鼠标映射到虚拟机中,只在tc中
使用(在实际测试中发现usb鼠标不映射到虚拟机中使用效果更好,所以将class =03禁止了)
查看是否禁止,在tc上,在桌面云登陆界面,输入快捷键CTRL+ALT+X调出xterm界面,在bash-3.00#后输入打开ICAClient文件夹,查看usb.conf文件(xpe tc是在注册表HKEY_LOCAL_MACHINE\SOFTWARE\Citrix\ICA Client\GenericUSB的DeviceRules键值,修改方法和liunx tc 一样),命令如下:
bash-3.00# cd /usr/lib/ICAClient/
bash-3.00# vi usb.conf
在lib/usr/usb.conf文件中可以看到有如下配置:
DENY: class=03 subclass=01 prot=01 # HID Boot keyboards
DENY: class=03 subclass=01 prot=02 # HID Boot mice
3、 将class取消DENY,手写板就可以在虚拟机中使用,修改方法在tc上执行mount -o remount
rw /,取消写保护,将usb.conf文件中的配置做部分修改如下:
bash-3.00# mount -o remount rw /
bash-3.00# cd /usr/lib/ICAClient/
bash-3.00# vi usb.conf
……
#DENY: class=03 subclass=01 prot=01 # HID Boot keyboards
#DENY: class=03 subclass=01 prot=02 # HID Boot mice
……
4、 保存修改后的配置,重启TC后,再次接入手写笔,手写笔可以使用了。这种方式鼠标也
使映射到虚拟机中,就导致出现USB鼠标在桌面移动时经常卡死,无法正常使用。现场接入,鼠标不能操作tc等问题,USB无线鼠标也会存在此问题,但接入PS2的鼠标,是不会有此问题。
5、 只有将usb鼠标不能映射到虚拟机中才能规避此问题,实现方法查看鼠标的PID和VID,
然后DENY鼠标的PID和VID同样可以屏蔽鼠标的映射。
修复方式如下现场查看到该鼠标的pid为0001,修改usb.conf文件配置为:
# Don't remote hubs, human-interface devices, or smartcards
DENY: class=02 # Communications and CDC-Control
DENY: class=09 # Hub devices
ALLOW: vid=0B57 pid=8021 # Hanwang
ALLOW: vid=5543 pid=0003 # PowerPen
DENY: class=03 subclass=01 prot=01 # HID Boot keyboards
DENY: class=03 subclass=01 prot=02 # HID Boot mice
DENY: class=0a # CDC-Data
DENY: class=0b # Smartcard
DENY: class=e0 # Wireless controller
ALLOW: # Ultimate fallback: allow everything else
这样USB鼠标由TC来识别,而手写板由虚拟机识别,这样鼠标和手写板就都能正常使用了。
6、 使用中,还发现了自从安装了手写笔驱动,虚拟机下方的“断开”按钮就消失了:
保存注册表,然后修复方式重新安装VDA,发现“断开”按钮出现了。
通过对比注册表项,发现VDA增加了一个MFAPHOOK.DLL;而安装手写笔驱动后,手写笔驱动将原有的MFAPHOOK.DLL修改为自己的PPINKDLL.DLL了。
注册表项HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs中,手工修改C:\PPENSB\Win32\PPINKDLL.DLL,MFAPHOOK.DLL后,“断开”按钮也能出现
但此时如果使用全屏手写识别模式,会导致系统异常,桌面消失。通过分析发现, MFAPHOOK.DLL只是一个接口钩子,它最后使用的钩子是在HKEY_LOCAL_MACHINE\SOFTWARE\Citrix\CtxHook下面。逐一排除测试,发现HKEY_LOCAL_MACHINE\SOFTWARE\Citrix\CtxHook\AppInit_Dlls\UI Tweak\explorer.exe去掉后,“断开”按钮会消失,手写笔全屏识别模式也没有问题了。在Citrix这边已经清楚了和哪个底层冲突了。
如果能找到VDA和手写笔驱动之间的非主要进程冲突,先禁用一个非主要的,也许能解决问题。
反过来再看手写笔如何进入全屏识别模式的。虚拟机启动后,手写笔只是在“开始”-“启动”选项中增加了一个“蒙恬手写笔”的启动项,在进程中增加了ppshell.exe,这是一个菜单进程。通过这个进程,再去加载其它功能对应的进程模块。
测试中发现,使用了全屏识别模式后,增加了freeime.exe、MSNChk.exe进程。逐一排除这两个进程,发现当禁用MSNChk.exe后,出现“断开”按钮,全屏手写识别模式也正常了。
最后通过验证,暂时没有发现禁用MSNChk.exe可能导致问题。
【解决办法】
1、通过以上分析处理过程可以知晓,如果手写笔连接至虚拟机而不通过TC直接识别,鼠标通过TC识别映射到虚拟机,那么问题就得到解决了,因此最终的解决办法是找到手写笔与鼠标的不同参数,现场注意到手写笔的特征参数里,vid为5543 pid为0003,最终修改配置如下后问题得到解决。
ALLOW: vid=0B57 pid=8021 # Hanwang
ALLOW: vid=5543 pid=0003 # PowerPen
DENY: class=03 subclass=01 prot=01 # HID Boot keyboards
DENY: class=03 subclass=01 prot=02 # HID Boot mice
注意:ALLOW: vid=5543 pid=0003必须放在DENY: 命令的前面,TC查询时会按照脚本顺序的优先级来查询。
2、通过执行脚本,解决“断开”按钮消失和手写全屏识别问题