Как перезаписать части внутреннего буфера DriverKit OSData?

Документация OSData говорит, что "... Вы можете добавлять к ним байты и перезаписывать части байтового массива".. Я вижу способ добавления байтов, но не понимаю, как я могу перезаписать часть буфера.

Другой вариант - использовать IONewZeroвыделить ряд элементов нужного мне типа. В моем случае это просто нужно дляintс.

Пример:

T* dataBuffer = IONewZero(T, SIZE);

А затем освободите место с помощью:

IOSafeDeleteNULL(dataBuffer_, T, SIZE);

Каковы преимущества использования OSData объект по сравнению с решением с IONewZero / IOSafeDeleteNULL?

1 ответ

Решение

Я думаю, что документацию можно просто скопировать из варианта ядра OSData. Я видел это во многих местах, особенно в USBDriverKit.

OSData в основном полезен для работы с plist-подобными структурами данных (т. е. для установки и получения свойств объектов службы) в сочетании с другими типами OSTypes: OSArray, OSDictionary, OSNumberи т. д. Он также используется для внутриполосных (<= 4096 байт) аргументов "структуры" внешних методов пользователя-клиента.

Единственное использование, которое я вижу за пределами этих сценариев, - это когда вам абсолютно необходимо подсчитать количество ссылок на большой объем данных. Но это, конечно, не особенно удобный или эффективный контейнер для незавершенных данных. Если впоследствии вам потребуется отправить данные на устройство или сопоставить их с пользовательским пространством,IOBufferMemoryDescriptor вероятно, лучший выбор (а также учитывается количество ссылок), хотя он еще более тяжелый.

Другие вопросы по тегам