qifeng8
驱动小牛
驱动小牛
  • 注册日期2003-08-26
  • 最后登录2013-01-31
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望80点
  • 贡献值0点
  • 好评度21点
  • 原创分0分
  • 专家分0分
阅读:1344回复:9

去除"不安全的设备删除"

楼主#
更多 发布于:2004-08-10 15:56
NTSTATUS
DDK_QueryCapabilities(
    IN PDEVICE_OBJECT PdoDeviceObject,
    IN PDEVICE_CAPABILITIES DeviceCapabilities
    )
{
    PIO_STACK_LOCATION nextStack;
    PIRP irp;
    NTSTATUS ntStatus;
    KEVENT event;

    PAGED_CODE();
    irp = IoAllocateIrp(PdoDeviceObject->StackSize, FALSE);

    if (!irp) {
        return STATUS_INSUFFICIENT_RESOURCES;
    }
    //分配IO位置
    nextStack = IoGetNextIrpStackLocation(irp);
    ASSERT(nextStack != NULL);
    nextStack->MajorFunction= IRP_MJ_PNP;
    nextStack->MinorFunction= IRP_MN_QUERY_CAPABILITIES;

    KeInitializeEvent(&event, NotificationEvent, FALSE);
  
    IoSetCompletionRoutine(irp,
                           DDK_DeferIrpCompletion,
                           &event,
                           TRUE,
                           TRUE,
                           TRUE);
                          
    nextStack->Parameters.DeviceCapabilities.Capabilities = DeviceCapabilities;

    //传送一个IRP给下一层驱动程序
    //指向下一层驱动程序
    ntStatus = IoCallDriver(PdoDeviceObject,irp);

    if (ntStatus == STATUS_PENDING) {
       // wait for irp to complete
      
       TRAP(); // first time we hit this
       //等待事件
       KeWaitForSingleObject(
            &event,
            Suspended,
            KernelMode,
            FALSE,
            NULL);
    }
    
    //去除"不安全设备删除"
RtlZeroMemory( DeviceCapabilities, sizeof(DEVICE_CAPABILITIES) );
DeviceCapabilities->Size = sizeof(DEVICE_CAPABILITIES);
DeviceCapabilities->Version = 1;
DeviceCapabilities->Address = -1;
DeviceCapabilities->UINumber = -1;


DeviceCapabilities->SurpriseRemovalOK=TRUE;
DeviceCapabilities->Removable=TRUE;
DeviceCapabilities->EjectSupported=TRUE;
DeviceCapabilities->WarmEjectSupported=TRUE;
    
     //释放IRP
    IoFreeIrp(irp);
    return STATUS_SUCCESS;
}
我是这样写的,怎么好像不对啊?该怎么写
zfw
zfw
驱动小牛
驱动小牛
  • 注册日期2001-12-16
  • 最后登录2006-09-01
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-08-11 09:34
case IRP_MN_QUERY_CAPABILITIES:
{
pdc = irpStack->Parameters.DeviceCapabilities.Capabilities;
if(pdc->Version<1 || pdc->Size<sizeof(DEVICE_CAPABILITIES))
{
ntStatus = STATUS_UNSUCCESSFUL;
}
pdc->SurpriseRemovalOK = TRUE;
pdc->Removable = TRUE;

IoCompleteRequest (Irp,
                       IO_NO_INCREMENT
                       ); break;

[编辑 -  8/11/04 by  zfw]
zfw
qifeng8
驱动小牛
驱动小牛
  • 注册日期2003-08-26
  • 最后登录2013-01-31
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望80点
  • 贡献值0点
  • 好评度21点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-08-11 16:25
是在电源管理里添加这段代码?
//电源管理
NTSTATUS
D12_ProcessPowerIrp(....)
qifeng8
驱动小牛
驱动小牛
  • 注册日期2003-08-26
  • 最后登录2013-01-31
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望80点
  • 贡献值0点
  • 好评度21点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-08-11 16:45
黑屏了,我是加在这里的:
switch (irpStack->MinorFunction) {
   case IRP_MN_QUERY_CAPABILITIES:
         {
PDEVICE_CAPABILITIES pdc = irpStack->Parameters.DeviceCapabilities.Capabilities;
if(pdc->Version<1 || pdc->Size<sizeof(DEVICE_CAPABILITIES))
{
ntStatus = STATUS_UNSUCCESSFUL;
}
pdc->SurpriseRemovalOK = TRUE;
pdc->Removable = TRUE;

IoCompleteRequest (Irp,IO_NO_INCREMENT);
          }
   break;
         //开始设备
        case IRP_MN_START_DEVICE:
zfw
zfw
驱动小牛
驱动小牛
  • 注册日期2001-12-16
  • 最后登录2006-09-01
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-08-12 10:00
我的很正常啊,最后还有一句D12_DecrementIoCount(DeviceObject);是和 D12_IncrementIoCount(DeviceObject);配对的。
zfw
qifeng8
驱动小牛
驱动小牛
  • 注册日期2003-08-26
  • 最后登录2013-01-31
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望80点
  • 贡献值0点
  • 好评度21点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-08-12 11:15
好像还是不行,老大有没有邮箱,MSN?
qifeng8
驱动小牛
驱动小牛
  • 注册日期2003-08-26
  • 最后登录2013-01-31
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望80点
  • 贡献值0点
  • 好评度21点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-08-12 11:15
好像还是不行,老大有没有邮箱,QQ,MSN?
qifeng8
驱动小牛
驱动小牛
  • 注册日期2003-08-26
  • 最后登录2013-01-31
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望80点
  • 贡献值0点
  • 好评度21点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-08-12 16:25
我是在98的驱动源代码上修改的,我现在改成这样
case IRP_MN_QUERY_CAPABILITIES:
         {
         KEVENT event;
         PDEVICE_EXTENSION deviceExtension;
         //irpStack=IoGetCurrentIrpStackLocation(Irp);
         //deviceExtension=DeviceObject->DeviceExtension;
PDEVICE_CAPABILITIES pdc = irpStack->Parameters.DeviceCapabilities.Capabilities;

if(pdc->Version<1 || pdc->Size<sizeof(DEVICE_CAPABILITIES))
{
ntStatus = STATUS_UNSUCCESSFUL;
break;
}
pdc->SurpriseRemovalOK = TRUE;
pdc->Removable = TRUE;
pdc->EjectSupported=TRUE;
pdc->WarmEjectSupported=TRUE;

Irp->IoStatus.Status = STATUS_SUCCESS;

//IoCompleteRequest (Irp,IO_NO_INCREMENT);
//D12_DecrementIoCount(DeviceObject);

KeInitializeEvent(&event, NotificationEvent, FALSE);

IoCopyCurrentIrpStackLocationToNext(Irp);
  
   IoSetCompletionRoutine(Irp,D12_DeferIrpCompletion,&event,
   TRUE,
                                   TRUE,
                                   TRUE);
                          
                 //传送一个IRP给下一层驱动程序
     //指向下一层驱动程序
     deviceExtension=DeviceObject->DeviceExtension;
     ntStatus = IoCallDriver(deviceExtension->TopOfStackDeviceObject,Irp);
D12_KdPrint(("D12TEST.SYS:  ntStatus from IoCallDriver to PCI = 0x%x\n", ntStatus));

     if (ntStatus == STATUS_PENDING) {
     TRAP(); // first time we hit this
       KeWaitForSingleObject(&event,Suspended,KernelMode,
       FALSE,
       NULL);
     }

}
   break;
这样的话,不会重启了,但是"不安全的设备删除"还是出现了???怎么回事
qifeng8
驱动小牛
驱动小牛
  • 注册日期2003-08-26
  • 最后登录2013-01-31
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望80点
  • 贡献值0点
  • 好评度21点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-09-08 09:32
没人知道吗
qifeng8
驱动小牛
驱动小牛
  • 注册日期2003-08-26
  • 最后登录2013-01-31
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望80点
  • 贡献值0点
  • 好评度21点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-09-10 13:43
解决了,结贴
游客

返回顶部