#include <kern/kern_cdata.h>
kern/kern_cdata.h
macroKCDATA_ITEM_HEADER_SIZE
Do not use these macros!
Instead, you should use kcdata_iter_* functions defined in kcdata.h. These
macros have no idea where the kcdata buffer ends, so they are all unsafe.
#define KCDATA_ITEM_HEADER_SIZE (sizeof(uint32_t) + sizeof(uint32_t) + sizeof(uint64_t))
macroKCDATA_ITEM_ITER
#define KCDATA_ITEM_ITER(item) kcdata_iter_unsafe((void*)(item))
macroKCDATA_ITEM_TYPE
#define KCDATA_ITEM_TYPE(item) kcdata_iter_type(KCDATA_ITEM_ITER(item))
macroKCDATA_ITEM_SIZE
#define KCDATA_ITEM_SIZE(item) kcdata_iter_size(KCDATA_ITEM_ITER(item))
macroKCDATA_ITEM_FLAGS
#define KCDATA_ITEM_FLAGS(item) kcdata_iter_flags(KCDATA_ITEM_ITER(item))
macroKCDATA_ITEM_ARRAY_GET_EL_TYPE
#define KCDATA_ITEM_ARRAY_GET_EL_TYPE(item) kcdata_iter_array_elem_type(KCDATA_ITEM_ITER(item))
macroKCDATA_ITEM_ARRAY_GET_EL_COUNT
#define KCDATA_ITEM_ARRAY_GET_EL_COUNT(item) kcdata_iter_array_elem_count(KCDATA_ITEM_ITER(item))
macroKCDATA_ITEM_ARRAY_GET_EL_SIZE
#define KCDATA_ITEM_ARRAY_GET_EL_SIZE(item) kcdata_iter_array_elem_size(KCDATA_ITEM_ITER(item))
macroKCDATA_CONTAINER_ID
#define KCDATA_CONTAINER_ID(item) kcdata_iter_container_id(KCDATA_ITEM_ITER(item))
macroKCDATA_ITEM_NEXT_HEADER
#define KCDATA_ITEM_NEXT_HEADER(itemx) (kcdata_iter_next(KCDATA_ITEM_ITER(itemx)).item)
macroKCDATA_ITEM_FOREACH
#define KCDATA_ITEM_FOREACH(head) for (; KCDATA_ITEM_TYPE(head) != KCDATA_TYPE_BUFFER_END; (head) = KCDATA_ITEM_NEXT_HEADER(head))
macroKCDATA_ITEM_DATA_PTR
#define KCDATA_ITEM_DATA_PTR(item) kcdata_iter_payload(KCDATA_ITEM_ITER(item))
macroKCDATA_ITEM_FIND_TYPE
#define KCDATA_ITEM_FIND_TYPE(itemx, type) (kcdata_iter_find_type(KCDATA_ITEM_ITER(itemx), type).item)
macrokcdata_get_container_type
#define kcdata_get_container_type(buffer) kcdata_iter_container_type(KCDATA_ITEM_ITER(buffer))
macrokcdata_get_data_with_desc
#define kcdata_get_data_with_desc(buf, desc, data) kcdata_iter_get_data_with_desc(KCDATA_ITEM_ITER(buf),desc,data,NULL)
enumkcd_compression_type_t
| KCDCT_NONE | 0 | |
| KCDCT_ZLIB | 1 |
typedefkcd_compression_type_t
typedef enum kcd_compression_type_t kcd_compression_type_t;
typedefkcdata_descriptor_t
typedef void * kcdata_descriptor_t
functionkcdata_estimate_required_buffer_size
uint32_t kcdata_estimate_required_buffer_size(uint32_t num_items, uint32_t payload_size)
▾
claude-fable-5, 2026-08-24 · not from Apple sources · verified against xnu osfmk/kern/kern_cdata.c
Estimates the buffer size needed for a kcdata buffer that will contain num_items items with total payload payload_size, accounting for per-item headers, worst-case alignment padding, and the begin/end markers. Panics on arithmetic overflow of the intermediate terms. The estimate is not accurate for buffers that will contain unknown types (those with string descriptions).
functionkcdata_memory_get_used_bytes
uint64_t kcdata_memory_get_used_bytes(kcdata_descriptor_t kcd)
▾
claude-fable-5, 2026-08-24 · not from Apple sources · verified against xnu osfmk/kern/kern_cdata.c
Returns the number of bytes currently used in the kcdata buffer, from the start of the buffer through the end marker item.
functionkcdata_memory_get_uncompressed_bytes
uint64_t kcdata_memory_get_uncompressed_bytes(kcdata_descriptor_t kcd)
▾
claude-fable-5, 2026-08-24 · not from Apple sources · verified against xnu osfmk/kern/kern_cdata.c
Returns the number of uncompressed bytes represented by the kcdata buffer. When the descriptor uses compression (KCFLAG_USE_COMPRESSION) this is the total input byte count from the compression statistics (0 if the statistics cannot be obtained); otherwise it is the same value as kcdata_memory_get_used_bytes.
functionkcdata_memcpy
kern_return_t kcdata_memcpy( kcdata_descriptor_t data, mach_vm_address_t dst_addr, const void * src_addr, uint32_t size )
▾
claude-fable-5, 2026-08-24 · not from Apple sources · verified against xnu osfmk/kern/kern_cdata.c
Copies size bytes from src_addr into a kcdata buffer at dst_addr, using copyout when the descriptor addresses user memory (KCFLAG_USE_COPYOUT) and memcpy otherwise. dst_addr is normally obtained from kcdata_get_memory_addr. Returns KERN_NO_ACCESS if the copyout fails, else KERN_SUCCESS.
functionkcdata_bzero
kern_return_t kcdata_bzero( kcdata_descriptor_t data, mach_vm_address_t dst_addr, uint32_t size )
▾
claude-fable-5, 2026-08-24 · not from Apple sources · verified against xnu osfmk/kern/kern_cdata.c
Zeroes size bytes of a kcdata buffer at dst_addr, via repeated copyout of zero blocks when the descriptor addresses user memory and bzero otherwise. Returns KERN_NO_ACCESS if a copyout fails, else KERN_SUCCESS.
functionkcdata_get_memory_addr
kern_return_t kcdata_get_memory_addr( kcdata_descriptor_t data, uint32_t type, uint32_t size, mach_vm_address_t * user_addr )
▾
claude-fable-5, 2026-08-24 · not from Apple sources · verified against xnu osfmk/kern/kern_cdata.c
Appends an item header of the given type and size to the kcdata buffer and returns through user_addr the address at which the caller should populate the item's data (with kcdata_memcpy, or copyout). Padding to 16-byte alignment is recorded in the item flags. The caller is responsible for zeroing or otherwise marking the reserved memory if it fails to populate it mid-operation. Returns KERN_INSUFFICIENT_BUFFER_SIZE (or resource errors) when the item does not fit.
functionkcdata_get_memory_addr_for_array
kern_return_t kcdata_get_memory_addr_for_array( kcdata_descriptor_t data, uint32_t type_of_element, uint32_t size_of_element, uint32_t count, mach_vm_address_t * user_addr )
▾
claude-fable-5, 2026-08-24 · not from Apple sources · verified against xnu osfmk/kern/kern_cdata.c
Reserves space in the kcdata buffer for an array of count elements of type_of_element, each size_of_element bytes, and returns through user_addr the address to populate. The element type and count are encoded in the item flags, and the pad byte count in the low bits of the KCDATA_TYPE_ARRAY_PAD type. The caller is responsible for zeroing the memory if population fails mid-operation.