zoukankan      html  css  js  c++  java
  • 记录下 初次接触驱动开发的过程 及碰到的问题

    安装 步骤
    1  安装vs2008
    2 安装 msdn
    3 安装 winxp_ddk_3790_1830.iso
    4 xp下配置环境变量WXPBASE=ddk根目录
    5 vs2008下 工具--选项-项目解决方案-vc++目录
       可执行文件【自动找配置的目录下的bin目录】 添加 ddk根目录 F:\WINDDK\3790.1830
       包含文件【即要包含的头文件 也就是定义】 添加F:\WINDDK\3790.1830\inc\ddk\wxp ,F:\WINDDK\3790.1830\inc\wxp 这两个目录 前面的根目录为你安装的目录
       引用文件【记头文件中定义的方法的实现】 添加F:\WINDDK\3790.1830\lib\wxp\i386   前面的根目录为你安装的目录


    6 安装ddkwizard_setup_v1.3.0a.exe
    双击程序运行 安装完毕
    拷贝 ddkbuild.cmd 和 ddkbuild.bat文件到 你的ddk根目录 这两个文件也是ddkwizard_setup_v1.3.0a.exe 下载的时候一并下下来的 搜索一下


    这样全部安装完毕
    打开vs2008  vc++下超级 驱动工程
    新建好工程后 在 souce file目录下 创建 firstDriver.c
    修改special file下的 SOURCES
    改成你的代码文件 如下


    SOURCES=firstDriver.c \
            drvversion.rc


    firstDriver.c代码如下 本人写的第一个驱动  基本理解流程 作为记录
    #include <ntddk.h>
    #include <string.h>
    typedef struct _DEVICE_EXTENT{
    UNICODE_STRING symoName;
    } *PDEVICE_EXTENT;
    void DDK_UNLOAD(PDRIVER_OBJECT obj);
    NTSTATUS createFirstDevice(PDRIVER_OBJECT obj){
    NTSTATUS status;
    UNICODE_STRING deviceName;
    UNICODE_STRING linkName;
    PDEVICE_OBJECT pDevObj;
    PDEVICE_EXTENT de;
    RtlInitUnicodeString(&deviceName,L"\\Device\\MyFirstDevide1");
    status=IoCreateDevice(obj,sizeof(PDEVICE_EXTENT),&deviceName,FILE_DEVICE_UNKNOWN,0,TRUE,&pDevObj);
    if(!NT_SUCCESS(status)>0){
    if(status==STATUS_INSUFFICIENT_RESOURCES){
    DbgPrint("资源不足");
    }
    if(status==STATUS_OBJECT_NAME_EXISTS){
    DbgPrint("对象名称已存在");
    }
    if(status==STATUS_OBJECT_NAME_COLLISION){
    DbgPrint("资源冲突");
    }
    return status;
    }

    DbgPrint("创建设备成功");
    RtlInitUnicodeString(&linkName,L"\\??\\MyFirstLink1");
    status=IoCreateSymbolicLink(&linkName,&deviceName);
    if(!NT_SUCCESS(status)){
    DbgPrint("创建设备链接失败");
    IoDeleteDevice(pDevObj);

    return status;
    }
    de=(PDEVICE_EXTENT)pDevObj->DeviceExtension;
    de->symoName=linkName;

    DbgPrint("创建设备链接成功");
    return STATUS_SUCCESS;








    }
    NTSTATUS DriverEntry(PDRIVER_OBJECT obj,PUNICODE_STRING str){
       DbgPrint("驱动被加载了+++++++++饺子");
       createFirstDevice(obj);
       obj->DriverUnload=DDK_UNLOAD;
       return (1);
    }
    void DDK_UNLOAD(PDRIVER_OBJECT obj){
    PDEVICE_EXTENT de;
    PDEVICE_OBJECT curDevice;
    PDEVICE_OBJECT deviceObj=obj->DeviceObject;
    UNICODE_STRING tmpLikName;
        WCHAR*  abb;
    while(deviceObj!=NULL){
            de=(PDEVICE_EXTENT)deviceObj->DeviceExtension;
    tmpLikName=de->symoName;
    abb =(WCHAR* )tmpLikName.Buffer;
    DbgPrint("卸载链接成功%s",abb);
    IoDeleteSymbolicLink(&tmpLikName);
      

    curDevice=deviceObj;
    deviceObj=deviceObj->NextDevice;
    DbgPrint("卸载设备成功");
       IoDeleteDevice(curDevice);

    }

    DbgPrint("驱动被卸载了--------饺子");
    }




    作为一个初学者 我总结了三点 问题 有高手解释下
    1 一句语句需要换行必须 带有/
    2 文件名必须是.c后缀 不然一大堆错误
    3 在一个方法中 临时变量的定义必须在方面最前面几行 不能再中间定义
  • 相关阅读:
    php分页类 (来源网络)
    symfony2 symofny3中得到get post session cookies的方法
    symfony route参数
    Symfony2同步数据库的数据表
    mysql中SQL执行过程详解与用于预处理语句的SQL语法
    使用MySQL命令行新建用户并授予权限的方法
    抽象类和接口的区别
    Yaf 使用遇到的坑
    Mysql 常用引擎的特点及选择使用策略
    定时任务 Crontab命令 详解
  • 原文地址:https://www.cnblogs.com/liaomin416100569/p/9331362.html
Copyright © 2011-2022 走看看