Windows API Reference

Device Management

This section details the Windows API functions and structures used for managing devices on the system. Understanding device management is crucial for interacting with hardware, controlling access, and ensuring proper operation of peripherals.

Key Concepts

Core APIs

The following APIs are fundamental for device management:

Device Enumeration and Information

Functions to discover and query information about devices connected to the system.

Function Description Header
SetupDiGetClassDevs Retrieves a handle to a device information set that contains entries for enumerated devices. setupapi.h
SetupDiEnumDeviceInfo Enumerates the devices present in a device information set. setupapi.h
SetupDiGetDeviceRegistryProperty Retrieves a device's registry property. setupapi.h

Device Control

APIs for sending custom control codes to devices.

Function Description Header
DeviceIoControl Sends a device-specific control code directly to a specified device driver. windows.h

Device Installation and Removal

APIs that assist in the installation, uninstallation, and surprise removal of devices.

Function Description Header
CM_Install_Driver Installs a device and its driver. cfgmgr32.h
CM_Uninstall_Driver Uninstalls a device and its driver. cfgmgr32.h
Note: Direct interaction with device drivers using DeviceIoControl requires detailed knowledge of the specific device and its driver's IOCTL codes. Incorrect usage can lead to system instability.

Working with Device Properties

Device properties provide standardized information about a device, such as its description, hardware IDs, and compatibility IDs. These can be accessed using functions like SetupDiGetDeviceRegistryProperty.

// Example: Retrieving the device description
HDEVINFO hDevInfo = SetupDiGetClassDevs(NULL, NULL, NULL, DIGCF_PRESENT);
SP_DEVINFO_DATA deviceInfoData;
deviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);

if (SetupDiEnumDeviceInfo(hDevInfo, 0, &deviceInfoData)) {
    TCHAR deviceDescription[MAX_PATH];
    if (SetupDiGetDeviceRegistryProperty(hDevInfo, &deviceInfoData, SPDRP_DEVICEDESC, NULL, (PBYTE)deviceDescription, sizeof(deviceDescription), NULL)) {
        // Use deviceDescription
    }
}
SetupDiDestroyDeviceInfoList(hDevInfo);
Tip: For most application-level tasks, it's recommended to use higher-level APIs or COM interfaces that abstract away the complexities of direct device management.

Further Reading