다음을 통해 공유


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에 대한 부모 레지스트리 키)는 운영 체제 버전에 따라 드라이버의 쓰기 액세스를 위해 열려 있거나 열리지 않을 수 있습니다.

참고드라이버는 더 이상 필요하지 않을 때 연 레지스트리 키를 닫아야 하며 언로드하기 전에 모든 레지스트리 키를 닫아야 합니다.