3599|4

81

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

NT设备驱动程序安装 [复制链接]

在XP操作系统下编了个NT设备驱动程序,怎样能安装上?

最新回复

谢谢! lqp@public3.bta.net.cn   详情 回复 发表于 2009-10-22 21:31
点赞 关注

回复
举报

67

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
  1. 加载一个驱动程序,主要就是,在
  2. SYSTEM\CurrentControlSet\Services 建一个键。
  3. 如:
  4. SYSTEM\CurrentControlSet\Services\Twdm1
  5. Type(1)
  6. ErrorControl(0)
  7. Start(3)

  8. 多数驱动程序都是通过设置 Start 的值为 0, 1, 2 。
  9. 在系统启动的过程中加载驱动程序。

  10. 在WINNT下驱动程序的加载处理上述方式外,
  11. 还可以在应用程序里用 Service Api 实现,驱动程序的动态加载。
  12. 这时候的 Start 为 3 。

  13. 所用到的 Api 为:
  14. OpenSCManager, CreateService, OpenService, StartService
  15. ControlService, DeleteService, CloseServiceHandle

  16. 其中需要说明的是:
  17. CreateService :他通过参数在注册表里自动创建驱动程序需要的键值。
  18. DeleteService :他自动删除驱动程序在注册表里创的键值。

  19. 下面是一个,简单的例子:

  20. 应用程序:

  21. #include "stdafx.h"
  22. #include
  23. #include
  24. #include

  25. void DelSvr( char * szSvrName ); //自动卸载驱动程序。

  26. int main(int argc, char* argv[])
  27. {
  28. HANDLE hWdm;
  29. printf("Hello World!\n");

  30. SC_HANDLE hServiceMgr, hServiceTwdm;
  31. BOOL bRtn;
  32. DWORD dwRtn, dwSize = 256;
  33. char szDir[256];

  34. if( argc > 1 ) //加任一个参数表示卸载驱动程序。
  35. {
  36. DelSvr( "Twdm1" );
  37. return 0;
  38. }

  39. GetCurrentDirectory( dwSize, szDir );//取当前目录
  40. strcat( szDir, "\\Twdm.sys" ); //取驱动程序的全路径

  41. LPCTSTR lpszBinaryPathName = TEXT(szDir);
  42. hServiceMgr = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS ); //打开服务控制管理器

  43. if( hServiceMgr == NULL )
  44. {
  45. printf( "OpenSCManager() Faild %d ! \n", GetLastError() );
  46. return 0;
  47. }
  48. else
  49. {
  50. printf( "OpenSCManager() ok ! \n" );
  51. }

  52. hServiceTwdm = CreateService( hServiceMgr,
  53. TEXT("Twdm1"), //SYSTEM\CurrentControlSet\Services 驱动程序的在注册表中的名字
  54. TEXT("Twdm1"), // 注册表驱动程序的 DisplayName 值
  55. SERVICE_ALL_ACCESS, // 加载驱动程序的访问权限
  56. SERVICE_KERNEL_DRIVER,// 表示加载的服务是驱动程序
  57. SERVICE_DEMAND_START, // 注册表驱动程序的 Start 值
  58. SERVICE_ERROR_IGNORE, // 注册表驱动程序的 ErrorControl 值
  59. lpszBinaryPathName, // 注册表驱动程序的 ImagePath 值
  60. NULL,
  61. NULL,
  62. NULL,
  63. NULL,
  64. NULL);

  65. if( hServiceTwdm == NULL )
  66. {
  67. dwRtn = GetLastError();
  68. if( dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_EXISTS )
  69. {
  70. CloseServiceHandle( hServiceMgr );
  71. printf( "CrateService() Faild %d ! \n", dwRtn );
  72. return 0;
  73. }
  74. else
  75. {
  76. printf( "CrateService() Faild Service is ERROR_IO_PENDING or ERROR_SERVICE_EXISTS! \n" );
  77. }

  78. // 驱动程序已经加载,只需要打开
  79. hServiceTwdm = OpenService( hServiceMgr, TEXT("Twdm1"), SERVICE_ALL_ACCESS );
  80. if( hServiceTwdm == NULL )
  81. {
  82. dwRtn = GetLastError();
  83. CloseServiceHandle( hServiceMgr );
  84. printf( "OpenService() Faild %d ! \n", dwRtn );
  85. return 0;
  86. }
  87. else
  88. {
  89. printf( "OpenService() ok ! \n" );
  90. }
  91. }
  92. else
  93. {
  94. printf( "CrateService() ok ! \n" );
  95. }

  96. // 启动驱动程序,调用驱动程序的 DriverEntry 函数
  97. bRtn = StartService( hServiceTwdm, NULL, NULL );
  98. if( !bRtn )
  99. {
  100. dwRtn = GetLastError();
  101. if( dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_ALREADY_RUNNING )
  102. {
  103. printf( "StartService() Faild %d ! \n", dwRtn );
  104. CloseServiceHandle( hServiceTwdm );
  105. CloseServiceHandle( hServiceMgr );
  106. return 0;
  107. }
  108. else
  109. {
  110. if( dwRtn != ERROR_IO_PENDING )
  111. {
  112. printf( "StartService() Faild ERROR_IO_PENDING ! \n");
  113. }
  114. else
  115. {
  116. printf( "StartService() Faild ERROR_SERVICE_ALREADY_RUNNING ! \n");
  117. }
  118. }
  119. }

  120. //测试驱动程序
  121. hWdm = CreateFile("\\\\.\\Twdm1",
  122. GENERIC_WRITE | GENERIC_READ,
  123. 0,
  124. NULL,
  125. OPEN_EXISTING,
  126. 0,
  127. NULL);
  128. if( hWdm != INVALID_HANDLE_VALUE )
  129. {
  130. printf( "Open Driver Twdm ok ! \n" );
  131. }
  132. else
  133. {
  134. printf( "Open Driver Twdm faild %d ! \n", GetLastError() );
  135. }
  136. CloseHandle( hWdm );
  137. CloseServiceHandle( hServiceTwdm );
  138. CloseServiceHandle( hServiceMgr );

  139. //这时候你可以通过注册表,或其他查看符号连接的软件验证。
  140. printf( "按任意键 卸载驱动程序 !\n" );
  141. getch();
  142. //卸载驱动程序。
  143. DelSvr( "Twdm1" );
  144. return 0;
  145. }

  146. //卸载驱动程序。
  147. void DelSvr( char * szSvrName )
  148. {
  149. SC_HANDLE hServiceMgr, hServiceTwdm;
  150. SERVICE_STATUS SvrSta;
  151. hServiceMgr = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );
  152. if( hServiceMgr == NULL )
  153. {
  154. printf( "DelSvr::OpenSCManager() Faild %d ! \n", GetLastError() );
  155. return;
  156. }
  157. else
  158. {
  159. printf( "DelSvr::OpenSCManager() ok ! \n" );
  160. }
  161. hServiceTwdm = OpenService( hServiceMgr, TEXT(szSvrName), SERVICE_ALL_ACCESS );

  162. if( hServiceTwdm == NULL )
  163. {
  164. CloseServiceHandle( hServiceMgr );
  165. printf( "DelSvr::OpenService() Faild %d ! \n", GetLastError() );
  166. return;
  167. }
  168. else
  169. {
  170. printf( "DelSvr::OpenService() ok ! \n" );
  171. }
  172. //停止驱动程序,如果停止失败,只有重新启动才能,再动态加载。
  173. if( !ControlService( hServiceTwdm, SERVICE_CONTROL_STOP , &SvrSta ) )
  174. {
  175. printf( "DelSvr::ControlService() Faild %d !\n", GetLastError() );
  176. }
  177. else
  178. {
  179. printf( "DelSvr::ControlService() ok !\n" );
  180. }
  181. //动态卸载驱动程序。
  182. if( !DeleteService( hServiceTwdm ) )
  183. {
  184. printf( "DelSvr::DeleteSrevice() Faild %d !\n", GetLastError() );
  185. }
  186. else
  187. {
  188. printf( "DelSvr::DeleteSrevice() ok !\n" );
  189. }
  190. CloseServiceHandle( hServiceTwdm );
  191. CloseServiceHandle( hServiceMgr );
  192. return;
  193. }
复制代码
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
非常感谢wx7864566!

我的驱动程序名是TIMERDRV.sys,是一块ISA板卡的驱动,板卡没装。程序编译成功后复制到系统目录的sysytem32\drivers目录中,我再运行TIMER.INI文件,内容是

\registry\machine\system\currentcontrolset\services\TIMERDRV
    Type = REG_DWORD 0x00000001
    Start = REG_DWORD 0x00000001
    Group = Extended base
    ErrorControl = REG_DWORD 0x00000001
    DisplayName = REG_SZ TIMERDRV

运行命令用regini.exe TIMER.INI,用regedit查看注册表,TIMERDRV已在注册表中,重新启动XP系统,到设备管理器中查看“显示隐藏的设备”,但就是找不到TIMERDRV。

我不知怎样下手寻找装不上的原因,装不上就没办法调试啊。请高手指点,谢谢!
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

4
 
留个邮箱给我 我给你发个装sys服务器的小工具
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

5
 
谢谢!

lqp@public3.bta.net.cn
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表