lofrank
驱动牛犊
驱动牛犊
  • 注册日期2008-09-28
  • 最后登录2010-04-26
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望102点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1348回复:2

编译错误,烦请帮忙看看

楼主#
更多 发布于:2009-06-02 20:51
http://bbs.driverdevelop.com/htm_data/11/0902/115756.html

就是这个帖子里的程序,我这里编译通不过,你们能通过么?

#include <wdm.h>

void Example1Unload(PDRIVER_OBJECT pDrvObj)
{

    UNICODE_STRING usDosDevName;//Dos符号链接

    DbgPrint("Example1: Driver is being unloaded.\n");

    //首先我们要删除的是一个Dos链接名,否则,这个链接名便不再可用,直到系统重启

    //不过,这个Dos链接名应该和我们在DriverEntry里创建的一样,千万记得了

    RtlInitUnicodeString(&usDosDevName,L"\\DosDevices\\Example1");

    IoDeleteSymbolicLink(&usDosDevName);

    //接下来,我们再删除驱动程序创建的设备对象,在此之后,系统将会把我们的驱动从内核移除

    //我们的驱动便是被卸载了

    IoDeleteDevice(pDrvObj->DeviceObject);

    //OK,所有的事情已经解决

}

NTSTATUS Example1IrpRoutine(PDRIVER_OBJECT pDev,PIRP pIrp)
{

    //在调试器中输出一个字符串,你还记得Win32下的TRACE系列宏吗

    DbgPrint("An driver routine is called.\n");

    return STATUS_SUCCESS;//简单地返回成功而已

}

//驱动入口函数

NTSTATUS DriverEntry(PDRIVER_OBJECT pDrvObj,PUNICODE_STRING pUsRegPath)
{

    NTSTATUS status = STATUS_UNSUCCESSFUL;//初始化为不成功

    UNICODE_STRING usDevName;//我们的设备名

    UNICODE_STRING usDosDevName;//Dos符号链接

    PDEVICE_OBJECT pDevObj = NULL;//设备对象

    unsigned int nIndex;//一个计数器,循环的时候可以用到

    DbgPrint("Example1: Driver entry is called.\n");

    //__try{

    //初始化两个Unicodestring

    RtlInitUnicodeString(&usDevName,L"\\Device\\Example1");

    RtlInitUnicodeString(&usDosDevName,L"\\DosDevices\\Example1");

    //现在我们创建设备

    status = IoCreateDevice(pDrvObj,0,&usDevName,FILE_DEVICE_UNKNOWN,

        FILE_DEVICE_SECURE_OPEN,FALSE,&pDevObj);

    //只有成功创建设备我们才有必要继续

    if(NT_SUCCESS(status)){//测试成功与否一般用这个宏,而不是让它直接与STATUS_SUCCESS比 //较,查看一下这个宏定义就知道了

        //成功创建设备之后,我们要作的一件事就是初使化驱动的IRP例程,现在,我们的驱动什么 都不干,所以,每个例程也还是什么都不做

        //每个设备最多有IRP_MJ_MAXIMUM_FUNCTION个IRP例程,现在,我们都把它们初始 //化成一个相同的入口

        for(nIndex=0;nIndex<IRP_MJ_MAXIMUM_FUNCTION;++nIndex)

            pDrvObj->MajorFunction[nIndex] = Example1IrpRoutine;

        //接下来,我再安装一个卸载例程,从而,使我们的驱动可以动态的卸载,这就是传说中的 //热插拨

        pDrvObj->DriverUnload = Example1Unload;

        //把创建的设备保存起来吧,否则以后便不能引用啦

        pDrvObj->DeviceObject = pDevObj;

        //好了,创建符号链接,正是由于有了符号链接,我们可以用C:来访问第一个硬盘分区……

        status = IoCreateSymbolicLink(&usDosDevName,&usDevName);

        if(!NT_SUCCESS(status)){

            //在这里定义了如果创建Dos链接失败将做的事情,如果我们不需要一个Dos符号链接, //这一步便不是必须的,更不必检验了

            IoDeleteDevice(pDevObj);//删除创建的设备对象

            //这个时候,status肯定就代表失败了,如果入口函数返回一个失败的状态,系统会自动把 //创建的这个Driver删除的,我们不用担心

        }

    }

    //现在,我们测试一下成功与否

    //}__except(EXCEPTION_EXECUTE_HANDLER){

    //如果出现一般的异常,执行流程会走到这儿来,除了一些SEH都解决不了的异常除外,这个我们以 //后再讨论

    //}

    return status;//

}
lofrank
驱动牛犊
驱动牛犊
  • 注册日期2008-09-28
  • 最后登录2010-04-26
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望102点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2009-06-02 20:55
错误为:
warning C4028: 形参 1 与声明不同

在这一行:
pDrvObj->MajorFunction[nIndex] = Example1IrpRoutine;


函数应该没错,如下:
NTSTATUS Example1IrpRoutine(PDRIVER_OBJECT pDev,PIRP pIrp)
{

    //在调试器中输出一个字符串,你还记得Win32下的TRACE系列宏吗

    DbgPrint("An driver routine is called.\n");

    return STATUS_SUCCESS;//简单地返回成功而已

}
lofrank
驱动牛犊
驱动牛犊
  • 注册日期2008-09-28
  • 最后登录2010-04-26
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望102点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2009-06-02 21:31
原来把PDEVICE_OBJECT写成PDRIVER_OBJECT了


麻烦各位了

怎么好像不能修改自己的标题?
游客

返回顶部