阅读:2935回复:7
怎样让设备休眠?或者说怎样创建发送一个IRP_MJ_POWER的irp给设备?
我下面的代码有问题吗? 总是返回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; } |
|
沙发#
发布于:2007-04-24 18:16
用户被禁言,该主题自动屏蔽! |
|
板凳#
发布于:2007-04-24 19:36
呵呵,是把minorFunction忘了,加上就可以发送了,返回成功的,可是硬件没收到。
|
|
地板#
发布于:2007-04-26 15:03
用户被禁言,该主题自动屏蔽! |
|
地下室#
发布于:2007-04-30 08:53
多谢提供信息,参考selsusp成功了。
|
|
5楼#
发布于:2007-04-30 14:40
Delphips 你好,
最近几天都在关注你这篇帖子,参考你上面的代码和DDK中例子, 我也做了个WDM的虚拟驱动 (以自己网卡ID组建的,可以把网卡当设备来试 ,以便直接看效果) 发送IRP功能函数代码基本上是copy你的上面的代码; 然后在WDM中Startdevice功能函数中调用该函数,随便给了个DeviceState 状态,比如 PowerDeviceD3,然后跑过了,安装后结果网卡驱动是更新了, 只是网卡指示灯还是一直亮着,也就是说网卡没有进入要求状态PowerDeviceD3, 现在就有点晕了,不知道是产生IRP出问题,还是处理有问题,希望你能给点意见, 也希望路上的几位也给点意见,谢谢各位! |
|
|
6楼#
发布于:2007-07-04 08:53
我看看使用selsusp的,谢谢
|
|
7楼#
发布于:2007-07-04 08:53
我看看你是怎样使用selsusp的,谢谢
|
|