大概的方法是:在HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\下建立你的设备的一个主键,名字和你的sys文件名相同(去掉扩展名)。在加上Type、start、ErrorControl、Group等键值。然后再把你的sys文件copy到system32目录下,重启机器系统会自动加载。或者编写一个安装程序写那几个注册表项,然后调用CreateService函数,这样不用重启也可。以后系统重启时系统也会自动加载。
/////////////////////////////////////
直接修改注册表,也可以!
还不会在系统设备管理里面看到设备,对于那些对异物敏感的客户可能有效,呵呵! \Registry\Machine\System\CurrentControlSet\Services\ABCDEFG
Type = REG_DWORD 0x00000001
Start = REG_DWORD 0x00000002
DisplayName = "myfilename"
ErrorControl = REG_DWORD 0x0000001 这样就可以,自己写吧,只要把sys拷贝到 system32/drivers/即可
重新启动,哈哈,不是就ok了吗? 我已经照做了,可还是不行,请高手帮帮我啊!!
这个SYS是人家提供给我的,用他提供的安装程序安装后是可以正确使用的,但是我现在用它进行开发后,想将它和我的应用程序一起做成一个安装包,但就是装不上去。以上注册表项是它的安装程序建立的,另外还有一项,但是我用REGEDIT既不能删除,也不能导入。其值为:
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\Root\LEGACY_abcd]
"NextInstance"=dword:00000001 [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\Root\LEGACY_DLPORTIO\0000]
"Service"="abcd"
"Legacy"=dword:00000001
"ConfigFlags"=dword:00000000
"Class"="LegacyDriver"
"ClassGUID"="{8ECC055D-047F-11D1-A537-0000F8753ED1}"
"DeviceDesc"="abcd I/O Driver"
"Capabilities"=dword:00000000 [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\Root\LEGACY_DLPORTIO\0000\Control]
"DeviceReference"=dword:81888430
"ActiveService"="abcd" 不知此项对其加载有无影响,又是如何建立的?
/////////////////////////////////////
直接修改注册表,也可以!
还不会在系统设备管理里面看到设备,对于那些对异物敏感的客户可能有效,呵呵! \Registry\Machine\System\CurrentControlSet\Services\ABCDEFG
Type = REG_DWORD 0x00000001
Start = REG_DWORD 0x00000002
DisplayName = "myfilename"
ErrorControl = REG_DWORD 0x0000001 这样就可以,自己写吧,只要把sys拷贝到 system32/drivers/即可
重新启动,哈哈,不是就ok了吗? 我已经照做了,可还是不行,请高手帮帮我啊!!
这个SYS是人家提供给我的,用他提供的安装程序安装后是可以正确使用的,但是我现在用它进行开发后,想将它和我的应用程序一起做成一个安装包,但就是装不上去。以上注册表项是它的安装程序建立的,另外还有一项,但是我用REGEDIT既不能删除,也不能导入。其值为:
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\Root\LEGACY_abcd]
"NextInstance"=dword:00000001 [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\Root\LEGACY_DLPORTIO\0000]
"Service"="abcd"
"Legacy"=dword:00000001
"ConfigFlags"=dword:00000000
"Class"="LegacyDriver"
"ClassGUID"="{8ECC055D-047F-11D1-A537-0000F8753ED1}"
"DeviceDesc"="abcd I/O Driver"
"Capabilities"=dword:00000000 [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\Root\LEGACY_DLPORTIO\0000\Control]
"DeviceReference"=dword:81888430
"ActiveService"="abcd" 不知此项对其加载有无影响,又是如何建立的?
#include <winsvc.h>
#include <conio.h>
#include <iostream.h> void ErrorHandler(char * s,DWORD err)
{
cout << s << endl;
cout << "Error number:" << err << endl;
ExitProcess(err);
}int main(int argc, char* argv[])
{
SC_HANDLE hServiceMgr, hServiceNpf;
DWORD dwRtn;
if (argc!=4)
{
cout << "Usage:\n";
cout << " install service_name \
service_label executable\n";
cout << " service_name is the \
name used internally by the SCM\n";
cout << " service_label is the \
name that appears in the Services applet\n";
cout << " (for multiple \
words,put them in double quotes)\n";
cout << " executable is the \
full path to the EXE \n";
cout << endl;
return 0;
} cout << "Starting ...\n"; //open a connection to the SCM
hServiceMgr = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );
if(hServiceMgr==NULL)
ErrorHandler("In OpenSCManager",GetLastError());
else
cout << "OpenSCManager() ok !" << endl;
//Install the new service hServiceNpf = CreateService(
hServiceMgr, argv[1], //eg "NPF"
argv[2], //eg "Netgroup Packet Filter"
SERVICE_ALL_ACCESS, // 加载驱动程序的访问权限
SERVICE_KERNEL_DRIVER,// 表示加载的服务是驱动程序
2, // 注册表驱动程序的 Start 值
1, // 注册表驱动程序的 ErrorControl 值
argv[3], // 注册表驱动程序的 ImagePath 值
NULL, NULL, NULL, NULL, NULL); if( hServiceNpf==NULL )
{
dwRtn = GetLastError();
if( dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_EXISTS )
{
CloseServiceHandle( hServiceMgr );
ErrorHandler("In CreateService",GetLastError());
}
else
{
cout << "CrateService() Faild Service is ERROR_IO_PENDING or ERROR_SERVICE_EXISTS! " << endl;
} // 驱动程序已经加载,只需要打开
hServiceNpf = OpenService( hServiceMgr, argv[1], SERVICE_ALL_ACCESS );
if( hServiceNpf==NULL )
{
CloseServiceHandle( hServiceMgr );
ErrorHandler("In OpenService", GetLastError());
}
else
{
cout << "OpenService() ok ! " << endl;
}
}
else
{
cout << "CrateService() ok ! " << endl;
}
return 0;
}
#include <iostream.h>void ErrorHandler (char * s,DWORD err)
{
cout << s << endl;
cout << "Error number: " << err << endl;
ExitProcess(err);
}void main (int argc , char * argv[])
{
SC_HANDLE service,scm;
BOOL success;
SERVICE_STATUS status;
if (argc!=2)
{
cout << "Usage:\n";
cout << " remove service_name\n";
return;
}
cout << "Starting ...\n";
//Open a connection to the SCM
scm=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if(scm==NULL)
ErrorHandler("In OpenSCManager",GetLastError());
//Get the service's handle
service=OpenService(scm,argv[1],SERVICE_ALL_ACCESS|DELETE);
if (service==NULL)
ErrorHandler("In OpenService",GetLastError());
//Stop the service if necessary
success=QueryServiceStatus(service,&status);
if (!success)
ErrorHandler("In QueryServiceStatus",GetLastError());
if (status.dwCurrentState!=SERVICE_STOPPED)
{
cout << "Stopping service ...\n";
success=ControlService(service,SERVICE_CONTROL_STOP,&status);
if (!success)
ErrorHandler("In ControlService",GetLastError());
Sleep(500);
}
//Remove the service
success=DeleteService(service);
if(success)
cout << "Service removed\n";
else
ErrorHandler("In DeleteService",GetLastError());
//Clean up
CloseServiceHandle(service);
CloseServiceHandle(scm);
cout << "Ending ...\n";
}