阅读:1348回复:2
编译错误,烦请帮忙看看
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;// } |
|
沙发#
发布于: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;//简单地返回成功而已 } |
|
板凳#
发布于:2009-06-02 21:31
原来把PDEVICE_OBJECT写成PDRIVER_OBJECT了
麻烦各位了 怎么好像不能修改自己的标题? |
|