内核驱动加载顺序
内核的驱动是分组的,系统启动时是根据组来加载的.
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));
}