ReactOS 0.4.15-dev-6644-g539123c
events.c File Reference
#include <ntoskrnl.h>
#include <debug.h>
Include dependency graph for events.c:

Go to the source code of this file.

Classes

struct  _SYS_BUTTON_CONTEXT
 

Macros

#define NDEBUG
 

Typedefs

typedef struct _SYS_BUTTON_CONTEXT SYS_BUTTON_CONTEXT
 
typedef struct _SYS_BUTTON_CONTEXTPSYS_BUTTON_CONTEXT
 

Functions

static VOID NTAPI PopGetSysButton (IN PDEVICE_OBJECT DeviceObject, IN PVOID Context)
 
VOID NTAPI PoNotifySystemTimeSet (VOID)
 
static NTSTATUS NTAPI PopGetSysButtonCompletion (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
 
NTSTATUS NTAPI PopAddRemoveSysCapsCallback (IN PVOID NotificationStructure, IN PVOID Context)
 

Variables

PKWIN32_POWEREVENT_CALLOUT PopEventCallout
 
PCALLBACK_OBJECT SetSystemTimeCallback
 

Macro Definition Documentation

◆ NDEBUG

#define NDEBUG

Definition at line 12 of file events.c.

Typedef Documentation

◆ PSYS_BUTTON_CONTEXT

◆ SYS_BUTTON_CONTEXT

Function Documentation

◆ PoNotifySystemTimeSet()

VOID NTAPI PoNotifySystemTimeSet ( VOID  )

Definition at line 39 of file events.c.

40{
42
43 /* Check if Win32k registered a notification callback */
45 {
46 /* Raise to dispatch */
48
49 /* Notify the callback */
51
52 /* Lower IRQL back */
54 }
55}
#define NULL
Definition: types.h:112
UCHAR KIRQL
Definition: env_spec_w32.h:591
#define KeRaiseIrql(irql, oldIrql)
Definition: env_spec_w32.h:597
#define KeLowerIrql(oldIrql)
Definition: env_spec_w32.h:602
#define DISPATCH_LEVEL
Definition: env_spec_w32.h:696
VOID NTAPI ExNotifyCallback(IN PCALLBACK_OBJECT CallbackObject, IN PVOID Argument1, IN PVOID Argument2)
Definition: callback.c:467
PCALLBACK_OBJECT SetSystemTimeCallback
Definition: callback.c:27
PKWIN32_POWEREVENT_CALLOUT PopEventCallout
Definition: events.c:32
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
Definition: kefuncs.h:792

Referenced by ExpSetTimeZoneInformation(), NtSetSystemTime(), and Phase1InitializationDiscard().

◆ PopAddRemoveSysCapsCallback()

NTSTATUS NTAPI PopAddRemoveSysCapsCallback ( IN PVOID  NotificationStructure,
IN PVOID  Context 
)

Definition at line 147 of file events.c.

149{
151 PSYS_BUTTON_CONTEXT SysButtonContext;
156 PIRP Irp;
159 BOOLEAN Arrival;
160 ULONG Caps;
162
163 DPRINT("PopAddRemoveSysCapsCallback(%p %p)\n",
165
167 if (Notification->Version != 1)
171 if (RtlCompareMemory(&Notification->Event, &GUID_DEVICE_INTERFACE_ARRIVAL, sizeof(GUID)) == sizeof(GUID))
172 Arrival = TRUE;
173 else if (RtlCompareMemory(&Notification->Event, &GUID_DEVICE_INTERFACE_REMOVAL, sizeof(GUID)) == sizeof(GUID))
174 Arrival = FALSE;
175 else
177
178 if (Arrival)
179 {
180 DPRINT("Arrival of %wZ\n", Notification->SymbolicLinkName);
181
182 /* Open the device */
184 Notification->SymbolicLinkName,
186 NULL,
187 NULL);
193 0);
194 if (!NT_SUCCESS(Status))
195 {
196 DPRINT1("ZwOpenFile() failed with status 0x%08lx\n", Status);
197 return Status;
198 }
203 (PVOID*)&FileObject,
204 NULL);
205 if (!NT_SUCCESS(Status))
206 {
207 DPRINT1("ObReferenceObjectByHandle() failed with status 0x%08lx\n", Status);
209 return Status;
210 }
213
214 /* Get capabilities (IOCTL_GET_SYS_BUTTON_CAPS) */
218 NULL,
219 0,
220 &Caps,
221 sizeof(Caps),
222 FALSE,
223 &Event,
225 if (!Irp)
226 {
227 DPRINT1("IoBuildDeviceIoControlRequest() failed\n");
230 }
232 if (Status == STATUS_PENDING)
233 {
234 DPRINT("IOCTL_GET_SYS_BUTTON_CAPS pending\n");
237 }
238 if (!NT_SUCCESS(Status))
239 {
240 DPRINT1("Sending IOCTL_GET_SYS_BUTTON_CAPS failed with status 0x%08x\n", Status);
243 }
244
245 DPRINT("Device capabilities: 0x%x\n", Caps);
246 if (Caps & SYS_BUTTON_POWER)
247 {
248 DPRINT("POWER button present\n");
250 }
251
252 if (Caps & SYS_BUTTON_SLEEP)
253 {
254 DPRINT("SLEEP button present\n");
256 }
257
258 if (Caps & SYS_BUTTON_LID)
259 {
260 DPRINT("LID present\n");
262 }
263
264 SysButtonContext = ExAllocatePoolWithTag(NonPagedPool,
265 sizeof(SYS_BUTTON_CONTEXT),
266 'IWOP');
267 if (!SysButtonContext)
268 {
269 DPRINT1("ExAllocatePoolWithTag() failed\n");
272 }
273
274 /* Queue a work item to get sys button event */
275 SysButtonContext->WorkItem = IoAllocateWorkItem(DeviceObject);
276 SysButtonContext->DeviceObject = DeviceObject;
277 if (!SysButtonContext->WorkItem)
278 {
279 DPRINT1("IoAllocateWorkItem() failed\n");
281 ExFreePoolWithTag(SysButtonContext, 'IWOP');
283 }
284 IoQueueWorkItem(SysButtonContext->WorkItem,
287 SysButtonContext);
288
290 return STATUS_SUCCESS;
291 }
292 else
293 {
294 DPRINT1("Removal of a power capable device not implemented\n");
296 }
297}
unsigned char BOOLEAN
LONG NTSTATUS
Definition: precomp.h:26
#define DPRINT1
Definition: precomp.h:8
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
Definition: conport.c:36
_In_ PIRP Irp
Definition: csq.h:116
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define FILE_SHARE_READ
Definition: compat.h:136
const GUID GUID_DEVICE_INTERFACE_ARRIVAL
Definition: deviface.c:14
const GUID GUID_DEVICE_INTERFACE_REMOVAL
Definition: deviface.c:15
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define KeWaitForSingleObject(pEvt, foo, a, b, c)
Definition: env_spec_w32.h:478
#define RtlCompareMemory(s1, s2, l)
Definition: env_spec_w32.h:465
#define KeInitializeEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:477
#define NonPagedPool
Definition: env_spec_w32.h:307
_Must_inspect_result_ _In_opt_ PFLT_INSTANCE _Out_ PHANDLE FileHandle
Definition: fltkernel.h:1231
Status
Definition: gdiplustypes.h:25
#define OBJ_KERNEL_HANDLE
Definition: winternl.h:231
POBJECT_TYPE IoFileObjectType
Definition: iomgr.c:36
VOID NTAPI IoQueueWorkItem(IN PIO_WORKITEM IoWorkItem, IN PIO_WORKITEM_ROUTINE WorkerRoutine, IN WORK_QUEUE_TYPE QueueType, IN PVOID Context)
Definition: iowork.c:40
PIO_WORKITEM NTAPI IoAllocateWorkItem(IN PDEVICE_OBJECT DeviceObject)
Definition: iowork.c:75
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
static OUT PIO_STATUS_BLOCK IoStatusBlock
Definition: pipe.c:75
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:106
#define KernelMode
Definition: asm.h:34
NTSYSAPI NTSTATUS NTAPI ZwOpenFile(_Out_ PHANDLE FileHandle, _In_ ACCESS_MASK DesiredAccess, _In_ POBJECT_ATTRIBUTES ObjectAttributes, _Out_ PIO_STATUS_BLOCK IoStatusBlock, _In_ ULONG ShareAccess, _In_ ULONG OpenOptions)
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
#define FILE_SHARE_WRITE
Definition: nt_native.h:681
#define FILE_READ_DATA
Definition: nt_native.h:628
@ NotificationEvent
PDEVICE_OBJECT NTAPI IoGetRelatedDeviceObject(IN PFILE_OBJECT FileObject)
Definition: device.c:1539
PIRP NTAPI IoBuildDeviceIoControlRequest(IN ULONG IoControlCode, IN PDEVICE_OBJECT DeviceObject, IN PVOID InputBuffer, IN ULONG InputBufferLength, IN PVOID OutputBuffer, IN ULONG OutputBufferLength, IN BOOLEAN InternalDeviceIoControl, IN PKEVENT Event, IN PIO_STATUS_BLOCK IoStatusBlock)
Definition: irp.c:881
#define IoCallDriver
Definition: irp.c:1225
static VOID NTAPI PopGetSysButton(IN PDEVICE_OBJECT DeviceObject, IN PVOID Context)
Definition: events.c:107
#define STATUS_PENDING
Definition: ntstatus.h:82
#define STATUS_NOT_IMPLEMENTED
Definition: ntstatus.h:239
#define STATUS_REVISION_MISMATCH
Definition: ntstatus.h:325
NTSTATUS NTAPI ObReferenceObjectByHandle(IN HANDLE Handle, IN ACCESS_MASK DesiredAccess, IN POBJECT_TYPE ObjectType, IN KPROCESSOR_MODE AccessMode, OUT PVOID *Object, OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL)
Definition: obref.c:494
SYSTEM_POWER_CAPABILITIES PopCapabilities
Definition: power.c:29
#define SYS_BUTTON_SLEEP
Definition: poclass.h:82
#define SYS_BUTTON_POWER
Definition: poclass.h:81
#define IOCTL_GET_SYS_BUTTON_CAPS
Definition: poclass.h:57
#define SYS_BUTTON_LID
Definition: poclass.h:83
#define STATUS_SUCCESS
Definition: shellext.h:65
#define DPRINT
Definition: sndvol32.h:71
PIO_WORKITEM WorkItem
Definition: events.c:20
PDEVICE_OBJECT DeviceObject
Definition: events.c:19
uint32_t ULONG
Definition: typedefs.h:59
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
_In_ PWDFDEVICE_INIT _In_ PFN_WDF_DEVICE_SHUTDOWN_NOTIFICATION Notification
Definition: wdfcontrol.h:115
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2055
_In_ WDFREQUEST _In_ WDFFILEOBJECT FileObject
Definition: wdfdevice.h:550
@ DelayedWorkQueue
Definition: extypes.h:190
_In_ PVOID NotificationStructure
Definition: iofuncs.h:1206
struct _DEVICE_INTERFACE_CHANGE_NOTIFICATION * PDEVICE_INTERFACE_CHANGE_NOTIFICATION
* PFILE_OBJECT
Definition: iotypes.h:1998
@ Suspended
Definition: ketypes.h:408
#define ObDereferenceObject
Definition: obfuncs.h:203

