DDK程序编译成为。SYS文件后,如何装载进系统
如题。谢了各位。 问题点数:100、回复次数:6Top
1 楼Greenwillow(^_^,~_~)回复于 2002-04-11 10:33:50 得分 50
大概的方法是:在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了吗?
说得好请给点分,说得不好继续问
Top
2 楼someone(阿风)回复于 2002-04-11 10:35:54 得分 0
写inf文件Top
3 楼JoeXu(我是一个诗人)回复于 2002-04-11 10:43:11 得分 25
2种方法,取决你的sys文件的用途。
sys文件如果是设备用的,往往要做一个inf文件,因为device 需要很多参数,一般没有人会自己手动在code中改。这样的话你就要用到UpdateDriver...就是setupapi.dll 的函数,
如果你是一个virtual Device,或者是只是一个Service的话,或者是true Device但是不需要很多的param的话,你可以用Service的方法直接Start it.
下面是example Code:
// install.Inf - NT driver install program
// Modify @ by Sniff Xu,
#include "stdafx.h"
#include "Service.h"
#include <Winsvc.h>
NTServiceInstall::NTServiceInstall()
{
}
NTServiceInstall::~NTServiceInstall()
{
}
//
//Param: DriverName = xxx[.sys], Des file-name
//Param: DriverFromPath = dir-xxx.sys, Source file
//
void NTServiceInstall::InstallDriver( CString DriverName, CString DriverFromPath)
{
/////////////////////////////////////////////////////////////////////////
// Get System32 directory
_TCHAR System32Directory[_MAX_PATH];
if( 0==GetSystemDirectory(System32Directory,_MAX_PATH))
{
AfxMessageBox(_T("Could not find Windows system directory"));
return;
}
/////////////////////////////////////////////////////////////////////////
// Copy driver .sys file across
LPCTSTR lpTempAddString = _tcscat(System32Directory, _T("\\Drivers\\"));
CString TempAddString = lpTempAddString;
CString DriverFullPath = TempAddString + DriverName + ".sys";
if( 0==CopyFile( DriverFromPath, DriverFullPath, FALSE)) // Overwrite OK
{
LPCTSTR Drivers = DriverFromPath;
CString Msg;
Msg.Format(_T("Could not copy %s to %s"), Drivers, DriverFullPath);
AfxMessageBox(Msg);
return;
}
/////////////////////////////////////////////////////////////////////////
// Create driver (or stop existing driver)
if( !CreateDriver( DriverName, DriverFullPath))
return;
/////////////////////////////////////////////////////////////////////////
// Create/Open driver registry key and set its values
// Overwrite registry values written in driver creation
HKEY mru;
DWORD disposition;
if( RegCreateKeyEx( HKEY_LOCAL_MACHINE, \
"SYSTEM\\CurrentControlSet\\Services\\"+DriverName, \
0, NULL, 0, KEY_ALL_ACCESS, NULL, &mru, &disposition)
!= ERROR_SUCCESS)
{
AfxMessageBox(_T("Could not create driver registry key"));
return;
}
// Delete ImagePath
LPCTSTR lpImagePath = _T("ImagePath");
RegDeleteValue(mru, lpImagePath);
// Delete DisplayName
LPCTSTR lpDisplayName = _T("DisplayName");
RegDeleteValue(mru, lpDisplayName);
// ErrorControl
DWORD dwRegValue = SERVICE_ERROR_NORMAL;
LPCTSTR lpErrorControl = _T("ErrorControl");
if( RegSetValueEx(mru, lpErrorControl,0,REG_DWORD,(CONST BYTE*)&dwRegValue,sizeof(DWORD))
!= ERROR_SUCCESS)
{
AfxMessageBox(_T("Could not create driver registry value ErrorControl"));
return;
}
// Start
dwRegValue = SERVICE_AUTO_START;
LPCTSTR lpStart = _T("Start");
if( RegSetValueEx(mru, lpStart,0,REG_DWORD,(CONST BYTE*)&dwRegValue,sizeof(DWORD))
!= ERROR_SUCCESS)
{
AfxMessageBox(_T("Could not create driver registry value Start"));
return;
}
Top
4 楼JoeXu(我是一个诗人)回复于 2002-04-11 10:44:01 得分 0
// Type
dwRegValue = SERVICE_KERNEL_DRIVER;
LPCTSTR lpType = _T("Type");
if( RegSetValueEx(mru, lpType,0,REG_DWORD,(CONST BYTE*)&dwRegValue,sizeof(DWORD))
!= ERROR_SUCCESS)
{
AfxMessageBox(_T("Could not create driver registry value Type"));
return;
}
// DependOnGroup
_TCHAR DependOnGroup[] = _T("Parallel arbitrator\0\0");
LPCTSTR lpDependOnGroup = _T("DependOnGroup");
if( RegSetValueEx(mru, lpDependOnGroup, 0,REG_MULTI_SZ,(CONST BYTE*)&DependOnGroup, _tcslen(lpDependOnGroup)+2)
!= ERROR_SUCCESS)
{
AfxMessageBox(_T("Could not create driver registry value DependOnGroup"));
return;
}
// DependOnService
_TCHAR DependOnService[] = _T("parport\0\0");
LPCTSTR lpDependOnService = _T("DependOnService");
if( RegSetValueEx(mru, lpDependOnService, \
0,REG_MULTI_SZ,(CONST BYTE*)&DependOnService, \
_tcslen(lpDependOnService)+2)
!= ERROR_SUCCESS)
{
AfxMessageBox(_T("Could not create driver registry value DependOnService"));
return;
}
RegCloseKey(mru);
/////////////////////////////////////////////////////////////////////////
// Create/Open driver\Parameters registry key and set its values
if( RegCreateKeyEx( HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\"+DriverName+"\\Parameters",
0, NULL, 0, KEY_ALL_ACCESS, NULL, &mru, &disposition)
!= ERROR_SUCCESS)
{
AfxMessageBox(_T("Could not create driver\\Parameters registry key"));
return;
}
// EventLogLevel
dwRegValue = 1;
LPCTSTR lpEventLogLevel = _T("EventLogLevel");
if( RegSetValueEx(mru, lpEventLogLevel,0,REG_DWORD,(CONST BYTE*)&dwRegValue,sizeof(DWORD))
!= ERROR_SUCCESS)
{
AfxMessageBox(_T("Could not create driver\\Parameters registry value EventLogLevel"));
return;
}
// Default or No Name
CString DefaultName = DriverName;
int DeviceNameLen = DefaultName.GetLength()+1;
LPTSTR lpDefaultName = DefaultName.GetBuffer(DeviceNameLen);
if( RegSetValueEx(mru, NULL,0,REG_SZ,(CONST BYTE*)lpDefaultName,DeviceNameLen)
!= ERROR_SUCCESS)
{
AfxMessageBox(_T("Could not create driver\\Parameters default registry value"));
return;
}
DefaultName.ReleaseBuffer(0);
RegCloseKey(mru);
/////////////////////////////////////////////////////////////////////////
// Open EventLog\System registry key and set its values
LPCTSTR lpData_event = _T("SYSTEM\\CurrentControlSet\\Services\\EventLog\\System");
if( RegCreateKeyEx( HKEY_LOCAL_MACHINE,
lpData_event,
0, NULL,
0, KEY_ALL_ACCESS, NULL, &mru, &disposition)
!= ERROR_SUCCESS)
{
AfxMessageBox(_T("Could not open EventLog\\System registry key"));
return;
}
// get Sources size
DWORD DataSize = 0;
DWORD Type;
if( RegQueryValueEx(mru,_T("Sources"),NULL,&Type,NULL,&DataSize)
!= ERROR_SUCCESS)
{
AfxMessageBox(_T("Could not read size of EventLog\\System registry value Sources"));
return;
}
// read Sources
LPTSTR lpDriverName = DriverName.GetBuffer(DriverName.GetLength()+1);
int DriverNameLen = _tcslen(lpDriverName);
DataSize += DriverNameLen+1;
LPTSTR Sources = new _TCHAR[DataSize];
if( RegQueryValueEx(mru, _T("Sources"),NULL,&Type,(LPBYTE)Sources,&DataSize)
!= ERROR_SUCCESS)
{
AfxMessageBox(_T("Could not read EventLog\\System registry value Sources"));
return;
}
// If driver not there, add and write
if( FindInMultiSz(Sources,DataSize,lpDriverName)==-1)
{
_tcscpy(Sources+DataSize-1,DriverName);
DataSize += DriverNameLen;
*(Sources+DataSize) = '\0';
if( RegSetValueEx(mru,_T("Sources"),0,REG_MULTI_SZ,(CONST BYTE*)Sources,DataSize)
!= ERROR_SUCCESS)
{
AfxMessageBox(_T("Could not create driver registry value Sources"));
return;
}
}
/////////////////////////////////////////////////////////////////////////
// Create/Open EventLog\System\driver registry key and set its values
if( RegCreateKeyEx( HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\EventLog\\System\\"+DriverName,
0, NULL, 0, KEY_ALL_ACCESS, NULL, &mru, &disposition)
!= ERROR_SUCCESS)
{
AfxMessageBox(_T("Could not create EventLog\\System\\driver registry key"));
return;
}
// TypesSupported
dwRegValue = 7;
if( RegSetValueEx(mru,_T("TypesSupported"),0,REG_DWORD,(CONST BYTE*)&dwRegValue,sizeof(DWORD))
!= ERROR_SUCCESS)
{
AfxMessageBox(_T("Could not create EventLog\\System\\driver registry value TypesSupported"));
return;
}
// EventMessageFile
CString TempEventMessageFile = "%SystemRoot%\\System32\\IoLogMsg.dll;%SystemRoot%\\System32\\Drivers\\"+DriverName+".sys";
LPTSTR EventMessageFile = TempEventMessageFile.GetBuffer( TempEventMessageFile.GetLength()+1 );
if( RegSetValueEx(mru,_T("EventMessageFile"),0,REG_EXPAND_SZ,(CONST BYTE*)EventMessageFile,_tcslen(EventMessageFile)+1)
!= ERROR_SUCCESS)
{
AfxMessageBox(_T("Could not create EventLog\\System\\driver registry value EventMessageFile"));
return;
}
RegCloseKey(mru);
/////////////////////////////////////////////////////////////////////////
// Start driver service
if( !StartDriver(DriverName))
return;
}
Top
5 楼JoeXu(我是一个诗人)回复于 2002-04-11 10:44:15 得分 0
//
//Param: DriverName -- Service Name
//Param: FullDriver -- In System diretory sys file full path
//
BOOL NTServiceInstall::CreateDriver( CString DriverName, CString FullDriver)
{
/////////////////////////////////////////////////////////////////////////
// Open service control manager
SC_HANDLE hSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if( hSCManager==NULL)
{
AfxMessageBox(_T("Could not open Service Control Manager"));
return FALSE;
}
/////////////////////////////////////////////////////////////////////////
// If driver is running, stop it
SC_HANDLE hDriver = OpenService(hSCManager,DriverName,SERVICE_ALL_ACCESS);
if( hDriver!=NULL)
{
SERVICE_STATUS ss;
if( ControlService(hDriver,SERVICE_CONTROL_INTERROGATE,&ss))
{
if( ss.dwCurrentState!=SERVICE_STOPPED)
{
if( !ControlService(hDriver,SERVICE_CONTROL_STOP,&ss))
{
AfxMessageBox(_T("Could not stop driver"));
CloseServiceHandle(hSCManager);
CloseServiceHandle(hDriver);
return FALSE;
}
// Give it 10 seconds to stop
BOOL Stopped = FALSE;
for(int seconds=0;seconds<10;seconds++)
{
Sleep(1000);
if( ControlService(hDriver,SERVICE_CONTROL_INTERROGATE,&ss) &&
ss.dwCurrentState==SERVICE_STOPPED)
{
Stopped = TRUE;
break;
}
}
if( !Stopped)
{
AfxMessageBox(_T("Could not stop driver"));
CloseServiceHandle(hSCManager);
CloseServiceHandle(hDriver);
return FALSE;
}
}
CloseServiceHandle(hDriver);
}
return TRUE;
}
/////////////////////////////////////////////////////////////////////////
// Create driver service
hDriver = CreateService(hSCManager,DriverName,DriverName,SERVICE_ALL_ACCESS,
SERVICE_KERNEL_DRIVER,SERVICE_AUTO_START,SERVICE_ERROR_NORMAL,
FullDriver,NULL,NULL,_T("parport\0\0"),NULL,NULL);
if( hDriver==NULL)
{
AfxMessageBox(_T("Could not install driver with Service Control Manager"));
CloseServiceHandle(hSCManager);
return FALSE;
}
/////////////////////////////////////////////////////////////////////////
CloseServiceHandle(hSCManager);
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
BOOL NTServiceInstall::StartDriver(CString DriverName)
{
/////////////////////////////////////////////////////////////////////////
// Open service control manager
SC_HANDLE hSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if( hSCManager==NULL)
{
AfxMessageBox(_T("Could not open Service Control Manager"));
return FALSE;
}
/////////////////////////////////////////////////////////////////////////
// Driver isn't there
SC_HANDLE hDriver = OpenService(hSCManager,DriverName,SERVICE_ALL_ACCESS);
if( hDriver==NULL)
{
AfxMessageBox(_T("Could not open driver service"));
CloseServiceHandle(hSCManager);
return FALSE;
}
SERVICE_STATUS ss;
/*
if( !ControlService(hDriver,SERVICE_CONTROL_INTERROGATE,&ss) ||
ss.dwCurrentState!=SERVICE_STOPPED)
{
AfxMessageBox(_T("Could not interrogate driver service"));
CloseServiceHandle(hSCManager);
CloseServiceHandle(hDriver);
return FALSE;
}
*/
if( !StartService(hDriver,0,NULL))
{
AfxMessageBox(_T("Could not start driver"));
CloseServiceHandle(hSCManager);
CloseServiceHandle(hDriver);
return FALSE;
}
// Give it 10 seconds to start
BOOL Started = FALSE;
for(int seconds=0;seconds<10;seconds++)
{
Sleep(1000);
if( ControlService(hDriver,SERVICE_CONTROL_INTERROGATE,&ss) &&
ss.dwCurrentState==SERVICE_RUNNING)
{
Started = TRUE;
break;
}
}
if( !Started)
{
AfxMessageBox(_T("Could not start driver"));
CloseServiceHandle(hSCManager);
CloseServiceHandle(hDriver);
return FALSE;
}
CloseServiceHandle(hDriver);
CloseServiceHandle(hSCManager);
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// Try to find Match in MultiSz, including Match's terminating \0
int NTServiceInstall::FindInMultiSz(LPTSTR MultiSz, int MultiSzLen, LPTSTR Match)
{
int MatchLen = _tcslen(Match);
_TCHAR FirstChar = *Match;
for(int i=0;i<MultiSzLen-MatchLen;i++)
{
if( *MultiSz++ == FirstChar)
{
BOOL Found = TRUE;
LPTSTR Try = MultiSz;
for(int j=1;j<=MatchLen;j++)
if( *Try++ != Match[j])
{
Found = FALSE;
break;
}
if( Found)
return i;
}
}
return -1;
}Top
6 楼zerone510(仙外有仙)回复于 2002-04-11 10:56:25 得分 25
静态加载sys的话,顶楼的老兄说得很明白了,再此补充一下动态加载sys的方法,不知你需不需要动态加载:
SC_HANDLE hDriver;
SC_HANDLE hSCManager=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if(hSCManager==NULL)
{
printf("Could not open Service Control Manager\n");
return FALSE;
}
//Open driver service
hDriver=OpenService(hSCManager,"ServiceName",SERVICE_ALL_ACCESS);
if(hDriver==NULL)
{
//If can't open, create driver service
hDriver=CreateService(hSCManager,"ServiceName","DisplayName",
SERVICE_ALL_ACCESS,
SERVICE_KERNEL_DRIVER,
SERVICE_DEMAND_START,
SERVICE_ERROR_NORMAL,
"sys文件的全路径名",
NULL,NULL,NULL,NULL,NULL);
if(hDriver==NULL)
{
printf("Could not install driver with Service Control Manager");
CloseServiceHandle(hSCManager);
return FALSE;
}
}
//Start driver service
SERVICE_STATUS ss;
ControlService(hDriver,SERVICE_CONTROL_INTERROGATE,&ss);
if(ss.dwCurrentState == SERVICE_STOPPED)
{
if(!StartService(hDriver,0,NULL))
{
printf("Could not start driver\n");
CloseServiceHandle(hSCManager);
CloseServiceHandle(hDriver);
return FALSE;
}
Sleep(100);
}Top




