1/**
2 * This file has no copyright assigned and is placed in the Public Domain.
3 * This file is part of the mingw-w64 runtime package.
4 * No warranty is given; refer to the file DISCLAIMER.PD within this package.
5 */
6
7#ifndef _EMI_
8#define _EMI_
9
10#if (NTDDI_VERSION >= NTDDI_WINBLUE)
11
12#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
13
14DEFINE_GUID(GUID_DEVICE_ENERGY_METER, 0x45bd8344, 0x7ed6, 0x49cf, 0xa4, 0x40, 0xc2, 0x76, 0xc9, 0x33, 0xb0, 0x53);
15
16#define IOCTL_EMI_GET_VERSION CTL_CODE(FILE_DEVICE_UNKNOWN, 0, METHOD_BUFFERED, FILE_READ_ACCESS)
17#define IOCTL_EMI_GET_METADATA_SIZE CTL_CODE(FILE_DEVICE_UNKNOWN, 1, METHOD_BUFFERED, FILE_READ_ACCESS)
18#define IOCTL_EMI_GET_METADATA CTL_CODE(FILE_DEVICE_UNKNOWN, 2, METHOD_BUFFERED, FILE_READ_ACCESS)
19#define IOCTL_EMI_GET_MEASUREMENT CTL_CODE(FILE_DEVICE_UNKNOWN, 3, METHOD_BUFFERED, FILE_READ_ACCESS)
20
21#define EMI_NAME_MAX 16
22
23#define EMI_VERSION_V1 1
24#define EMI_VERSION_V2 2
25
26typedef enum {
27 EmiMeasurementUnitPicowattHours
28} EMI_MEASUREMENT_UNIT;
29
30typedef struct {
31 USHORT EmiVersion;
32} EMI_VERSION;
33
34typedef struct {
35 ULONG MetadataSize;
36} EMI_METADATA_SIZE;
37
38typedef struct {
39 ULONGLONG AbsoluteEnergy;
40 ULONGLONG AbsoluteTime;
41} EMI_CHANNEL_MEASUREMENT_DATA;
42
43typedef struct {
44 EMI_MEASUREMENT_UNIT MeasurementUnit;
45 WCHAR HardwareOEM[EMI_NAME_MAX];
46 WCHAR HardwareModel[EMI_NAME_MAX];
47 USHORT HardwareRevision;
48 USHORT MeteredHardwareNameSize;
49 WCHAR MeteredHardwareName[ANYSIZE_ARRAY];
50} EMI_METADATA_V1;
51
52typedef EMI_CHANNEL_MEASUREMENT_DATA EMI_MEASUREMENT_DATA_V1;
53
54typedef EMI_METADATA_V1 EMI_METADATA;
55typedef EMI_MEASUREMENT_DATA_V1 EMI_MEASUREMENT_DATA;
56
57typedef struct {
58 EMI_MEASUREMENT_UNIT MeasurementUnit;
59 USHORT ChannelNameSize;
60 WCHAR ChannelName[ANYSIZE_ARRAY];
61} EMI_CHANNEL_V2;
62
63typedef struct {
64 WCHAR HardwareOEM[EMI_NAME_MAX];
65 WCHAR HardwareModel[EMI_NAME_MAX];
66 USHORT HardwareRevision;
67 USHORT ChannelCount;
68 EMI_CHANNEL_V2 Channels[ANYSIZE_ARRAY];
69} EMI_METADATA_V2;
70
71typedef struct {
72 EMI_CHANNEL_MEASUREMENT_DATA ChannelData[ANYSIZE_ARRAY];
73} EMI_MEASUREMENT_DATA_V2;
74
75#define EMI_CHANNEL_V2_LENGTH(_ChannelNameSize) (FIELD_OFFSET(EMI_CHANNEL_V2, ChannelName) + (_ChannelNameSize))
76
77#define EMI_CHANNEL_V2_NEXT_CHANNEL(_Channel) ((EMI_CHANNEL_V2 *)((PUCHAR)(_Channel) + EMI_CHANNEL_V2_LENGTH((_Channel)->ChannelNameSize)))
78
79#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
80
81#endif /* (NTDDI_VERSION >= NTDDI_WINBLUE) */
82
83#endif /* _EMI_ */