CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

DDK程序编译成为。SYS文件后,如何装载进系统

楼主greenwillow01(青柳)2002-04-11 10:24:31 在 VC/MFC / 基础类 提问

如题。谢了各位。 问题点数: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

相关问题

  • 请教高手:DDK程序编译成为。SYS文件后,如何装载进系统,急
  • DDK编译问题
  • DDK编译问题
  • 如何编译DDK的源程序?
  • [求助]关于DDK用的编译器
  • mov ax, es:[di] 在ddk中编译出错
  • win2k DDK sp1, Win2ksvr,DriverStdio3.1上不能编译程序吗?
  • 编译
  • 编译错误
  • 条件编译???

关键词

  • 文件
  • 系统
  • start
  • service
  • ntserviceinstall
  • driverfrompath
  • sys
  • drivername
  • 设备
  • dword0x

得分解答快速导航

  • 帖主:greenwillow01
  • Greenwillow
  • JoeXu
  • zerone510

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo