Windows Radio Management Sample
The Radio Manager sample demonstrates how to structure a Radio Manager for use with the Windows Radio Management APIs.
The operating system contains a set of APIs which are used as a software mechanism to control the various radios found on the machine. The APIs work by communicating with a Radio Manager, which is a COM object that relays commands from the APIs to turn the radio on or off, and reports back radio information to the APIs. This feature is designed in such a way that a separate Radio Manager is required for each radio media type. For example, a WLAN radio will be controlled by a different Radio Manager than a GPS radio. If there are 2 WLAN radios and a GPS radio, the 2 WLAN radios will be controlled by one Radio Manager, and the GPS radio will be controlled by a different Radio Manager. The Radio Manager must be able to run correctly within Local Service Account context. Under this context, the Radio Manager will have the minimum privilege on the local computer.
When the user turns the radio off (either by using the specific radio software switch or the airplane mode switch), radio transmission must be turned off. The device can be powered off as long as the radio switch does not disappear from the UI. It is very important that the radio manager developer ensures that when the device is powered off, the radio switch does not disappear from the UI. If the radio switch disappears from the UI when the radio is turned off by the user, then user has no way to turn the radio back on! If it is desired to conserve power by cutting power to the device when the radio is turned off, but the device cannot be completely powered off because it disappears from the UI, then the solution would be to put the device in a low power state (e.g. D3).
Important
The radio manager must be given a name. This is the name of the radio switch that is displayed to the user in the Wireless page of PC Settings. The name must be simple, yet descriptive of what the radio is. For example, for NFC radios, the value of the name field should be "NFC", and for GPS radios, the value of the name field should be "GPS" or "GNSS", whichever is more appropriate. The name must not include the word "radio" or the manufacturer's name or some other word related to the functionality of the radio (e.g. "Location" OR "port").
Installation
The sample contains a script, install.cmd, which copies the radio manager DLL to the system directory, registers as a COM component, and configures the registry.
Copy the install.cmd, SampleRM.reg and SampleRM.dll files to a directory. Run install.cmd.
Code Tour
File | description |
---|---|
install.cmd | Installation script. Copies and registers the dll and executes SampleRM.reg. |
SampleRM.reg | Script to install the Sample Radio Manager into the registry, along with 2 radio instances. |
SampleRM.sln | The Visual Studio solution file for building the Sample Radio Manager dll. |
sampleRM.idl | The interface definition for the Sample Radio Manager. |
RadioMgr.idl | The interface definition for a Windows Radio Manager. |
SampleRadioManager.h | Header file for the functions required for a Radio Manager. |
SampleRadioInstance.h | Header file for the functions required for a Radio Instance. |
SampleInstanceCollection.h | Header file for the functions required for a Collection of Radio Instances. |
precomp.h | Common header file |
InternalInterfaces.h | Header file for internal interface used for this sample. |
dllmain.cpp | Standard dllmain |
Sample Radio Manager. Important concepts include utilizing IMediaRadioManagerNotifySink for radio instance events, adding/Removing radio instances, and queuing and deploying worker jobs for system events. | |
SampleRadioInstance.cpp | Implementation details for the Sample Radio Instance. Important concepts include accessors and modifiers for radio information, and instance change functions. |
SampleInstanceCollection.cpp | Implementation details for the Sample Instance Collection. Important concepts include radio instance discovery and retrieval. |
RadioMgr_interface.cpp | Helper source file to include the MIDL-generated files. |
Run the sample
Operation
This sample Radio Manager does not operate on an actual radio. Instead, it uses registry keys to act as virtual radios.
Each "radio" instance can have the following values:
Name
RadioState
PreviousRadioState
IsMultiComm
IsAssociatingDevice
Note
It is required that the registry key has AT LEAST a Name value, otherwise the Sample Radio Manager will fail to initialize.
Important
The radio manager must be given a name and the registry key must have, as a minimum, a Name value. Otherwise, the Sample Radio Manager will fail to initialize. This is the name of the radio switch that is displayed to the user in the Wireless page of PC Settings. The name must be simple, yet descriptive of what the radio is. For example, for NFC radios, the value of the name field should be "NFC", and for GPS radios, the value of the name field should be "GPS" or "GNSS", whichever is more appropriate. The name must not include the word "radio" or the manufacturer's name or some other word related to the functionality of the radio (e.g. "Location" OR "port").
When the Radio Manager is initialized, it uses these registry keys to retrieve the "radio" information. The radio state values can be any of the following enum values:
typedef enum _DEVICE_RADIO_STATE
{
DRS_RADIO_ON = 0,
DRS_SW_RADIO_OFF = 1,
DRS_HW_RADIO_OFF = 2,
DRS_SW_HW_RADIO_OFF = 3,
DRS_HW_RADIO_ON_UNCONTROLLABLE = 4,
DRS_RADIO_INVALID = 5,
DRS_HW_RADIO_OFF_UNCONTROLLABLE = 6,
DRS_RADIO_MAX = DRS_HW_RADIO_OFF_UNCONTROLLABLE
} DEVICE_RADIO_STATE;
For IsMultiComm and IsAssociatingDevice, a value of 0 means 'no' and 1 means 'yes'.
Adding and Setting a Radio Instance
To add a new radio instance, add a new instance key to the registry key like the following entry:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\RadioManagement\Misc\SampleRadioManager\SampleRadioX]
"RadioState"=dword:00000000
"Name"="SampleRadioX"
"IsMultiComm"=dword:00000000
Editing a Radio Instance
Simply change the values in the registry. For example, change the radio state from DRS_RADIO_ON to DRS_SW_RADIO_OFF by changing the 'RadioState' value from 0 to 1.
Removing a Radio Instance
Delete the corresponding registry key.