我正在使用 IOKit 框架IOConnectCallMethod
从用户空间客户端和IOExternalMethodDispatch
驱动程序端与我的驱动程序进行通信。
到目前为止,我能够发送固定长度的命令,现在我希望发送不同大小的字符数组(即完整路径)。
但是,驱动程序和客户端的命令长度似乎是耦合的,这意味着驱动程序中的checkStructureInputSize
fromIOExternalMethodDispatch
必须等于客户端中的inputStructCnt
from
。IOConnectCallMethod
这是双方的结构内容:
司机 :
struct IOExternalMethodDispatch
{
IOExternalMethodAction function;
uint32_t checkScalarInputCount;
uint32_t checkStructureInputSize;
uint32_t checkScalarOutputCount;
uint32_t checkStructureOutputSize;
};
客户:
kern_return_t IOConnectCallMethod(
mach_port_t connection, // In
uint32_t selector, // In
const uint64_t *input, // In
uint32_t inputCnt, // In
const void *inputStruct, // In
size_t inputStructCnt, // In
uint64_t *output, // Out
uint32_t *outputCnt, // In/Out
void *outputStruct, // Out
size_t *outputStructCnt) // In/Out
这是我使用不同大小命令的失败尝试:
std::vector<char> rawData; //vector of chars
// filling the vector with filePath ...
kr = IOConnectCallMethod(_connection, kCommandIndex , 0, 0, rawData.data(), rawData.size(), 0, 0, 0, 0);
从驱动程序命令处理程序方面,我正在调用IOUserClient::ExternalMethod
,但这需要我从客户端传递的动态数据的确切长度。IOExternalMethodArguments *arguments
IOExternalMethodDispatch *dispatch
除非我将调度函数设置为它应该期望的确切数据长度,否则这不起作用。
知道如何解决这个问题,或者在这种情况下我应该使用不同的 API 吗?