当前位置: 代码迷 >> 驱动开发 >> 新人一星期时间未能弄出可通常安装卸载的sys文件,跪求各路大神帮助.
  详细解决方案

新人一星期时间未能弄出可通常安装卸载的sys文件,跪求各路大神帮助.

热度:102   发布时间:2016-04-28 10:09:55.0
新人一星期时间未能弄出可正常安装卸载的sys文件,跪求各路大神帮助...
在搭建环境上就花掉4天终于可以正常生成sys文件了,使用的配置是VS2013+WDK8.1,本来想用wdk7.6的,无奈VS2013和VS2010怎么搭建都不对,现在文件可以正常生成了,在用虚拟机的安装驱动的时候也可以正常安装,但是一卸载驱动就会蓝屏,蓝屏代码0x0000050,虚拟机系统最开始是win7_x86,后来又换了win_xp,两者情况一样 蓝屏0x0000050,初学驱动根本不知道什么状况,最可怕的是,代码我是按照教程写的,教程使用的环境是VS2008+DDK!虚拟机使用教程里的sys文件可以完成驱动的安装和卸载! 这是什么状况?附上代码,
头文件:
#include <ntddk.h>
#define INITCODE code_seg("INIT") 
#define PAGECODE code_seg("PAGE") /*表示内存不足时,可以被置换到硬盘*/
#pragma INITCODE /*指的代码运行后 就从内存释放掉*/
NTSTATUS CreateMyDevice (IN PDRIVER_OBJECT pDriverObject) 
{
NTSTATUS status;
PDEVICE_OBJECT pDevObj;/*用来返回创建设备*/

//创建设备名称
UNICODE_STRING devName;
UNICODE_STRING symLinkName; // 
RtlInitUnicodeString(&devName,L"\\Device\\yjxDDK_Device");/*对devName初始化字串为 "\\Device\\yjxDDK_Device"*/

//创建设备
status = IoCreateDevice( pDriverObject,\
0,\
&devName,\
FILE_DEVICE_UNKNOWN,\
0, TRUE,\
&pDevObj);
if (!NT_SUCCESS(status))
{
if (status==STATUS_INSUFFICIENT_RESOURCES)
{
KdPrint(("资源不足 STATUS_INSUFFICIENT_RESOURCES"));
}
if (status==STATUS_OBJECT_NAME_EXISTS )
{
KdPrint(("指定对象名存在"));
}
if (status==STATUS_OBJECT_NAME_COLLISION)
{
KdPrint(("//对象名有冲突"));
}
KdPrint(("设备创建失败...++++++++"));
return status;
}
KdPrint(("设备创建成功...++++++++"));

pDevObj->Flags |= DO_BUFFERED_IO;
//创建符号链接

RtlInitUnicodeString(&symLinkName,L"\\??\\yjx888");
status = IoCreateSymbolicLink( &symLinkName,&devName );
if (!NT_SUCCESS(status)) /*status等于0*/
{
IoDeleteDevice( pDevObj );
return status;
}
return STATUS_SUCCESS;
}
#pragma  INITCODE
VOID DDK_Unload (IN PDRIVER_OBJECT pDriverObject); //前置说明 卸载例程


C文件:
//_stdcall
#include "mini_ddk.h"
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject,PUNICODE_STRING B) //TYPEDEF LONG NTSTATUS
{
KdPrint(("驱动成功被加载...OK++++++++"));
//jmp指令
 CreateMyDevice(pDriverObject);//创建相应的设备
 pDriverObject->DriverUnload=DDK_Unload;
return (1);
}
VOID DDK_Unload (IN PDRIVER_OBJECT pDriverObject)
{
  PDEVICE_OBJECT pDev;//用来取得要删除设备对象
  UNICODE_STRING symLinkName; // 
 
  pDev=pDriverObject->DeviceObject;
  IoDeleteDevice(pDev); //删除设备
  
  //取符号链接名字
   RtlInitUnicodeString(&symLinkName,L"\\??\\yjx888");
  //删除符号链接
   IoDeleteSymbolicLink(&symLinkName);
 KdPrint(("驱动成功被卸载...OK-----------")); //sprintf,printf
 //取得要删除设备对象
//删掉所有设备
 DbgPrint("卸载成功");
}


http://pan.baidu.com/s/1ntsNPPZ
2个sys文件都已经上传了 
开头DDK的是教程里的用VS2008+DDK,开头WDK的是我编译的VS2013+WDK8.1
求大神帮忙看看是哪里出了问题吧 我实在是弄不明白了
另外想问问大家,平时大家学习驱动的时候用的什么环境呢? 
虚拟机是win_X86的还是64的呢? 还是XP的?
如果是64位的话,那么证书要怎么解决呢? 
如果不是64位的,那学完之后是不是没用了? 我的意思是你做的驱动只能在win7_X86或XP上运行,要做64位和win8还要重写代码?

------解决方案--------------------
这个问题应该是在卸载函数中,删除设备和删除符号链接这两个部分应该没有处理好。
在VS2008+WDK7中,使用的是WDM框架在写驱动程序,很多处理都没有封装完美,不小心就会导致电脑蓝屏。
在VS2013+WDK8.1中,使用的是WDF框架,根据我个人体验来讲,还没有出现蓝屏的情况,当然了,如果自己不懂驱动工作流程,那肯定是要蓝屏的。
对于你的问题,可以上vmware,直接调试,在DDK_Unload这个函数中调试,因为这个名字显然就是使用DDK来编写的,现在都已经是WDK了,可以试一下
  相关解决方案