From d864b69334aff805c65cbfe0368c92d6bdf990a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20H=C3=B6glinger-Stelzer?= Date: Tue, 14 Mar 2023 21:37:52 +0100 Subject: [PATCH] Added RegisterPowerStateChangeCallback --- .../WDM/RegisterPowerStateChangeCallback.md | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 Snippets/WDM/RegisterPowerStateChangeCallback.md diff --git a/Snippets/WDM/RegisterPowerStateChangeCallback.md b/Snippets/WDM/RegisterPowerStateChangeCallback.md new file mode 100644 index 0000000..8631ab4 --- /dev/null +++ b/Snippets/WDM/RegisterPowerStateChangeCallback.md @@ -0,0 +1,60 @@ +# RegisterPowerStateChangeCallback + +```c +NTSTATUS RegisterPowerStateChangeCallback(_Inout_ DEVICE_EXTENSION* pDeviceExtension) +{ +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " ---> RegisterPowerStateChangeCallback()\n"); + +#endif /// DBG + + NT_ASSERT(pDeviceExtension); + + NTSTATUS status = STATUS_SUCCESS; + OBJECT_ATTRIBUTES objectAttributes = {0}; + UNICODE_STRING unicodeString = {0}; + + RtlInitUnicodeString(&unicodeString, + L"\\Callback\\PowerState"); + + InitializeObjectAttributes(&objectAttributes, + &unicodeString, + OBJ_CASE_INSENSITIVE, + 0, + 0); + + status = ExCreateCallback(&(pDeviceExtension->pCallbackObject), + &objectAttributes, + FALSE, /// Do not create as the system should already have done this + TRUE); /// Allow multiple callbacks + if(status != STATUS_SUCCESS) + { + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_ERROR_LEVEL, + " !!!! RegisterPowerStateChangeCallback : ExCreateCallback() [status: %#x]\n", + status); + + HLPR_BAIL; + } + + pDeviceExtension->pRegistration = ExRegisterCallback(pDeviceExtension->pCallbackObject, + PowerStateCallback, + pDeviceExtension); + + HLPR_BAIL_LABEL: + +#if DBG + + DbgPrintEx(DPFLTR_IHVNETWORK_ID, + DPFLTR_INFO_LEVEL, + " <--- RegisterPowerStateChangeCallback() [status: %#x]\n", + status); + +#endif /// DBG + + return status; +} +```