Windows驱动的设备PNP和电源设置

              

       加班,还是悠着点吧,毕竟,多加班没好处!

                 今天,介绍下,关于PNP的操作,也就是即插即用。我们知道Windows支持PNP,但是,设备首先要声明,设备本身是支持的。
     上一章,我们讲了很多关于WdfDeviceInitXXXXXX的函数。那些都是在创建设备对象之前,调用的。设置属性,以参数的形式传给创建设备对象的函数。
      而我们的PNP的操作都是在设备对象创建后,声明的。这也合乎情理。还没有设备,怎么说支持。

                这边,我先把这些函数列举一下,在重点介绍下PNP的操作。

                VOID   WdfDeviceSetAlignmentRequirement(
                                          IN WDFDEVICE  Device,
                                          IN ULONG  AlignmentRequirement
                  );
               

                 VOID   WdfDeviceSetBusInformationForChildren(
                                          IN WDFDEVICE  Device,
                                          IN PPNP_BUS_INFORMATION  BusInformation
                  );

                 VOID     WdfDeviceSetCharacteristics(
                                          IN WDFDEVICE  Device,
                                          IN ULONG  DeviceCharacteristics
                  );

                VOID      WdfDeviceSetDeviceInterfaceState(
                                           IN WDFDEVICE  Device,
                                           IN CONST GUID*  InterfaceClassGUID,
                                           IN OPTIONAL PCUNICODE_STRING  ReferenceString,
                                           IN BOOLEAN  IsInterfaceEnabled
                   );

                VOID    WdfDeviceSetDeviceState(
                                          IN WDFDEVICE  Device,
                                          IN PWDF_DEVICE_STATE  DeviceState
                   );

                  VOID   WdfDeviceSetFailed(
                                          IN WDFDEVICE  Device,
                                          IN WDF_DEVICE_FAILED_ACTION  FailedAction
                   );

                  VOID    WdfDeviceSetSpecialFileSupport(
                                         IN WDFDEVICE  Device,
                                         IN WDF_SPECIAL_FILE_TYPE  FileType,
                                         IN BOOLEAN  FileTypeIsSupported
                   );

                  VOID    WdfDeviceSetStaticStopRemove(
                                         IN WDFDEVICE  Device,
                                         IN BOOLEAN  Stoppable
                   );

                  NTSTATUS    WdfDeviceStopIdle(
                                         IN WDFDEVICE  Device,
                                         IN BOOLEAN  WaitForD0
                   );

                  NTSTATUS   WdfDeviceWdmDispatchPreprocessedIrp(
                                          WDFDEVICE  Device,
                                          PIRP  Irp
                     );

                   PDEVICE_OBJECT   WdfDeviceWdmGetAttachedDevice(
                                          IN WDFDEVICE  Device
                     );

                   PDEVICE_OBJECT    WdfDeviceWdmGetDeviceObject(
                                          IN WDFDEVICE hDevice
                     );

                   PDEVICE_OBJECT    WdfDeviceWdmGetPhysicalDevice(
                                          IN WDFDEVICE  Device
                     );

                    这里重点介绍如下两个函数:

                   VOID   WdfDeviceSetPnpCapabilities(
                                     IN WDFDEVICE  Device,
                                     IN PWDF_DEVICE_PNP_CAPABILITIES  PnpCapabilities
                       );

                    设置设备的PNP属性:我们来看WDF_DEVICE_PNP_CAPABILITIES:

                     typedef struct _WDF_DEVICE_PNP_CAPABILITIES {
                                       ULONG Size;
                                      WDF_TRI_STATE LockSupported;
                                      WDF_TRI_STATE EjectSupported;
                                      WDF_TRI_STATE Removable;
                                      WDF_TRI_STATE DockDevice;
                                      WDF_TRI_STATE UniqueID;
                                      WDF_TRI_STATE SilentInstall;
                                      WDF_TRI_STATE SurpriseRemovalOK;
                                      WDF_TRI_STATE HardwareDisabled;
                                      WDF_TRI_STATE NoDisplayInUI;
                                      ULONG Address;
                                      ULONG UINumber;
                                    } WDF_DEVICE_PNP_CAPABILITIES, *PWDF_DEVICE_PNP_CAPABILITIES;

                    typedef enum _WDF_TRI_STATE {
                                     WdfUseDefault,
                                    WdfFalse,
                                    WdfTrue
                                    } WDF_TRI_STATE, *PWDF_TRI_STATE;

 

                  需要用宏来初始化:

                   WDF_DEVICE_PNP_CAPABILITIES  pnpCaps;

                  WDF_DEVICE_PNP_CAPABILITIES_INIT(&pnpCaps);
                 

                  pnpCaps.SurpriseRemovalOK = WdfTrue;

                  WdfDeviceSetPnpCapabilities(
                            device,
                            &pnpCaps
                            );


                  相信做个WDM驱动,就应该知道这些属性代表什么,MSDN中有详细的说明。这里不解释了。

                  还有一个函数:设置电源状态的WdfDeviceSetPowerCapabilities‘

                  VOID       WdfDeviceSetPowerCapabilities(
                                  IN WDFDEVICE  Device,
                                  IN PWDF_DEVICE_POWER_CAPABILITIES  PowerCapabilities

                                   );

                  再看下电源能力的结构体:

                  typedef struct _WDF_DEVICE_POWER_CAPABILITIES {
                                 ULONG Size;
                                 WDF_TRI_STATE DeviceD1;
                                 WDF_TRI_STATE DeviceD2;
                                 WDF_TRI_STATE WakeFromD0;
                                 WDF_TRI_STATE WakeFromD1;
                                 WDF_TRI_STATE WakeFromD2;
                                 WDF_TRI_STATE WakeFromD3;
                                DEVICE_POWER_STATE DeviceState[PowerSystemMaximum];
                                DEVICE_POWER_STATE DeviceWake;
                                SYSTEM_POWER_STATE SystemWake;
                                ULONG D1Latency;
                                ULONG D2Latency;
                               ULONG D3Latency;
                               DEVICE_POWER_STATE IdealDxStateForSx;
                               } WDF_DEVICE_POWER_CAPABILITIES, *PWDF_DEVICE_POWER_CAPABILITIES;
                 

                    typedef enum _DEVICE_POWER_STATE {
                              PowerDeviceUnspecified = 0,
                              PowerDeviceD0,
                              PowerDeviceD1,
                              PowerDeviceD2,
                              PowerDeviceD3,
                              PowerDeviceMaximum
                            } DEVICE_POWER_STATE, *PDEVICE_POWER_STATE;

                    

                  
        typedef enum _DEVICE_POWER_STATE {
             PowerDeviceUnspecified = 0,
             PowerDeviceD0,
             PowerDeviceD1,
             PowerDeviceD2,
             PowerDeviceD3,
             PowerDeviceMaximum
             } DEVICE_POWER_STATE, *PDEVICE_POWER_STATE;

          
             我们来看用宏来初始化代码:

                    WDF_DEVICE_POWER_CAPABILITIES powerCaps;

                    WDF_DEVICE_POWER_CAPABILITIES_INIT(&powerCaps);
                    powerCaps.DeviceD1 = WdfTrue;
                    powerCaps.WakeFromD1 = WdfTrue;
                    powerCaps.DeviceWake = PowerDeviceD1;
                    powerCaps.DeviceState[PowerSystemWorking] = PowerDeviceD1;
                    powerCaps.DeviceState[PowerSystemSleeping1] = PowerDeviceD1;
                    powerCaps.DeviceState[PowerSystemSleeping2] = PowerDeviceD2;
                    powerCaps.DeviceState[PowerSystemSleeping3] = PowerDeviceD2;
                    powerCaps.DeviceState[PowerSystemHibernate] = PowerDeviceD3;
                    powerCaps.DeviceState[PowerSystemShutdown] = PowerDeviceD3;

                    WdfDeviceSetPowerCapabilities(
                              device,
                              &powerCaps
                              );


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值