| use winapi::shared::cfg::PNP_VETO_TYPE; |
| use winapi::shared::guiddef::GUID; |
| use winapi::shared::ntdef::{HANDLE, NTSTATUS, PULONG, PUNICODE_STRING, PVOID, ULONG, WCHAR}; |
| ENUM!{enum PLUGPLAY_EVENT_CATEGORY { |
| HardwareProfileChangeEvent = 0, |
| TargetDeviceChangeEvent = 1, |
| DeviceClassChangeEvent = 2, |
| CustomDeviceEvent = 3, |
| DeviceInstallEvent = 4, |
| DeviceArrivalEvent = 5, |
| PowerEvent = 6, |
| VetoEvent = 7, |
| BlockedDriverEvent = 8, |
| InvalidIDEvent = 9, |
| MaxPlugEventCategory = 10, |
| }} |
| pub type PPLUGPLAY_EVENT_CATEGORY = *mut PLUGPLAY_EVENT_CATEGORY; |
| STRUCT!{struct PLUGPLAY_EVENT_BLOCK_u_DeviceClass { |
| ClassGuid: GUID, |
| SymbolicLinkName: [WCHAR; 1], |
| }} |
| STRUCT!{struct PLUGPLAY_EVENT_BLOCK_u_TargetDevice { |
| DeviceIds: [WCHAR; 1], |
| }} |
| STRUCT!{struct PLUGPLAY_EVENT_BLOCK_u_InstallDevice { |
| DeviceId: [WCHAR; 1], |
| }} |
| STRUCT!{struct PLUGPLAY_EVENT_BLOCK_u_CustomNotification { |
| NotificationStructure: PVOID, |
| DeviceIds: [WCHAR; 1], |
| }} |
| STRUCT!{struct PLUGPLAY_EVENT_BLOCK_u_ProfileNotification { |
| Notification: PVOID, |
| }} |
| STRUCT!{struct PLUGPLAY_EVENT_BLOCK_u_PowerNotification { |
| NotificationCode: ULONG, |
| NotificationData: ULONG, |
| }} |
| STRUCT!{struct PLUGPLAY_EVENT_BLOCK_u_VetoNotification { |
| VetoType: PNP_VETO_TYPE, |
| DeviceIdVetoNameBuffer: [WCHAR; 1], |
| }} |
| STRUCT!{struct PLUGPLAY_EVENT_BLOCK_u_BlockedDriverNotification { |
| BlockedDriverGuid: GUID, |
| }} |
| STRUCT!{struct PLUGPLAY_EVENT_BLOCK_u_InvalidIDNotification { |
| ParentId: [WCHAR; 1], |
| }} |
| UNION!{union PLUGPLAY_EVENT_BLOCK_u { |
| DeviceClass: PLUGPLAY_EVENT_BLOCK_u_DeviceClass, |
| TargetDevice: PLUGPLAY_EVENT_BLOCK_u_TargetDevice, |
| InstallDevice: PLUGPLAY_EVENT_BLOCK_u_InstallDevice, |
| CustomNotification: PLUGPLAY_EVENT_BLOCK_u_CustomNotification, |
| ProfileNotification: PLUGPLAY_EVENT_BLOCK_u_ProfileNotification, |
| PowerNotification: PLUGPLAY_EVENT_BLOCK_u_PowerNotification, |
| VetoNotification: PLUGPLAY_EVENT_BLOCK_u_VetoNotification, |
| BlockedDriverNotification: PLUGPLAY_EVENT_BLOCK_u_BlockedDriverNotification, |
| InvalidIDNotification: PLUGPLAY_EVENT_BLOCK_u_InvalidIDNotification, |
| }} |
| STRUCT!{struct PLUGPLAY_EVENT_BLOCK { |
| EventGuid: GUID, |
| EventCategory: PLUGPLAY_EVENT_CATEGORY, |
| Result: PULONG, |
| Flags: ULONG, |
| TotalSize: ULONG, |
| DeviceObject: PVOID, |
| u: PLUGPLAY_EVENT_BLOCK_u, |
| }} |
| pub type PPLUGPLAY_EVENT_BLOCK = *mut PLUGPLAY_EVENT_BLOCK; |
| ENUM!{enum PLUGPLAY_CONTROL_CLASS { |
| PlugPlayControlEnumerateDevice = 0, |
| PlugPlayControlRegisterNewDevice = 1, |
| PlugPlayControlDeregisterDevice = 2, |
| PlugPlayControlInitializeDevice = 3, |
| PlugPlayControlStartDevice = 4, |
| PlugPlayControlUnlockDevice = 5, |
| PlugPlayControlQueryAndRemoveDevice = 6, |
| PlugPlayControlUserResponse = 7, |
| PlugPlayControlGenerateLegacyDevice = 8, |
| PlugPlayControlGetInterfaceDeviceList = 9, |
| PlugPlayControlProperty = 10, |
| PlugPlayControlDeviceClassAssociation = 11, |
| PlugPlayControlGetRelatedDevice = 12, |
| PlugPlayControlGetInterfaceDeviceAlias = 13, |
| PlugPlayControlDeviceStatus = 14, |
| PlugPlayControlGetDeviceDepth = 15, |
| PlugPlayControlQueryDeviceRelations = 16, |
| PlugPlayControlTargetDeviceRelation = 17, |
| PlugPlayControlQueryConflictList = 18, |
| PlugPlayControlRetrieveDock = 19, |
| PlugPlayControlResetDevice = 20, |
| PlugPlayControlHaltDevice = 21, |
| PlugPlayControlGetBlockedDriverList = 22, |
| PlugPlayControlGetDeviceInterfaceEnabled = 23, |
| MaxPlugPlayControl = 24, |
| }} |
| pub type PPLUGPLAY_CONTROL_CLASS = *mut PLUGPLAY_CONTROL_CLASS; |
| EXTERN!{extern "system" { |
| fn NtGetPlugPlayEvent( |
| EventHandle: HANDLE, |
| Context: PVOID, |
| EventBlock: PPLUGPLAY_EVENT_BLOCK, |
| EventBufferSize: ULONG, |
| ) -> NTSTATUS; |
| fn NtPlugPlayControl( |
| PnPControlClass: PLUGPLAY_CONTROL_CLASS, |
| PnPControlData: PVOID, |
| PnPControlDataLength: ULONG, |
| ) -> NTSTATUS; |
| fn NtSerializeBoot() -> NTSTATUS; |
| fn NtEnableLastKnownGood() -> NTSTATUS; |
| fn NtDisableLastKnownGood() -> NTSTATUS; |
| fn NtReplacePartitionUnit( |
| TargetInstancePath: PUNICODE_STRING, |
| SpareInstancePath: PUNICODE_STRING, |
| Flags: ULONG, |
| ) -> NTSTATUS; |
| }} |