【问题标题】:How to communicate with minifilter driver in UWP?如何与 UWP 中的 minifilter 驱动程序通信?
【发布时间】:2021-11-20 07:32:39
【问题描述】:

我有一个微过滤器驱动程序,想将它与 FilterConnectCommunicationPort 连接。 它在 wpf 中运行良好,但即使在我添加 SECURITY_ATTRIBUTES 之后,它也会在 UWP 中返回 E_ACCESSDENIED。

    SECURITY_ATTRIBUTES sa;
    PSECURITY_DESCRIPTOR SecurityDescriptor;
    bool ret = ConvertStringSecurityDescriptorToSecurityDescriptorW(
        L"D:P(A;;GA;;;WD)(A;;GA;;;AC)(A;;GA;;;S-1-15-2-2)S:(ML;;;;;LW)", 
    SDDL_REVISION, &SecurityDescriptor, 0);

    // Initialize a security attributes structure.
    sa.nLength = sizeof(SECURITY_ATTRIBUTES);
    sa.lpSecurityDescriptor = SecurityDescriptor;
    sa.bInheritHandle = FALSE;
    HRESULT hResult = S_OK;
    hResult = FilterConnectCommunicationPort(NPMINI_PORT_NAME, 0, NULL, 0, &sa, &g_hPort);
    if (IS_ERROR(hResult))
    {
        LogError("FilterConnectCommunicationPort fail! 0x%x",hResult);
        return hResult;
    }

我修改了应用程序包清单以声明一些受限功能。还是不行。

<rescap:Capability Name="interopServices"/>
<iot:Capability Name="lowLevelDevices"/>

我不确定UWP中是否允许FilterConnectCommunicationPort。如果api没问题,如何使用它?谢谢。

【问题讨论】:

  • 是windows IOT应用吗?
  • @Anonymous 不,它只是一个语音转换器应用程序。我想捕获音频并在处理后将其发送到虚拟声卡驱动程序。
  • 不确定在 UWP 中是否可行,但既然您已经在 WPF 中完成了,为什么不改用 WPF。
  • @Anonymous 我希望它是一个小部件,所以它必须是一个 uwp。
  • FilterConnectCommunicationPort 需要像管理员这样的特权吗?如果是,那应该是这个原因。

标签: uwp driver minifilter


【解决方案1】:

您不需要这些功能。 interopServices 是 Windows Phone 时代的产物,lowLevelDevices 仅适用于实际的 IOT(嵌入式模式)操作系统。

添加正确的 ACE 可以通过这样的函数来完成 - 只需将句柄传递给您的对象、目标应用程序的 PFN 以及所需的访问权限。 (为了简单起见,这里硬编码SE_KERNEL_OBJECT;您可能需要根据需要使用不同的object type)。

bool GrantAccessToPackage(HANDLE handle, const wchar_t* packageName, DWORD accessRights)
{
  PSID packageSid{};

  if (!SUCCEEDED(DeriveAppContainerSidFromAppContainerName(packageName, &packageSid)))
  {
    throw std::exception("invalid pfn");
  }

  EXPLICIT_ACCESS explicitAccess{};
  explicitAccess.grfAccessMode = GRANT_ACCESS;
  explicitAccess.grfAccessPermissions = accessRights;
  explicitAccess.grfInheritance = NO_INHERITANCE;
  explicitAccess.Trustee.TrusteeType = TRUSTEE_IS_USER;
  explicitAccess.Trustee.TrusteeForm = TRUSTEE_IS_SID;
  explicitAccess.Trustee.ptstrName = (LPWCH)packageSid;

  PSECURITY_DESCRIPTOR securityDescriptor{ nullptr };
  PACL oldAcl{ nullptr };
  PACL newAcl{ nullptr };

  auto retVal = GetSecurityInfo(handle, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, nullptr, nullptr, &oldAcl, nullptr, &securityDescriptor);
  if (SUCCEEDED(retVal))
  {
    retVal = SetEntriesInAclW(1, &explicitAccess, oldAcl, &newAcl);
    if (SUCCEEDED(retVal))
    {
      retVal = SetSecurityInfo(handle, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, nullptr, nullptr, newAcl, nullptr);
    }
  }

  FreeSid(packageSid);
  if (securityDescriptor != nullptr)
  {
    LocalFree(securityDescriptor);
    if (newAcl != nullptr)
    {
      LocalFree(newAcl);

      // oldAcl is NOT freed; it's just a pointer into securityDescriptor
    }
  }

  return SUCCEEDED(retVal);
}

【讨论】:

    【解决方案2】:

    FilterConnectCommunicationPort 的安全属性仅用于继承目的。 您必须确保您在过滤器中创建的安全描述符允许您的 UWP 应用程序访问,或者更确切地说,允许运行您的 UWP 的用户访问您的通信端口。

    如果我没记错的话,你的 UWP 应用应该有自己的 SID。因此,在您调用 FltCreateCommunicationPort 时的过滤器中,您必须首先让您的 ObjectAttributes 参数包含一个 SD,该 SD 在您的 UWP 应用 SID 的 DACL 中有一个允许的 ACE。

    您可以使用 RtlCreateSecurityDescriptor(在调用此函数之前,您必须先为 SD 分配足够的内存)、RtlCreateAclRtlAddAccessAllowedAceRtlSetDaclSecurityDescriptor 创建一个并将您的 SID 作为允许的 ACE 添加到 SD 中的 DACL。

    让我知道它是否适合你。

    【讨论】:

      猜你喜欢
      • 2020-06-17
      • 2020-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多