首页
社区
课程
招聘
[原创]开机自启动技术
发表于: 2021-10-7 10:22 16736

[原创]开机自启动技术

2021-10-7 10:22
16736

    在Windows系统中有一个快速启动文件夹,只要把我们的程序放到这个文件夹下,就可以实现开启启动。但由于每台计算机的快速启动文件夹都不一样,所以我们需要使用SHGetSpecialFolderPath函数来获取快速启动文件夹。它在文档中的定义如下

参数hwndOwner代表了窗口所有者的句柄,这里传NULL就好

参数lpszPath是我们指定的缓冲区,用来保存返回快速启动文件夹路径。缓冲区的大小最少为MAX_PATH。

参数nFloader是系统路径的CSIDL标识,这里传入CSIDL_STARTUP代表快速启动文件夹。

参数fCreate指定文件夹不存在时是否要创建。TRUE表示创建,FALSE为不创建。

    既然得到了快速启动文件夹的路径,只要拼接上我们的文件名,并将文件拷贝过去就可以实现开机启动。具体实现代码如下

    运行程序以后可以在以下文件夹下面看到程序被复制进去,此时重启电脑,程序就会自动运行。

    Windows每次开机启动后都会在两个专门的注册表键下遍历键值,得到相应的程序路径并且将它们启动。

    这两个注册表键在32位下分别是

HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\Run

HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run

     这两个注册表键有两个区别。

对HKEY_CURRENT_USER主键的修改只需要用户默认的权限就可以,而对HKEY_LOCAL_MACHINE注册表键的修改却需要管理员权限。

第一个注册表键在64位中会被重定位成HKEY_LOCAL_MACHINE\\Software\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Run

    要实现注册表的操作,首先就要使用RegOpenKeyEx获取相应的注册表键的句柄,它文档中的定义如下

参数hKey指定要打开的主键名。分别有

HKEY_CLASSES_ROOT

HKEY_CURRENT_USER

HKEY_LOCAL_MACHINE

HKEY_USERS

参数lpSubKey指向一个字符串用来表明我们要打开的键的名称。

参数ulOptions被保留起来,必须设为0。

参数samDesired指定得到的键值的权限。其中KEY_ALL_ACCESS代表获取全部权限。

参数phkResult是一个用来保存打开注册表键句柄的指针。

如果函数指向成功,返回值就是ERROR_SUCCESS。

    其次是使用RegSetValueEx来设置指定值的数据和类型。它在文档中的定义如下

参数hKey就是上面打开的注册表的键值句柄。

参数lpValueName指向了包含预设值名称的字符串。

参数Reserved被保留起来,必须设为0。

参数dwType指定将存储的数据类型。其中REG_SZ表示类型是一个以0结尾的字符串。

参数lpData指向了一个缓冲区,缓冲区中包含了要存储的数据。

参数cbData指定了lpData的大小。

如果函数执行成功,返回值就是ERROR_SUCCESS。

    据此可以写出下列代码来实现开机启动。

    程序运行之后在注册表中可以看到如下的键值

   此时重启系统,程序就会在重启后运行。

    这种自启动方式主要是通过设置我们编写的驱动以随系统自启动的方式启动我们的驱动来实现的。要实现这个功能需要以下的步骤

    首先我们需要使用OpenSCManager建立一个到服务控制管理器的连接,并打开指定的数据库,文档中定义如下

参数1指向目标计算机名的字符串,如果为NULL则连接到本地的服务控制管理器

参数2指向要打开的服务控制管理数据库的名称。此参数应该设置为SERVICES_ACTIVE_DATABASE,如果设置为NULL,就是默认打开它。

参数3指定服务访问控制管理器的权限。

函数成功调用则返回服务控制管理器数据库的句柄,否则为NULL。

    接下来需要使用CreateService函数来创建一个服务对象并添加到指定的服务控制管理器数据库中。该函数在文档中定义如下

参数1指向的就是上面那个函数得到的句柄。

参数2指向要安装服务器的名称。

参数3指向用户界面识别服务的显示名称。

参数4指定对服务的访问。

参数5指定服务的类型。主要有以下几个类型

SERVICE_FILE_SYSTEM_DRIVER 文件系统驱动服务程序

SERVICE_KERNEL_DRIVER 驱动服务程序

SERVICE_WIN32_OWN_PROCESS 运行在独立进程中的服务程序

SERVICE_WIN32_SHARE_PROCESS 由多个进程共享的服务程序


参数6指定服务的启动选项。有以下几个类型

SERVICE_AUTO_START 系统启动时由服务控制管理器自启动该服务程序

SERVICE_BOOT_START 用在由系统加载器创建的设备驱动程序中,它只能用于驱动服务程序

SERVICE_DEMAND_START 由服务控制管理器启动的服务

SERVICE_DISABLED 表示该服务不可启动

SERVICE_SYSTEM_START 用于由IoInitSystem函数创建的设备驱动程序

参数7指定当启动服务失败时,产生的严重程度以及应采取的保护措施。

参数8指定了你要加载的服务的程序路径。


[注意]APP应用上架合规检测服务,协助应用顺利上架!

最后于 2021-11-12 15:26 被1900编辑 ,原因:
收藏
免费 3
支持
分享
最新回复 (10)
雪    币: 3017
活跃值: (2635)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
可惜现在驱动也要签名了
2021-10-7 11:18
0
雪    币: 22413
活跃值: (25381)
能力值: ( LV15,RANK:910 )
在线值:
发帖
回帖
粉丝
3
caocaofff 可惜现在驱动也要签名了
害 做个记录罢了
2021-10-7 12:49
0
雪    币: 293
活跃值: (287)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
explorer 插件启动,任务计划,再加Native 启动,登录之前。
2021-10-20 17:14
0
雪    币: 94
活跃值: (475)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
安装系统服务也行啊
2021-10-25 11:10
0
雪    币: 201
活跃值: (543)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
autoruns里面涵盖了所有启动方式
2021-11-9 17:16
1
雪    币: 2428
活跃值: (2613)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
还有定时任务之类的
2021-11-10 09:49
0
雪    币: 38
活跃值: (33)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
感谢分享
2021-11-10 15:20
0
雪    币: 145
活跃值: (60)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
感谢分享
2022-1-29 11:08
0
雪    币: 238
活跃值: (178)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
椰子比尔 autoruns里面涵盖了所有启动方式
不是所有,是绝大部分
2022-1-29 11:56
0
游客
登录 | 注册 方可回帖
返回
// // 统计代码