【问题标题】:Single DLL for multiple devices using the same driver使用相同驱动程序的多个设备的单个 DLL
【发布时间】:2020-06-17 10:27:13
【问题描述】:

我尝试在用户应用程序和驱动程序之间设计一个第三方 DLL,它将能够管理通过 PCIe 连接到同一台 PC 的多个设备(相同型号)的通信。单个 DLL 将放置在已知文件夹中,例如%SystemRoot%/System32。加载/卸载 DLL 应该调用一些函数,例如。 FindDevices()、OpenDevice()、CloseDevice() 将更新 DLL 中定义的结构,例如。设备管理器:

const int MAX_DEV_INSTANCES;

typedef struct DEV_STATUS_T {

    BOOL swConnected;           // State of SW connection
    UINT32 swConnIdx;           // ID of SW app

    BOOL hwConnected;           // State of HW connection
    UINT32 hwPortIdx;           // ID of port for HW

} DEV_STATUS;

typedef struct DEV_MANAGER_T {

    UINT32 devicesNr;
    DEV_STATUS status[MAX_DEV_INSTANCES];
    DEVICE device[MAX_DEV_INSTANCES];

} MANAGER;

MANAGER manager;

假设我们有 2 个设备:A、B 和 2 个应用程序:M、N。它们都试图连接到一个单独的设备:M 控制 A,N 控制 B。

我的问题:

  1. 假设 M 加载 DLL 并且 DLL 更新 MANAGER struct {status[0], device[0]}。 如果 N 加载相同的 DLL,它是否能够看到 M 在 {status[0], device[0]} 或 M 中进行了更改,N 将有单独的 MANAGER 结构副本来处理?

  2. 如果 M 和 N 不知道在 MANAGER 中所做的外部更改(MANAGER 不是“全局的”),实现此目的的方法是什么?是不是应该在底层管理——驱动代码?

  3. 如果 M 和 N 知道在 MANAGER 中进行的外部更改(MANAGER 是“全局”),OpenDevice() / CloseDevice() 将是唯一需要的函数修改 MANAGER 结构?

感谢您对此事的任何 cmets 和建议。

【问题讨论】:

    标签: c++ dll driver wdk pci-e


    【解决方案1】:

    这里有一些提示:

    1. 不,两个应用程序将位于不同的内存空间中,因此应用程序MMANAGER 的修改不会对应用程序N 产生任何影响
    2. 几个解决方案,但要注意其中任何一个的并发:
      1. 为数据使用共享内存缓冲区
      2. 将管理器放在一个单独的进程中(如果您可以访问它,这可能是驱动程序)
      3. 使用文件锁表示设备为进程“拥有”
    3. 不知道...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多