Я использую инфраструктуру IOKit для связи с моим драйвером, используя IOConnectCallMethod
из клиента пользовательского пространства и IOExternalMethodDispatch
на стороне драйвера.
До сих пор я мог отправлять команды фиксированной длины, и теперь я хочу отправить массив символов различного размера (то есть полный путь).
Однако кажется, что длины команд на стороне драйвера и на стороне клиента связаны, что означает, что checkStructureInputSize
из IOExternalMethodDispatch
в драйвере должно быть равно inputStructCnt
из 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, который я должен использовать в этом случае?