.NET Windows服务在ntdll.dll中崩溃

时间:2012-04-13 06:24:30

标签: c# windows windows-services crash

我有一个用C#编写的Windows服务。它在调用第三方COM组件时崩溃。该问题仅出现在Windows 7(x86和x64)上。当我在Windows 7(x86和x64)上运行与控制台应用程序相同的服务代码时,它可以正常工作。

当我在Windows 2003上运行相同的服务时,它也可以正常工作。我认为这可能与UAC有关。我正在寻找有关调试此服务的建议/方向,以确定导致问题的原因。使用ntdll.dll的调试符号?在事件日志的信息下面。

事件ID:1000,级别:错误

错误应用程序名称:ServiceHost.exe,版本:1.0.0.0,时间戳:0x4f87bc9a

错误模块名称:ntdll.dll,版本:6.1.7601.17725,时间戳:0x4ec49b60

异常代码:0xc0000005

故障偏移:0x0002bcbb

错误进程ID:0x151c

错误申请开始时间:0x01cd1939c9017b2d

错误应用程序路径:E:\ ServiceHost \ bin \ Debug \ ServiceHost.exe

错误模块路径:C:\ Windows \ SYSTEM32 \ ntdll.dll

报告编号:08da6aa3-852d-11e1-a889-00155d016f32

3 个答案:

答案 0 :(得分:6)

作为一个疯狂的猜测,你可能会对Session 0 Isolation犯下错误:

  

在WindowsXP®,WindowsServer®2003和早期版本的Windows®操作系统中,所有服务都在与登录控制台的第一个用户相同的会话中运行。此会话称为会话0.会话0中的运行服务和用户应用程序一起构成安全风险,因为服务以提升的权限运行,因此是寻找提升其自身权限级别的方法的恶意代理的目标。

这通常会导致服务问题,例如,某些东西试图创建UI。

处理此问题的最简单的方法是与第三方组件的供应商交谈,并确保它支持与服务一起使用。但是,如果供应商不再存在,则可能无法实现。

如果问题出现,而服务正在运行,则可以将调试器附加到它并在发生错误的位置捕获转储(例如,使用adplus中的adplus) Windows的调试工具)。如果在服务启动期间发生问题,则诊断可能会更棘手。

您确实需要在 代码中隔离导致错误的最后一个函数调用,然后尝试从那里进行诊断。

答案 1 :(得分:1)

尝试将服务帐户更改为任何其他帐户。与Local System一样。

答案 2 :(得分:0)

第三方COM组件正在使用一些黑客(一些释放的API)来提高其性能,而OS接口在Windows上的下一版本中已经更改,恕不另行通知。

这是Windows早期的一项旧政策(Norton,Office ...),可以直接调用内核和...