【发布时间】: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。
我的问题:
假设 M 加载 DLL 并且 DLL 更新 MANAGER struct {status[0], device[0]}。 如果 N 加载相同的 DLL,它是否能够看到 M 在 {status[0], device[0]} 或 M 中进行了更改,N 将有单独的 MANAGER 结构副本来处理?
如果 M 和 N 不知道在 MANAGER 中所做的外部更改(MANAGER 不是“全局的”),实现此目的的方法是什么?是不是应该在底层管理——驱动代码?
如果 M 和 N 知道在 MANAGER 中进行的外部更改(MANAGER 是“全局”),OpenDevice() / CloseDevice() 将是唯一需要的函数修改 MANAGER 结构?
感谢您对此事的任何 cmets 和建议。
【问题讨论】: