阅读:1427回复:8
卸载时自动重新启动??
/***************************************************************
程序名称:Hello World for WDM 文件名称:HelloWDM.cpp 作者:罗聪 日期:2002-8-16 ***************************************************************/ //一定要的头文件,声明了函数模块和变量: #include \"HelloWDM.h\" /*************************************************************** 函数名称:DriverEntry() 功能描述:WDM程序入口 ***************************************************************/ //extern \"C\"是必须的,表示“用C链接”。如果你的文件名是HelloWDM.c的话,这句可以省略。 extern \"C\" NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) { //指定“添加设备”消息由函数“HelloWDMAddDevice()”来处理: DriverObject->DriverExtension->AddDevice = HelloWDMAddDevice; //指定“即插即用”消息由函数“HelloWDMPnp()”来处理: DriverObject->MajorFunction[IRP_MJ_PNP] = HelloWDMPnp; //返回一个NTSTATUS值STATUS_SUCCESS。几乎所有的驱动程序例程都必须返回一个NTSTATUS值,这些值在NTSTATUS.H DDK头文件中有详细的定义。 return STATUS_SUCCESS; } /*************************************************************** 函数名称:HelloWDMAddDevice() 功能描述:处理“添加设备”消息 ***************************************************************/ NTSTATUS HelloWDMAddDevice(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT PhysicalDeviceObject) { //定义一个NTSTATUS类型的返回值: NTSTATUS status; //定义一个功能设备对象(Functional Device Object): PDEVICE_OBJECT fdo; //创建我们的功能设备对象,并储存到fdo中: status = IoCreateDevice( DriverObject, //驱动程序对象 sizeof(DEVICE_EXTENSION), //要求的设备扩展的大小 NULL, //设备名称,这里为NULL FILE_DEVICE_UNKNOWN, //设备的类型,在标准头文件WDM.H或NTDDK.H中列出的FILE_DEVICE_xxx值之一 0, //各种常量用OR组合在一起,指示可删除介质、只读等。 FALSE, //如果一次只有一个线程可以访问该设备,为TRUE,否则为FALSE &fdo); //返回的设备对象 //NT_SUCCESS宏用于测试IoCreateDevice内核是否成功完成。不要忘记检查对内核的所有调用是否成功。NT_ERROR宏不等同于!NT_SUCCESS,最好使用!NT_SUCCESS,因为除了错误外,它还截获警告信息。 if( !NT_SUCCESS(status)) return status; //创建一个设备扩展对象dx,用于存储指向fdo的指针: PDEVICE_EXTENSION dx = (PDEVICE_EXTENSION)fdo->DeviceExtension; dx->fdo = fdo; //用IoAttachDeviceToDeviceStack函数把HelloWDM设备挂接到设备栈: dx->NextStackDevice = IoAttachDeviceToDeviceStack(fdo, PhysicalDeviceObject); //设置fdo的flags。有两个“位”是必须改变的,一个是必须清除DO_DEVICE_INITIALIZING标志,如果在DriverEntry例程中调用IoCreateDevice(),就不需要清除这个标志位。还有一个是必须设置DO_BUFFER_IO标志位: fdo->Flags |= DO_BUFFERED_IO | DO_POWER_PAGABLE; fdo->Flags &= ~DO_DEVICE_INITIALIZING; //返回值: return STATUS_SUCCESS; } /*************************************************************** 函数名称:HelloWDMPnp() 功能描述:处理“即插即用”消息 ***************************************************************/ NTSTATUS HelloWDMPnp(IN PDEVICE_OBJECT fdo, IN PIRP Irp) { //创建一个设备扩展对象dx,用于存储指向fdo的指针: PDEVICE_EXTENSION dx=(PDEVICE_EXTENSION)fdo->DeviceExtension; //首先要通过函数IoGetCurrentIrpStackLocation()得到当前的IRP,并由此得到Minor Function: PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp); ULONG MinorFunction = IrpStack->MinorFunction; //然后把这个Minor Function传递给下一个设备栈: IoSkipCurrentIrpStackLocation(Irp); NTSTATUS status = IoCallDriver( dx->NextStackDevice, Irp); //处理“即插即用”次功能代码: //当Minor Function等于IRP_MN_REMOVE_DEVICE时,说明有设备被拔出或卸下,这时要取消资源分配并删除设备: if( MinorFunction==IRP_MN_REMOVE_DEVICE) { //取消设备接口: IoSetDeviceInterfaceState(&dx->ifSymLinkName, FALSE); RtlFreeUnicodeString(&dx->ifSymLinkName); //调用IoDetachDevice()把fdo从设备栈中脱开: if (dx->NextStackDevice) IoDetachDevice(dx->NextStackDevice); //删除fdo: IoDeleteDevice(fdo); } //返回值: return status; } /*************************************************************** 程序名称:Hello World for WDM 文件名称:HelloWDM.h 作者:罗聪 日期:2002-8-16 ***************************************************************/ //头文件,只是声明一些函数和变量,比较简单就不多说了,请读者自行研究: #ifdef __cplusplus extern \"C\" { #endif #include \"ntddk.h\" #ifdef __cplusplus } #endif typedef struct _DEVICE_EXTENSION { PDEVICE_OBJECT fdo; PDEVICE_OBJECT NextStackDevice; UNICODE_STRING ifSymLinkName; } DEVICE_EXTENSION, *PDEVICE_EXTENSION; NTSTATUS HelloWDMAddDevice(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT PhysicalDeviceObject); NTSTATUS HelloWDMPnp(IN PDEVICE_OBJECT fdo, IN PIRP Irp); inf文件---------- ;; The Win2K DDK documentation contains an excellent INF reference. ;--------- Version Section --------------------------------------------------- [Version] Signature=\"$CHICAGO$\" Provider=LC_Device DriverVer=8/21/2002,3.0.0.3 ; If device fits one of the standard classes, use the name and GUID here, ; otherwise create your own device class and GUID as this example shows. Class=Unknown ClassGUID={ff646f80-8def-11d2-9449-00105a075f6b} ;--------- SourceDiskNames and SourceDiskFiles Section ----------------------- ; These sections identify source disks and files for installation. They are ; shown here as an example, but commented out. [SourceDisksNames] 1 = \"HelloWDM\",Disk1,, [SourceDisksFiles] HelloWDM.sys = 1,objfre\\i386, ;--------- ClassInstall/ClassInstall32 Section ------------------------------- ; Not necessary if using a standard class ; 9X Style [ClassInstall] Addreg=Class_AddReg ; NT Style [ClassInstall32] Addreg=Class_AddReg [Class_AddReg] HKR,,,,%DeviceClassName% HKR,,Icon,,\"-5\" ;--------- DestinationDirs Section ------------------------------------------- [DestinationDirs] YouMark_Files_Driver = 10,System32\\Drivers ;--------- Manufacturer and Models Sections ---------------------------------- [Manufacturer] %MfgName%=Mfg0 [Mfg0] ; PCI hardware Ids use the form ; PCI\\VEN_aaaa&DEV_bbbb&SUBSYS_cccccccc&REV_dd ;改成你自己的ID %DeviceDesc%=YouMark_DDI, PCI\\VEN_9999&DEV_9999 ;---------- DDInstall Sections ----------------------------------------------- ; --------- Windows 9X ----------------- ; Experimentation has shown that DDInstall root names greater than 19 characters ; cause problems in Windows 98 [YouMark_DDI] CopyFiles=YouMark_Files_Driver AddReg=YouMark_9X_AddReg [YouMark_9X_AddReg] HKR,,DevLoader,,*ntkern HKR,,NTMPDriver,,HelloWDM.sys HKR, \"Parameters\", \"BreakOnEntry\", 0x00010001, 0 ; --------- Windows NT ----------------- [YouMark_DDI.NT] CopyFiles=YouMark_Files_Driver AddReg=YouMark_NT_AddReg [YouMark_DDI.NT.Services] Addservice = HelloWDM, 0x00000002, YouMark_AddService [YouMark_AddService] DisplayName = %SvcDesc% ServiceType = 1 ; SERVICE_KERNEL_DRIVER StartType = 3 ; SERVICE_DEMAND_START ErrorControl = 1 ; SERVICE_ERROR_NORMAL ServiceBinary = %10%\\System32\\Drivers\\HelloWDM.sys [YouMark_NT_AddReg] HKLM, \"System\\CurrentControlSet\\Services\\HelloWDM\\Parameters\",\\ \"BreakOnEntry\", 0x00010001, 0 ; --------- Files (common) ------------- [YouMark_Files_Driver] HelloWDM.sys ;--------- Strings Section --------------------------------------------------- [Strings] ProviderName=\"Flying L Co.,Ltd.\" MfgName=\"LC Soft\" DeviceDesc=\"Hello World WDM!\" DeviceClassName=\"LC_Device\" SvcDesc=\"???\" 在2000下安装时没有问题,但卸载时就会自动重新启动,卸载不掉,怎么回事啊?? |
|
沙发#
发布于:2003-01-05 10:10
用户被禁言,该主题自动屏蔽! |
|
板凳#
发布于:2003-01-05 10:20
我的眼睛看花了
[编辑 - 1/5/03 by yangyang] |
|
|
地板#
发布于:2003-01-05 11:38
大佬,
这样不对,那哪样才算对啊, 给个话啊, 帮我解决了,分咱有的是, |
|
地下室#
发布于:2003-01-06 08:50
你的驱动用了什么资源吗?是不是卸载的时候没有释放?还是释放了本来没有的资源?或者没有处理好cleanup,unload之类的函数?
|
|
|
5楼#
发布于:2003-01-07 17:37
不会呀,我也下了这个程序,用得很好,不会重起,要不要我发给你
|
|
6楼#
发布于:2003-01-07 19:39
那可能是我的系统有问题吧。。。。。。。。
|
|
7楼#
发布于:2003-01-08 20:18
我的也是,卸载的时候总是蓝屏,郁闷中……
|
|
|
8楼#
发布于:2004-07-02 11:41
你没有 unload 例程啊 我也不是很清楚
另外就是由于DDK某些命名不是很清楚 容易把实例 指针 指针的指针 句柄 等搞混 尤其是强制转换的情况下更容易出错 注意一下 |
|