共用方式為


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;
  }

  .
  .
  .
}

DeviceData登錄子機碼已開啟,可讀取/寫入 Windows Me 上的驅動程式,以及 Windows XP 和更新版本。 例如,裝置機碼本身 (,根據作業系統版本而定, DeviceData) 的父登錄機碼可能或可能無法開啟以供驅動程式進行寫入存取。

注意 驅動程式 必須 關閉不再需要時所開啟的任何登錄機碼,而且必須在卸載之前關閉所有登錄機碼。