The topic you requested is included in another documentation set. For convenience, it's displayed below. Choose Switch to see the topic in its original location.

CLIENT_StartController callback function

The CLIENT_StartController event callback function performs operations that are needed when the general-purpose I/O (GPIO) controller device enters the D0 power state.



NTSTATUS CLIENT_StartController(
  _In_ PVOID                  Context,
  _In_ BOOLEAN                RestoreContext,
  _In_ WDF_POWER_DEVICE_STATE PreviousPowerState
{ ... }


Context [in]

A pointer to the GPIO controller driver's device context.

RestoreContext [in]

Whether the client driver should restore the GPIO controller to a previously saved hardware context. If TRUE, the hardware context should be restored. If FALSE, the hardware context should not be restored. For more information, see Remarks.

PreviousPowerState [in]

The previous device power state. This parameter is a WDF_POWER_DEVICE_STATE enumeration value that specifies the low-power state from which the device entered the D0 power state. The GPIO controller driver can use this information to determine how to configure the controller device so that it is ready to use.

Return value

The CLIENT_StartController function returns STATUS_SUCCESS if the call is successful. Otherwise, it returns an appropriate error code.


This callback function is implemented by the GPIO controller driver. The GPIO framework extension (GpioClx) calls this function to place the GPIO controller device in a known, initial state at system startup or when the device transitions from a low-power state to a working state. This callback function must perform any operations that are necessary after the device wakes from a low-power state, such as restoring any information that the driver needs after the device enters the D0 power state.

Typically, a CLIENT_StartController callback function sets all the GPIO pins to their default state.

To register your driver's CLIENT_StartController callback function, call the GPIO_CLX_RegisterClient method. This method accepts, as an input parameter, a pointer to a GPIO_CLIENT_REGISTRATION_PACKET structure that contains a CLIENT_StartController function pointer.

Although the CLIENT_StartController callback function is called at IRQL = PASSIVE_LEVEL, you should not make this function pageable. The CLIENT_StartController callback is in the critical timing path for restoring power to the devices in the hardware platform and, for performance reasons, it should not be delayed by page faults.


To define a CLIENT_StartController callback function, you must first provide a function declaration that identifies the type of callback function you're defining. Windows provides a set of callback function types for drivers. Declaring a function using the callback function types helps Code Analysis for Drivers, Static Driver Verifier (SDV), and other verification tools find errors, and it's a requirement for writing drivers for the Windows operating system.

For example, to define a CLIENT_StartController callback function that is named MyEvtGpioStartController, use the GPIO_CLIENT_START_CONTROLLER function type, as shown in this code example:


Then, implement your callback function as follows:

    PVOID Context,
    BOOLEAN RestoreContext,
    WDF_POWER_DEVICE_STATE PreviousPowerState
{ ... }

The GPIO_CLIENT_START_CONTROLLER function type is defined in the Gpioclx.h header file. To more accurately identify errors when you run the code analysis tools, be sure to add the _Use_decl_annotations_ annotation to your function definition. The _Use_decl_annotations_ annotation ensures that the annotations that are applied to the GPIO_CLIENT_START_CONTROLLER function type in the header file are used. For more information about the requirements for function declarations, see Declaring Functions by Using Function Role Types for KMDF Drivers. For more information about _Use_decl_annotations_, see Annotating Function Behavior.


Target platform


Supported starting with Windows 8.




Called at PASSIVE_LEVEL (see Remarks).

See also




Send comments about this topic to Microsoft