注册表项关于start参数的说明,一直以来都搞错了,竟然还写了个错误的程序禁用本级的一些自启动项,汗呀

来源:互联网 发布:黑客用python做什么 编辑:程序博客网 时间:2024/04/27 06:40

本来装机装了很多软件后,会有很多自启动的服务项,竟然高达50多个,额这个汗呀,哗哗的呀。

 

由于本人的机子老喜欢出现一些莫名的错误,导致一些程序无法使用,后来只能靠重装系统来解决,干脆写个程序禁掉算了。

 

没想到额设置的禁止启动, 网上解释竟然是“由核心装载器装载”,额晕呀,但是额设置为0后,却是可以不启动的,虽然实现了,但是是个隐患呀。

 

start = {0,1,2,3,4}
0 == 由核心装载器装载
1 == 由I/O子系统装载
2 == 自动启动
3 == 手工启动
4 == 禁止启动

 

看来还是程序先停服务,后手工启动吧

 

下面来看看关于注册表的 start REG_DWORD 的 说明吧:

===================================================================================

 

 WindowsXP系统服务

在系统启动的时候会自动启动很很多系统服务用于硬件驱动、内存管理、网络服务等多方面服务。services.msc是windows系统自带的服务管理器,net命令是对应的命令行方式工具。
net

services.msc是图形界面的,没有什么好说的,都能看懂。而net,最常用的,也是我下面会用得到的两条指令就是:start和stop。

net start serviceName   //根据参数中的服务名称启动一项已经注册的服务,如果服务名还没有注册将报错。

net stop serviceName    //停止一项服务

注册表

和服务有关的注册表目录:

HKEY_LOCAL_MACHINE/SYSTEM/ControlSet001/Services
HKEY_LOCAL_MACHINE/SYSTEM/ControlSet002/Services
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services

可以在这三个地方找到系统中注册的各种服务,手动注册服务就从这里开始,我选择的是最后一个目录。

首先,查看一下已经注册的服务我们可以看到每个服务都是以单独的节点的方式存在,节点内的一些键值描述了这个服务的一些信息和配置情况,最主要的有:
名称         类型         数据
DisplayName         REG_SZ         注册的服务名,用于net下唯一标识一个服务,比如我们用cliff
Description         REG_SZ         描述信息
ImagePath         REG_EXPAND_SZ         服务的可执行文件绝对路径
Start         REG_DWORD         启动模式,有0、1、2、3、4可选
Type         REG_DWORD         程序类型,0x10和0x20
ErrorControl         REG_DWORD         出错处理


上述表中的DisplayName、Start和ImagePath是最重要的,这里对Start的取值类型再作进一步说明:

start = {0,1,2,3,4}
0 == 由核心装载器装载
1 == 由I/O子系统装载
2 == 自动启动
3 == 手工启动
4 == 禁止启动

于是我们可以仿照这个结构创建我们自己的服务:

细心的你可能会发现在inetsvr下还有两个节点,的确你没有说错,在这里我偷了点懒,没有给你看手动注册的服务,而是截了一张利用后面将要提到的方法注册的服务。不过如果手工注册服务可以不建立那两个子节点,后面我们将会看到他们都是系统自动创建的,无须担心。

创建完之后,你充满期待的打开services.msc,但是你没有找到你刚刚注册的服务名cliff,那意味着你将不能享受到cliff带给你的服务了!别急,重起一下系统试试,你会发现它已经在静静的等你了。

好了,到此为止,我们已经可以手动注册系统服务了。但是我们也发现有一个很不好的地方,那就是我们需要重起系统。回想你可能安装过的Tomcat、MySQL等东东,没有重起系统也已经注册了服务,我们怎么能实现呢?
INF

INF:Device INFormation File

准备知识:INF

这里需要三个INF文件,一个用于注册并启动服务,一个用于停止并注销服务,最后一个用于在U盘插入的时候添加功能菜单。

首先需要说明的是最终的实现和我最初的设想有些背离。开始是想让U盘在加载后自动运行批处理文件,应该是这样的:

[AutoRun]
open=setup.bat

但是经过试验发现并没有运行成功,所以采取了第二种方案,也是相对比较缓和的方案:在U盘的菜单中加入setup DB和unistall DB的选项。
addDB.inf

[Version]
Signature="$WINDOWS NT$"
[DefaultInstall.Services]
addService=inetsvr,,My_AddService_Name
[My_AddService_Name]
DisplayName=FirebirdServer
Description=mobile DB Server
ServiceType=0x10
StartType=3
ErrorControl=0
ServiceBinary=%01%binfbserver.exe -r

delDB.inf

[Version]
Signature="$WINDOWS NT$"
[DefaultInstall.Services]
delService=inetsvr,,My_DelService_Name
[My_DelService_Name]
DisplayName=FirebirdServer

Bat批处理

最后,我希望达到的目的是U盘插上后自动注册服务,并启动服务。而上面创建的inf可以完成注册服务,它的调用可以用rundll32.exe配以相应参数来完成,所以.bat的批处理文件里就只有两行文字了:

@rundll32.exe setupapi,InstallHinfSection DefaultInstall 132 .Firebird_2_0addDB.inf
@net start FirebirdServer

注:前面的@是为了不显示着两条语句的执行过程,但是弹出黑框还是暂时不能避免,需进一步寻找方法。


另一方面为了在卸除U盘的时候可以还原注册表,还需要一个uninstall.bat。里面也是调用一个inf,但是需要注意的是应该先停止服务!

@net stop FirebirdServer
@rundll32.exe setupapi,InstallHinfSection DefaultInstall 132 .Firebird_2_0delDB.inf

等一下,到现在这两个bat文件可以完成服务的自动注册、启动,停止、注销,但是我们忘记了一件事,那就是让他自动运行!下面一个经常与病毒联系到一起的文件就要出现了————autorun.inf!!
Autorun.inf

[AutoRun]
shell1=Open
shell1Command=explorer.exe
shell2=Setup DB
shell2Command=setup.bat
shell3=Uninstall DB
shell3Command=uninstall.bat

这里说明一下,shell指令是用于在右键菜单中加入新的条目shell序号代表了要加入的条目的顺序,但是好像只是相对顺序,都会被加到最开始的位置,并且第一条自动设置成双机打开,这也是为什么要加上shell1的两行的原因了。在保留原有双击功能的前提下,需要手动调用 explorer.exe。''代表打开当前路径,如果没有参数则会打开当前用户的我的文档。
尾声

至此,所有的事情都已经做完了,让我们来整理一下U盘的目录结构:

root
  |----Autorun.inf
  |----setup.bat
  |----uninstall.bat
  |----Firebird_2_0
          |-------addDB.inf
          |-------delDB.inf

一共用到了三个inf,两个bat,实现了右键菜单方式的注册、启动,停止、卸载系统服务。

 

 

===================================================================================