识别winspool根本原因的技巧!EnumPorts错误地返回0个端口

时间:2016-07-20 12:57:12

标签: c++ windows debugging winapi

拥有一个Windows环境,其中所有网络打印机上的“端口”选项卡都为空,但仅限于某些win7客户端。这些客户端的所有其他打印功能适用于这些打印服务器上的打印机。由于环境的设置方式,我无法轻松将内核调试程序连接到这些vSphere虚拟机。

  • Server 2008 R2计算机 - 确定
  • 清洁Win7机器 - 确定
  • Win7机器+许多第三方软件,包括第三方设备驱动程序,多个API挂钩软件等 - BROKEN

所有计算机都加入同一个域,并以同一用户身份登录。 在Explorer.exe上使用Rohitab API Monitor我发现winspool EnumPorts正在成功,但在失败的机器上返回0端口,但在相同的用户帐户/相同的网络和相同的参数下,它们在两个工作中返回600多个端口机器..

我写了一个测试C ++程序来自己测试EnumPorts。 Visual Studio 2015项目+二进制文件是here

该计划的关键部分是:

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但找不到任何东西,并且一开始并不知道我在寻找什么
  • 使用Process Monitor查找丢失的注册表项/文件,但找不到任何

0 个答案:

没有答案