Referenced by PoInitSystem().

◆ PopGetSysButton()

static VOID NTAPI PopGetSysButton ( IN PDEVICE_OBJECT  DeviceObject,
IN PVOID  Context 
)
static

Definition at line 107 of file events.c.

110{
111 PSYS_BUTTON_CONTEXT SysButtonContext = Context;
112 PIO_WORKITEM CurrentWorkItem = SysButtonContext->WorkItem;
113 PIRP Irp;
114
115 /* Get button pressed (IOCTL_GET_SYS_BUTTON_EVENT) */
116 KeInitializeEvent(&SysButtonContext->Event, NotificationEvent, FALSE);
119 NULL,
120 0,
121 &SysButtonContext->SysButton,
122 sizeof(SysButtonContext->SysButton),
123 FALSE,
124 &SysButtonContext->Event,
125 &SysButtonContext->IoStatusBlock);
126 if (Irp)
127 {
130 SysButtonContext,
131 TRUE,
132 FALSE,
133 FALSE);
135 }
136 else
137 {
138 DPRINT1("IoBuildDeviceIoControlRequest() failed\n");
139 ExFreePoolWithTag(SysButtonContext, 'IWOP');
140 }
141
142 IoFreeWorkItem(CurrentWorkItem);
143}
VOID NTAPI IoFreeWorkItem(IN PIO_WORKITEM IoWorkItem)
Definition: iowork.c:64
#define IoSetCompletionRoutine(_Irp, _CompletionRoutine, _Context, _InvokeOnSuccess, _InvokeOnError, _InvokeOnCancel)
Definition: irp.cpp:498
static NTSTATUS NTAPI PopGetSysButtonCompletion(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
Definition: events.c:59
#define IOCTL_GET_SYS_BUTTON_EVENT
Definition: poclass.h:60
IO_STATUS_BLOCK IoStatusBlock
Definition: events.c:22

Referenced by PopAddRemoveSysCapsCallback().

◆ PopGetSysButtonCompletion()

static NTSTATUS NTAPI PopGetSysButtonCompletion ( IN PDEVICE_OBJECT  DeviceObject,
IN PIRP  Irp,
IN PVOID  Context 
)
static

Definition at line 59 of file events.c.

63{
64 PSYS_BUTTON_CONTEXT SysButtonContext = Context;
65 ULONG SysButton;
66
67 /* The DeviceObject can be NULL, so use the one we stored */
68 DeviceObject = SysButtonContext->DeviceObject;
69
70 /* FIXME: What do do with the sys button event? */
71 SysButton = *(PULONG)Irp->AssociatedIrp.SystemBuffer;
72 {
73 DPRINT1("A device reported the event 0x%x (", SysButton);
74 if (SysButton & SYS_BUTTON_POWER) DbgPrint(" POWER");
75 if (SysButton & SYS_BUTTON_SLEEP) DbgPrint(" SLEEP");
76 if (SysButton & SYS_BUTTON_LID) DbgPrint(" LID");
77 if (SysButton == 0) DbgPrint(" WAKE");
78 DbgPrint(" )\n");
79
80 if (SysButton & SYS_BUTTON_POWER)
81 {
82 /* FIXME: Read registry for the action we should perform here */
83 DPRINT1("Initiating shutdown after power button event\n");
84
86 }
87 }
88
89 /* Allocate a new workitem to send the next IOCTL_GET_SYS_BUTTON_EVENT */
90 SysButtonContext->WorkItem = IoAllocateWorkItem(DeviceObject);
91 if (!SysButtonContext->WorkItem)
92 {
93 DPRINT("IoAllocateWorkItem() failed\n");
94 ExFreePoolWithTag(SysButtonContext, 'IWOP');
95 return STATUS_SUCCESS;
96 }
97 IoQueueWorkItem(SysButtonContext->WorkItem,
100 SysButtonContext);
101
102 return STATUS_SUCCESS /* STATUS_CONTINUE_COMPLETION */;
103}
#define DbgPrint
Definition: hal.h:12
NTSYSAPI NTSTATUS NTAPI ZwShutdownSystem(_In_ SHUTDOWN_ACTION Action)
@ ShutdownNoReboot
Definition: extypes.h:176
uint32_t * PULONG
Definition: typedefs.h:59

Referenced by PopGetSysButton().

Variable Documentation

◆ PopEventCallout

PKWIN32_POWEREVENT_CALLOUT PopEventCallout

Definition at line 32 of file events.c.

Referenced by PoNotifySystemTimeSet(), and PsEstablishWin32Callouts().

◆ SetSystemTimeCallback

PCALLBACK_OBJECT SetSystemTimeCallback
extern

Definition at line 27 of file callback.c.

Referenced by PoNotifySystemTimeSet().