- Do massive renames in the ntoskrnl tree to make sure we don't have multiple files...
[reactos.git] / reactos / ntoskrnl / po / events.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: ntoskrnl/po/events.c
5 * PURPOSE: Power Manager
6 *
7 * PROGRAMMERS: Hervé Poussineau (hpoussin@reactos.org)
8 */
9
10 #include <ntoskrnl.h>
11 //#define NDEBUG
12 #include <internal/debug.h>
13
14 NTSTATUS
15 NTAPI
16 PopAddRemoveSysCapsCallback(
17 IN PVOID NotificationStructure,
18 IN PVOID Context)
19 {
20 PDEVICE_INTERFACE_CHANGE_NOTIFICATION Notification;
21 OBJECT_ATTRIBUTES ObjectAttributes;
22 HANDLE DeviceHandle;
23 IO_STATUS_BLOCK IoStatusBlock;
24 BOOLEAN Arrival;
25 ULONG Caps;
26 NTSTATUS Status;
27
28 DPRINT("PopAddRemoveSysCapsCallback(%p %p)\n",
29 NotificationStructure, Context);
30
31 Notification = (PDEVICE_INTERFACE_CHANGE_NOTIFICATION)NotificationStructure;
32 if (Notification->Version != 1)
33 return STATUS_REVISION_MISMATCH;
34 if (Notification->Size != sizeof(DEVICE_INTERFACE_CHANGE_NOTIFICATION))
35 return STATUS_INVALID_PARAMETER;
36 if (RtlCompareMemory(&Notification->Event, &GUID_DEVICE_INTERFACE_ARRIVAL, sizeof(GUID) == sizeof(GUID)))
37 Arrival = TRUE;
38 else if (RtlCompareMemory(&Notification->Event, &GUID_DEVICE_INTERFACE_REMOVAL, sizeof(GUID) == sizeof(GUID)))
39 Arrival = FALSE;
40 else
41 return STATUS_INVALID_PARAMETER;
42
43 if (Arrival)
44 {
45 DPRINT("Arrival of %wZ\n", Notification->SymbolicLinkName);
46
47 /* Open device */
48 InitializeObjectAttributes(
49 &ObjectAttributes,
50 Notification->SymbolicLinkName,
51 OBJ_KERNEL_HANDLE,
52 NULL,
53 NULL);
54 Status = ZwOpenFile(
55 &DeviceHandle,
56 FILE_READ_DATA,
57 &ObjectAttributes,
58 &IoStatusBlock,
59 FILE_SHARE_READ | FILE_SHARE_WRITE,
60 0);
61 if (!NT_SUCCESS(Status))
62 {
63 DPRINT("ZwOpenFile() failed with status 0x%08lx\n", Status);
64 return Status;
65 }
66
67 /* Send IOCTL_GET_SYS_BUTTON_CAPS to get new caps */
68 Status = ZwDeviceIoControlFile(
69 DeviceHandle,
70 NULL,
71 NULL,
72 NULL,
73 &IoStatusBlock,
74 IOCTL_GET_SYS_BUTTON_CAPS,
75 NULL,
76 0,
77 &Caps,
78 sizeof(Caps));
79 if (!NT_SUCCESS(Status))
80 {
81 DPRINT("ZwDeviceIoControlFile(IOCTL_GET_SYS_BUTTON_CAPS) failed with status 0x%08lx\n", Status);
82 ZwClose(DeviceHandle);
83 return Status;
84 }
85 /* FIXME: What do do with this? */
86 DPRINT1("Device capabilities: 0x%lx\n", Caps);
87
88 /* Send IOCTL_GET_SYS_BUTTON_CAPS to get current caps */
89 /* FIXME: Set a IO completion routine on it to be able to send a new one */
90 DPRINT1("Send a IOCTL_GET_SYS_BUTTON_EVENT\n");
91 return ZwClose(DeviceHandle);
92 }
93 else
94 {
95 DPRINT1("Removal of a power capable device not implemented\n");
96 return STATUS_NOT_IMPLEMENTED;
97 }
98 }