wjnong
驱动牛犊
驱动牛犊
  • 注册日期2004-07-30
  • 最后登录2007-01-25
  • 粉丝0
  • 关注0
  • 积分97分
  • 威望10点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
阅读:2655回复:16

调用IoAttachDeviceToDeviceStack就死机,帮忙看看是怎么回事?

楼主#
更多 发布于:2004-08-24 02:36
我编的一个PCI数据采集卡的驱动,在AddDevice函数中,我如果不调用IoAttachDeviceToDeviceStack把驱动连接到驱动栈的话,用EzInstall安装驱动能进入和退出AddDevice,如果调用IoAttachDeviceToDeviceStack的话,系统就会dump,蓝屏,出错的信自是BAD_POOL_CALLER,请大家帮我诊断一下,
另外,为什么AddDevice退出后,系统不发PNP_IRP给我?我的StartDevice得不到调用,
而且,卸载驱动时,为什么我的DriverUnload得不到调用?
我在DriverEntry里已经把各个入口函数初始化好了呀,请DX们帮看看,谢谢!下面是AddDevice的源代码。

 
NTSTATUS AddDevice(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT pdo)
{ // AddDevice
  
    NTSTATUS status = STATUS_SUCCESS;
WCHAR KernelNameBuffer[] =L"\\Device\\AMCC5933";
UNICODE_STRING devName;
    WCHAR UserDeviceNameBuffer[] =L"\\DosDevice\\AMCC5933";
UNICODE_STRING devLinkName;
    PDEVICE_OBJECT devObj = NULL;
POSR_DEVICE_EXT devExt;

#if DBG
    DbgPrint("AddDevice:AddDevice:Entering \n");
#endif
RtlInitUnicodeString(&devName, L"\\Device\\Amcc5933");

    //
    // Ask the I/O Manager to create the device object and
    // device extension
    //
    status = IoCreateDevice(DriverObject,
                            sizeof(OSR_DEVICE_EXT),
                            &devName,
                            FILE_DEVICE_UNKNOWN,
                            0,      
                            FALSE,
                            &devObj);

        
    if(!NT_SUCCESS(status))  {
        
#if DBG
        DbgPrint("IoCreateDevice failed.  Status = 0x%0x\n", status);
#endif
        return(STATUS_UNSUCCESSFUL);
    }    
    

    //
    // Get a pointer to our device extension
    //
    devExt = (POSR_DEVICE_EXT)devObj->DeviceExtension;

 
    //
    // Zero out the device extension.  While not strictly necessary
    // (the documentation says the device extension is zeroed) it's
    // better to be safe.
    //
    RtlZeroMemory(devExt, sizeof(OSR_DEVICE_EXT));
    //
    // Get a pointer to our device extension
    //
    devExt = (POSR_DEVICE_EXT)devObj->DeviceExtension;

    //
    // Save the device object pointer away for future reference
    //
    devExt->DeviceObject = devObj;

    //
    // Next, make the device accessible from user-mode applications.
    // Note that this name can be either the same or different from
    // the native "kernel mode" name of the device object, given above.
    //
    RtlInitUnicodeString(&devLinkName, L"\\??\\Amcc5933");

    status = IoCreateSymbolicLink(&devLinkName, &devName);
    
    if (!NT_SUCCESS(status))
    {
#if DBG
        DbgPrint("AddDevice:IoCreateSymbolicLink failed.  Status = 0x%0x\n", status);
#endif
        return(STATUS_UNSUCCESSFUL);
    }
    

devExt->LowerDeviceObject = IoAttachDeviceToDeviceStack(devObj, pdo);
    if (!devExt->LowerDeviceObject)
{ // can't attach
#if DBG
       DbgPrint("AddDevice:IoAttachDeviceToDeviceStack failed\n");
#endif
 status = STATUS_DEVICE_REMOVED;
} // can't attach  


    //
    // Initialize our Spin Locks
    //
    KeInitializeSpinLock(&devExt->ReadQueueLock);
    KeInitializeSpinLock(&devExt->WriteQueueLock);
    
    
    IoInitializeDpcRequest(devObj, DpcForIsr);


// Declare the buffering method we'll use for read/write requests
devObj->Flags |= DO_DIRECT_IO;

// Clear the "initializing" flag so that we can get IRPs
devObj->Flags &= ~DO_DEVICE_INITIALIZING;

if (!NT_SUCCESS(status))
{ // need to cleanup
//if (devExt->devname.Buffer)
// RtlFreeUnicodeString(&pdx->devname);
if (devExt->LowerDeviceObject)
IoDetachDevice(devExt->LowerDeviceObject);
IoDeleteDevice(devObj);
} // need to cleanup, cleanup side effects


#if DBG
    DbgPrint("AddDevice:Leaving AddDevice\n");
#endif
    
return(status);  

} // AddDevice
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
沙发#
发布于:2004-08-24 09:38
如果调用IoAttachDeviceToDeviceStack的话,系统就会dump,蓝屏

