次の方法で共有


WIA ドライバーのレジストリ アクセス

ドライバー開発者は、アクセスが必要なレジストリ キーのアクセス許可を知っておく必要があります。 レジストリの大半は、ドライバーから読み取ることができます。 ただし、WIA ドライバーが書き込めるのは、IStiUSD::Initialize メソッドで渡されたレジストリ キーのみです。

Windows XP では、WIA サービスが高い特権の LocalSystem アカウントで実行されるため、ドライバーから他のレジストリ キーへの書き込みが可能でした。しかし、Microsoft Windows Server 2003 以降の低い特権の LocalService アカウントでは、それが不可能になっています。

ドライバーは、IStiUSD::Initialize 以外の場所でも、自身のレジストリ キーへの書き込みアクセスが必要になることがよくあります。 ほとんどのドライバーが DeviceData サブキーにデータを保存するため、DeviceData サブキーを開き、そのキー ハンドルを保持しておけば、後で利用できます。 ドライバーは、レジストリ キーが不要になった場合にのみ、そのキーを閉じる必要があります。

次のコード例は、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;
  }

  .
  .
  .
}

Windows Me および Windows XP 以降のバージョンにおいて、DeviceData レジストリ サブキーはドライバーから読み書きアクセスできるように開いています。 デバイス キー自体 (DeviceData の親レジストリ キーなど) は、オペレーティング システムのバージョンによって、ドライバーが書き込みアクセスできる場合とできない場合があります。

注: ドライバーは、不要になったレジストリ キーを閉じる必要があります。また、アンロードする前にはすべてのレジストリ キーを閉じる必要があります。