阅读:1320回复:2
所有卷都绑了,但一进桌面就重启,后来重启解决了,又兰屏了,大侠们看看 (详解)
驱动功能:绑定机器上的所有卷(只绑定),并在日志里写入信息
当安装好驱动重新启动的时候一切正常,但当WINDOWS2000(ADVANCE SERVER) 登陆好刚好显示桌面图标的时候就黑屏了,然后就是重新启动; 后来我删除驱动文件,重新启动2000进入系统,我发现,在日志里我看到了我绑定时写入的信息,信息为 \"成功的绑定了卷\\Device\\Hard..1[c:],每一个卷都有这样一条信息,说明绑定还是成功了, 但我也看到了一个错误,来源于fdisk,错误是 \"无法将故障存储到系统.......请确认....能容纳所有物理内存\". 总之和每次兰屏的时候都要写入%SystemRoot%\\MEMORY.DMP这个文件有关吧,相信大家都应该见过这条错误信息吧,这是不是我在绑定系统盘C:的时候出问题了呢, 我进入了系统属性(我的电脑右键菜单里)->高级->启动和故障恢复,在里面看见了下面有 //------------------- 系统失败 写入系统日志(已选中) 发送警报(已选中) 自动重新启动(也是已选中) 写入调试信息 完全存储 (这里可以选择成 \'无\') %SystemRoot%\\MEMORY.DMP ------------------------------------------ 我怀凝是不是系统检测到错误就自动重启了,与是我把自动重新启动这一项给取消了,然后下面的调试信息也选择成\"无\",我再次安装驱动重新启动计算机, 此次进入系统刚开始显示桌面图标的时候也挂了,不过这次不是重启,而是兰屏 (可能是我取消了重启计算机,所以检测到错误就不重启而是兰屏吧) **STOP 。。IRQL_NOT_LESS... 。。。。。。。。。。。。。。。。。。ntoskrnl.exe .... 哎,,这究竟是为什么啊,为什么会这样呢? 各位大哥帮帮忙解决这个问题好不好啊?? 为什么所有的卷都成功的绑定了,就是一到桌面显示图标的时候就挂了呢?而且我的默认的派遣例程,都不做什么处理(除了DriverEntry里建立的那个设备,我直接完成了返回),其它的都是调用下级设备驱动去处理的,这应该没错啊。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 |
|
沙发#
发布于:2005-02-26 10:34
兰屏时**STOP 。。IRQL_NOT_LESS...是错误提示
程序贴出来看看吧 |
|
|
板凳#
发布于:2005-02-26 10:48
#include \"FileDrv.h\"
extern DRIVER_OBJECT * pdriver; //IRP_MN_MOUNT_VOLUME NTSTATUS ProMountVolume(DEVICE_OBJECT * Device, IRP * Irp) { IO_STACK_LOCATION * stack; DEVICE_EXTENSION * pex,*newEx; WCHAR buf[255]; NTSTATUS status; DEVICE_OBJECT * realDev, * newDev; PUBCONTEXT * context; stack = IoGetCurrentIrpStackLocation(Irp); pex = (DEVICE_EXTENSION*)Device->DeviceExtension; realDev = stack->Parameters.MountVolume.Vpb->RealDevice; //--------------------------------------------------- //建立一个设备 status = MyCreateDevice(pdriver, sizeof(DEVICE_EXTENSION), NULL, FILE_DEVICE_DISK_FILE_SYSTEM, 0, 0, &newDev); if(!NT_SUCCESS(status)){ ShowEvent(\"无法建立新设备来绑定卷对象!\",FALSE); goto next; } UpIrql(&pex->oldIrql); newEx = (DEVICE_EXTENSION*)newDev->DeviceExtension; //获取卷设备名 status = MyGetDeviceName((void*)realDev, &newEx->BindDeviceName, TRUE); if(!NT_SUCCESS(status)){ swprintf(buf,L\"无法获取设备名称-#%08X\",status); SetLogEvent(pdriver,DRIVER1_DEFW,buf,TRUE); } ///工作者线程参数内存 context = (PUBCONTEXT*)ExAllocatePool(NonPagedPool, sizeof(PUBCONTEXT)); if(context == NULL){ ShowEvent(\"无法分配完成例程参数空间内存!\",FALSE); MyDeleteDevice(newDev); goto next; } else RtlZeroMemory(context,sizeof(PUBCONTEXT)); //保存所需要的数据 context->cdoDevice = Device; //自己建立的CDO context->irp = Irp; context->newDevice = newDev; //新设备 context->realDev = realDev; //存储设备 //----------初始化工作者线程任务函数 ExInitializeWorkItem( &context->item, MountCompleteWorker, (void*)context); //开始设置完成例程 IoCopyCurrentIrpStackLocationToNext(Irp); IoSetCompletionRoutine(Irp, //为哪个IRP挂例程 VolumeCompletiRoutine, //例程地址 (void*)&context->item, //例程参数 TRUE, //成功时调用 FALSE, //失败时调用 FALSE); //取消时调用 DownIrql(pex->oldIrql); return IoCallDriver(pex->AttachedDevice ,Irp); next:; DownIrql(pex->oldIrql); return MyCallDriver(pex->AttachedDevice ,Irp,SKIP); } //---------完成例程, NTSTATUS VolumeCompletiRoutine(DEVICE_OBJECT *Device, IRP *Irp, void * compcontext) { WORK_QUEUE_ITEM * item = NULL; item =(WORK_QUEUE_ITEM*)compcontext; //判断当前优先级 if(KeGetCurrentIrql() >PASSIVE_LEVEL){ ExQueueWorkItem(item,DelayedWorkQueue); //排队,让工作者线程处理任务 } else{ (item->WorkerRoutine)(item->Parameter); //否则可以直接调用 } return STATUS_MORE_PROCESSING_REQUIRED; } //--工作者线程 ,当完成例程高于PASSIVE级的时候,必须把任务放入工作者线程中完成 void MountCompleteWorker (void* con) { PUBCONTEXT * param; param = (PUBCONTEXT*)con; if(param){ AttachVolumeDevice(param->cdoDevice, //这个cdo是自己的CDO设备 param->newDevice, //自己建立的卷设备 param->realDev, //系统存储设置 param->irp); ExFreePool(param); } } //这个函数由工作者线程调用 void AttachVolumeDevice(DEVICE_OBJECT *cdo, DEVICE_OBJECT *newDev, DEVICE_OBJECT *realDev, IRP *Irp) { BOOLEAN isSuccess; DEVICE_OBJECT *VolumeDev,*dev,*tmp; DEVICE_EXTENSION *newEx,*ex; NTSTATUS status; int i; WCHAR data[255]; LARGE_INTEGER integ; isSuccess =FALSE; newEx = (DEVICE_EXTENSION*)newDev->DeviceExtension;//自己的卷设备扩展结构 VolumeDev = realDev->Vpb->DeviceObject; //系统的卷设备 if(VolumeDev == NULL) //如果为空 , { swprintf(data,L\"设备%s的卷对象为空\",newEx->BindDeviceName.Buffer); ShowEvent(data,TRUE); goto end; } //获取卷符号名 status = MyGetDeviceSymbolicName(realDev, &newEx->BindDeviceLinkName, TRUE); //如果名称为空,分配内存 if(!NT_SUCCESS(status)){ swprintf(data,L\"无法获取卷设备%s的符号名称 - #%08X\",newEx->BindDeviceName.Buffer,status); ShowEvent(data,TRUE); } //============ newEx->BindDevice=VolumeDev; newEx->RealStorage=realDev; newEx->ThisDevice=newDev; //================================================================= //绑定卷设备 newEx->AttachedDevice = NULL; for(i=0;i<8;i++) { newEx->AttachedDevice = IoAttachDeviceToDeviceStack(newDev,VolumeDev); if(newEx->AttachedDevice) //没成功 goto success; integ.QuadPart = 1000; KeDelayExecutionThread( KernelMode, FALSE, &integ ); } swprintf(data,L\"无法绑定设备%s的卷对象\",newEx->BindDeviceName.Buffer); ShowEvent(data,TRUE); goto end; //============================================================================ success:; swprintf(data,L\"成功绑定设备%s的卷对象%s\",newEx->BindDeviceName.Buffer,newEx->BindDeviceLinkName.Buffer); ShowEvent(data,TRUE); //============================ //-------标志复制 if(VolumeDev->Flags & DO_BUFFERED_IO) newDev->Flags |= DO_BUFFERED_IO; if(VolumeDev->Flags & DO_DIRECT_IO) newDev->Flags |= DO_DIRECT_IO; if(VolumeDev->Characteristics & FILE_DEVICE_SECURE_OPEN) newDev->Characteristics |= FILE_DEVICE_SECURE_OPEN; newEx->Flags=FILE_VOLUME_DEVICE;//自己的标志 //================================================ //去标志 newDev->Flags &= ~DO_DEVICE_INITIALIZING; isSuccess =TRUE; end:; if(!isSuccess) MyDeleteDevice(newDev); MyCompleteIrp(Irp,STATUS_SUCCESS,0); return ; } |
|