• 记录下 初次接触驱动开发的过程 及碰到的问题


    安装 步骤
    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 在一个方法中 临时变量的定义必须在方面最前面几行 不能再中间定义
  • 相关阅读:
    数据与C
    队列的基本实现代码
    栈的基本实现代码
    c中const定义的问题
    微博登录报错 sso package orsign error
    透明度修改
    <大话设计模式>工厂模式,策略模式
    弹键盘动画
    压缩图片,直接使用大图,在小控件上会有毛边
    删除数组中的元素
  • 原文地址:https://www.cnblogs.com/liaomin416100569/p/9331362.html
Copyright © 2020-2023  润新知