發送由於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