你是什么时候出的问题?是在调用的时候还是调用成功了返回后在其他时候出的问题????
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
Sundsea
驱动老牛
驱动老牛
  • 注册日期2003-05-06
  • 最后登录2012-06-05
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望35点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-08-24 12:19
哦,用的是AMCC的s5933作pci的桥接芯片,和我用的一样,这段代码是没有问题的.怎么会在加载的时候蓝屏呢?
wjnong
驱动牛犊
驱动牛犊
  • 注册日期2004-07-30
  • 最后登录2007-01-25
  • 粉丝0
  • 关注0
  • 积分97分
  • 威望10点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-08-24 12:40
对,是5933PCI卡,如果把IoAttachDeviceToDeviceStack的那些代码注释掉,则不会蓝屏,而且能进入AddDevice,但不注释掉就会死机,为什么???
对了,楼上的,你的卡插入到机子里再开机,系统会不会提出找到新硬件?我的怎么不会呀?想和你多交流。
Sundsea
驱动老牛
驱动老牛
  • 注册日期2003-05-06
  • 最后登录2012-06-05
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望35点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-08-24 12:52
对,是5933PCI卡,如果把IoAttachDeviceToDeviceStack的那些代码注释掉,则不会蓝屏,而且能进入AddDevice,但不注释掉就会死机,为什么???
对了,楼上的,你的卡插入到机子里再开机,系统会不会提出找到新硬件?我的怎么不会呀?想和你多交流。



哦,是这样啊,你的机器自检,操作系统分配资源,都没有检测到你的PCI卡,这样装载驱动程序,系统肯定会奔溃的.
我开发的s5933的PCI卡,当插在机器的PCI插槽上时,系统开机(Windows 2003 .NET系统)会提示发现新硬件,要求安装驱动程序.
这时安装驱动就没问题的.
建议:你在仔细看看,PCI卡是否有问题,或是存储器中烧的程序有问题.
AthlonxpX86
驱动小牛
驱动小牛
  • 注册日期2002-11-10
  • 最后登录2013-07-17
  • 粉丝0
  • 关注0
  • 积分29分
  • 威望43点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-08-24 14:09
你看看开机BIOS中有没有你的PCI资源列表,如果没有,应该不是IoAttachDeviceToDeviceStack的问题,更好象是上层驱动给你发送了IRP_MJ_XXX,然后你驱动中因为没有I/O资源而错误的运行了,某些内存未分配因此出现内存访问错误
AthlonxpX86(桃源村)
wjnong
驱动牛犊
驱动牛犊
  • 注册日期2004-07-30
  • 最后登录2007-01-25
  • 粉丝0
  • 关注0
  • 积分97分
  • 威望10点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-08-24 22:38
我用PCIConfig来看我的机器上的PCI卡的状态,发现我的那个卡没有什么问题,VID,DID,BIST,bar0,等都没有问题,后来我知道系统没有找到新硬件的原因是因为装了windriver,后来的卸掉了之后可以找到新硬件了,但装驱动时系统确不选择我编的驱动(我不知道系统靠什么来选择合适的INF文件,靠VID?DID?还是别的?),另外,为什么我用Ezinstall来装我的驱动时它总不调用我的DispatchPNP例程?
AddDevice倒是调用了,但DispatchPNP和DriverUnload都没有被调用,请大家帮忙看看原因,谢谢!
Sundsea
驱动老牛
驱动老牛
  • 注册日期2003-05-06
  • 最后登录2012-06-05
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望35点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-08-25 00:24
我用PCIConfig来看我的机器上的PCI卡的状态,发现我的那个卡没有什么问题,VID,DID,BIST,bar0,等都没有问题,后来我知道系统没有找到新硬件的原因是因为装了windriver,后来的卸掉了之后可以找到新硬件了,但装驱动时系统确不选择我编的驱动(我不知道系统靠什么来选择合适的INF文件,靠VID?DID?还是别的?),另外,为什么我用Ezinstall来装我的驱动时它总不调用我的DispatchPNP例程?
AddDevice倒是调用了,但DispatchPNP和DriverUnload都没有被调用,请大家帮忙看看原因,谢谢!
 


