首页
社区
课程
招聘
[求助]NT式驱动:一星期时间未能弄出可正常安装卸载的sys文件,跪求各路大神帮助...
发表于: 2014-5-24 11:38 6074

[求助]NT式驱动:一星期时间未能弄出可正常安装卸载的sys文件,跪求各路大神帮助...

2014-5-24 11:38
6074
在搭建环境上就花掉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还要重写代码?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 31
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
1、INITCODE的问题?卸载的时候Unload函数不在内存了把?
2、学驱动我用VS2010+WDK7.6,虚拟机用XP
3、先学32位的,64位是一样的,甚至代码都不用改就能编译成64位驱动。学习和开发64位驱动不用证书,测试模式就行了。
2014-5-24 12:22
0
雪    币: 27
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
解答你后面的问题

网上的免费32位驱动教程多如牛毛,不懂用GOOGLE就去亚马逊买书看
64位免费的驱动教程,目前就这一个http://bbs.pediy.com/showthread.php?t=187348
2014-5-24 12:36
0
雪    币: 468
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
派遣例程都没有正确设置,不蓝屏才怪。
DriverEntry一个重要的工作就是设置
DriverObject->MajorFunction[IRP_MJ_XXXXX]。
2014-5-24 12:42
0
雪    币: 84
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
[QUOTE=aait;1287135]派遣例程都没有正确设置,不蓝屏才怪。
DriverEntry一个重要的工作就是设置
DriverObject->MajorFunction[IRP_MJ_XXXXX]。[/QUOTE]

系统有默认的派遣函数,如果不处理的话是可以不设置的。
2014-5-24 14:45
0
雪    币: 284
活跃值: (3579)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
6
有现成的驱动开发的书,比如《寒江独钓》
2014-5-24 15:15
0
雪    币: 294
活跃值: (119)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
7
平时大家学习驱动的时候用的什么环境呢?
我是VS2012+WDK8
虚拟机是win_X86的还是64的呢? 还是XP的?
我的是WIN7 64位
如果是64位的话,那么证书要怎么解决呢?
破解PG:http://bbs.pediy.com/showthread.php?t=187348 看这个帖子
如果不是64位的,那学完之后是不是没用了? 我的意思是你做的驱动只能在win7_X86或XP上运行,要做64位和win8还要重写代码?
不是学完就没用了,而是之间有少许不同。学习的只是总会有用的。
HelloNTDriver代码(我用的C++写的,微软官方推荐用C写驱动):
#ifdef __cplusplus
extern "C"
{
#endif
#include <ntddk.h>
#ifdef __cplusplus
}
#endif

NTSTATUS HelloNTDDKDispatch (PDRIVER_OBJECT pDeivceObject, PIRP pIrp);
VOID DriverUnload(PDRIVER_OBJECT pDriverObject);
NTSTATUS CreateDevice(PDRIVER_OBJECT pDriverObject);
NTSTATUS CreateDevice2(PDRIVER_OBJECT pDriverObject);

typedef struct _DEVICE_EXTENSION
{
        PDEVICE_OBJECT pDevice;
        UNICODE_STRING ustrDeviceName;
        UNICODE_STRING ustrSymLinkName;
}DEIVCE_EXTENSION, *PDEVICE_ENTENSION;

VOID DumpInformation(PDRIVER_OBJECT pDriverObject)
{
        DbgPrint("---------------------------------------------------\n");
        DbgPrint("Begin Dump.....\n");
        DbgPrint("Driver Address:0X%08X\n",pDriverObject);
        DbgPrint("Driver name:%wZ\n",&pDriverObject->DriverName);
        DbgPrint("Driver HardwareDatabase:%wZ\n",&pDriverObject->HardwareDatabase);
        DbgPrint("Driver first device:0X%08X\n",&pDriverObject->DeviceObject);

        PDEVICE_OBJECT pDevice = pDriverObject->DeviceObject;
        int i =1;
        for (;pDevice!=NULL;pDevice =pDevice->NextDevice)
        {
                DbgPrint("The %d Device\n",i++);
                DbgPrint("Device AttachedDevice:0X%08X\n",pDevice->AttachedDevice);
                DbgPrint("Device NextDevice:0X%08X\n",pDevice->NextDevice);
                DbgPrint("Device StackSize:%d\n",pDevice->StackSize);
                DbgPrint("Device's DriverObject:0X%08X\n",pDevice->DriverObject);
        }

        DbgPrint("Dump END.....\n");
        DbgPrint("---------------------------------------------------\n");
}

