创建SvcHost.exe调用的服务原理与实践.docVIP

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
创建SvcHost.exe调用的服务原理与实践.doc

  创建SvcHost.exe调用的服务原理与实践~教育资源库   1.多个服务共享一个Svchost.exe进程利与弊   s又把很多服务做成共享方式,由svchost.exe启动。oteProcedureCall)服务进程,另外一个则是由很多服务共享的一个svchost.exe。而在s的一个趋势。这样做在一定程度上减少了系统资源的消耗,不过也带来一定的不稳定因素,因为任何一个共享进程的服务因为错误退出进程就会导致整个进程中的所有服务都退出。另外就是有一点安全隐患,首先要介绍一下svchost.exe的实现机制。   2.Svchost原理   Svchost本身只是作为服务宿主,并不实现任何服务功能,需要Svchost启动的服务以动态链接库形式实现,在安装这些服务时,把服务的可执行程序指向svchost,启动这些服务时由svchost调用相应服务的动态链接库来启动服务。   那么svchost如何知道某一服务是由哪个动态链接库负责呢?这不是由服务的可执行程序路径中的参数部分提供的,而是服务在注册表中的参数设置的,注册表中服务下边有一个Parameters子键其中的ServiceDll表明该服务由哪个动态链接库负责。并且所有这些服务动态链接库都必须要导出一个ServiceMain()函数,用来处理服务任务。   例如rpcss(RemoteProcedureCall)在注册表中的位置是HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesRpcSs,它的参数子键Parameters里有这样一项:   ServiceDll=REG_EXPAND_SZ:%SystemRoot%system32rpcss.dll   当启动rpcss服务时,svchost就会调用rpcss.dll,并且执行其ServiceMain()函数执行具体服务。   既然这些服务是使用共享进程方式由svchost启动的,为什么系统中会有多个svchost进程呢?ms把这些服务分为几组,同组服务共享一个svchost进程,不同组服务使用多个svchost进程,组的区别是由服务的可执行程序后边的参数决定的。   例如rpcss在注册表中HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesRpcSs有这样一项:   ImagePath=REG_EXPAND_SZ:%SystemRoot%system32svchost-krpcss   因此rpcss就属于rpcss组,这在服务管理控制台也可以看到。   svchost的所有组和组内的所有服务都在注册表的如下位置:HKEY_LOCAL_MACHINESOFTicrosoftain()函数中接收的参数是ANSI还是Unicode?我们是否需要调用RegisterServiceCtrlHandler和StartServiceCtrlDispatcher来注册服务控制及调度函数?   这些问题要通过查看svchost代码获得。下边的代码是andLine()对命令行进行分析,获得要启动的服务组,然后调用SvcHostOptions()查询该服务组的选项和服务组的所有服务,并使用一个数据结构svcTable来保存这些服务及其服务的DLL,然后调用PrepareSvcTable()函数创建SERVICE_TABLE_ENTRY结构,把所有处理函数SERVICE_MAIN_FUNCTION指向自己的一个函数FuncServiceMain(),最后调用APIStartServiceCtrlDispatcher()注册这些服务的调度函数。   ;===============================MainFuncion===========================================   .text:010010B8     publicstart   .text:010010B8start   proear   .text:010010B8     push esi   .text:010010B9     push edi   .text:010010BA     push offsetsub_1001EBA;lpTopLevelExceptionFilter   .text:010010BF     xor edi,edi   .text:0100112E     test edi,edi   .text    jz  ExitProgram   .text    push edi   12

文档评论(0)

ggkkppp + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档