拒绝 UWP 应用程序使用"CustomDevice.FromIdAsync"访问 KMDF 驱动程序



我发现了一个类似的问题,但它可能对我没有多大帮助。

我正在学习通过UWP访问驱动设备,前两天程序运行良好,但是今天,UWP打开设备时出现关闭错误,错误消息是"Access is denied。来自HRESULT: 0x80070005">的异常

我不知道在更新过程中是否有什么东西被修改导致了这个问题。我只有一个可以打开驱动器设备的虚拟机快照。在这个快照上,当我更新UWP应用程序时,我还可以打开驱动设备,但是更新驱动程序后,UWP应用程序无法再打开驱动设备。

这是否意味着问题出在驱动程序上?

之后,我新建了一个KMDF项目和一个UWP项目,只打印了一些信息,安装到虚拟机后也出现了同样的错误。

值得注意的是,当我在DbgView中看到UWP访问驱动器设备时,触发了EvtDeviceFileCreate事件回调,但立即触发了EvtDeviceClose事件回调,我认为设备接口应该没有问题。

而且,在开始时,我使用设备管理器"添加遗留硬件";加载驱动程序,然后我尝试使用devcon安装驱动程序,两者都可以安装驱动程序,但似乎略有不同,我不确定这是否也会产生影响,虽然两种安装方法目前都不能解决我遇到的问题。

以下是UWP应用程序和驱动程序的一些设置。

注册设备接口并添加自定义功能:

在这一部分中,我参考了Microsoft的官方示例kmdf_fx2。

WDFSTRING symbolicLinkString = NULL;
UNICODE_STRING symbolicLinkName = SymbolicName;
DEVPROP_BOOLEAN isRestricted;
status = WdfDeviceCreateDeviceInterface(
hDevice,
(LPGUID)&GUID_INTERFACE_HSADRVSAMPLE1,
NULL); // Reference String
if (!NT_SUCCESS(status)) {
KdPrint(("WdfDeviceCreateDeviceInterface Failn"));
goto Error;
}
if (g_pIoSetDeviceInterfacePropertyData != NULL) {
status = WdfStringCreate(NULL,
WDF_NO_OBJECT_ATTRIBUTES,
&symbolicLinkString);
if (!NT_SUCCESS(status)) {
KdPrint(("WdfStringCreate Failn"));
goto Error;
}
status = WdfDeviceRetrieveDeviceInterfaceString(
hDevice,
(LPGUID)&GUID_INTERFACE_HSADRVSAMPLE1,
NULL,
symbolicLinkString);
if (!NT_SUCCESS(status)) {
KdPrint(("WdfDeviceRetrieveDeviceInterfaceString Failn"));
goto Error;
}
WdfStringGetUnicodeString(symbolicLinkString, &symbolicLinkName);
isRestricted = DEVPROP_TRUE;
status = g_pIoSetDeviceInterfacePropertyData(
&symbolicLinkName,
&DEVPKEY_DeviceInterface_Restricted,
0,
0,
DEVPROP_TYPE_BOOLEAN,
sizeof(isRestricted),
&isRestricted);
if (!NT_SUCCESS(status)) {
KdPrint(("g_pIoSetDeviceInterfacePropertyData Failn"));
goto Error;
}
#if defined(NTDDI_WIN10_RS2) && (NTDDI_VERSION >= NTDDI_WIN10_RS2)
static const wchar_t customCapabilities[] = L"ColinTest.HSADrvSample_2022051717171";
status = g_pIoSetDeviceInterfacePropertyData(
&symbolicLinkName,
&DEVPKEY_DeviceInterface_UnrestrictedAppCapabilities,
0,
0,
DEVPROP_TYPE_STRING_LIST,
sizeof(customCapabilities),
(PVOID)&customCapabilities);
if (!NT_SUCCESS(status)) {
KdPrint(("g_pIoSetDeviceInterfacePropertyData Failn"));
goto Error;
}
#endif
WdfObjectDelete(symbolicLinkString);
}
Error:
if (symbolicLinkString != NULL) {
WdfObjectDelete(symbolicLinkString);
}

司机正:

