驅動優先啟動(win xp)
阿新 • • 發佈:2022-04-20
驅動程式碼
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)); //值長度 }