尝试 CustomDevice.FromIdAsync 使用软件 KMDF 驱动程序时访问被拒绝
Access is denied when trying to CustomDevice.FromIdAsync using a Software KMDF Driver
我准备了一个 KMDF 驱动程序,供 UWP 使用 MSDN 中的指南访问 (HSA for Driver, HSA for UWP)
我使用的UWP App是在Universal Windows Samples下找到的CustomCapability
例子
KMDF 是一个示例驱动程序,仅实现了 DriverEntry, Unload, and EvtDeviceAdd
。此外,驱动程序已安装,并在设备管理器中可见,但没有插入 actual/external 设备。
在 UWP 应用程序中,我可以从设备观察器中看到示例驱动程序。但是,当尝试使用 connect/open 驱动程序时:
var device = await CustomDevice.FromIdAsync(Id, DeviceAccessMode.Read, DeviceSharingMode.Exclusive);
正在抛出异常 System.UnauthorizedAccessException' in System.Private.CoreLib.ni.dll
如下所示:
我已经匹配了跨两个应用程序所需的信息,我已经尝试了这个,假设 SCCD
不需要签名,如果它只是为了 运行 处于开发模式。
除了SCCD配置外,我还尝试为驱动程序的class接口以及lowLevel
设备添加<DeviceCapability>
,但似乎没有做任何与异常相关的事情。
除了 SCCD 和 INF 文件之外,我没有看到任何其他问题的地方,但我想展示它们以防万一我遗漏了什么:
SCCD:
<?xml version="1.0" encoding="utf-8"?>
<CustomCapabilityDescriptor xmlns="http://schemas.microsoft.com/appx/2016/sccd" xmlns:s="http://schemas.microsoft.com/appx/2016/sccd">
<CustomCapabilities>
<CustomCapability Name="microsoft.firmwareRead_cw5n1h2txyewy"></CustomCapability> <!-- this one is not used by the way -->
<CustomCapability Name="microsoft.hsaTestCustomCapability_q536wpkpf5cy2"></CustomCapability>
</CustomCapabilities>
<AuthorizedEntities>
<AuthorizedEntity AppPackageFamilyName="Microsoft.SDKSamples.CustomCapability.CS_8wekyb3d8bbwe" CertificateSignatureHash="1db5ceeaa4c97c6f6e91c0ce76830361776c64635ecfecdb2f157ca818ae3b69"></AuthorizedEntity>
</AuthorizedEntities>
<Catalog>xxxx</Catalog>
</CustomCapabilityDescriptor>
INF Strings and Interface section:
[Strings]
SPSVCINST_ASSOCSERVICE= 0x00000002
ManufacturerName="Samples" ;TODO: Replace with your manufacturer name
ClassName="Samples" ; TODO: edit ClassName
DiskName = "Samples_Driver Installation Disk"
Samples_Driver.DeviceDesc = "Samples_Driver Device"
Samples_Driver.SVCDESC = "Samples_Driver Service"
GUID_DEVINTERFACE_OSRUSBFX2="573E8C73-0CB4-4471-A1BF-FAB26C31D384"
DEVPKEY_DeviceInterface_UnrestrictedAppCapabilities="026e516e-b814-414b-83cd-856d6fef4822"
CustomCapability="microsoft.hsaTestCustomCapability_q536wpkpf5cy2"
;
;----------------- Interface Section ----------------------
;
[WDMPNPB003_Device.NT.Interfaces]
AddInterface= {%GUID_DEVINTERFACE_OSRUSBFX2%},,AddInterfaceSection
[AddInterfaceSection]
AddProperty= AddInterfaceSection.AddProps
[AddInterfaceSection.AddProps]
; DEVPKEY_DeviceInterface_UnrestrictedAppCapabilities
{%DEVPKEY_DeviceInterface_UnrestrictedAppCapabilities%}, 8, 0x2012,, %CustomCapability%
我设法在 INF 文件上找到了问题。标记为 Interface Section
的部分已直接从 Microsoft 的 HSA for Drivers 指南中复制。所做的修改只是那些明确写在指南中的修改。
下面的 INF 片段描述了接口部分的起点:
[WDMPNPB003_Device.NT.Interfaces]
AddInterface= {zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz},,AddInterfaceSection
指南没有明确提到的是,我们必须将 WDMPNPB003_Device
替换为您自己的 Driver_name/Root namespace
。
一个小错误,但很可能是驱动程序开发新手会遇到的错误。
我准备了一个 KMDF 驱动程序,供 UWP 使用 MSDN 中的指南访问 (HSA for Driver, HSA for UWP)
我使用的UWP App是在Universal Windows Samples下找到的CustomCapability
例子
KMDF 是一个示例驱动程序,仅实现了 DriverEntry, Unload, and EvtDeviceAdd
。此外,驱动程序已安装,并在设备管理器中可见,但没有插入 actual/external 设备。
在 UWP 应用程序中,我可以从设备观察器中看到示例驱动程序。但是,当尝试使用 connect/open 驱动程序时:
var device = await CustomDevice.FromIdAsync(Id, DeviceAccessMode.Read, DeviceSharingMode.Exclusive);
正在抛出异常 System.UnauthorizedAccessException' in System.Private.CoreLib.ni.dll
如下所示:
我已经匹配了跨两个应用程序所需的信息,我已经尝试了这个,假设 SCCD
不需要签名,如果它只是为了 运行 处于开发模式。
除了SCCD配置外,我还尝试为驱动程序的class接口以及lowLevel
设备添加<DeviceCapability>
,但似乎没有做任何与异常相关的事情。
除了 SCCD 和 INF 文件之外,我没有看到任何其他问题的地方,但我想展示它们以防万一我遗漏了什么:
SCCD:
<?xml version="1.0" encoding="utf-8"?>
<CustomCapabilityDescriptor xmlns="http://schemas.microsoft.com/appx/2016/sccd" xmlns:s="http://schemas.microsoft.com/appx/2016/sccd">
<CustomCapabilities>
<CustomCapability Name="microsoft.firmwareRead_cw5n1h2txyewy"></CustomCapability> <!-- this one is not used by the way -->
<CustomCapability Name="microsoft.hsaTestCustomCapability_q536wpkpf5cy2"></CustomCapability>
</CustomCapabilities>
<AuthorizedEntities>
<AuthorizedEntity AppPackageFamilyName="Microsoft.SDKSamples.CustomCapability.CS_8wekyb3d8bbwe" CertificateSignatureHash="1db5ceeaa4c97c6f6e91c0ce76830361776c64635ecfecdb2f157ca818ae3b69"></AuthorizedEntity>
</AuthorizedEntities>
<Catalog>xxxx</Catalog>
</CustomCapabilityDescriptor>
INF Strings and Interface section:
[Strings]
SPSVCINST_ASSOCSERVICE= 0x00000002
ManufacturerName="Samples" ;TODO: Replace with your manufacturer name
ClassName="Samples" ; TODO: edit ClassName
DiskName = "Samples_Driver Installation Disk"
Samples_Driver.DeviceDesc = "Samples_Driver Device"
Samples_Driver.SVCDESC = "Samples_Driver Service"
GUID_DEVINTERFACE_OSRUSBFX2="573E8C73-0CB4-4471-A1BF-FAB26C31D384"
DEVPKEY_DeviceInterface_UnrestrictedAppCapabilities="026e516e-b814-414b-83cd-856d6fef4822"
CustomCapability="microsoft.hsaTestCustomCapability_q536wpkpf5cy2"
;
;----------------- Interface Section ----------------------
;
[WDMPNPB003_Device.NT.Interfaces]
AddInterface= {%GUID_DEVINTERFACE_OSRUSBFX2%},,AddInterfaceSection
[AddInterfaceSection]
AddProperty= AddInterfaceSection.AddProps
[AddInterfaceSection.AddProps]
; DEVPKEY_DeviceInterface_UnrestrictedAppCapabilities
{%DEVPKEY_DeviceInterface_UnrestrictedAppCapabilities%}, 8, 0x2012,, %CustomCapability%
我设法在 INF 文件上找到了问题。标记为 Interface Section
的部分已直接从 Microsoft 的 HSA for Drivers 指南中复制。所做的修改只是那些明确写在指南中的修改。
下面的 INF 片段描述了接口部分的起点:
[WDMPNPB003_Device.NT.Interfaces]
AddInterface= {zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz},,AddInterfaceSection
指南没有明确提到的是,我们必须将 WDMPNPB003_Device
替换为您自己的 Driver_name/Root namespace
。
一个小错误,但很可能是驱动程序开发新手会遇到的错误。