// LoadDrives.cpp : 定義控制台應用程式的進入點。<br />//<br />#include "stdafx.h"<br />#include <Windows.h></p><p>LPCTSTR lpRegSoftPath = "SYSTEM//CurrentControlSet//Services"; //註冊表格服務(驅動)路徑<br />LPCTSTR lpRegPath = "SYSTEM//CurrentControlSet//Services//helloDDK"; //註冊表HelloDDK驅動路徑.</p><p>void DelSvr(TCHAR * szSvrName); //卸載驅動<br />int StartSvr(TCHAR* szPath,TCHAR * szSvrName);<br />void CheckReg()<br />{<br />HKEY hSoftKey = NULL;<br />if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,lpRegPath,<br /> 0,KEY_READ|KEY_WRITE,&hSoftKey) != ERROR_SUCCESS)<br />{<br /> printf("建立");<br /> DWORD dwDisp;<br /> if (RegCreateKeyEx(HKEY_LOCAL_MACHINE,lpRegPath,0,REG_NONE,REG_OPTION_NON_VOLATILE,<br /> KEY_WRITE|KEY_READ,NULL,&hSoftKey,&dwDisp) != ERROR_SUCCESS)<br /> {<br /> printf("建立失敗");<br /> }<br /> else<br /> {<br /> TCHAR szDisplayName[] = "HelloDDK_Test";<br /> DWORD dwErrorControl = 1;<br /> TCHAR szGroup[] = "";<br /> TCHAR szImagePath[] = "//??//E://HelloDDK.sys]//??//E://HelloDDK.sys"; //驅動路徑<br /> DWORD dwStart = 3;<br /> DWORD dwType = 1;<br /> RegSetValueEx(hSoftKey,"DisplayName",0,REG_SZ,(BYTE *)szDisplayName,(DWORD)sizeof(szDisplayName));<br /> RegSetValueEx(hSoftKey,"ErrorControl",0,REG_DWORD,(CONST BYTE *)&dwErrorControl,sizeof(DWORD));<br /> RegSetValueEx(hSoftKey,"Group",0,REG_SZ,(BYTE *)szGroup,sizeof(szGroup));<br /> RegSetValueEx(hSoftKey,"ImagePath",0,REG_EXPAND_SZ,(BYTE *)szImagePath,sizeof(szImagePath));<br /> RegSetValueEx(hSoftKey,"Start",0,REG_DWORD,(CONST BYTE *)&dwStart,sizeof(DWORD));<br /> RegSetValueEx(hSoftKey,"Type",0,REG_DWORD,(CONST BYTE *)&dwType,sizeof(DWORD));<br /> }<br />}<br />RegCloseKey(hSoftKey);<br />}<br />int _tmain(int argc, _TCHAR* argv[])<br />{<br />//CheckReg(); //檢測註冊表<br />//StartSvr("E://helloddk.sys","helloddk");<br />DelSvr("HelloDDK");<br />system("pause");<br />return 0;<br />}<br />int StartSvr(TCHAR* szPath,TCHAR * szSvrName)<br />{<br />SC_HANDLE hServiceMgr, hServiceTwdm;<br />BOOL bRtn;<br />DWORD dwRtn, dwSize = 256;<br />TCHAR szDir[256];<br />strcpy(szDir,szPath); //驅動檔案路徑<br />LPCTSTR lpszBinaryPathName = TEXT(szDir);<br />hServiceMgr = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS); //開啟服務控制管理員<br />if( hServiceMgr == NULL )<br />{<br /> printf( "Open SCManager() Faild %d ! /n", GetLastError() );<br /> return 0;<br />}<br />else<br />{<br /> printf( "Open SCManager() ok ! /n" );<br />}<br />printf("================按鍵執行建立或開啟服務./n");<br />system("pause");<br />//建立驅動服務<br />hServiceTwdm = CreateService( hServiceMgr,<br /> TEXT(szSvrName), //SYSTEM/CurrentControlSet/Services 驅動程式的在註冊表中的名字<br /> TEXT(szSvrName), // 註冊表驅動程式的 DisplayName 值<br /> SERVICE_ALL_ACCESS, // 載入驅動程式的存取權限<br /> SERVICE_KERNEL_DRIVER,// 表示載入的服務是驅動程式<br /> SERVICE_DEMAND_START, // 註冊表驅動程式的 Start 值<br /> SERVICE_ERROR_IGNORE, // 註冊表驅動程式的 ErrorControl 值<br /> lpszBinaryPathName, // 註冊表驅動程式的 ImagePath 值<br /> NULL,<br /> NULL,<br /> NULL,<br /> NULL,<br /> NULL);<br />if( hServiceTwdm == NULL )<br />{<br /> dwRtn = GetLastError();<br /> if( dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_EXISTS )<br /> {<br /> CloseServiceHandle( hServiceMgr );<br /> printf( "Create Service() Faild %d ! /n", dwRtn );<br /> system("pause");<br /> return 0;<br /> }<br /> else<br /> {<br /> printf( "Create Service() Faild Service is ERROR_IO_PENDING or ERROR_SERVICE_EXISTS! /n" );<br /> }<br /> // 驅動程式已經載入,只需要開啟<br /> hServiceTwdm = OpenService( hServiceMgr, TEXT(szSvrName), SERVICE_ALL_ACCESS );<br /> if( hServiceTwdm == NULL )<br /> {<br /> dwRtn = GetLastError();<br /> CloseServiceHandle( hServiceMgr );<br /> printf( "OpenService() Faild %d ! /n", dwRtn );<br /> system("pause");<br /> return 0;<br /> }<br /> else<br /> {<br /> printf( "Open Service() ok ! /n" );<br /> }<br />}<br />else<br />{<br /> printf( "Create Service() ok ! /n" );<br />}<br />printf("================按鍵執行啟動驅動服務./n");<br />system("pause");<br />// 啟動驅動程式,調用驅動程式的 DriverEntry 函數<br />bRtn = StartService( hServiceTwdm, NULL, NULL );<br />if( !bRtn )<br />{<br /> dwRtn = GetLastError();<br /> if( dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_ALREADY_RUNNING )<br /> {<br /> printf( "StartService() Faild %d ! /n", dwRtn );<br /> CloseServiceHandle( hServiceTwdm );<br /> CloseServiceHandle( hServiceMgr );<br /> return 0;<br /> }<br /> else<br /> {<br /> if( dwRtn != ERROR_IO_PENDING )<br /> {<br /> printf( "Start Service() Faild ERROR_IO_PENDING ! /n");<br /> }<br /> else<br /> {<br /> printf( "Start Service() Faild ERROR_SERVICE_ALREADY_RUNNING ! /n");<br /> }<br /> }<br />}<br />else<br />{<br /> printf( "Start Service() 成功 ! /n");<br />}<br />printf("===================按鍵執行關閉服務./n");<br />system("pause");<br />SERVICE_STATUS ServiceStatus;<br />ControlService(hServiceTwdm,SERVICE_CONTROL_STOP,&ServiceStatus);<br />CloseServiceHandle( hServiceTwdm );<br />CloseServiceHandle( hServiceMgr );<br />}<br />//卸載驅動程式。<br />void DelSvr(TCHAR* szSvrName)<br />{<br />SC_HANDLE hServiceMgr, hServiceTwdm;<br />SERVICE_STATUS SvrSta;<br />hServiceMgr = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );<br />if( hServiceMgr == NULL )<br />{<br /> printf( "DelSvr::OpenSCManager() Faild %d ! /n", GetLastError() );<br /> return;<br />}<br />else<br />{<br /> printf( "DelSvr::OpenSCManager() ok ! /n" );<br />}<br />hServiceTwdm = OpenService( hServiceMgr, TEXT(szSvrName), SERVICE_ALL_ACCESS );<br />if( hServiceTwdm == NULL )<br />{<br /> CloseServiceHandle( hServiceMgr );<br /> printf( "DelSvr::OpenService() Faild %d ! /n", GetLastError() );<br /> return;<br />}<br />else<br />{<br /> printf( "DelSvr::OpenService() ok ! /n" );<br />}<br />//停止驅動程式,如果停止失敗,只有重新啟動才能,再動態載入。<br />if( !ControlService( hServiceTwdm, SERVICE_CONTROL_STOP , &SvrSta ) )<br />{<br /> printf( "DelSvr::ControlService() Faild %d !/n", GetLastError() );<br />}<br />else<br />{<br /> printf( "DelSvr::ControlService() ok !/n" );<br />}<br />//動態卸載驅動程式。<br />if( !DeleteService( hServiceTwdm ) )<br />{<br /> printf( "DelSvr:eleteSrevice() Faild %d !/n", GetLastError() );<br />}<br />else<br />{<br /> printf( "DelSvr:eleteSrevice() ok !/n" );<br />}<br />CloseServiceHandle( hServiceTwdm );<br />CloseServiceHandle( hServiceMgr );<br />return;<br />}<br />