Używam frameworka IOKit do komunikacji z moim sterownikiem za pomocą IOConnectCallMethod
od klienta przestrzeni użytkownika i IOExternalMethodDispatch
po stronie sterownika.Wysyłanie polecenia IOKit z dynamiczną długością
Do tej pory mogłem wysyłać komendy o stałej długości, a teraz chcę wysłać tablicę znaków o różnych rozmiarach (np. Fullpath).
Wydaje się jednak, że kierowca i długości boków poleceń klienta są połączone, co oznacza, że checkStructureInputSize
z IOExternalMethodDispatch
w sterowniku musi być równa inputStructCnt
z IOConnectCallMethod
na stronie klienta.
Oto treść struct po obu stronach:
DRIVER:
struct IOExternalMethodDispatch
{
IOExternalMethodAction function;
uint32_t checkScalarInputCount;
uint32_t checkStructureInputSize;
uint32_t checkScalarOutputCount;
uint32_t checkStructureOutputSize;
};
KLIENT:
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
Oto moja nieudana próba stosować zróżnicowane polecenie Rozmiar:
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);
I od strony obsługi sterownika sterownika, dzwonię pod numer IOUserClient::ExternalMethod
z IOExternalMethodArguments *arguments
i IOExternalMethodDispatch *dispatch
, ale to wymaga dokładnej długości danych, które przekazuję od klienta, który jest dynamiczny.
to nie działa, chyba że ustawię funkcję wysyłki z dokładną długością danych, których powinien się spodziewać.
Każdy pomysł, jak rozwiązać ten problem, a może jest inny interfejs API, którego powinienem użyć w tym przypadku?
Tak, to zrobi. Zauważ, że jeśli "struct" wykracza poza pewien rozmiar (2 strony/8K, jeśli dobrze pamiętam), otrzymasz go w jądrze nie jako wskaźnik, ale jako deskryptor pamięci. Pole 'structureInput' w' IOExternalMethodArguments' będzie "nullptr", a zamiast tego należy zajrzeć do pola 'structureInputDescriptor'. Daj mi znać, jeśli chcesz, abym przedstawił dokładną procedurę we właściwej odpowiedzi. – pmdj
@pmdj, tak, odpowiednia odpowiedź z przykładem kodu jest rzeczywiście mile widziane. dzięki – Zohar81
Zrobione! Zagłębiłem się w szczegóły, szczególnie w kwestii pułapek bezpieczeństwa. – pmdj