46 DbgPrint(
"CmBattPowerCallBack: Calling CmBattWakeDpc after 10 seconds.\n");
49 DbgPrint(
"CmBattPowerCallBack: timerCanceled = %d.\n", Cancelled);
55 DbgPrint(
"CmBattPowerCallBack: Delaying Notifications\n");
62 DeviceExtension->DelayNotification =
TRUE;
68 DbgPrint(
"CmBattPowerCallBack: unknown argument2 = %08x\n",
Value);
89 CurrentObject = CurrentObject->NextDevice)
103 DeviceExtension->
ArFlag = 0;
105 DbgPrint(
"CmBattWakeDpc: AC adapter notified\n");
113 CurrentObject = CurrentObject->NextDevice)
120 ArFlag = DeviceExtension->
ArFlag;
122 DbgPrint(
"CmBattWakeDpc: Performing delayed ARs: %01x\n", ArFlag);
150 DbgPrint(
"CmBattNotifyHandler: CmBatt 0x%08x Type %d Number %d Notify Value: %x\n",
152 DeviceExtension->FdoType,
153 DeviceExtension->DeviceId,
164 if ((DeviceExtension->Tag) &&
166 DbgPrint(
"CmBattNotifyHandler: Received battery #%x insertion, but tag was not invalid.\n",
167 DeviceExtension->DeviceId);
190 DbgPrint(
"CmBattNotifyHandler: Unknown Notify Value: %x\n", NotifyValue);
194 if (DeviceExtension->DelayNotification)
198 DbgPrint(
"CmBattNotifyHandler: Notification delayed: ARs = %01x\n",
199 DeviceExtension->ArFlag);
205 DbgPrint(
"CmBattNotifyHandler: Performing ARs: %01x\n", DeviceExtension->ArFlag);
214 ArFlag = DeviceExtension->ArFlag;
226 DeviceExtension->NotifySent =
TRUE;
233 for (
DeviceObject = DeviceExtension->FdoDeviceObject->DriverObject->DeviceObject;
249 DeviceExtension->ArFlag = 0;
272 DbgPrint(
"Unload called before all devices removed.\n");
348 Info->BifData = BifData;
352 Info->BixData = BixData;
356 Info->ExtendedData = *UseBix;
460 Info->CycleCount = 0;
532 RtlCopyMemory(&DeviceExtension->BattInfo, BattInfo,
sizeof(*BattInfo));
570 if (
Count == 0xFFFFFFFF)
576 DbgPrint(
"CmBattOpenClose: Failed (UID = %x)(device being removed).\n",
577 DeviceExtension->
Tag);
591 DbgPrint(
"CmBattOpenClose: Open (DeviceNumber = %x)(count = %x).\n",
601 DbgPrint(
"CmBattOpenClose: Close (DeviceNumber = %x)(count = %x).\n",
668 Irp->AssociatedIrp.SystemBuffer);
685 Irp->AssociatedIrp.SystemBuffer);
705 Irp->AssociatedIrp.SystemBuffer);
728 *(
PULONG)
Irp->AssociatedIrp.SystemBuffer);
729 Irp->IoStatus.Information = 0;
747 Irp->AssociatedIrp.SystemBuffer);
765 Irp->AssociatedIrp.SystemBuffer);
786 Irp->AssociatedIrp.SystemBuffer);
834 DbgPrint(
"CmBattQueryTag - Tag (%d), Battery %x, Device %d\n",
835 *
Tag, DeviceExtension, DeviceExtension->DeviceId);
838 PdoDevice = DeviceExtension->PdoDeviceObject;
839 DeviceExtension->NotifySent = 0;
853 DeviceExtension->TagData = 1;
854 DeviceExtension->Tag = DeviceExtension->TagData;
856 DbgPrint(
"CmBattQueryTag - New Tag: (%d)\n", DeviceExtension->Tag);
859 DeviceExtension->TripPointOld = 0;
876 *
Tag = DeviceExtension->Tag;
891 if (DeviceExtension->TripPointSet)
894 if (DeviceExtension->TripPointValue)
897 DeviceExtension->TripPointValue = 0;
904 DbgPrint(
"CmBattDisableStatusNotify: SetTripPoint failed - %x\n",
Status);
931 ULONG PowerUnit, Capacity, NewTripPoint, TripPoint, DesignVoltage;
935 DbgPrint(
"CmBattSetStatusNotify: Tag (%d) Target(0x%x)\n",
951 DbgPrint(
"CmBattSetStatusNotify: Failing request because of BATTERY_UNKNOWN_CAPACITY.\n");
971 if (DeviceExtension->BattInfo.ExtendedData)
973 PowerUnit = DeviceExtension->BattInfo.BixData.PowerUnit;
974 DesignVoltage = DeviceExtension->BattInfo.BixData.DesignVoltage;
978 PowerUnit = DeviceExtension->BattInfo.BifData.PowerUnit;
979 DesignVoltage = DeviceExtension->BattInfo.BifData.DesignVoltage;
989 TripPoint = 1000 * NewTripPoint;
993 NewTripPoint = (TripPoint + 500) / DesignVoltage + ((TripPoint + 500) % DesignVoltage != 0);
998 NewTripPoint = (TripPoint - 500) / DesignVoltage - ((TripPoint - 500) % DesignVoltage == 0);
1006 DbgPrint(
"CmBattSetStatusNotify: Can't calculate BTP, DesignVoltage = 0x%08x\n",
1015 else if (NewTripPoint > 0)
1022 if (NewTripPoint == DeviceExtension->TripPointValue)
1026 DbgPrint(
"CmBattSetStatusNotify: Keeping original setting: %X\n", DeviceExtension->TripPointValue);
1031 DeviceExtension->TripPointValue = NewTripPoint;
1039 DbgPrint(
"CmBattSetStatusNotify: SetTripPoint failed - %x\n",
Status);
1055 DbgPrint(
"CmBattSetStatusNotify: Trip point already crossed (1): TP = %08x, remaining capacity = %08x\n",
1063 DbgPrint(
"CmBattSetStatusNotify: Trip point already crossed (1): TP = %08x, remaining capacity = %08x\n",
1070 DbgPrint(
"CmBattSetStatusNotify: Want %X CurrentCap %X\n",
1071 Capacity, DeviceExtension->RemainingCapacity);
1073 DbgPrint(
"CmBattSetStatusNotify: Set to: [%#08lx][%#08lx][%#08lx] Status %lx\n",
1091 ULONG DesignVoltage, PresentRate, RemainingCapacity;
1094 DbgPrint(
"CmBattGetBatteryStatus - CmBatt (%08x) Tag (%d)\n", DeviceExtension,
Tag);
1101 if (DeviceExtension->DelayNotification)
1121 DeviceExtension->State = 0;
1122 DeviceExtension->RemainingCapacity = 0;
1123 DeviceExtension->PresentVoltage = 0;
1124 DeviceExtension->Rate = 0;
1127 BstState = DeviceExtension->BstData.State;
1132 DbgPrint(
"************************ ACPI BIOS BUG ********************\n* "
1133 "CmBattGetBatteryStatus: Invalid state: _BST method returned 0x%08x for Battery State.\n"
1134 "* One battery cannot be charging and discharging at the same time.\n",
1142 if (!WasDischarging)
1158 DeviceExtension->PresentVoltage = DeviceExtension->BstData.PresentVoltage;
1187 DbgPrint(
"CmBattGetBatteryStatus: AC adapter is connected\n");
1191 DbgPrint(
"CmBattGetBatteryStatus: AC adapter is NOT connected\n");
1195 if (DeviceExtension->BattInfo.ExtendedData)
1197 PowerUnit = DeviceExtension->BattInfo.BixData.PowerUnit;
1198 DesignVoltage = DeviceExtension->BattInfo.BixData.DesignVoltage;
1202 PowerUnit = DeviceExtension->BattInfo.BifData.PowerUnit;
1203 DesignVoltage = DeviceExtension->BattInfo.BifData.DesignVoltage;
1207 PresentRate = DeviceExtension->BstData.PresentRate;
1208 RemainingCapacity = DeviceExtension->BstData.RemainingCapacity;
1214 DeviceExtension->RemainingCapacity = RemainingCapacity;
1215 DeviceExtension->Rate = PresentRate;
1224 DbgPrint(
"CmBattGetBatteryStatus - Rate is greater than CM_MAX_VALUE\n");
1225 DbgPrint(
"---------------------- PresentRate = 0x%08x\n", PresentRate);
1238 DbgPrint(
"CmBattGetBatteryStatus - Can't calculate RemainingCapacity \n");
1239 DbgPrint(
"---------------------- RemainingCapacity = CM_UNKNOWN_VALUE\n");
1245 DeviceExtension->RemainingCapacity = (DesignVoltage * RemainingCapacity + 500) / 1000;
1252 if (PresentRate > (-500 / DesignVoltage))
1258 DbgPrint(
"CmBattGetBatteryStatus - Can't calculate Rate \n");
1259 DbgPrint(
"---------------------- Overflow: PresentRate = 0x%08x\n", PresentRate);
1264 DeviceExtension->Rate = (PresentRate * DesignVoltage + 500) / 1000;
1272 DbgPrint(
"CmBattGetBatteryStatus - Can't calculate Rate \n");
1273 DbgPrint(
"---------------------- Present Rate = CM_UNKNOWN_VALUE\n");
1284 DbgPrint(
"CmBattGetBatteryStatus - Can't calculate RemainingCapacity and Rate \n");
1285 DbgPrint(
"---------------------- DesignVoltage = 0x%08x\n", DesignVoltage);
1295 DbgPrint(
"CmBattGetBatteryStatus: battery rate is unknown when battery is not charging!\n");
1300 DeviceExtension->Rate = -(
LONG)DeviceExtension->Rate;
1302 else if (!(DeviceExtension->State &
BATTERY_CHARGING) && (DeviceExtension->Rate))
1306 DbgPrint(
"CmBattGetBatteryStatus: battery is not charging or discharging, but rate = %x\n",
1307 DeviceExtension->Rate);
1308 DeviceExtension->Rate = 0;
1327 ULONG QueryLength = 0;
1328 ULONG RemainingTime = 0;
1331 WCHAR InfoBuffer[256];
1332 WCHAR TempBuffer[256];
1334 ULONG RemainingCapacity;
1339 DbgPrint(
"CmBattQueryInformation - Tag (%d) Device %d, Informationlevel %d\n",
1364 QueryData = BatteryReportingScale;
1396 DbgPrint(
"CmBattQueryInformation: Can't calculate EstimatedTime.\n");
1405 DbgPrint(
"---------------------- PresentRate = BATTERY_UNKNOWN_RATE\n");
1414 DbgPrint(
"---------------------- RemainingCapacity = BATTERY_UNKNOWN_CAPACITY\n");
1424 DbgPrint(
"CmBattQueryInformation: Data Overflow in calculating Remaining Capacity.\n");
1429 RemainingTime = (RemainingCapacity * 3600) / -Rate;
1439 QueryData = &RemainingTime;
1440 QueryLength =
sizeof(
ULONG);
1456 InfoString.
Buffer = InfoBuffer;
1461 QueryData = InfoString.
Buffer;
1462 QueryLength = InfoString.
Length;
1485 InfoString.
Buffer = InfoBuffer;
1490 QueryData = InfoString.
Buffer;
1491 QueryLength = InfoString.
Length;
1507 InfoString.
Buffer = InfoBuffer;
1512 TempString2.
Buffer = TempBuffer;
1549 QueryData = InfoString.
Buffer;
1550 QueryLength = InfoString.
Length;
1580 DbgPrint(
"CmBattQueryStatus - Tag (%d) Device %x\n",
Tag, DeviceExtension->DeviceId);
1594 DbgPrint(
"CmBattQueryStatus: Returning [%#08lx][%#08lx][%#08lx][%#08lx]\n",
1622 DbgPrint(
"CmBatt: Couldn't allocate pool for registry path.");
1629 DbgPrint(
"CmBatt DriverEntry - Obj (%08x) Path \"%wZ\"\n",
1661 DbgPrint(
"CmBattRegisterPowerCallBack: failed status=0x%08x\n",
Status);
1679 DbgPrint(
"CmBattRegisterPowerCallBack: ExRegisterCallback failed.\n");
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
#define InterlockedExchange
_In_ ULONG _In_ BATTERY_QUERY_INFORMATION_LEVEL _In_ LONG _In_ ULONG _Out_ PULONG ReturnedLength
#define BATTERY_SYSTEM_BATTERY
_In_ ULONG _In_ PBATTERY_NOTIFY BatteryNotify
#define BATTERY_UNKNOWN_CAPACITY
_In_ ULONG _Out_ PBATTERY_STATUS BatteryStatus
#define BATTERY_UNKNOWN_VOLTAGE
_In_ ULONG _In_ BATTERY_QUERY_INFORMATION_LEVEL _In_ LONG AtRate
#define BATTERY_POWER_ON_LINE
#define BATTERY_DISCHARGING
struct _BATTERY_INFORMATION BATTERY_INFORMATION
@ BatteryGranularityInformation
#define BATTERY_UNKNOWN_RATE
enum _BATTERY_QUERY_INFORMATION_LEVEL BATTERY_QUERY_INFORMATION_LEVEL
#define BATTERY_TAG_INVALID
#define BATTERY_UNKNOWN_TIME
BCLASSAPI NTSTATUS NTAPI BatteryClassStatusNotify(_In_ PVOID ClassData)
BCLASSAPI NTSTATUS NTAPI BatteryClassIoctl(PVOID ClassData, PIRP Irp)
static VOID CmBattVerifyBixData(_In_ PCMBATT_DEVICE_EXTENSION DeviceExtension, _Inout_ PBATTERY_INFORMATION Info)
Verifies the extended battery information (_BIX) and translates such data to the BATTERY_INFORMATION ...
PDEVICE_OBJECT AcAdapterPdo
NTSTATUS NTAPI CmBattGetBatteryStatus(IN PCMBATT_DEVICE_EXTENSION DeviceExtension, IN ULONG Tag)
static NTSTATUS CmBattGetBattStaticInfo(_In_ PCMBATT_DEVICE_EXTENSION DeviceExtension, _Out_ PBOOLEAN UseBix, _Outptr_ PACPI_BATT_STATIC_INFO *BattInfo)
Retrieves the static information of the battery.
VOID NTAPI CmBattUnload(IN PDRIVER_OBJECT DriverObject)
KTIMER CmBattWakeDpcTimerObject
NTSTATUS NTAPI CmBattOpenClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
NTSTATUS NTAPI CmBattIoctl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
PCALLBACK_OBJECT CmBattPowerCallBackObject
PVOID CmBattPowerCallBackRegistration
NTSTATUS NTAPI CmBattDisableStatusNotify(IN PCMBATT_DEVICE_EXTENSION DeviceExtension)
LARGE_INTEGER CmBattWakeDpcDelay
VOID NTAPI CmBattWakeDpc(IN PKDPC Dpc, IN PCMBATT_DEVICE_EXTENSION FdoExtension, IN PVOID SystemArgument1, IN PVOID SystemArgument2)
NTSTATUS NTAPI CmBattQueryStatus(IN PCMBATT_DEVICE_EXTENSION DeviceExtension, IN ULONG Tag, IN PBATTERY_STATUS BatteryStatus)
NTSTATUS NTAPI CmBattQueryInformation(IN PCMBATT_DEVICE_EXTENSION FdoExtension, IN ULONG Tag, IN BATTERY_QUERY_INFORMATION_LEVEL InfoLevel, IN OPTIONAL LONG AtRate, IN PVOID Buffer, IN ULONG BufferLength, OUT PULONG ReturnedLength)
NTSTATUS NTAPI CmBattVerifyStaticInfo(_Inout_ PCMBATT_DEVICE_EXTENSION DeviceExtension, _In_ ULONG BatteryTag)
static VOID CmBattVerifyBifData(_In_ PCMBATT_DEVICE_EXTENSION DeviceExtension, _Inout_ PBATTERY_INFORMATION Info)
Verifies the battery information (_BIF) and translates such data to the BATTERY_INFORMATION structure...
VOID NTAPI CmBattNotifyHandler(IN PCMBATT_DEVICE_EXTENSION DeviceExtension, IN ULONG NotifyValue)
UNICODE_STRING GlobalRegistryPath
VOID NTAPI CmBattPowerCallBack(IN PCMBATT_DEVICE_EXTENSION DeviceExtension, IN ULONG Action, IN ULONG Value)
NTSTATUS NTAPI CmBattQueryTag(IN PCMBATT_DEVICE_EXTENSION DeviceExtension, OUT PULONG Tag)
NTSTATUS NTAPI CmBattSetStatusNotify(IN PCMBATT_DEVICE_EXTENSION DeviceExtension, IN ULONG BatteryTag, IN PBATTERY_NOTIFY BatteryNotify)
NTSTATUS NTAPI CmBattSetTripPpoint(PCMBATT_DEVICE_EXTENSION DeviceExtension, ULONG AlarmValue)
#define CMBATT_GENERIC_INFO
#define CMBATT_ACPI_WARNING
#define CMBATT_GENERIC_STATUS
#define CMBATT_CAPACITY_BOGUS
NTSTATUS NTAPI CmBattGetStaData(PDEVICE_OBJECT DeviceObject, PULONG StaData)
NTSTATUS NTAPI CmBattGetPsrData(PDEVICE_OBJECT DeviceObject, PULONG PsrData)
#define CMBATT_ACPI_ASSERT
#define ACPI_BATT_NOTIFY_INFO
#define IOCTL_BATTERY_QUERY_STA
struct _ACPI_BIF_DATA ACPI_BIF_DATA
#define ACPI_BATT_POWER_UNIT_WATTS
#define IOCTL_BATTERY_QUERY_BST
NTSTATUS NTAPI CmBattGetUniqueId(PDEVICE_OBJECT DeviceObject, PULONG UniqueId)
#define ACPI_BATT_STAT_CRITICAL
#define CMBATT_DISCHARGE_TIME
#define IOCTL_BATTERY_SET_TRIP_POINT
#define ACPI_DEVICE_CHECK
NTSTATUS NTAPI CmBattPowerDispatch(PDEVICE_OBJECT DeviceObject, PIRP Irp)
#define CMBATT_GENERIC_WARNING
NTSTATUS NTAPI CmBattGetBifData(PCMBATT_DEVICE_EXTENSION DeviceExtension, PACPI_BIF_DATA BifData)
#define ACPI_BATT_STAT_DISCHARG
NTSTATUS NTAPI CmBattGetBstData(PCMBATT_DEVICE_EXTENSION DeviceExtension, PACPI_BST_DATA BstData)
#define CMBATT_BATT_STATIC_INFO_TAG
#define IOCTL_BATTERY_QUERY_PSR
#define IOCTL_BATTERY_QUERY_UNIQUE_ID
#define CONVERT_BATT_INFO(Capacity, DesignVoltage)
NTSTATUS NTAPI CmBattPnpDispatch(PDEVICE_OBJECT DeviceObject, PIRP Irp)
struct _ACPI_BST_DATA ACPI_BST_DATA
NTSTATUS NTAPI CmBattGetBixData(_In_ PCMBATT_DEVICE_EXTENSION DeviceExtension, _Out_ PACPI_BIX_DATA BixData)
Retrieves the eXtended static battery information from the ACPI _BIX method.
#define IOCTL_BATTERY_QUERY_BIF_BIX
#define ACPI_BATT_STAT_CHARGING
struct _ACPI_BIX_DATA ACPI_BIX_DATA
#define ACPI_BATT_NOTIFY_STATUS
NTSTATUS NTAPI CmBattAddDevice(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT DeviceObject)
NTSTATUS NTAPI CmBattSystemControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
#define ACPI_BATT_POWER_UNIT_AMPS
#define ACPI_STA_BATTERY_PRESENT
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
#define STATUS_NOT_SUPPORTED
#define STATUS_DEVICE_REMOVED
#define NT_SUCCESS(StatCode)
VOID NTAPI KeInitializeDpc(IN PKDPC Dpc, IN PKDEFERRED_ROUTINE DeferredRoutine, IN PVOID DeferredContext)
DRIVER_INITIALIZE DriverEntry
#define ExAllocatePoolWithTag(hernya, size, tag)
pRequest Complete(RequestStatus)
VOID FASTCALL ExAcquireFastMutex(IN PFAST_MUTEX FastMutex)
VOID FASTCALL ExReleaseFastMutex(IN PFAST_MUTEX FastMutex)
#define OBJ_KERNEL_HANDLE
#define ExFreePoolWithTag(_P, _T)
FORCEINLINE PVOID ExAllocatePoolZero(ULONG PoolType, SIZE_T NumberOfBytes, ULONG Tag)
#define InitializeObjectAttributes(p, n, a, r, s)
NTSYSAPI VOID NTAPI RtlCopyUnicodeString(PUNICODE_STRING DestinationString, PUNICODE_STRING SourceString)
NTSYSAPI NTSTATUS NTAPI RtlAppendUnicodeStringToString(PUNICODE_STRING Destination, PUNICODE_STRING Source)
NTSYSAPI NTSTATUS NTAPI RtlAnsiStringToUnicodeString(PUNICODE_STRING DestinationString, PANSI_STRING SourceString, BOOLEAN AllocateDestinationString)
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
NTSYSAPI VOID NTAPI RtlInitAnsiString(PANSI_STRING DestinationString, PCSZ SourceString)
#define UNREFERENCED_PARAMETER(P)
#define IoSkipCurrentIrpStackLocation(Irp)
VOID NTAPI ExUnregisterCallback(IN PVOID CallbackRegistrationHandle)
PVOID NTAPI ExRegisterCallback(IN PCALLBACK_OBJECT CallbackObject, IN PCALLBACK_FUNCTION CallbackFunction, IN PVOID CallbackContext)
NTSTATUS NTAPI ExCreateCallback(OUT PCALLBACK_OBJECT *CallbackObject, IN POBJECT_ATTRIBUTES ObjectAttributes, IN BOOLEAN Create, IN BOOLEAN AllowMultipleCallbacks)
#define IoCompleteRequest
#define STATUS_INVALID_BUFFER_SIZE
PPCI_DRIVER_EXTENSION DriverExtension
#define IRP_MJ_DEVICE_CONTROL
#define KeQueryInterruptTime()
#define STATUS_BUFFER_TOO_SMALL
PULONG MinorVersion OPTIONAL
CHAR BatteryType[ASCIIZ_MAX_LENGTH]
ULONG DesignCapacityWarning
CHAR BatteryType[ASCIIZ_MAX_LENGTH]
ULONG DesignCapacityWarning
CMBATT_EXTENSION_TYPE FdoType
ACPI_BATT_STATIC_INFO BattInfo
PDEVICE_OBJECT PdoDeviceObject
BOOLEAN DelayNotification
PDEVICE_OBJECT AttachedDevice
IO_REMOVE_LOCK RemoveLock
struct _IO_STACK_LOCATION::@1584::@1585 DeviceIoControl
union _IO_STACK_LOCATION::@1584 Parameters
BOOLEAN NTAPI KeSetTimer(IN OUT PKTIMER Timer, IN LARGE_INTEGER DueTime, IN PKDPC Dpc OPTIONAL)
VOID NTAPI KeInitializeTimer(OUT PKTIMER Timer)
#define RtlCopyMemory(Destination, Source, Length)
#define RtlZeroMemory(Destination, Length)
#define STATUS_INVALID_DEVICE_REQUEST
#define STATUS_INVALID_PARAMETER
#define STATUS_NO_SUCH_DEVICE
#define STATUS_INSUFFICIENT_RESOURCES
#define STATUS_OBJECT_NAME_NOT_FOUND
_Must_inspect_result_ _In_ WDFCHILDLIST _In_ PWDF_CHILD_LIST_ITERATOR _Out_ WDFDEVICE _Inout_opt_ PWDF_CHILD_RETRIEVE_INFO Info
_In_ PDEVICE_OBJECT DeviceObject
_Must_inspect_result_ _In_ WDFDEVICE _In_ BOOLEAN _In_opt_ PVOID Tag
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ ULONG BufferLength
_Must_inspect_result_ _In_ PWDF_DPC_CONFIG _In_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFDPC * Dpc
_Must_inspect_result_ _In_ PDRIVER_OBJECT _In_ PCUNICODE_STRING RegistryPath
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
_In_ WDFREQUEST _In_ size_t _In_ size_t _In_ ULONG IoControlCode
_In_ WDFREQUEST _In_ size_t OutputBufferLength
_In_ WDFREQUEST _In_ size_t _In_ size_t InputBufferLength
_In_ WDFIOTARGET _In_ _Strict_type_match_ WDF_IO_TARGET_SENT_IO_ACTION Action
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
#define IoAcquireRemoveLock(RemoveLock, Tag)
#define IoReleaseRemoveLock(_RemoveLock, _Tag)
#define IRP_MJ_SYSTEM_CONTROL
_In_opt_ PVOID _In_opt_ PVOID SystemArgument1
_In_opt_ PVOID _In_opt_ PVOID _In_opt_ PVOID SystemArgument2
#define ObDereferenceObject
#define PO_CB_SYSTEM_STATE_LOCK