系统安装驱动当然是根据你指定的Inf文件来进行安装的,你的DriverEntry例程应该没有问题吧.
wjnong
驱动牛犊
驱动牛犊
  • 注册日期2004-07-30
  • 最后登录2007-01-25
  • 粉丝0
  • 关注0
  • 积分97分
  • 威望10点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-08-26 23:12
我指定了我的INF文件,但系统就是不选择它,后来我硬指定了,终于让它硬是用了我的驱动。但有一个问题,为什么系统不给我发IRP_PNP?我要用PNP的IRP_MN_START_DEVICE来获得分配的资源。

我的DriverEntry没有问题,它只指定了一些分派函数的入口点,AddDevice如果不调用IoAttachDeviceToDeviceStack的话也不会出问题,都能正常结束,现在我的困惑就是系统在什么情况下会发给我的驱动IRP_MJ_PNP?

再次谢谢大家帮助!
Sundsea
驱动老牛
驱动老牛
  • 注册日期2003-05-06
  • 最后登录2012-06-05
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望35点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-08-27 18:09
当你的驱动加载的时候,系统会给你发送IRP_MJ_PNP,
你只需要处理就行.
wjnong
驱动牛犊
驱动牛犊
  • 注册日期2004-07-30
  • 最后登录2007-01-25
  • 粉丝0
  • 关注0
  • 积分97分
  • 威望10点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-08-28 04:27
我的程序里有以下语句:
在DriverEntry里
 DriverObj->MajorFunction[IRP_MJ_DEVICE_CONTROL] =  DispatchDeviceControl;
    DriverObj->MajorFunction[IRP_MJ_PNP]            =  DispatchPnp;
    DriverObj->MajorFunction[IRP_MJ_POWER]          =  DispatchPower;

在DispatchPnp里:
 
