Compartir a través de


Acceso al Registro para controladores WIA

Los desarrolladores de controladores deben conocer los permisos de las claves del Registro a las que necesitan acceder. Gran parte del registro está disponible para que el controlador lea. Sin embargo, los controladores WIA solo deben escribir en la clave del Registro que se les ha entregado en el método IStiUSD::Initialize .

Aunque es posible escribir en otras claves del Registro en Windows XP, porque el servicio WIA se ejecuta en la cuenta localSystem con privilegios elevados, esto ya no es posible en la cuenta localService con pocos privilegios en Microsoft Windows Server 2003 y versiones posteriores.

Los controladores suelen necesitar acceso de escritura a su clave del Registro fuera de IStiUSD::Initialize. Dado que la mayoría de los controladores almacenan datos en la subclave DeviceData , es fácil abrir la subclave DeviceData y almacenar el identificador en la clave abierta que se usará más adelante. El controlador debe cerrar la clave del Registro solo cuando ya no necesite la clave.

En el ejemplo de código siguiente se muestra el uso de la subclave del 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;
  }

  .
  .
  .
}

La subclave del Registro DeviceData está abierta para el acceso de lectura y escritura al controlador en Windows Me y Windows XP y versiones posteriores. La propia clave del dispositivo (por ejemplo, la clave del Registro principal en DeviceData) puede o no estar abierta para el acceso de escritura por parte del controlador, en función de la versión del sistema operativo.

Nota El controlador debe cerrar las claves del Registro que abrió cuando ya no sean necesarias y debe cerrar todas las claves del Registro antes de descargarse.