Accès au Registre pour les pilotes WIA
Les développeurs de pilotes doivent connaître les autorisations pour les clés de Registre auxquelles ils doivent accéder. Une grande partie du Registre est disponible pour le pilote. Toutefois, les pilotes WIA doivent écrire uniquement sur la clé de Registre qui leur est remise dans la méthode IStiUSD::Initialize .
Bien que l’écriture dans d’autres clés de Registre soit possible dans Windows XP, car le service WIA s’exécute sous le compte LocalSystem à privilèges élevés, cela n’est plus possible sous le compte LocalService à faibles privilèges dans Microsoft Windows Server 2003 et versions ultérieures.
Les pilotes ont souvent besoin d’un accès en écriture à leur clé de Registre en dehors de IStiUSD::Initialize. Étant donné que la plupart des pilotes stockent des données dans la sous-clé DeviceData , il est facile d’ouvrir la sous-clé DeviceData et de stocker le handle dans la clé ouverte à utiliser ultérieurement. Le pilote doit fermer la clé de Registre uniquement lorsqu’il n’a plus besoin de la clé.
L’exemple de code suivant illustre l’utilisation de la sous-clé de Registre DeviceData .
STDMETHODIMP CWIADevice::Initialize(
PSTIDEVICECONTROL pIStiDevControl,
DWORD dwStiVersion,
HKEY hParametersKey)
{
.
.
.
//
// Open the DeviceData key since this is where the
// driver-specific settings will be stored.
//
DWORD dwError = RegOpenKeyEx(
hParametersKey, // handle to open key
TEXT("DeviceData"), // subkey to open
0, // options (must be NULL)
KEY_READ|KEY_WRITE, // requesting read/write access
&m_hMyWritableRegistryKey);
if (dwError == ERROR_SUCCESS)
{
//
// m_hMyWritableRegistryKey now contains a handle to the
// DeviceData subkey which can be used to store information
// in the registry.
// Notice that it isn't closed here, but instead,
// kept open because it is needed later.
//
}
else
{
// Handle error
.
.
.
}
.
.
.
}
STDMETHODIMP CWIADevice::SomeDriverMethod()
{
.
.
.
//
// We need to store some setting in the registry here.
//
DWORD dwError = RegSetValueEx(
m_hMyWritableRegistryKey,
TEXT("MyDriverValueName"),
0,
REG_DWORD,
(BYTE*)&dwValue,
sizeof(dwValue));
if (dwError == ERROR_SUCCESS)
{
//
// We successfully stored dwValue in the registry
//
}
else
{
// Handle error
.
.
.
}
.
.
.
}
CWIADevice:: CWIADevice () :
m_hMyWritableRegistryKey(NULL),
.
.
.
{
// Rest of constructor goes here. Ensure that the
// handle to the registry key is initialized to NULL.
}
CWIADevice::~CWIADevice(void)
{
.
.
.
//
// If the writable registry key isn't closed yet, do it now,
// because the driver is about to be unloaded.
//
if (m_hMyWritableRegistryKey)
{
RegCloseKey(m_hMyWritableRegistryKey);
m_hMyWritableRegistryKey = NULL;
}
.
.
.
}
La sous-clé de Registre DeviceData est ouverte pour l’accès en lecture/écriture au pilote sur Windows Me et Windows XP et versions ultérieures. La clé de périphérique elle-même (par exemple, la clé de Registre parente de DeviceData) peut être ouverte ou non pour l’accès en écriture par le pilote, selon la version du système d’exploitation.
Note Le pilote doit fermer toutes les clés de Registre qu’il a ouvertes lorsqu’elles ne sont plus nécessaires, et doit fermer toutes les clés de Registre avant le déchargement.