没有合适的资源?快使用搜索试试~ 我知道了~
首页Win64驱动内核编程环境搭建与调试指南
"天使也掉毛 Win64 驱动内核编程" 是一本关于64位Windows驱动程序开发的教程资源,由作者“天使也掉毛”在CSDN博客上分享。这本书或教程主要涵盖了驱动开发的基础到进阶内容,特别是针对Win64平台的内核编程技术。 在描述中,提到了驱动开发环境的搭建过程,这是学习驱动开发的第一步。首先,需要安装Visual Studio 2015(企业版或其他版本),接着安装Windows Driver Kit (WDK) 10.0.14393.0以及Windows 10 SDK 10.0.14393。安装SDK时,可以通过VS2015的更新功能来尝试,但可能会遇到校验失败的问题,此时可能需要寻找离线安装包。确保SDK和WDK的版本匹配非常重要,这里强调了它们都应为14393版本。 为了进行驱动的调试,通常需要建立一个双机调试环境,即在主机上编写和编译代码,通过虚拟机进行运行和调试。这里推荐使用VMware作为虚拟机软件,并在虚拟机中安装64位的Windows系统(例如Windows 7)。关闭虚拟机的用户账户控制(UAC)是为了避免调试过程中不必要的干扰。安装VMware Tools是为了优化主机和虚拟机之间的交互。然后,在虚拟机中编译并运行驱动程序,这样可以在出现蓝屏等异常情况时获取更详细的信息,而不只是简单的dump文件。 该教程详细介绍了Win64驱动内核编程,包括环境配置、驱动开发基础知识、内核模式编程技巧以及可能遇到的问题和解决方案。对于想要深入理解和实践64位Windows驱动开发的读者来说,这是一个宝贵的资源。通过学习,读者将能够掌握如何创建、调试和优化驱动程序,以及如何处理与操作系统内核交互的各种细节。
资源详情
资源推荐
然后就可以了:
然后是驱动安装程序:
目前如果没有仔细看上面的那个基本模板代码,需要回去仔细看下。大体了解细
节,尤其是里面的注释。
看完代码了,接下来是驱动安装。
驱动安装和服务安装,如果之前写过安装服务的代码看驱动安装代码会很熟悉,
都是采用 SCM 安装。具体流程是:
然后这个函数要仔细看定义:
更详细的细节之前看 MSDN 吧。
然后还是把资料上的模板代码直接拿过来,注意目前先用这个模板,因为这个安
装模板是和上面的那个
Hello World
对应的,等看懂之后了,在自己定义相关驱
动安装和驱动程序的代码,也可以自己写个模板,这里先不自己随便定义,可能
会导致链接名字,驱动名字,还有驱动通讯的那个地方的细节自己弄乱了。这个
博客看完了再回头定义自己的就行。
创建 C++工程,然后直接添加安装代码和安装测试代码:
功能代码:
[cpp] view plain copy
1. /*============================
2. Drvier Control Class (SCM way)
3. ============================*/
4.
5. #pragma comment(lib,"advapi32.lib")
6.
7. class cDrvCtrl
8. {
9. public:
10. cDrvCtrl()
11. {
12. m_pSysPath = NULL;
13. m_pServiceName = NULL;
14. m_pDisplayName = NULL;
15. m_hSCManager = NULL;
16. m_hService = NULL;
17. m_hDriver = INVALID_HANDLE_VALUE;
18. }
19. ~cDrvCtrl()
20. {
21. CloseServiceHandle(m_hService);
22. CloseServiceHandle(m_hSCManager);
23. CloseHandle(m_hDriver);
24. }
25. public:
26. DWORD m_dwLastError;
27. PCHAR m_pSysPath;
28. PCHAR m_pServiceName;
29. PCHAR m_pDisplayName;
30. HANDLE m_hDriver;
31. SC_HANDLE m_hSCManager;
32. SC_HANDLE m_hService;
33. public:
34. BOOL Install(PCHAR pSysPath,PCHAR pServiceName,PCHAR pDisplayName);
35. BOOL Start();
36. BOOL Stop();
37. BOOL Remove();
38. BOOL Open(PCHAR pLinkName);
39. BOOL IoControl(DWORD dwIoCode, PVOID InBuff, DWORD InBuffLen, PVOID OutBuff,
DWORD OutBuffLen, DWORD *RealRetBytes);
40. private:
41. BOOL GetSvcHandle(PCHAR pServiceName);
42. DWORD CTL_CODE_GEN(DWORD lngFunction);
43. protected:
44. //null
45. };
46.
47. BOOL cDrvCtrl::GetSvcHandle(PCHAR pServiceName)
48. {
49. m_pServiceName = pServiceName;
50. m_hSCManager = OpenSCManagerA(NULL,NULL,SC_MANAGER_ALL_ACCESS);
51. if (NULL == m_hSCManager)
52. {
53. m_dwLastError = GetLastError();
54. return FALSE;
55. }
56. m_hService = OpenServiceA(m_hSCManager,m_pServiceName,SERVICE_ALL_ACCESS);
57. if (NULL == m_hService)
58. {
59. CloseServiceHandle(m_hSCManager);
60. return FALSE;
61. }
62. else
63. {
64. return TRUE;
65. }
66. }
67.
68. BOOL cDrvCtrl::Install(PCHAR pSysPath,PCHAR pServiceName,PCHAR pDisplayName)
69. {
70. m_pSysPath = pSysPath;
71. m_pServiceName = pServiceName;
72. m_pDisplayName = pDisplayName;
73. m_hSCManager = OpenSCManagerA(NULL,NULL,SC_MANAGER_ALL_ACCESS);
74. if (NULL == m_hSCManager)
75. {
76. m_dwLastError = GetLastError();
77. return FALSE;
78. }
79. m_hService = CreateServiceA(m_hSCManager,m_pServiceName,m_pDisplayName,
80. SERVICE_ALL_ACCESS,SERVICE_KERNEL_DRIVER,SERVICE
_DEMAND_START,SERVICE_ERROR_NORMAL,
81. m_pSysPath,NULL,NULL,NULL,NULL,NULL);
82. if (NULL == m_hService)
83. {
84. m_dwLastError = GetLastError();
85. if (ERROR_SERVICE_EXISTS == m_dwLastError)
86. {
87. m_hService = OpenServiceA(m_hSCManager,m_pServiceName,SERVICE_ALL_ACCESS);
88. if (NULL == m_hService)
89. {
90. CloseServiceHandle(m_hSCManager);
91. return FALSE;
92. }
93. }
94. else
95. {
96. CloseServiceHandle(m_hSCManager);
97. return FALSE;
98. }
99. }
100. return TRUE;
101. }
102.
103. BOOL cDrvCtrl::Start()
104. {
105. if (!StartServiceA(m_hService,NULL,NULL))
106. {
107. m_dwLastError = GetLastError();
108. return FALSE;
109. }
110. return TRUE;
111. }
112.
113. BOOL cDrvCtrl::Stop()
114. {
115. SERVICE_STATUS ss;
116. GetSvcHandle(m_pServiceName);
117. if (!ControlService(m_hService,SERVICE_CONTROL_STOP,&ss))
118. {
119. m_dwLastError = GetLastError();
120. return FALSE;
121. }
122. return TRUE;
123.
124. }
125.
126. BOOL cDrvCtrl::Remove()
127. {
128. GetSvcHandle(m_pServiceName);
129. if (!DeleteService(m_hService))
130. {
131. m_dwLastError = GetLastError();
132. return FALSE;
133. }
134. return TRUE;
135. }
剩余371页未读,继续阅读
阿亮520
- 粉丝: 1
- 资源: 8
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 新型矿用本安直流稳压电源设计:双重保护电路
- 煤矿掘进工作面安全因素研究:结构方程模型
- 利用同位素位移探测原子内部新型力
- 钻锚机钻臂动力学仿真分析与优化
- 钻孔成像技术在巷道松动圈检测与支护设计中的应用
- 极化与非极化ep碰撞中J/ψ的Sivers与cos2φ效应:理论分析与COMPASS验证
- 新疆矿区1200m深孔钻探关键技术与实践
- 建筑行业事故预防:综合动态事故致因理论的应用
- 北斗卫星监测系统在电网塔形实时监控中的应用
- 煤层气羽状水平井数值模拟:交替隐式算法的应用
- 开放字符串T对偶与双空间坐标变换
- 煤矿瓦斯抽采半径测定新方法——瓦斯储量法
- 大倾角大采高工作面设备稳定与安全控制关键技术
- 超标违规背景下的热波动影响分析
- 中国煤矿选煤设计进展与挑战:历史、现状与未来发展
- 反演技术与RBF神经网络在移动机器人控制中的应用
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功