1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
|
/*++
Copyright (c) Microsoft Corporation. All rights reserved.
Module Name:
pep.h
Abstract:
This is the general header.
--*/
//
//--------------------------------------------------------------------- Pragmas
//
#pragma once
//
//-------------------------------------------------------------------- Includes
//
#include <ntddk.h>
#include <pepfx.h>
#include "pch.h"
//
//----------------------------------------------------------------- Definitions
//
#define PEP_POOL_TAG 'xEPT'
#define PEP_REGISTRY_OPTIN_KEY L"PepOptIn"
#define PEP_REGISTRY_OPTIN_KEY_ACPI_MASK 0x00000001
#define PEP_REGISTRY_OPTIN_KEY_DPM_MASK 0x00000002
#define PEP_REGISTRY_OPTIN_KEY_PPM_MASK 0x00000004
#define PEP_MAKE_DEVICE_TYPE(Major, Minor, UniqueId) \
(ULONG)(((ULONG)(Major) << 24) | \
(((ULONG)(Minor) & 0xFF) << 16) | \
((ULONG)(UniqueId) & 0xFFFF))
#define OffsetToPtr(base, offset) ((PVOID)((ULONG_PTR)(base) + (offset)))
#define PEP_ACPI_NOTIFICATION_ID_TO_WORK_TYPE(Id) \
(((Id) == PEP_NOTIFY_ACPI_EVALUATE_CONTROL_METHOD) ? \
PepWorkAcpiEvaluateControlMethodComplete : \
PepWorkAcpiNotify)
//
// ACPI method names.
//
#define ACPI_OBJECT_NAME_AC0 ((ULONG)'0CA_')
#define ACPI_OBJECT_NAME_AC1 ((ULONG)'1CA_')
#define ACPI_OBJECT_NAME_AC2 ((ULONG)'2CA_')
#define ACPI_OBJECT_NAME_AC3 ((ULONG)'3CA_')
#define ACPI_OBJECT_NAME_AC4 ((ULONG)'4CA_')
#define ACPI_OBJECT_NAME_AC5 ((ULONG)'5CA_')
#define ACPI_OBJECT_NAME_AC6 ((ULONG)'6CA_')
#define ACPI_OBJECT_NAME_AC7 ((ULONG)'7CA_')
#define ACPI_OBJECT_NAME_AC8 ((ULONG)'8CA_')
#define ACPI_OBJECT_NAME_AC9 ((ULONG)'9CA_')
#define ACPI_OBJECT_NAME_ADR ((ULONG)'RDA_')
#define ACPI_OBJECT_NAME_AL0 ((ULONG)'0LA_')
#define ACPI_OBJECT_NAME_AL1 ((ULONG)'1LA_')
#define ACPI_OBJECT_NAME_AL2 ((ULONG)'2LA_')
#define ACPI_OBJECT_NAME_AL3 ((ULONG)'3LA_')
#define ACPI_OBJECT_NAME_AL4 ((ULONG)'4LA_')
#define ACPI_OBJECT_NAME_AL5 ((ULONG)'5LA_')
#define ACPI_OBJECT_NAME_AL6 ((ULONG)'6LA_')
#define ACPI_OBJECT_NAME_AL7 ((ULONG)'7LA_')
#define ACPI_OBJECT_NAME_AL8 ((ULONG)'8LA_')
#define ACPI_OBJECT_NAME_AL9 ((ULONG)'9LA_')
#define ACPI_OBJECT_NAME_BST ((ULONG)'TSB_')
#define ACPI_OBJECT_NAME_CCA ((ULONG)'ACC_')
#define ACPI_OBJECT_NAME_CID ((ULONG)'DIC_')
#define ACPI_OBJECT_NAME_CLS ((ULONG)'SLC_')
#define ACPI_OBJECT_NAME_CRS ((ULONG)'SRC_')
#define ACPI_OBJECT_NAME_CRT ((ULONG)'TRC_')
#define ACPI_OBJECT_NAME_DCK ((ULONG)'KCD_')
#define ACPI_OBJECT_NAME_DDN ((ULONG)'NDD_')
#define ACPI_OBJECT_NAME_DEP ((ULONG)'PED_')
#define ACPI_OBJECT_NAME_DIS ((ULONG)'SID_')
#define ACPI_OBJECT_NAME_DLM ((ULONG)'MLD_')
#define ACPI_OBJECT_NAME_DSM ((ULONG)'MSD_')
#define ACPI_OBJECT_NAME_DSW ((ULONG)'WSD_')
#define ACPI_OBJECT_NAME_DTI ((ULONG)'ITD_')
#define ACPI_OBJECT_NAME_EJD ((ULONG)'DJE_')
#define ACPI_OBJECT_NAME_EJ0 ((ULONG)'0JE_')
#define ACPI_OBJECT_NAME_EJ1 ((ULONG)'1JE_')
#define ACPI_OBJECT_NAME_EJ2 ((ULONG)'2JE_')
#define ACPI_OBJECT_NAME_EJ3 ((ULONG)'3JE_')
#define ACPI_OBJECT_NAME_EJ4 ((ULONG)'4JE_')
#define ACPI_OBJECT_NAME_EJ5 ((ULONG)'5JE_')
#define ACPI_OBJECT_NAME_FST ((ULONG)'TSF_')
#define ACPI_OBJECT_NAME_GHID ((ULONG)'DIHG')
#define ACPI_OBJECT_NAME_HID ((ULONG)'DIH_')
#define ACPI_OBJECT_NAME_HRV ((ULONG)'VRH_')
#define ACPI_OBJECT_NAME_HOT ((ULONG)'TOH_')
#define ACPI_OBJECT_NAME_INI ((ULONG)'INI_')
#define ACPI_OBJECT_NAME_IRC ((ULONG)'CRI_')
#define ACPI_OBJECT_NAME_LCK ((ULONG)'KCL_')
#define ACPI_OBJECT_NAME_LID ((ULONG)'DIL_')
#define ACPI_OBJECT_NAME_MAT ((ULONG)'TAM_')
#define ACPI_OBJECT_NAME_NTT ((ULONG)'TTN_')
#define ACPI_OBJECT_NAME_OFF ((ULONG)'FFO_')
#define ACPI_OBJECT_NAME_ON ((ULONG)'_NO_')
#define ACPI_OBJECT_NAME_OSC ((ULONG)'CSO_')
#define ACPI_OBJECT_NAME_OST ((ULONG)'TSO_')
#define ACPI_OBJECT_NAME_PCCH ((ULONG)'HCCP')
#define ACPI_OBJECT_NAME_PR0 ((ULONG)'0RP_')
#define ACPI_OBJECT_NAME_PR1 ((ULONG)'1RP_')
#define ACPI_OBJECT_NAME_PR2 ((ULONG)'2RP_')
#define ACPI_OBJECT_NAME_PR3 ((ULONG)'3RP_')
#define ACPI_OBJECT_NAME_PRS ((ULONG)'SRP_')
#define ACPI_OBJECT_NAME_PRT ((ULONG)'TRP_')
#define ACPI_OBJECT_NAME_PRW ((ULONG)'WRP_')
#define ACPI_OBJECT_NAME_PS0 ((ULONG)'0SP_')
#define ACPI_OBJECT_NAME_PS1 ((ULONG)'1SP_')
#define ACPI_OBJECT_NAME_PS2 ((ULONG)'2SP_')
#define ACPI_OBJECT_NAME_PS3 ((ULONG)'3SP_')
#define ACPI_OBJECT_NAME_PSC ((ULONG)'CSP_')
#define ACPI_OBJECT_NAME_PSL ((ULONG)'LSP_')
#define ACPI_OBJECT_NAME_PSV ((ULONG)'VSP_')
#define ACPI_OBJECT_NAME_PSW ((ULONG)'WSP_')
#define ACPI_OBJECT_NAME_PTS ((ULONG)'STP_')
#define ACPI_OBJECT_NAME_REG ((ULONG)'GER_')
#define ACPI_OBJECT_NAME_RMV ((ULONG)'VMR_')
#define ACPI_OBJECT_NAME_S0 ((ULONG)'_0S_')
#define ACPI_OBJECT_NAME_S0D ((ULONG)'D0S_')
#define ACPI_OBJECT_NAME_S0W ((ULONG)'W0S_')
#define ACPI_OBJECT_NAME_S1 ((ULONG)'_1S_')
#define ACPI_OBJECT_NAME_S1D ((ULONG)'D1S_')
#define ACPI_OBJECT_NAME_S1W ((ULONG)'W1S_')
#define ACPI_OBJECT_NAME_S2 ((ULONG)'_2S_')
#define ACPI_OBJECT_NAME_S2D ((ULONG)'D2S_')
#define ACPI_OBJECT_NAME_S2W ((ULONG)'W2S_')
#define ACPI_OBJECT_NAME_S3 ((ULONG)'_3S_')
#define ACPI_OBJECT_NAME_S3D ((ULONG)'D3S_')
#define ACPI_OBJECT_NAME_S3W ((ULONG)'W3S_')
#define ACPI_OBJECT_NAME_S4 ((ULONG)'_4S_')
#define ACPI_OBJECT_NAME_S4D ((ULONG)'D4S_')
#define ACPI_OBJECT_NAME_S4W ((ULONG)'W4S_')
#define ACPI_OBJECT_NAME_S5 ((ULONG)'_5S_')
#define ACPI_OBJECT_NAME_S5D ((ULONG)'D5S_')
#define ACPI_OBJECT_NAME_S5W ((ULONG)'W5S_')
#define ACPI_OBJECT_NAME_SCP ((ULONG)'PCS_')
#define ACPI_OBJECT_NAME_SEG ((ULONG)'GES_')
#define ACPI_OBJECT_NAME_SI ((ULONG)'_IS_')
#define ACPI_OBJECT_NAME_SRS ((ULONG)'SRS_')
#define ACPI_OBJECT_NAME_SST ((ULONG)'TSS_')
#define ACPI_OBJECT_NAME_STA ((ULONG)'ATS_')
#define ACPI_OBJECT_NAME_STD ((ULONG)'DTS_')
#define ACPI_OBJECT_NAME_SUB ((ULONG)'BUS_')
#define ACPI_OBJECT_NAME_SUN ((ULONG)'NUS_')
#define ACPI_OBJECT_NAME_SWD ((ULONG)'DWS_')
#define ACPI_OBJECT_NAME_TC1 ((ULONG)'1CT_')
#define ACPI_OBJECT_NAME_TC2 ((ULONG)'2CT_')
#define ACPI_OBJECT_NAME_TMP ((ULONG)'PMT_')
#define ACPI_OBJECT_NAME_TSP ((ULONG)'PST_')
#define ACPI_OBJECT_NAME_TZD ((ULONG)'DZT_')
#define ACPI_OBJECT_NAME_UID ((ULONG)'DIU_')
#define ACPI_OBJECT_NAME_WAK ((ULONG)'KAW_')
#define ACPI_OBJECT_NAME_BBN ((ULONG)'NBB_')
#define ACPI_OBJECT_NAME_PXM ((ULONG)'MXP_')
#define ACPI_OBJECT_NAME_PLD ((ULONG)'DLP_')
#define ACPI_OBJECT_NAME_REV ((ULONG)'VER_')
#define NAME_NATIVE_METHOD(_Name) (((_Name) == NULL) ? "Unknown" : (_Name))
#define NAME_DEBUG_INFO(_Info) (((_Info) == NULL) ? "" : (_Info))
//
//----------------------------------------------------------------------- Types
//
typedef enum _PEP_MAJOR_DEVICE_TYPE {
PepMajorDeviceTypeProcessor,
PepMajorDeviceTypeAcpi,
PepMajorDeviceTypeMaximum
} PEP_MAJOR_DEVICE_TYPE, *PPEP_MAJOR_DEVICE_TYPE;
C_ASSERT(PepMajorDeviceTypeMaximum <= 0xFF); // 8 bits max
typedef enum _PEP_ACPI_MINOR_DEVICE_TYPE {
PepAcpiMinorTypeDevice,
PepAcpiMinorTypePowerResource,
PepAcpiMinorTypeThermalZone,
PepAcpiMinorTypeMaximum
} PEP_ACPI_MINOR_DEVICE_TYPE, *PPEP_ACPI_MINOR_DEVICE_TYPE;
C_ASSERT(PepAcpiMinorTypeMaximum <= 0xFF); // 8 bits max
#define PEP_INVALID_DEVICE_TYPE \
PEP_MAKE_DEVICE_TYPE(PepMajorDeviceTypeMaximum, \
PepAcpiMinorTypeMaximum, \
0xFFFF)
typedef enum _PEP_NOTIFICATION_HANDLER_RESULT {
PEP_NOTIFICATION_HANDLER_COMPLETE,
PEP_NOTIFICATION_HANDLER_MORE_WORK,
PEP_NOTIFICATION_HANDLER_MAX
} PEP_NOTIFICATION_HANDLER_RESULT,
*PPEP_NOTIFICATION_HANDLER_RESULT;
typedef
VOID
PEP_GENERAL_NOTIFICATION_HANDLER_ROUTINE (
_In_ PVOID Data
);
typedef PEP_GENERAL_NOTIFICATION_HANDLER_ROUTINE
*PPEP_GENERAL_NOTIFICATION_HANDLER_ROUTINE;
typedef
PEP_NOTIFICATION_HANDLER_RESULT
PEP_NOTIFICATION_HANDLER_ROUTINE (
_In_ PVOID Data,
_Out_opt_ PPEP_WORK_INFORMATION PoFxWorkInfo
);
typedef PEP_NOTIFICATION_HANDLER_ROUTINE
*PPEP_NOTIFICATION_HANDLER_ROUTINE;
typedef struct _PEP_GENERAL_NOTIFICATION_HANDLER {
ULONG Notification;
PPEP_GENERAL_NOTIFICATION_HANDLER_ROUTINE Handler;
CONST PCHAR Name;
} PEP_GENERAL_NOTIFICATION_HANDLER, *PPEP_GENERAL_NOTIFICATION_HANDLER;
typedef struct _PEP_DEVICE_NOTIFICATION_HANDLER {
ULONG Notification;
PPEP_NOTIFICATION_HANDLER_ROUTINE Handler;
PPEP_NOTIFICATION_HANDLER_ROUTINE WorkerCallbackHandler;
} PEP_DEVICE_NOTIFICATION_HANDLER, *PPEP_DEVICE_NOTIFICATION_HANDLER;
typedef ULONG _PEP_DEVICE_TYPE, PEP_DEVICE_TYPE, *PPEP_DEVICE_TYPE;
typedef struct _PEP_OBJECT_INFORMATION {
ULONG ObjectName;
ULONG InputArgumentCount;
ULONG OutputArgumentCount;
PEP_ACPI_OBJECT_TYPE ObjectType;
} PEP_OBJECT_INFORMATION, *PPEP_OBJECT_INFORMATION;
struct _PEP_INTERNAL_DEVICE_HEADER;
typedef
NTSTATUS
PEP_DEVICE_CONTEXT_INITIALIZE (
_In_ struct _PEP_INTERNAL_DEVICE_HEADER *Context
);
typedef PEP_DEVICE_CONTEXT_INITIALIZE *PPEP_DEVICE_CONTEXT_INITIALIZE;
typedef struct _PEP_DEVICE_DEFINITION {
PEP_DEVICE_TYPE Type;
ULONG ContextSize;
PPEP_DEVICE_CONTEXT_INITIALIZE Initialize;
//
// The following fields are valid if device is DPM-owned.
//
//
// The following fields are valid if device is ACPI-owned.
//
ULONG ObjectCount;
_Field_size_(ObjectCount) PPEP_OBJECT_INFORMATION Objects;
ULONG AcpiNotificationHandlerCount;
_Field_size_(AcpiNotificationHandlerCount)
PPEP_DEVICE_NOTIFICATION_HANDLER AcpiNotificationHandlers;
ULONG DpmNotificationHandlerCount;
_Field_size_(DpmNotificationHandlerCount)
PPEP_DEVICE_NOTIFICATION_HANDLER DpmNotificationHandlers;
} PEP_DEVICE_DEFINITION, *PPEP_DEVICE_DEFINITION;
//
// Common device object header
//
typedef struct _PEP_INTERNAL_DEVICE_HEADER {
LIST_ENTRY ListEntry;
PEP_DEVICE_TYPE DeviceType;
POHANDLE KernelHandle;
PWSTR InstancePath;
KSPIN_LOCK Lock;
PPEP_DEVICE_DEFINITION DeviceDefinition;
} PEP_INTERNAL_DEVICE_HEADER, *PPEP_INTERNAL_DEVICE_HEADER;
typedef struct _PEP_PROCESSOR_DEVICE {
PEP_INTERNAL_DEVICE_HEADER Header;
//
// Processor identification
//
PROCESSOR_NUMBER Processor;
ULONG NtNumber;
//
// Idle states
//
ULONG SelectedIdleState;
ULONG IdleStateCount;
PEP_PROCESSOR_IDLE_STATE_V2 IdleStates[10];
//
// Performance states
//
ULONG CurrentPerformance;
} PEP_PROCESSOR_DEVICE, *PPEP_PROCESSOR_DEVICE;
typedef struct _PEP_ACPI_DEVICE {
PEP_INTERNAL_DEVICE_HEADER Header;
} PEP_ACPI_DEVICE, *PPEP_ACPI_DEVICE;
typedef enum _PEP_NOTIFICATION_CLASS {
PEP_NOTIFICATION_CLASS_NONE = 0,
PEP_NOTIFICATION_CLASS_ACPI = 1,
PEP_NOTIFICATION_CLASS_DPM = 2,
PEP_NOTIFICATION_CLASS_PPM = 4
} PEP_NOTIFICATION_CLASS, *PPEP_NOTIFICATION_CLASS;
#define PEP_CHECK_DEVICE_TYPE_ACCEPTED(_Type, _Mask) \
(((_Type) & (_Mask)) == (_Mask))
typedef enum _PEP_DEVICE_ID_MATCH {
PepDeviceIdMatchPartial, // Substring match.
PepDeviceIdMatchFull, // Whole string match.
} PEP_DEVICE_ID_MATCH, *PPEP_DEVICE_ID_MATCH;
typedef struct _PEP_DEVICE_MATCH {
PEP_DEVICE_TYPE Type;
PEP_NOTIFICATION_CLASS OwnedType;
PWSTR DeviceId;
PEP_DEVICE_ID_MATCH CompareMethod;
} PEP_DEVICE_MATCH, *PPEP_DEVICE_MATCH;
typedef enum _PEP_HANDLER_TYPE {
PepHandlerTypeSyncCritical,
PepHandlerTypeWorkerCallback
} PEP_HANDLER_TYPE, *PPEP_HANDLER_TYPE;
typedef struct _PEP_WORK_CONTEXT {
//
// Entry of this request on its current (pending or completed) queue.
//
LIST_ENTRY ListEntry;
//
// Request signature (for validation purposes).
//
ULONG Signature;
//
// The type of the request.
//
PEP_NOTIFICATION_CLASS WorkType;
ULONG NotificationId;
BOOLEAN WorkCompleted;
//
// The device for which the request is associated with. This value may be
// NULL if request is tagged as a parent.
//
PPEP_INTERNAL_DEVICE_HEADER PepInternalDevice;
PPEP_DEVICE_DEFINITION DeviceDefinitionEntry;
//
// PoFx-supplied PEP_WORK for work requests.
//
PEP_WORK_INFORMATION LocalPoFxWorkInfo;
//
// Work item context
//
PVOID WorkContext;
SIZE_T WorkContextSize;
PNTSTATUS WorkRequestStatus;
} PEP_WORK_CONTEXT, *PPEP_WORK_CONTEXT;
typedef struct _PEP_WORK_ITEM_CONTEXT {
WDFWORKITEM WorkItem;
PEP_NOTIFICATION_CLASS WorkType;
} PEP_WORK_ITEM_CONTEXT, *PPEP_WORK_ITEM_CONTEXT;
WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(PEP_WORK_ITEM_CONTEXT, PepGetWorkItemContext)
//
//--------------------------------------------------------------------- Globals
//
extern PEP_GENERAL_NOTIFICATION_HANDLER PepAcpiNotificationHandlers[];
extern PEP_GENERAL_NOTIFICATION_HANDLER PepDpmNotificationHandlers[];
extern PEP_KERNEL_INFORMATION PepKernelInformation;
extern LIST_ENTRY PepCompletedWorkList;
extern PEP_DEVICE_DEFINITION PepDeviceDefinitionArray[];
extern ULONG PepDeviceDefinitionArraySize;
extern LIST_ENTRY PepDeviceList;
extern KSPIN_LOCK PepGlobalSpinLock;
extern WDFDEVICE PepGlobalWdfDevice;
extern PEP_DEVICE_MATCH PepDeviceMatchArray[];
extern ULONG PepDeviceMatchArraySize;
extern LIST_ENTRY PepPendingWorkList;
extern BOOLEAN PepRegistered;
extern WDFSPINLOCK PepWorkListLock;
//
//------------------------------------------------------------------ Prototypes
//
//
// pep.c
//
NTSTATUS
PepRegister (
_In_ BOOLEAN AcpiHandlerOptIn,
_In_ BOOLEAN DpmHandlerOptIn,
_In_ BOOLEAN PpmHandlerOptIn
);
NTSTATUS
PepInitialize (
_In_ PDRIVER_OBJECT WdmDriverObject,
_In_ WDFDRIVER WdfDriver,
_In_ PUNICODE_STRING RegistryPath
);
__drv_requiresIRQL(PASSIVE_LEVEL)
VOID
PepQueryRegisterOptions (
_In_ PDRIVER_OBJECT WdmDriverObject,
_In_ WDFDRIVER WdfDriver,
_In_ PUNICODE_STRING RegistryPath,
_Out_ PBOOLEAN PepAcpiOptin,
_Out_ PBOOLEAN PepDpmOptin,
_Out_ PBOOLEAN PepPpmOptin
);
BOOLEAN
PepAcpiNotify (
_In_ ULONG Notification,
_In_ PVOID Data
);
BOOLEAN
PepDpmNotify (
_In_ ULONG Notification,
_In_ PVOID Data
);
BOOLEAN
PepPpmNotify (
_In_ PEPHANDLE Handle,
_In_ ULONG Notification,
_Inout_opt_ PVOID Data
);
// acpinotify.c
PEP_GENERAL_NOTIFICATION_HANDLER_ROUTINE PepAcpiPrepareDevice;
PEP_GENERAL_NOTIFICATION_HANDLER_ROUTINE PepAcpiAbandonDevice;
PEP_GENERAL_NOTIFICATION_HANDLER_ROUTINE PepAcpiRegisterDevice;
PEP_GENERAL_NOTIFICATION_HANDLER_ROUTINE PepAcpiUnregisterDevice;
PEP_GENERAL_NOTIFICATION_HANDLER_ROUTINE PepAcpiEnumerateDeviceNamespace;
PEP_GENERAL_NOTIFICATION_HANDLER_ROUTINE PepAcpiQueryObjectInformation;
PEP_GENERAL_NOTIFICATION_HANDLER_ROUTINE PepAcpiEvaluateControlMethod;
PEP_GENERAL_NOTIFICATION_HANDLER_ROUTINE PepAcpiQueryDeviceControlResources;
PEP_GENERAL_NOTIFICATION_HANDLER_ROUTINE PepAcpiTranslatedDeviceControlResources;
PEP_GENERAL_NOTIFICATION_HANDLER_ROUTINE PepAcpiWorkNotification;
PEP_GENERAL_NOTIFICATION_HANDLER_ROUTINE PepAcpiIgnoreDeviceNotification;
//
// dpmnotify.c
//
PEP_GENERAL_NOTIFICATION_HANDLER_ROUTINE PepDpmPrepareDevice;
PEP_GENERAL_NOTIFICATION_HANDLER_ROUTINE PepDpmAbandonDevice;
PEP_GENERAL_NOTIFICATION_HANDLER_ROUTINE PepDpmRegisterDevice;
PEP_GENERAL_NOTIFICATION_HANDLER_ROUTINE PepDpmUnregisterDevice;
PEP_GENERAL_NOTIFICATION_HANDLER_ROUTINE PepDpmIgnoreDeviceNotification;
PEP_GENERAL_NOTIFICATION_HANDLER_ROUTINE PepDpmWorkNotification;
//
// driver.c
//
NTSTATUS
DriverEntry (
_In_ PDRIVER_OBJECT DriverObject,
_In_ PUNICODE_STRING RegistryPath
);
EVT_WDF_DRIVER_DEVICE_ADD PepEvtDeviceAdd;
VOID
PepEvtDriverUnload (
_In_ WDFDRIVER Driver
);
//
// util.c
//
__drv_requiresIRQL(PASSIVE_LEVEL)
NTSTATUS
PepQueryRegistry (
_Inout_opt_ WDFKEY *ParametersKey,
_In_opt_ WDFDRIVER WdfDriver,
_In_ PUNICODE_STRING RegistryPath,
_In_ PCUNICODE_STRING KeyValueName,
_Out_ PULONG OptionValue
);
BOOLEAN
PepIsDeviceAccepted (
_In_ PEP_NOTIFICATION_CLASS OwnedType,
_In_ PCUNICODE_STRING DeviceId,
_Out_ PPEP_DEVICE_DEFINITION *DeviceDefinition
);
BOOLEAN
PepIsDeviceIdMatched (
_In_ PWSTR String,
_In_ ULONG StringLength,
_In_ PWSTR SearchString,
_In_ ULONG SearchStringLength,
_In_ PEP_DEVICE_ID_MATCH DeviceIdCompareMethod
);
VOID
PepScheduleNotificationHandler (
_In_ PEP_NOTIFICATION_CLASS WorkType,
_In_ ULONG NotificationId,
_In_ PPEP_INTERNAL_DEVICE_HEADER PepInternalDevice,
_In_opt_ PVOID WorkContext,
_In_ SIZE_T WorkContextSize,
_In_opt_ PNTSTATUS WorkRequestStatus
);
VOID
PepInvokeNotificationHandler (
_In_ PEP_NOTIFICATION_CLASS WorkType,
_In_opt_ PPEP_WORK_CONTEXT WorkRequest,
_In_ PEP_HANDLER_TYPE HandlerType,
_In_ ULONG NotificationId,
_In_opt_ PPEP_INTERNAL_DEVICE_HEADER PepInternalDevice,
_In_ PVOID Data,
_In_ SIZE_T DataSize,
_In_opt_ PNTSTATUS WorkRequestStatus
);
PWSTR
PepGetDeviceName (
_In_ ULONG DeviceType
);
VOID
PepRequestCommonWork (
_In_ PPEP_ACPI_REQUEST_CONVERT_TO_BIOS_RESOURCES Request
);
NTSTATUS
PepGetBiosResourceSize (
_In_ PPEP_ACPI_RESOURCE ResourceBuffer,
_In_ ULONG ResourceBufferSize,
_In_opt_ PCHAR DebugInfo,
_Out_ PSIZE_T BiosResourceSize
);
VOID
PepReturnBiosResource (
_In_ PPEP_ACPI_RESOURCE ResourceBuffer,
_In_ ULONG ResourceBufferSize,
_In_ SIZE_T RequiredSize,
_In_ PACPI_METHOD_ARGUMENT Arguments,
_Inout_ PSIZE_T BiosResourcesSize,
_In_opt_ PCHAR DebugInfo,
_Out_ PNTSTATUS Status
);
VOID
PepReturnAcpiData (
_In_ PVOID Value,
_In_ USHORT ValueType,
_In_ ULONG ValueLength,
_In_ BOOLEAN ReturnAsPackage,
_Out_ PACPI_METHOD_ARGUMENT Arguments,
_Inout_ PSIZE_T OutputArgumentSize,
_Out_opt_ PULONG OutputArgumentCount,
_Out_ PNTSTATUS Status,
_In_opt_ PCHAR MethodName,
_In_opt_ PCHAR DebugInfo,
_Out_ PPEP_NOTIFICATION_HANDLER_RESULT CompleteResult
);
//
// work.c
//
NTSTATUS
PepCreateWorkRequest (
_In_ PEP_NOTIFICATION_CLASS WorkType,
_In_ ULONG NotificationId,
_In_ PPEP_INTERNAL_DEVICE_HEADER PepInternalDevice,
_In_ PPEP_DEVICE_DEFINITION DeviceDefinitionEntry,
_In_opt_ PVOID WorkContext,
_In_ SIZE_T WorkContextSize,
_In_opt_ PNTSTATUS WorkRequestStatus,
_Out_ PPEP_WORK_CONTEXT *OutputWorkRequest
);
VOID
PepDestroyWorkRequest (
_In_ PPEP_WORK_CONTEXT WorkRequest
);
VOID
PepPendWorkRequest (
_In_ PPEP_WORK_CONTEXT WorkRequest
);
_IRQL_requires_max_(DISPATCH_LEVEL)
VOID
PepCompleteWorkRequest (
_In_ PPEP_WORK_CONTEXT WorkRequest
);
NTSTATUS
PepCompleteSelfManagedWork (
_In_ PEP_NOTIFICATION_CLASS WorkType,
_In_ ULONG NotificationId,
_In_ PPEP_INTERNAL_DEVICE_HEADER PepInternalDevice,
_In_ PPEP_WORK_INFORMATION PoFxWorkInfo
);
VOID
PepMarkWorkRequestComplete (
_In_ PPEP_WORK_CONTEXT WorkRequest
);
NTSTATUS
PepScheduleWorker (
_In_ PPEP_WORK_CONTEXT WorkContext
);
VOID
PepWorkerWrapper (
_In_ WDFWORKITEM WorkItem
);
VOID
PepProcessPendingWorkRequests (
VOID
);
VOID
PepProcessCompleteWorkRequests (
_In_ PVOID Data
);
|