UMDF Windows ドライバーで、\DosDevices\Global\
デバイス インスタンスを追跡するために、ディレクトリにデバイスのシンボリック リンクを作成します。そのため、デバイスがホストに接続されると、シンボリック リンク\DosDevices\Global\MyDevice0
が作成されます。別のデバイスが接続されると、シンボリック リンク\DosDevices\Global\MyDevice1
が作成されます。次のコードでこれを実現します。
int symbolicLinkIndex = 0;
for (symbolicLinkIndex = 0; symbolicLinkIndex < 127; symbolicLinkIndex++) // 127 max usb devices
{
swprintf(m_SymbolicLinkName,
L"\\DosDevices\\Global\\MyDevice%d",
symbolicLinkIndex);
hr = m_FxDevice->CreateSymbolicLinkA(m_SymbolicLinkName);
if (FAILED(hr))
{
// Symbolic link already exists try next index
if (HRESULT_CODE(hr) == ERROR_ALREADY_EXISTS || HRESULT_CODE(hr) == ERROR_FILE_EXISTS)
continue;
else
{
TraceEvents(TRACE_LEVEL_ERROR, TRACE_DEVICE, "%!FUNC! Failed to create symbolic link: %lu", hr);
goto Exit;
}
}
else
{
TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_DEVICE, "%!FUNC! Created symbolic link: %S", m_SymbolicLinkName);
break;
}
}
メソッドのドキュメント: IWDFDevice::CreateSymbolicLink
これは、2 つのデバイスを互いに背後にすばやく接続すると機能します。ただし、約 10 秒待ってから 3 番目のデバイスを接続すると\DosDevices\Global\MyDevice0
、最初のデバイスが既にインデックス0
を取得しており、まだ接続されているため、発生しないシンボリック リンクが取得されるようです。
では、しばらくするとシンボリック リンクが削除されるように見えるのはなぜですか? また、私のアプローチがデバイスインスタンスをカウントするのに適しているかどうか疑問に思っていますか?