有一个 Windows 环境,其中所有网络打印机上的“端口”选项卡为空,但仅在某些 win7 客户端上。这些客户端的所有其他打印功能都适用于这些打印服务器上的打印机。由于环境的设置方式,我无法轻松地将内核调试器附加到这些 vSphere 虚拟机。
- Server 2008 R2 机器 - 好的
- 清洁 Win7 机器 - 好的
- Win7 机器 + 很多 3rd 方软件,包括 3rd 方设备驱动程序,多个 API 挂钩软件等 - BROKEN
所有机器都加入同一个域,并以同一个用户身份登录。在 Explorer.exe 上使用Rohitab API Monitor我发现 winspool EnumPorts成功,但在失败的机器上返回 0 个端口,但在相同的用户帐户/相同的网络和相同的参数下,它在两台工作机器上返回 600+ 个端口。
我编写了一个测试 C++ 程序来单独测试 EnumPorts。Visual Studio 2015 项目 + 二进制文件在这里
该计划的关键部分是:
pPortInfo = (PORT_INFO_2 *)malloc(cbNeeded);
bResult = EnumPorts(argv[1],
2,
(LPBYTE)pPortInfo,
cbNeeded,
&cbNeeded,
&cbReturned);
在 pPortInfo 的工作机器上输出是:
CALL: EnumPorts("\\PRINTSERVER01",(LPBYTE)pPortInfo,4096,&cbNeeded,&cbReturned)
RETURNED: false ERROR CODE: 122 ERROR MSG: The data area passed to a system call is too small.
CALL: EnumPorts("\\PRINTSERVER01",(LPBYTE)pPortInfo,121800,&cbNeeded,&cbReturned)
RETURNED: true ERROR CODE: 0 ERROR MSG: The operation completed successfully.
cbReturned = 629
PORT #0
Port Name: TS005
Monitor Name: Dynamic Print Monitor
Description: Inactive TS Port
Port Type: WRITE READ
PORT #1
Port Name: TS004
Monitor Name: Dynamic Print Monitor
Description: Inactive TS Port
Port Type: WRITE READ
etc...
在损坏的机器上:
CALL: EnumPorts("\\PRINTSERVER01",(LPBYTE)pPortInfo,4096,&cbNeeded,&cbReturned)
RETURNED: true ERROR CODE: 0 ERROR MSG: The operation completed successfully.
cbReturned = 0
到目前为止我已经确定/尝试了什么
- 使用SysInternals AutoRuns比较机器,两台机器上的 Windows 服务配置/驱动程序/挂钩 DLL 之间存在数百个差异。我想找到一种技术来将其缩小到潜在的罪魁祸首,而不必删除/禁用所有这些项目
- 我尝试通过重命名AppInit_DLLs键并确认这些 DLL 不再在进程中加载来禁用所有挂钩 DLL,但它仍然损坏
- 捕获的WireShark跟踪 - 在调用 EnumPorts 时,工作机器上的网络流量被发送/接收到打印服务器。在损坏的机器上,根本没有网络流量发送到打印服务器。但是,在损坏的机器上,您仍然可以运行 net view /all \ 等命令并映射到远程打印服务器上的打印机/驱动器。
- 使用Microsoft Message Analyzer RPC 跟踪,这会记录 RPC 调用,但不确定如何解释此数据。似乎没有一个呼叫失败。
- 深入了解 winspool!EnumPorts 它使用NdrClientCall2与打印服务器通信,但这些调用没有失败。
- 尝试禁用本地防火墙
- 尝试 netsh winsock 重置并重新启动
- 在禁用防病毒软件的情况下进行测试
- 在 Windows 事件查看器中创建了一个过滤器,以在测试运行期间查看所有 Windows 事件日志条目,并且找不到任何看似相关的错误
- 通过 WinDbg 运行我的测试工具,没有第一次机会异常或其他错误
- 尝试在 EnumPort 函数完成时设置断点,然后使用NotMyFault创建完整的内存 dmp但找不到任何东西,并且一开始并不真正知道我在寻找什么
- 使用进程监视器查找丢失的注册表项/文件,但找不到任何