xlkjmjp
驱动牛犊
驱动牛犊
  • 注册日期2004-11-10
  • 最后登录2005-11-24
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1320回复:2

所有卷都绑了,但一进桌面就重启,后来重启解决了,又兰屏了,大侠们看看 (详解)

楼主#
更多 发布于:2005-02-26 09:50
驱动功能:绑定机器上的所有卷(只绑定),并在日志里写入信息
 当安装好驱动重新启动的时候一切正常,但当WINDOWS2000(ADVANCE SERVER) 登陆好刚好显示桌面图标的时候就黑屏了,然后就是重新启动;  
    后来我删除驱动文件,重新启动2000进入系统,我发现,在日志里我看到了我绑定时写入的信息,信息为 \"成功的绑定了卷\\Device\\Hard..1[c:],每一个卷都有这样一条信息,说明绑定还是成功了,  但我也看到了一个错误,来源于fdisk,错误是
    \"无法将故障存储到系统.......请确认....能容纳所有物理内存\".  总之和每次兰屏的时候都要写入%SystemRoot%\\MEMORY.DMP这个文件有关吧,相信大家都应该见过这条错误信息吧,这是不是我在绑定系统盘C:的时候出问题了呢,

   我进入了系统属性(我的电脑右键菜单里)->高级->启动和故障恢复,在里面看见了下面有
//-------------------
系统失败
  写入系统日志(已选中)
  发送警报(已选中)
  自动重新启动(也是已选中)

写入调试信息
    完全存储  (这里可以选择成 \'无\')
    %SystemRoot%\\MEMORY.DMP
------------------------------------------
  我怀凝是不是系统检测到错误就自动重启了,与是我把自动重新启动这一项给取消了,然后下面的调试信息也选择成\"无\",我再次安装驱动重新启动计算机, 此次进入系统刚开始显示桌面图标的时候也挂了,不过这次不是重启,而是兰屏 (可能是我取消了重启计算机,所以检测到错误就不重启而是兰屏吧)
**STOP 。。IRQL_NOT_LESS...
 。。。。。。。。。。。。。。。。。。ntoskrnl.exe
....

   哎,,这究竟是为什么啊,为什么会这样呢? 各位大哥帮帮忙解决这个问题好不好啊??    为什么所有的卷都成功的绑定了,就是一到桌面显示图标的时候就挂了呢?而且我的默认的派遣例程,都不做什么处理(除了DriverEntry里建立的那个设备,我直接完成了返回),其它的都是调用下级设备驱动去处理的,这应该没错啊。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。



  

  


snowStart
驱动老牛
驱动老牛
  • 注册日期2004-04-06
  • 最后登录2011-06-02
  • 粉丝0
  • 关注0
  • 积分95分
  • 威望19点
  • 贡献值177点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-02-26 10:34
兰屏时**STOP 。。IRQL_NOT_LESS...是错误提示

程序贴出来看看吧
学习,关注,交流中... [email=fengyu@163.com]Email:snowstarth@163.com[/email] [url]http://bbs.zndev.com/?a=snowStart[/url]
xlkjmjp
驱动牛犊
驱动牛犊
  • 注册日期2004-11-10
  • 最后登录2005-11-24
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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 ;
}

 
游客

返回顶部