switch(MinorFunction)
  {
  case IRP_MN_START_DEVICE:
status = PnpHandleStartDevice( DeviceObject, Irp);
    #if DBG
          DbgPrint("DispatchPnp: IRP_MN_START_DEVICE\n");
    #endif
 //ntStatus = PnpHandleStartDevice(DeviceObject,Irp);
break;

我还有一个AddDevice,我觉得AddDevice执行完后应该就有IRP_MJ_PNP发过来了呀,然后我在DispatchPnp里处理,但很奇怪,为什么我的AddDevice成功执行之后却没有IRP_MJ_PNP发过来呢?也就是说IO管理器(或PNP管理器)不调用我的DispatchPnp呢?我是用EzInstall来安装驱动程序的,显示安装成功。怪事!
Sundsea
驱动老牛
驱动老牛
  • 注册日期2003-05-06
  • 最后登录2012-06-05
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望35点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-08-28 13:05
我的程序里有以下语句:
在DriverEntry里 [quote]  DriverObj->MajorFunction[IRP_MJ_DEVICE_CONTROL] =  DispatchDeviceControl;
    DriverObj->MajorFunction[IRP_MJ_PNP]            =  DispatchPnp;
    DriverObj->MajorFunction[IRP_MJ_POWER]          =  DispatchPower;

在DispatchPnp里:
 
switch(MinorFunction)
  {
  case IRP_MN_START_DEVICE:
status = PnpHandleStartDevice( DeviceObject, Irp);
    #if DBG
          DbgPrint("DispatchPnp: IRP_MN_START_DEVICEn");
    #endif
 //ntStatus = PnpHandleStartDevice(DeviceObject,Irp);
break;

我还有一个AddDevice,我觉得AddDevice执行完后应该就有IRP_MJ_PNP发过来了呀,然后我在DispatchPnp里处理,但很奇怪,为什么我的AddDevice成功执行之后却没有IRP_MJ_PNP发过来呢?也就是说IO管理器(或PNP管理器)不调用我的DispatchPnp呢?我是用EzInstall来安装驱动程序的,显示安装成功。怪事! [/quote]


你是通过什么说IRP_MJ_PNP没有给你发过来呢?
wjnong
驱动牛犊
驱动牛犊
  • 注册日期2004-07-30
  • 最后登录2007-01-25
  • 粉丝0
  • 关注0
  • 积分97分
  • 威望10点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-08-28 15:29
我在DispatchPnp的开头有一个DbgPrint("DispatchPnp:Enteredn");
然后我用EzInstall来装我的驱动,DriverEntry和AddDevice里的DbgPrint里的句子都打印出来了,但DispatchPnp里的句子就是不打印,说明我的DispatchPnp根本没被调用,安装过程中我的DriverMonitor一直是打开的

另外,提供一个信息供各位诊断,刚才我用CreateFile来打开设备,提示设备找到并打开了,但我在DispatchCreate里的DbgPrint同样没有输出到DriverMonitor,所以,很可能我的根本上什么IRP都不到,但AddDevice返回的是STATUS_SUCCESS,所以说明设备还是成功添加了

[编辑 -  8/28/04 by  wjnong]

刚才重启后再安装驱动程序,然后调用CreateFile和CloseHandle,发现DispatchCreate和DispatchClose都被调用了,但DispatchPnp还是没被调用,说明系统可能不认为我的驱动支持PNP,但我在Link的时候已经设了个/Driver:WDM开关了,为什么它不给我发工资?为什么它不给我发PNP_IRP??????

[编辑 -  8/28/04 by  wjnong]
Sundsea
驱动老牛
驱动老牛
  • 注册日期2003-05-06
  • 最后登录2012-06-05
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望35点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-08-28 16:04
我在DispatchPnp的开头有一个DbgPrint("DispatchPnp:Enteredn");
然后我用EzInstall来装我的驱动,DriverEntry和AddDevice里的DbgPrint里的句子都打印出来了,但DispatchPnp里的句子就是不打印,说明我的DispatchPnp根本没被调用,安装过程中我的DriverMonitor一直是打开的

另外,提供一个信息供各位诊断,刚才我用CreateFile来打开设备,提示设备找到并打开了,但我在DispatchCreate里的DbgPrint同样没有输出到DriverMonitor,所以,很可能我的根本上什么IRP都不到,但AddDevice返回的是STATUS_SUCCESS,所以说明设备还是成功添加了

[编辑 -  8/28/04 by  wjnong]

刚才重启后再安装驱动程序,然后调用CreateFile和CloseHandle,发现DispatchCreate和DispatchClose都被调用了,但DispatchPnp还是没被调用,说明系统可能不认为我的驱动支持PNP,但我在Link的时候已经设了个/Driver:WDM开关了,为什么它不给我发工资?为什么它不给我发PNP_IRP??????

[编辑 -  8/28/04 by  wjnong]


建议在贴些源码来判断判断.
wjnong
驱动牛犊
驱动牛犊
  • 注册日期2004-07-30
  • 最后登录2007-01-25
  • 粉丝0
  • 关注0
  • 积分97分
  • 威望10点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2004-08-28 17:48
好,
 
NTSTATUS
DriverEntry(PDRIVER_OBJECT DriverObj, PUNICODE_STRING RegistryPath)
{
      
    NTSTATUS status = STATUS_SUCCESS;
        
    DbgPrint("nAMCC PCI Driver -- Compiled %s %sn",__DATE__, __TIME__);
    DbgPrint("(c) 2004 KIP Electronic,Inc.n");

    DriverObj->DriverExtension->AddDevice = AddDevice;
DriverObj->DriverUnload = DriverUnload;
DriverObj->DriverStartIo = StartIo;
    
//
    // Establish dispatch entry points for the functions we support
    //

    DriverObj->MajorFunction[IRP_MJ_CREATE]         =  DispatchCreateClose;
    DriverObj->MajorFunction[IRP_MJ_CLOSE]          =  DispatchCreateClose;

    DriverObj->MajorFunction[IRP_MJ_READ]           =  DispatchRead;
    DriverObj->MajorFunction[IRP_MJ_WRITE]          =  DispatchWrite;
    DriverObj->MajorFunction[IRP_MJ_DEVICE_CONTROL] =  DispatchDeviceControl;
    DriverObj->MajorFunction[IRP_MJ_PNP]            =  DispatchPnp;
    DriverObj->MajorFunction[IRP_MJ_POWER]          =  DispatchPower;
#if DBG
    DbgPrint("DriverEntry: leavingn");
#endif
    
    return(STATUS_SUCCESS);
    
}



 
NTSTATUS AddDevice(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT pdo)
{ // AddDevice
  
    NTSTATUS status = STATUS_SUCCESS;
//WCHAR KernelNameBuffer[] =L"\Device\AMCC5933";
UNICODE_STRING devName;
    //WCHAR UserDeviceNameBuffer[] =L"\DosDevice\AMCC5933";
UNICODE_STRING devLinkName;
    PDEVICE_OBJECT devObj;
POSR_DEVICE_EXT devExt;

#if DBG
    DbgPrint("AddDevice:AddDevice:Entering n");
#endif
RtlInitUnicodeString(&devName, L"\Device\Amcc5933_0");

    //
    // Ask the I/O Manager to create the device object and
    // device extension
    //
    status = IoCreateDevice(DriverObject,
                            sizeof(OSR_DEVICE_EXT),
                            &devName,
                            FILE_DEVICE_UNKNOWN,
                            FILE_DEVICE_SECURE_OPEN ,      
                            FALSE,
                            &devObj);

        
    if(!NT_SUCCESS(status))  {
        
#if DBG
        DbgPrint("IoCreateDevice failed.  Status = 0x%0xn", status);
#endif
        return(STATUS_UNSUCCESSFUL);
    }    
    
     
    
    
//
    // Get a pointer to our device extension
    //
    devExt = (POSR_DEVICE_EXT)devObj->DeviceExtension;
    
//
    // Zero out the device extension.  While not strictly necessary
    // (the documentation says the device extension is zeroed) it's
    // better to be safe.
    //

    RtlZeroMemory(devExt, sizeof(OSR_DEVICE_EXT));
    //
    // Save the device object pointer away for future reference
    //
    devExt->DeviceObject = devObj;

    //
    // Next, make the device accessible from user-mode applications.
    // Note that this name can be either the same or different from
    // the native "kernel mode" name of the device object, given above.
    //
    RtlInitUnicodeString(&devLinkName, L"\??\Amcc5933_0");

    status = IoCreateSymbolicLink(&devLinkName, &devName);
    
    if (!NT_SUCCESS(status))
    {
#if DBG
        DbgPrint("AddDevice:IoCreateSymbolicLink failed.  Status = 0x%0xn", status);
#endif
        return(STATUS_UNSUCCESSFUL);
    }
    
//下面的语句如果不注释掉就会死机,
//devExt->LowerDeviceObject =   IoAttachDeviceToDeviceStack(devObj, pdo);
    //if (!devExt->LowerDeviceObject)
{ // can't attach
#if DBG
       DbgPrint("AddDevice:IoAttachDeviceToDeviceStack failedn");
#endif
 status = STATUS_DEVICE_REMOVED;
} // can't attach  


    //
    // Initialize our Spin Locks
    //
    //KeInitializeSpinLock(&devExt->ReadQueueLock);
    //KeInitializeSpinLock(&devExt->WriteQueueLock);
    
    
    IoInitializeDpcRequest(devObj, DpcForIsr);


// Declare the buffering method we'll use for read/write requests
devObj->Flags |= DO_DIRECT_IO;

// Clear the "initializing" flag so that we can get IRPs
devObj->Flags &= ~DO_DEVICE_INITIALIZING;

if (!NT_SUCCESS(status))
{ // need to cleanup
//if (devExt->devname.Buffer)
// RtlFreeUnicodeString(&pdx->devname);
if (devExt->LowerDeviceObject)
IoDetachDevice(devExt->LowerDeviceObject);
IoDeleteDevice(devObj);
} // need to cleanup, cleanup side effects


#if DBG
    DbgPrint("AddDevice:Leaving AddDevice,Status = 0x%0xn",status);
#endif
    
return(status);  

} // AddDevice


 
NTSTATUS DispatchPnp(PDEVICE_OBJECT DeviceObject, PIRP Irp)
{
  
  NTSTATUS  status = STATUS_SUCCESS;
  PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp);
  POSR_DEVICE_EXT devExt = (POSR_DEVICE_EXT) DeviceObject->DeviceExtension;
  ULONG MinorFunction = stack->MinorFunction;

#if DBG
  DbgPrint("DispatchPnp: enteringn");
#endif
  
  switch(MinorFunction)
  {
  case IRP_MN_START_DEVICE:
status = PnpHandleStartDevice( DeviceObject, Irp);
    #if DBG
          DbgPrint("DispatchPnp: IRP_MN_START_DEVICEn");
    #endif
 //ntStatus = PnpHandleStartDevice(DeviceObject,Irp);
break;
  case IRP_MN_STOP_DEVICE:
IoCompleteRequest(Irp, IO_NO_INCREMENT); //ntStatus = PnpHandleStopDevice(DeviceObject,Irp);
break;
  case IRP_MN_REMOVE_DEVICE:
IoCompleteRequest(Irp, IO_NO_INCREMENT);//ntStatus = PnpHandleRemoveDevice(DeviceObject,Irp);
break;
  case IRP_MN_QUERY_CAPABILITIES:
IoCompleteRequest(Irp, IO_NO_INCREMENT);//ntStatus = PnpHandleStartDevice(DeviceObject,Irp);
break;
  default:
IoCompleteRequest(Irp, IO_NO_INCREMENT);
break;
//ntStatus = PnpHandleDefault( DeviceObject,Irp);
  }
  
#if DBG
  DbgPrint("DispatchPnp: leaving");
#endif
  
  return status;
  
}

我觉得相关的就这些了,
再附上编译和链接选项:
Compile Option:
/nologo /Gz /MLd /W3 /Z7 /Oi /Gy /I "$(DDKROOT)inc" /FI"$(DDKROOT)incwarning.h" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D _X86_=1 /D i386=1 /D "STD_CALL" /D CONDITION_HANDLING=1 /D NT_UP=1 /D NT_INST=0 /D WIN32=100 /D _NT1X_=100 /D WINNT=1 /D _WIN32_WINNT=0x0500 /D _WIN32_IE=0x0400 /D WIN32_LEAN_AND_MEAN=1 /D DBG=1 /D DEVL=1 /D FPO=0 /D "NDEBUG" /D _DLL=1 /D "DRIVER" /D "_IDWBUILD" /D "RDRDBG" /D "SRVDBG" /FR"objchki386/" /Fo"objchki386/" /Fd"objchki386/" /FD /GF /TC /c


Link Option:
wdm.lib /nologo /base:"0x10000" /version:4.0 /entry:"DriverEntry" /subsystem:windows /pdb:none /debug /debugtype:both /machine:I386 /nodefaultlib /out:"objchki386S5933.sys" /libpath:"$(DDKPATH)libchki386" -SECTION:INIT,d -OPT:REF -FORCE:MULTIPLE -RELEASE -FULLBUILD -IGNORE:4001,4037,4039,4065,4070,4078,4087,4089,4096 -osversion:4.00 -optidata -driver -align:0x20 -subsystem:native,4.00 -debug:notmapped,FULL

谢谢关注!

[编辑 -  8/28/04 by  wjnong]
wjnong
驱动牛犊
驱动牛犊
  • 注册日期2004-07-30
  • 最后登录2007-01-25
  • 粉丝0
  • 关注0
  • 积分97分
  • 威望10点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2004-08-30 21:31
Problem solved!
原来问题不出在IoAttachDeviceToDeviceStack,死机是在DispatchPnp里死的,而且DispatchPnp被调用了,只不过一调用就死机所以我以为是没调用。
那么为什么把IoAttachDeviceToDeviceStack注释掉了之后就不死机了?因为如果不调用IoAttachDeviceToDeviceStack的话,系统IO管理器根本不会调用我的DispatchPnp,所以不会死机,

谢谢大家的关注!
Thread terminated
Sundsea
驱动老牛
驱动老牛
  • 注册日期2003-05-06
  • 最后登录2012-06-05
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望35点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2004-08-31 11:57
Problem solved!
原来问题不出在IoAttachDeviceToDeviceStack,死机是在DispatchPnp里死的,而且DispatchPnp被调用了,只不过一调用就死机所以我以为是没调用。
那么为什么把IoAttachDeviceToDeviceStack注释掉了之后就不死机了?因为如果不调用IoAttachDeviceToDeviceStack的话,系统IO管理器根本不会调用我的DispatchPnp,所以不会死机,

谢谢大家的关注!
Thread terminated
 



给分吧.
游客

返回顶部