LPCTSTR lpRegSoftPath = "SYSTEM//CurrentControlSet//Services"; //注册表服务(驱动)路径
LPCTSTR lpRegPath = "SYSTEM//CurrentControlSet//Services//helloDDK"; //注册表HelloDDK驱动路径.
void DelSvr(TCHAR * szSvrName); //卸载驱动
int StartSvr(TCHAR* szPath,TCHAR * szSvrName);
void CheckReg()
{
HKEY hSoftKey = NULL;
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,lpRegPath,
0,KEY_READ|KEY_WRITE,&hSoftKey) != ERROR_SUCCESS)
{
printf("创建");
DWORD dwDisp;
if (RegCreateKeyEx(HKEY_LOCAL_MACHINE,lpRegPath,0,REG_NONE,REG_OPTION_NON_VOLATILE,
KEY_WRITE|KEY_READ,NULL,&hSoftKey,&dwDisp) != ERROR_SUCCESS)
{
printf("创建失败");
}
else
{
TCHAR szDisplayName[] = "HelloDDK_Test";
DWORD dwErrorControl = 1;
TCHAR szGroup[] = "";
TCHAR szImagePath[] = "//??//E://HelloDDK.sys]//??//E://HelloDDK.sys"; //驱动路径
DWORD dwStart = 3;
DWORD dwType = 1;
RegSetValueEx(hSoftKey,"DisplayName",0,REG_SZ,(BYTE *)szDisplayName,(DWORD)sizeof(szDisplayName));
RegSetValueEx(hSoftKey,"ErrorControl",0,REG_DWORD,(CONST BYTE *)&dwErrorControl,sizeof(DWORD));
RegSetValueEx(hSoftKey,"Group",0,REG_SZ,(BYTE *)szGroup,sizeof(szGroup));
RegSetValueEx(hSoftKey,"ImagePath",0,REG_EXPAND_SZ,(BYTE *)szImagePath,sizeof(szImagePath));
RegSetValueEx(hSoftKey,"Start",0,REG_DWORD,(CONST BYTE *)&dwStart,sizeof(DWORD));
RegSetValueEx(hSoftKey,"Type",0,REG_DWORD,(CONST BYTE *)&dwType,sizeof(DWORD));
}
}
RegCloseKey(hSoftKey);
}
int _tmain(int argc, _TCHAR* argv[])
{
//CheckReg(); //检测注册表
//StartSvr("E://helloddk.sys","helloddk");
DelSvr("HelloDDK");
system("pause");
return 0;
}
int StartSvr(TCHAR* szPath,TCHAR * szSvrName)
{
SC_HANDLE hServiceMgr, hServiceTwdm;
BOOL bRtn;
DWORD dwRtn, dwSize = 256;
TCHAR szDir[256];
strcpy(szDir,szPath); //驱动文件路径
LPCTSTR lpszBinaryPathName = TEXT(szDir);
hServiceMgr = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS); //打开服务控制管理器
if( hServiceMgr == NULL )
{
printf( "Open SCManager() Faild %d ! /n", GetLastError() );
return 0;
}
else
{
printf( "Open SCManager() ok ! /n" );
}
printf("================按键执行创建或打开服务./n");
system("pause");
//创建驱动服务
hServiceTwdm = CreateService( hServiceMgr,
TEXT(szSvrName), //SYSTEM/CurrentControlSet/Services 驱动程序的在注册表中的名字
TEXT(szSvrName), // 注册表驱动程序的 DisplayName 值
SERVICE_ALL_ACCESS, // 加载驱动程序的访问权限
SERVICE_KERNEL_DRIVER,// 表示加载的服务是驱动程序
SERVICE_DEMAND_START, // 注册表驱动程序的 Start 值
SERVICE_ERROR_IGNORE, // 注册表驱动程序的 ErrorControl 值
lpszBinaryPathName, // 注册表驱动程序的 ImagePath 值
NULL,
NULL,
NULL,
NULL,
NULL);
if( hServiceTwdm == NULL )
{
dwRtn = GetLastError();
if( dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_EXISTS )
{
CloseServiceHandle( hServiceMgr );
printf( "Create Service() Faild %d ! /n", dwRtn );
system("pause");
return 0;
}
else
{
printf( "Create Service() Faild Service is ERROR_IO_PENDING or ERROR_SERVICE_EXISTS! /n" );
}
// 驱动程序已经加载,只需要打开
hServiceTwdm = OpenService( hServiceMgr, TEXT(szSvrName), SERVICE_ALL_ACCESS );
if( hServiceTwdm == NULL )
{
dwRtn = GetLastError();
CloseServiceHandle( hServiceMgr );
printf( "OpenService() Faild %d ! /n", dwRtn );
system("pause");
return 0;
}
else
{
printf( "Open Service() ok ! /n" );
}
}
else
{
printf( "Create Service() ok ! /n" );
}
printf("================按键执行启动驱动服务./n");
system("pause");
// 启动驱动程序,调用驱动程序的 DriverEntry 函数
bRtn = StartService( hServiceTwdm, NULL, NULL );
if( !bRtn )
{
dwRtn = GetLastError();
if( dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_ALREADY_RUNNING )
{
printf( "StartService() Faild %d ! /n", dwRtn );
CloseServiceHandle( hServiceTwdm );
CloseServiceHandle( hServiceMgr );
return 0;
}
else
{
if( dwRtn != ERROR_IO_PENDING )
{
printf( "Start Service() Faild ERROR_IO_PENDING ! /n");
}
else
{
printf( "Start Service() Faild ERROR_SERVICE_ALREADY_RUNNING ! /n");
}
}
}
else
{
printf( "Start Service() 成功 ! /n");
}
printf("===================按键执行关闭服务./n");
system("pause");
SERVICE_STATUS ServiceStatus;
ControlService(hServiceTwdm,SERVICE_CONTROL_STOP,&ServiceStatus);
CloseServiceHandle( hServiceTwdm );
CloseServiceHandle( hServiceMgr );
}
//卸载驱动程序。
void DelSvr(TCHAR* szSvrName)
{
SC_HANDLE hServiceMgr, hServiceTwdm;
SERVICE_STATUS SvrSta;
hServiceMgr = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );
if( hServiceMgr == NULL )
{
printf( "DelSvr::OpenSCManager() Faild %d ! /n", GetLastError() );
return;
}
else
{
printf( "DelSvr::OpenSCManager() ok ! /n" );
}
hServiceTwdm = OpenService( hServiceMgr, TEXT(szSvrName), SERVICE_ALL_ACCESS );
if( hServiceTwdm == NULL )
{
CloseServiceHandle( hServiceMgr );
printf( "DelSvr::OpenService() Faild %d ! /n", GetLastError() );
return;
}
else
{
printf( "DelSvr::OpenService() ok ! /n" );
}
//停止驱动程序,如果停止失败,只有重新启动才能,再动态加载。
if( !ControlService( hServiceTwdm, SERVICE_CONTROL_STOP , &SvrSta ) )
{
printf( "DelSvr::ControlService() Faild %d !/n", GetLastError() );
}
else
{
printf( "DelSvr::ControlService() ok !/n" );
}
//动态卸载驱动程序。
if( !DeleteService( hServiceTwdm ) )
{
printf( "DelSvr:eleteSrevice() Faild %d !/n", GetLastError() );
}
else
{
printf( "DelSvr:eleteSrevice() ok !/n" );
}
CloseServiceHandle( hServiceTwdm );
CloseServiceHandle( hServiceMgr );
return;
}