extern "C" NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegistryPath)
{
        NTSTATUS status;
        __asm int 3;
        DbgPrint("DirverEntry...\n");

        pDriverObject->DriverUnload = DriverUnload;
        pDriverObject->MajorFunction[IRP_MJ_CLOSE] = (PDRIVER_DISPATCH)HelloNTDDKDispatch;
        pDriverObject->MajorFunction[IRP_MJ_CREATE] = (PDRIVER_DISPATCH)HelloNTDDKDispatch;
        pDriverObject->MajorFunction[IRP_MJ_READ] = (PDRIVER_DISPATCH)HelloNTDDKDispatch;
        pDriverObject->MajorFunction[IRP_MJ_WRITE] = (PDRIVER_DISPATCH)HelloNTDDKDispatch;

        status = CreateDevice(pDriverObject);
        status = CreateDevice2(pDriverObject);

        DumpInformation(pDriverObject);

        DbgPrint("DirverEntry leave...\n");
        return status;

}

VOID DriverUnload(PDRIVER_OBJECT pDriverObject)
{
        PDEVICE_OBJECT pNextObj;
        DbgPrint("Enter DriverUnload\n");
        pNextObj = pDriverObject->DeviceObject;
        while (pNextObj != NULL)
        {
                PDEVICE_ENTENSION pDevExt = (PDEVICE_ENTENSION)pNextObj->DeviceExtension;

                UNICODE_STRING pLinkName = pDevExt->ustrSymLinkName;
                IoDeleteSymbolicLink(&pLinkName);
                pNextObj = pNextObj->NextDevice;
                IoDeleteDevice(pDevExt->pDevice);
        }

}

NTSTATUS HelloNTDDKDispatch (PDRIVER_OBJECT pDeivceObject, PIRP pIrp)
{
        DbgPrint("Enter HelloNTDDKDispatch\n");
        NTSTATUS status = STATUS_SUCCESS;

        pIrp->IoStatus.Status = status;
        pIrp->IoStatus.Information = 0;
        IoCompleteRequest(pIrp,IO_NO_INCREMENT);
        DbgPrint("Leave HelloNTDDKDispatch\n");
        return status;
}

NTSTATUS CreateDevice(PDRIVER_OBJECT pDriverObject)
{
        NTSTATUS status;
        PDEVICE_OBJECT pDevObj;
        PDEVICE_ENTENSION pDevExt;

        UNICODE_STRING devName;
        RtlInitUnicodeString(&devName,L"\\Device\\HelloNTDDK");

        status = IoCreateDevice(pDriverObject,sizeof(DEIVCE_EXTENSION),&devName,FILE_DEVICE_UNKNOWN,0,TRUE,&pDevObj);

        if (!NT_SUCCESS(status))
        {
                return status;
        }

        pDevObj->Flags |= DO_BUFFERED_IO;
        pDevExt = (PDEVICE_ENTENSION)pDevObj->DeviceExtension;
        pDevExt->pDevice = pDevObj;
        pDevExt->ustrDeviceName = devName;

        UNICODE_STRING symLinkName;
        RtlInitUnicodeString(&symLinkName,L"\\??\\HelloNTDDK");
        pDevExt->ustrSymLinkName = symLinkName;
        status = IoCreateSymbolicLink(&symLinkName,&devName);
        if (!NT_SUCCESS(status))
        {
                IoDeleteDevice(pDevObj);
                return status;
        }

        return STATUS_SUCCESS;
}

NTSTATUS CreateDevice2(PDRIVER_OBJECT pDriverObject)
{
        NTSTATUS status;
        PDEVICE_OBJECT pDevObj;
        PDEVICE_ENTENSION pDevExt;

        UNICODE_STRING devName;
        RtlInitUnicodeString(&devName,L"\\Device\\HelloNTDDK2");

        status = IoCreateDevice(pDriverObject,sizeof(DEIVCE_EXTENSION),&devName,FILE_DEVICE_UNKNOWN,0,TRUE,&pDevObj);

        if (!NT_SUCCESS(status))
        {
                return status;
        }

        pDevObj->Flags |= DO_BUFFERED_IO;
        pDevExt = (PDEVICE_ENTENSION)pDevObj->DeviceExtension;
        pDevExt->pDevice = pDevObj;
        pDevExt->ustrDeviceName = devName;

        UNICODE_STRING symLinkName;
        RtlInitUnicodeString(&symLinkName,L"\\??\\HelloNTDDK2");
        pDevExt->ustrSymLinkName = symLinkName;
        status = IoCreateSymbolicLink(&symLinkName,&devName);
        if (!NT_SUCCESS(status))
        {
                IoDeleteDevice(pDevObj);
                return status;
        }

        return STATUS_SUCCESS;
}
2014-5-24 15:31
0
雪    币: 44
活跃值: (186)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
我也来看看各大牛的答案
2014-5-24 20:54
0
游客
登录 | 注册 方可回帖
返回
//