鱼C论坛

 找回密码
 立即注册
查看: 2281|回复: 1

郁金香驱动学习>第5课:卸载设备对象和符号

[复制链接]
发表于 2015-7-21 16:45:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
有兴趣学习过游戏驱动保护的朋友,欢迎加我qq :2779535853  一起学习讨论

mini_ddk.h  代码如下
//2015年7月20日 15:14:22


#include <ntddk.h>

//定义个INITCODE宏,这个宏表示 初始化的时候载入内存,然后可以从内存中卸载掉
#define INITCODE code_seg("INIT") //;注意这里是不能加分号的 
#define PAGECODE code_seg("PAGE") //表示内存不够用时,可以置换到虚拟内存(硬盘)

//驱动设备
#pragma INITCODE //表示这个函数运行后,就从内存中释放掉
NTSTATUS CreateMyDevice (IN PDRIVER_OBJECT pDriverObject) 
{
        NTSTATUS status; // NTSTATUS 等价于 LONG
        PDEVICE_OBJECT pDevObj;/*用来返回创建设备*/

        //UNICODE_STRING 类型为UNICODE的字符结构,里面包含3个成员,第一个Length 表示buffer字节的长度,不包含NULL,第二个MaximumLength:buffer总的字节大小,第三个Buffer:指向宽字符的指针
        //创建设备名称
        UNICODE_STRING devName;  
        UNICODE_STRING symLinkName;

        //会动态分配一块指向“\\Device\\yjxDDK_Device”的内存指针,赋值给devName.Buffer;
        RtlInitUnicodeString(&devName,L"\\Device\\yjxDDK_Device");/*对devName初始化字串为 "\\Device\\yjxDDK_Device"*/

        //IoCreateDevice 创建设备对象,并更新pDriverObject->DeviceObject 为新创建的设备对象
        //介绍每个参数
        // pDriverObject  该参数用于在驱动程序和新设备对象之间建立连接,
        // 0              第二个参数是设备扩展结构的大小
        // &devName       命名该设备对象的UNICODE_STRING串的地址
        // &FILE_DEVICE_UNKNOWN       设备类型
        // 0              为设备对象提供Characteristics标志
        // TRUE           指出设备是否是排斥的
        // &pDevObj       设备对象的名字,有了名字应用程序就可以访问该设备的驱动对象了
        status = IoCreateDevice( pDriverObject,\
                0,\
                &devName,\
                FILE_DEVICE_UNKNOWN,\
                0, TRUE,\
                &pDevObj);

        //NT_SUCCESS宏定义:表示判断 status>=0 
        if (!NT_SUCCESS(status)) //成功返回0  0>=0 吗 true 取反  false 不执行
        {
                if(status == STATUS_INSUFFICIENT_RESOURCES)
                {
                        KdPrint(("STATUS_INSUFFICIENT_RESOURCES 资源不足"));
                }
                if(status == STATUS_OBJECT_NAME_EXISTS)
                {
                        KdPrint(("STATUS_OBJECT_NAME_EXISTS 指定对象不存在"));
                }
                if(status == STATUS_OBJECT_NAME_COLLISION)
                {
                        KdPrint(("STATUS_INSUFFICIENT_RESOURCES 对象名有冲突"));
                }
                KdPrint(("创建设备错误,返回值是=%d ",status));
                return status;
        }

        KdPrint(("创建设备成功,返回值是=%d ",status));

        //所创建设备被设定为直接缓冲I/O,这是设备读写三种方式中的一种
        pDevObj->Flags |= DO_BUFFERED_IO;
        //创建符号链接

        RtlInitUnicodeString(&symLinkName,L"\\??\\yjx888");

        //创建一个设备链接。驱动程序虽然有了设备名称,但是这种设备名只能在内核状态可见,而对于应用程序是不可见的,因此,驱动需要要暴露一个符号链接,来方便应用程序的访问,该链接指向真正的设备名称
        status = IoCreateSymbolicLink( &symLinkName,&devName );
        if (!NT_SUCCESS(status)) 
        {
                KdPrint(("创建符号连接错误,返回值是=%d ",status));
                //删除设备对象
                IoDeleteDevice( pDevObj );
                return status;
        }
        KdPrint(("创建符号连接成功,返回值是=%d ",status));
        return STATUS_SUCCESS;
}



//卸载函数的前置说明
VOID DDK_Unload(IN PDRIVER_OBJECT pDriverObject); 

mini_ddk.c  代码如下
//注意在使用 windows 2000 checked buitd Environment 编译驱动的时候
//如果遇到说磁盘空间不足或者文件路径错误,这样的异常的话
//有可能是某个程序正在使用pdb文件,比如我就是因为windbg使用了pdb文件
//所以才导致这样的错误
#include "mini_ddk.h"
#pragma INITCODE
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING B)
{
        //        __asm int 3; 
        KdPrint(("驱动成功被加载..."));

        //创建设备对象
        CreateMyDevice(pDriverObject);

        //卸载函数
        pDriverObject->DriverUnload = DDK_Unload;
        return 1;
}


VOID DDK_Unload(IN PDRIVER_OBJECT pDriverObject)
{
        PDEVICE_OBJECT pDev;//设备对象
        UNICODE_STRING symLinkName;  //设备符号
        

        //初始化符号
        RtlInitUnicodeString(&symLinkName,L"\\??\\yjx888");
        //删除符号
        IoDeleteSymbolicLink(&symLinkName);
        KdPrint(("删除符号成功..."));

        //warning C4133: '=' : incompatible types - from 'PDEVICE_OBJECT' to 'PDRIVER_OBJECT'
        //老是报上面这个错误,明明类型是一样的,没办法我只能加上强制转换

        //***注意***
        //PDRIVER_OBJECT  PDEVICE_OBJECT  2个是不一样的结构,一个是驱动程序的结构,一个是设备的结构,
        //每个驱动程序都自带一个 PDRIVER_OBJECT 的结构, 这个结构里有一个 DeviceObject 成员 指向一个设备对象链表的首地址
        //当调用IoCreateDevice的时候会自动赋予正确的设备对象指针,也就是说会更新PDRIVER_OBJECT->DeviceObject 成员
        pDev = pDriverObject->DeviceObject;
        
        //删除设备对象
        IoDeleteDevice(pDev);
        KdPrint(("删除设备成功..."));

        KdPrint(("驱动成功被卸载..."));

}

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-4-6 19:46:22 | 显示全部楼层
跪求  郁金香 全套教程啊  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-28 10:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表