实现驱动最早启动

内核驱动加载顺序

内核的驱动是分组的,系统启动时是根据组来加载的.
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ServiceGroupOrder 这个注册表项记录了组的启动顺序,可以从下图看出最早启动的组是System Reserved
在这里插入图片描述

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GroupOrderList 此注册表项记录了每一个组内不同服务的启动顺序

在这里插入图片描述
GroupOrderList 的每一各组内的数据是4字节的,记录的是组内服务的tag值,系统启动时会先查找组然后查找组内对应的值,如果服务的tag和这个值相等,就加载这个服务.
在这里插入图片描述

要让我们的驱动实现最早启动,需要有以下几点注意的地方
1:驱动文件的目录需要在system32目录下
2:把驱动目录前面的路径删除,剩下以system32开头的目录
在这里插入图片描述

3:打开注册表,HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LoadFirst 把start改成 0 表示系统引导启动
4:新建一个字符串值,键名:Group 键值 System Reserved
在这里插入图片描述
重启系统就可以看见,我们自己的驱动模块是在第5个位置加载的.
在这里插入图片描述

程序安装实现驱动最早启动

创建服务的方式

VOID ServiceInstall()
{

	SC_HANDLE hSCmanager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
	SC_HANDLE hService;
	DWORD dwTag = 1;
	hService = CreateService(hSCmanager,
		TEXT("loadfirst"),
		TEXT("loadfirst"),
		SERVICE_ALL_ACCESS,
		SERVICE_KERNEL_DRIVER,
		SERVICE_BOOT_START,
		SERVICE_ERROR_IGNORE,
		TEXT("System32\\Drivers\\loadfirst.sys"),	//驱动的路径
		TEXT("System Reserved"),
		&dwTag, NULL, NULL, NULL
		);
	// 	if (hService != NULL)
	// 	{
	// 		StartService(hService,NULL,NULL);
	// 	}
	CloseServiceHandle(hSCmanager);
	CloseServiceHandle(hService);


}

直接修改注册表方式

//需要静态引入DLL
#include <shlwapi.h>
#pragma comment(lib,"Shlwapi.lib")

VOID ServiceInstall()
{
	//HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\loadfirst
	DWORD dwStart = SERVICE_BOOT_START;
	DWORD dwType = SERVICE_KERNEL_DRIVER;
	DWORD dwTag = 1;
	SHSetValue(HKEY_LOCAL_MACHINE, TEXT("SYSTEM\\CurrentControlSet\\Services\\loadfirst"), TEXT("ImagePath"), REG_EXPAND_SZ, TEXT("\\SystemRoot\\System32\\Drivers\\.aaa%I64x.sys"), (lstrlen(TEXT("\\SystemRoot\\System32\\Drivers\\.aaa%I64x.sys")) + 1)*sizeof(TCHAR));
	SHSetValue(HKEY_LOCAL_MACHINE, TEXT("SYSTEM\\CurrentControlSet\\Services\\loadfirst"), TEXT("Group"), REG_EXPAND_SZ, TEXT("System Reserved"), (lstrlen(TEXT("System Reserved")) + 1)*sizeof(TCHAR));
	SHSetValue(HKEY_LOCAL_MACHINE, TEXT("SYSTEM\\CurrentControlSet\\Services\\loadfirst"), TEXT("Start"), REG_DWORD, &dwStart, sizeof(dwStart));
	SHSetValue(HKEY_LOCAL_MACHINE, TEXT("SYSTEM\\CurrentControlSet\\Services\\loadfirst"), TEXT("Type"), REG_DWORD, &dwType, sizeof(dwType));

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值