Winapi 使用win32在UWP中自定义驱动程序访问

Winapi 使用win32在UWP中自定义驱动程序访问,winapi,uwp,usb,Winapi,Uwp,Usb,Windows 10 IoT文档使用CreateFile和DeviceIoControl调用自定义设备。 这同样适用于Windows 10中的企业应用程序吗? 我们有一个基于Cypress Fx2的定制USB硬件。我们还有自定义驱动程序,它使用共享内存进行一些非常高效的同步传输。所有这些都可以在Win32中正常工作。现在我们想转到UWP。 与Windows.Devices.Usb相比,我们更喜欢win32 API的编程模型,因为后者需要多年的移植时间。此外,我们还需要共享内存和同步支持的性能。

Windows 10 IoT文档使用CreateFile和DeviceIoControl调用自定义设备。

这同样适用于Windows 10中的企业应用程序吗? 我们有一个基于Cypress Fx2的定制USB硬件。我们还有自定义驱动程序,它使用共享内存进行一些非常高效的同步传输。所有这些都可以在Win32中正常工作。现在我们想转到UWP。 与Windows.Devices.Usb相比,我们更喜欢win32 API的编程模型,因为后者需要多年的移植时间。此外,我们还需要共享内存和同步支持的性能。 如Windows IoT中所述,允许使用Win32访问我们的设备将非常有益。 IoT中推荐的这些指南在桌面上似乎不起作用。我无法通过修改安全注册表项“授予对AppContainer进程的访问权限”,并且CreateFile因“访问被拒绝”而失败。 我是否遗漏了一些东西,或者CreateFile在UWP中被完全阻止了,即使对于企业也是如此? 短暂性脑缺血发作
Ravi

使用平台/调用我刚刚成功地使用Win32 API、CreateFile和DeviceIoControl从windows 10桌面上的VB.net UWP访问了我们自定义的基于Cypress FX2的USB设备,使用了我们自己的WDM驱动程序

方法1记录在 在桌面上也很好用。 下面是一个命令提示符的抓图,用于进行注册表设置,以授予硬件对“AppContainer进程”的访问权


C:\WINDOWS\system32>schtasks/delete/tn DeviceAC/f 错误:系统找不到指定的文件

C:\WINDOWS\system32>schtasks/create/RU SYSTEM/SC ONCE/TN DeviceAC/TR“reg import C:\data\DeviceAC.reg”/ST 00:00 警告:任务可能无法运行,因为/ST早于当前时间。 成功:已成功创建计划任务“DeviceAC”

C:\WINDOWS\system32>schtasks/run/tn DeviceAC/I/Hresult 成功:尝试运行计划任务“DeviceAC”

C:\WINDOWS\system32>schtasks/query/tn DeviceAC

文件夹:\ TaskName下次运行时状态

=====================================================================================================================

设备不适用,准备就绪

C:\WINDOWS\system32>reg query“HKEY\U LOCAL\U MACHINE\SYSTEM\CurrentControlSet\Enum\USB\VID\U 0547&PID\U BC02\6&59cb9c4&0&4”/v安全

HKEY\U LOCAL\U MACHINE\SYSTEM\CurrentControlSet\Enum\USB\VID\U 0547&PID\U BC02\6&59cb9c4&0&4 安全注册表二进制文件010004900000000000000000000000014000002000600040000000000014000000000400000001010000000000000051200000000001800001001002000000002000000000002000000000000001400000001010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

C:\WINDOWS\system32>schtasks/delete/tn DeviceAC/f 成功:已成功删除计划任务“DeviceAC”


CreateFile和DeviceIoControl的工作方式很有魅力。我们有干净、快速和同步的Win32代码。 不要像这样胡说八道

task <UINT32> CUsbDev::getDeviceInfo()
{

return create_task(DeviceInformation::FindAllAsync(UsbDevice::GetDeviceSelector(0x0547, 0xAB02)))
    .then([this](DeviceInformationCollection^ deviceInformationCollection) -> UINT32
{
    if (deviceInformationCollection->Size > 0)
    {
        DeviceInformation^ di = deviceInformationCollection->GetAt(0);
        String^ s = di->Id;
        create_task(UsbDevice::FromIdAsync(s))
            .then([this, di](UsbDevice^ usbDevice)
        {
            String^ s;
            if (usbDevice != nullptr)
            {
                UsbDeviceDescriptor^ devDesc = usbDevice->DeviceDescriptor;
                s = devDesc->VendorId.ToString();
                s += devDesc->ProductId.ToString();
                return 0;
            }
            else
            {
                return 1;
            }
        });
    }
    else
    {
        return 10;
    }
}); 
task CUsbDev::getDeviceInfo()
{
返回创建任务(设备信息::findalsync(UsbDevice::GetDeviceSelector(0x0547,0xAB02)))
。然后([此](设备信息集合^DeviceInformation集合)->UINT32
{
如果(设备信息集合->大小>0)
{
DeviceInformation ^di=DeviceInformation集合->获取(0);
字符串^s=di->Id;
创建_任务(UsbDevice::FromIdAsync)
.然后([this,di](UsbDevice^UsbDevice)
{
字符串^s;
如果(usbDevice!=nullptr)
{
UsbDeviceDescriptor^devDesc=usbDevice->DeviceDescriptor;
s=devDesc->VendorId.ToString();
s+=devDesc->ProductId.ToString();
返回0;
}
其他的
{
返回1;
}
});
}
其他的
{
返回10;
}
}); 
}



虽然第一种方法是针对开发人员的,但下一种方法应该对生产有用 通过此链接中提到的.inf声明可以进行相同的注册表设置 “在DDINSTALL.HW节中指定特定设备的访问控制”


偏离轨道: 如果我们的好朋友比尔掌管事务,他决不会允许像C++/CX扩展这样的垃圾软件出现在第一位。为每个过程创建线程(或任务)是一种什么样的计算机编程。孩子们正在用C++/CX代码看着帽子和装饰品逃跑。一个干净的C++被赋予了这一代,他们给下一代的东西是不可原谅的。比尔应该对他的公司今天产生的代码有一个大致的了解。 现在他们正在用C++/WinRt来清理垃圾。 我相信UWP的核心是简单的Win32 C(C++)代码。现在是时候让VB6直接、干净、高效地访问UWP代码了


Ravi

“企业应用程序”不是我熟悉的术语。您指的是通过企业应用商店发布的UWP/Windows应用商店应用程序吗?私人的、侧面加载的应用程序可能更合适?有关如何在UWP中从vb.net调用win32的一些示例代码,请参阅这是一个问答网站。这不是随意咆哮的地方。当你编辑你的.inf文件时,别忘了再次对它进行测试签名,否则一切都不起作用……我认为这是一个信息丰富且有趣的地方(“孩子们正在跑开,看C++/CX代码中的帽子和装饰品。”)@Thomas它应该是一个安全描述符,意思是“授予对XYZ、管理员、用户等的访问权限”,因此,除非您想对此进行调整,否则它可能会被大量复制到所有设备上,如自定义USB、HID等