;
; HSADrvSample1.inf
;
[Version]
Signature="$WINDOWS NT$"
Class=Test ; TODO: edit Class
ClassGuid={160303BD-D84C-4819-B962-9B1BDBB52310} ; TODO: edit ClassGuid
Provider=%ManufacturerName%
CatalogFile=HSADrvSample1.cat
DriverVer = 05/19/2022,9.21.50.151
PnpLockDown=1
[DestinationDirs]
DefaultDestDir = 12
HSADrvSample1_Device_CoInstaller_CopyFiles = 11
; ================= Class section =====================
[ClassInstall32]
Addreg=SampleClassReg
[SampleClassReg]
HKR,,,0,%ClassName%
HKR,,Icon,,-5
[SourceDisksNames]
1 = %DiskName%,,,""
[SourceDisksFiles]
HSADrvSample1.sys  = 1,,
WdfCoInstaller01011.dll=1 ; make sure the number matches with SourceDisksNames
;*****************************************
; Install Section
;*****************************************
[Manufacturer]
%ManufacturerName%=Standard,NTamd64
[Standard.NTamd64]
%HSADrvSample1.DeviceDesc%=HSADrvSample1_Device, RootHSADrvSample1 ; TODO: edit hw-id
[HSADrvSample1_Device.NT]
CopyFiles=Drivers_Dir
[Drivers_Dir]
HSADrvSample1.sys
;-------------- Service installation
[HSADrvSample1_Device.NT.Services]
AddService = HSADrvSample1,%SPSVCINST_ASSOCSERVICE%, HSADrvSample1_Service_Inst
; -------------- HSADrvSample1 driver install sections
[HSADrvSample1_Service_Inst]
DisplayName    = %HSADrvSample1.SVCDESC%
ServiceType    = 1               ; SERVICE_KERNEL_DRIVER
StartType      = 3               ; SERVICE_DEMAND_START
ErrorControl   = 1               ; SERVICE_ERROR_NORMAL
ServiceBinary  = %12%HSADrvSample1.sys
;
;--- HSADrvSample1_Device Coinstaller installation ------
;
[HSADrvSample1_Device.NT.CoInstallers]
AddReg=HSADrvSample1_Device_CoInstaller_AddReg
CopyFiles=HSADrvSample1_Device_CoInstaller_CopyFiles
[HSADrvSample1_Device_CoInstaller_AddReg]
HKR,,CoInstallers32,0x00010000, "WdfCoInstaller01011.dll,WdfCoInstaller"
[HSADrvSample1_Device_CoInstaller_CopyFiles]
WdfCoInstaller01011.dll
[HSADrvSample1_Device.NT.Wdf]
KmdfService =  HSADrvSample1, HSADrvSample1_wdfsect
[HSADrvSample1_wdfsect]
KmdfLibraryVersion = 1.11
[Strings]
SPSVCINST_ASSOCSERVICE= 0x00000002
ManufacturerName="Colin" ;TODO: Replace with your manufacturer name
ClassName="Test" ; TODO: edit ClassName
DiskName = "HSADrvSample1 Installation Disk"
HSADrvSample1.DeviceDesc = "HSADrvSample1 Device"
HSADrvSample1.SVCDESC = "HSADrvSample1 Service"

SCCD文件:

根据官方文档硬件支持应用程序(HSA):应用程序开发人员的步骤配置文件,该文件已设置为content

<?xml version="1.0" encoding="utf-8"?>
<CustomCapabilityDescriptor xmlns="http://schemas.microsoft.com/appx/2018/sccd" xmlns:s="http://schemas.microsoft.com/appx/2018/sccd">
<CustomCapabilities>
<CustomCapability Name="ColinTest.HSADrvSample_2022051717171"></CustomCapability>
<AuthorizedEntities>
<AuthorizedEntity AppPackageFamilyName="Colin.HSA.A
<Capabilities>
<Capability Name="internetClient" />
<uap4:CustomCapability Name="ColinTest.HSADrvSample_2022051717171"/>
</Capabilities>
a8dxf1xdwf12" CertificateSignatureHash="2d6e4f1418bc13447bb8c10067d0af418cb8a2f9e14c014e03a1e0ec811735af"></AuthorizedEntity> </AuthorizedEntities> <Catalog>FFFF</Catalog> </CustomCapabilityDescriptor>

部分Package.appxmanifest:

PP_4部分UWP代码:

string selector = CustomDevice.GetDeviceSelector(DeviceInterfaceGuid);
DeviceInformationCollection enumDevice = await DeviceInformation.FindAllAsync(selector);
string DeviceID = enumDevice[0].Id;
try
{
CustomDevice Device = await CustomDevice.FromIdAsync(DeviceID, DeviceAccessMode.ReadWrite, DeviceSharingMode.Shared);
if (null != Device)
{
Note.Text = "Open successfully";
}
}
catch (Exception ex)
{
Note.Text = "Failed to open!" + ex.Message;
}

我想知道在哪一步我得到错误?如何解决?


根据@Nico Zhu - MSFT的建议,我又检查了CustomCapabilityName

在我的代码中有三个地方与CustomCapabilityName相关,但它们都是相同的.为了测试问题是否出现在这里,使用reset这个名字。
  1. 驱动代码
static const wchar_t customCapabilities[] = L"Test.hsaTestCustomCapability_1653011401000";
  • CustomCapability。SCCD
  • <?xml version="1.0" encoding="utf-8"?>
    <CustomCapabilityDescriptor xmlns="http://schemas.microsoft.com/appx/2018/sccd" xmlns:s="http://schemas.microsoft.com/appx/2018/sccd">
    <CustomCapabilities>
    <CustomCapability Name="Test.hsaTestCustomCapability_1653011401000"></CustomCapability>
    </CustomCapabilities>
    <AuthorizedEntities AllowAny="true"/>
    <Catalog>0000</Catalog>
    </CustomCapabilityDescriptor>
    
  • Package.appxmanifest
  • <Capabilities>
    <Capability Name="internetClient" />
    <uap4:CustomCapability Name="Test.hsaTestCustomCapability_1653011401000"/>
    </Capabilities>
    

    之后,我卸载重新启动并安装了最新版本的程序,但我仍然无法访问它。

    我的SDK和WDK版本是10.0.19041.0,测试机操作系统版本为Windows 10 Pro Build 19041.vb_release.191206-1406

    我想我犯了一个低级错误,设置设备接口属性的功能g_pIoSetDeviceInterfacePropertyData需要在DriverEntry中设置。但是我没有这样做,这导致我设置的CustomCapabilityName没有生效。

    UNICODE_STRING funcName;
    RtlInitUnicodeString(&funcName, L"IoSetDeviceInterfacePropertyData");
    g_pIoSetDeviceInterfacePropertyData = (PFN_IO_SET_DEVICE_INTERFACE_PROPERTY_DATA)(ULONG_PTR)
    MmGetSystemRoutineAddress(&funcName);
    

    然而,为什么驱动程序在最原始的版本中正常工作仍然是一个未解之谜…

    最新更新