Delphips
驱动小牛
驱动小牛
  • 注册日期2003-11-10
  • 最后登录2011-02-21
  • 粉丝1
  • 关注1
  • 积分-363分
  • 威望168点
  • 贡献值0点
  • 好评度151点
  • 原创分0分
  • 专家分0分
阅读:2935回复:7

怎样让设备休眠?或者说怎样创建发送一个IRP_MJ_POWER的irp给设备?

楼主#
更多 发布于:2007-04-24 11:20
我下面的代码有问题吗? 总是返回not supported. 望大家指教。


NTSTATUS
IrpCompleted(
 PDEVICE_OBJECT DeviceObject,
 PIRP Irp,
 PVOID Context
 )
{
    PKEVENT pEvent = (PKEVENT)Context;
  
    KeSetEvent(pEvent, 0, FALSE);
          
    return STATUS_MORE_PROCESSING_REQUIRED;
}



NTSTATUS SetDevicePowerState(PDEVICE_EXTENSION pDeviceExt,DEVICE_POWER_STATE PowerState)
{
    NTSTATUS Status= STATUS_SUCCESS;
    PIRP Irp;
    KEVENT event;
    IO_STATUS_BLOCK IoStatusBlock;
    PIO_STACK_LOCATION IoStackLocation;

    //
    // Initialize the event
    //
    KeInitializeEvent(&event, NotificationEvent, FALSE);
 
    Irp = IoAllocateIrp(pDeviceExt->pPhysicalDeviceObject->StackSize, FALSE);
 
    if (!Irp)
    {
        KdPrint(("SetDevicePowerState: No memory \n"));

        return STATUS_NO_MEMORY;
    }

    IoStackLocation = IoGetNextIrpStackLocation(Irp);
    IoStackLocation->MajorFunction = IRP_MJ_POWER;
    IoStackLocation->Parameters.Power.Type = DevicePowerState;
    IoStackLocation->Parameters.Power.State.DeviceState = PowerState;
    
  
    
    IoSetCompletionRoutine(Irp, IrpCompleted, &event, TRUE, TRUE, TRUE);
 
    IoCallDriver(pDeviceExt->pPhysicalDeviceObject, Irp);
 
 
    KeWaitForSingleObject(&event, Executive, KernelMode, TRUE, 0);

    Status = Irp->IoStatus.Status;

    KdPrint(("SetDevicePowerState: status =0x%x\n", Status ));
    

    IoFreeIrp(Irp);

    return Status;
  
}
gutian98
禁止发言
禁止发言
  • 注册日期2003-01-12
  • 最后登录2016-12-11
  • 粉丝4
  • 关注2
  • 积分760分
  • 威望8026点
  • 贡献值1点
  • 好评度364点
  • 原创分0分
  • 专家分21分
  • 金点子奖
  • 社区居民
沙发#
发布于:2007-04-24 18:16
用户被禁言,该主题自动屏蔽!
Delphips
驱动小牛
驱动小牛
  • 注册日期2003-11-10
  • 最后登录2011-02-21
  • 粉丝1
  • 关注1
  • 积分-363分
  • 威望168点
  • 贡献值0点
  • 好评度151点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-04-24 19:36
呵呵,是把minorFunction忘了,加上就可以发送了,返回成功的,可是硬件没收到。
gutian98
禁止发言
禁止发言
  • 注册日期2003-01-12
  • 最后登录2016-12-11
  • 粉丝4
  • 关注2
  • 积分760分
  • 威望8026点
  • 贡献值1点
  • 好评度364点
  • 原创分0分
  • 专家分21分
  • 金点子奖
  • 社区居民
地板#
发布于:2007-04-26 15:03
用户被禁言,该主题自动屏蔽!
Delphips
驱动小牛
驱动小牛
  • 注册日期2003-11-10
  • 最后登录2011-02-21
  • 粉丝1
  • 关注1
  • 积分-363分
  • 威望168点
  • 贡献值0点
  • 好评度151点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-04-30 08:53
多谢提供信息,参考selsusp成功了。
aqiuzaizai
驱动牛犊
驱动牛犊
  • 注册日期2007-02-02
  • 最后登录2008-04-02
  • 粉丝0
  • 关注0
  • 积分180分
  • 威望69点
  • 贡献值0点
  • 好评度68点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-04-30 14:40
Delphips 你好,
最近几天都在关注你这篇帖子,参考你上面的代码和DDK中例子,
我也做了个WDM的虚拟驱动
   (以自己网卡ID组建的,可以把网卡当设备来试 ,以便直接看效果)
发送IRP功能函数代码基本上是copy你的上面的代码
然后在WDM中Startdevice功能函数中调用该函数,随便给了个DeviceState 状态,比如

PowerDeviceD3,然后跑过了,安装后结果网卡驱动是更新了,
只是网卡指示灯还是一直亮着,也就是说网卡没有进入要求状态PowerDeviceD3,
现在就有点晕了,不知道是产生IRP出问题,还是处理有问题,希望你能给点意见,
也希望路上的几位也给点意见,谢谢各位!
竹密何妨流水过 山高岂碍野云飞
xiaobai_1981
驱动牛犊
驱动牛犊
  • 注册日期2007-05-09
  • 最后登录2010-05-28
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望149点
  • 贡献值0点
  • 好评度63点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-07-04 08:53
我看看使用selsusp的,谢谢
xiaobai_1981
驱动牛犊
驱动牛犊
  • 注册日期2007-05-09
  • 最后登录2010-05-28
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望149点
  • 贡献值0点
  • 好评度63点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-07-04 08:53
我看看你是怎样使用selsusp的,谢谢
游客

返回顶部