1. 程式人生 > 其它 >驅動優先啟動(win xp)

驅動優先啟動(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));  //值長度
}