Acesso ao Registro para Drivers WIA
Os desenvolvedores de driver devem saber as permissões para as chaves do Registro que precisam acessar. Grande parte do registro está disponível para o driver ler. No entanto, os drivers WIA devem gravar apenas na chave do Registro entregue a eles no método IStiUSD::Initialize .
Embora a gravação em outras chaves do Registro seja possível no Windows XP, como o serviço WIA é executado sob a conta LocalSystem de alto privilégio, isso não é mais possível na conta LocalService de baixo privilégio no Microsoft Windows Server 2003 e posterior.
Os drivers geralmente precisam de acesso de gravação à chave do Registro fora do IStiUSD::Initialize. Como a maioria dos drivers armazena dados na subchave DeviceData , é fácil abrir a subchave DeviceData e armazenar o identificador na chave aberta a ser usada posteriormente. O driver deve fechar a chave do Registro somente quando ela não precisar mais da chave.
O exemplo de código a seguir ilustra o uso da subchave do Registro 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;
}
.
.
.
}
A subchave do Registro DeviceData está aberta para acesso de leitura/gravação ao driver no Windows Me e ao Windows XP e posterior. A própria chave do dispositivo (por exemplo, a chave do registro pai para DeviceData) pode ou não estar aberta para acesso de gravação pelo driver, dependendo da versão do sistema operacional.
Nota O driver deve fechar todas as chaves do Registro que ele abriu quando elas não são mais necessárias e deve fechar todas as chaves do Registro antes de descarregar.