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 の親レジストリ キーなど) は、オペレーティング システムのバージョンによって、ドライバーが書き込みアクセスできる場合とできない場合があります。
注: ドライバーは、不要になったレジストリ キーを閉じる必要があります。また、アンロードする前にはすべてのレジストリ キーを閉じる必要があります。