Compartilhar via


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.