驱动优先启动(win xp)

驱动代码

 1 #include "ntddk.h"
 2 
 3 
 4 VOID Unload(IN PDRIVER_OBJECT DriverObj)
 5 {
 6     DbgPrint("卸载成功!");
 7 
 8 }
 9 
10 VOID ThreadProc(IN PVOID Context)
11 {
12     LARGE_INTEGER timeout = RtlConvertLongToLargeInteger(-10 * 1000 * 1000);
13 
14 
15     while(TRUE)
16     {
17         KdPrint(("驱动正在运行....\n"));
18         KeDelayExecutionThread(KernelMode,FALSE,&timeout);
19 
20     }
21 
22 }
23 
24 NTSTATUS DriverEntry(IN PDRIVER_OBJECT Driver,IN PUNICODE_STRING RegPath)
25 {
26 
27     HANDLE hThread = NULL;
28     Driver->DriverUnload = Unload;
29 
30     DbgPrint("开始!");
31 
32 
33     PsCreateSystemThread((PHANDLE)&hThread,THREAD_ALL_ACCESS,NULL,NULL,NULL,(PKSTART_ROUTINE)ThreadProc,NULL);
34 
35     return STATUS_SUCCESS;
36 }

 

驱动优先启动实现

  方法1:使用api实现驱动优先启动

VOID DriverApiInstall()
{
    SC_HANDLE hSCmanager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);  //函数建立了一个连接到服务控制管理器,并打开指定的数据库。
    DWORD dwFlags = 1;
    SC_HANDLE hService = CreateService(hSCmanager,               //数据库句柄
                                    TEXT("test"),                //服务名称
                                    TEXT("test"),                //服务显示名称
                                    SC_MANAGER_ALL_ACCESS,          //服务权限
                                    SERVICE_KERNEL_DRIVER,          //服务类型
                                    SERVICE_BOOT_START,            //服务启动类型
                                    SERVICE_ERROR_IGNORE,           //报错处理类型
                                    TEXT("System32\\Drivers\\test.sys"),  //驱动所在的路径
                                    TEXT("System Reserved"),         //服务所在的组
                                    &dwFlags,                  //服务标签
                                    NULL,                     //依赖那个服务
                                    NULL,                     //启动服务名称
                                    NULL);                    //启动服务密码
    //启动服务
      if (hService != NULL)
       {
            StartService(hService,NULL,NULL);
       }
                                
    //关闭服务句柄
    CloseServiceHandle(hSCmanager);
    CloseServiceHandle(hService);
}

 

  方法2:使用修改注册表来实现驱动优先启动

VOID DriverRegeditInstall()
{
    //HKEY_LOCAL_MACHINE\SYSTEM
    SHSetValue(HKEY_LOCAL_MACHINE,                 //键值
        TEXT("SYSTEM\\CurrentControlSet\\Services\\test"),  //路径
        TEXT("ImagePath"),                      //镜像名称
        REG_EXPAND_SZ,                         //类型
        TEXT("System32\\Drivers\\test.sys"),           //镜像值
        sizeof(L"System32\\Drivers\\test.sys"));         //值长度


    DWORD dwStart = SERVICE_BOOT_START;
    DWORD dwType = SERVICE_SYSTEM_START;

    SHSetValue(HKEY_LOCAL_MACHINE,                  //键值
        TEXT("SYSTEM\\CurrentControlSet\\Services\\test"),   //路径
        TEXT("Group"),                         //镜像名称
        REG_EXPAND_SZ,                          //类型
        TEXT("System Reserved"),                   //镜像值
        sizeof(L"System Reserved"));                 //值长度

    SHSetValue(HKEY_LOCAL_MACHINE,                  //键值
        TEXT("SYSTEM\\CurrentControlSet\\Services\\test"),   //路径
        TEXT("Start"),                         //镜像名称
        REG_DWORD,                            //类型
        &dwStart,                             //镜像值
        sizeof(REG_DWORD));                       //值长度

    SHSetValue(HKEY_LOCAL_MACHINE,                   //键值
        TEXT("SYSTEM\\CurrentControlSet\\Services\\test"),    //路径
        TEXT("Type"),                          //镜像名称
        REG_DWORD,                             //类型
        &dwType,                             //镜像值
        sizeof(REG_DWORD));                       //值长度
}

 

posted @ 2022-04-19 21:48  菜鸡拾光  阅读(115)  评论(0)    收藏  举报