发送由于IOKit命令我使用由于IOKit框架与使用从用户空间客户IOConnectCallMethod
和IOExternalMethodDispatch
驾驶员侧我的驱动程序通信。具有动态长度
到目前为止我能够发送固定长度指令,现在我想发送字符的不同大小的阵列(即FULLPATH)。
然而,似乎是,驱动器和所述的客户端侧命令长度耦合,这意味着checkStructureInputSize
从IOExternalMethodDispatch
在驾驶员必须在客户端等于inputStructCnt
从 IOConnectCallMethod
。
这里有结构内容两侧:
DRIVER:
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,我应该在这种情况下使用?
是的,这将做到这一点。请注意,如果“结构”超出了特定的大小(如果我没有记错的话,2页/ 8K),您将在内核中将其作为指针接收,而不是作为内存描述符。 'IOExternalMethodArguments'中的'structureInput'字段将是一个'nullptr',你需要看一下'structInputDescriptor'字段。让我知道你是否希望我在正确的答案中充实确切的程序。 – pmdj
@pmdj,是的,代码示例的正确答案确实值得欢迎。谢谢 – Zohar81
完成!我已经深入了解更多细节,特别是安全隐患。 – pmdj