Post not yet marked as solved
For those of us working on drivers for DriverKit, much of the example documentation is confusing, outdated, or just not an actual working example of the latest DriverKit feature set.
This post might be of some help to you.
I have published a fully working client sample app example that adds iPadOS support alongside macOS and updates to the latest driverkit version:
https://github.com/DanBurkhardt/DriverKitUserClientSample
This should be immediately runnable, but you will have to ensure you disable SIP and enable developer mode, as per the original README (this is required without DriverKit entitlement permission from Apple).
You will also need to, of course, change the bundle ID to your own name (replace "gigabitelabs" with something that is specific to your dev account / business).
Lmk if you have any issues, I'm happy to help you get this running so you can get the initial part of DriverKit testing out of the way.
Happy hacking,
Dan
Post not yet marked as solved
By default Driver kit is disabled in settings app when my app is first installed.
I want to show notification to user to enable driverkit whenever i detect driverkit is not enabled or disabled. How do my app know whether driverkit is enabled or disabled?
Any pointer for above question will be very helpful.
Post not yet marked as solved
Failed to verify code signature of /var/installd/Library/Caches/com.apple.mobile.installd.staging/temp.yOSaDQ/extracted/SimpleAudio.app/SystemExtensions/com.xreal.nrsdk.driver.demo.Driver.dext : 0xe8008015 (A valid provisioning profile for this executable was not found.)
Verify that the Developer App certificate for your account is trusted on your device. Open Settings on the device and navigate to General -> VPN & Device Management, then select your Developer App certificate to trust it.
Post not yet marked as solved
Hi, My goal is to enable this project https://github.com/evidlo/remarkable_mouse to provide native tablet inputs with full information to applications on MacOS, allowing me to reuse my reMarkable tablet for the computer instead of having to buy yet another device, such as a Wacom tablet or an iPad Pro for sidecar when the necessary hardware is already in my posession.
I would like to understand whether it is possible to use DriverKit in order to simulate a graphics tablet input device with extra inputs such as pressure and tilt in user-space. Or is this something where IOKit or other comes into play, requiring the creation of a kernel space driver?
In either case, what would be the right steps to take?
How would I create a virtual device and what are the limitations?
If you have the knowledge, how complex would you consider this project to be?
The path should basically be some inter-process communication from remarkable_mouse, possibly file-based, triggering tablet events through the driver. At least in the first stage.
I assume better performance would be achieved if the whole system was self-contained but porting the reMarkable communication is another challenge on its own.
I am experienced developing in other environments but MacOS and driver development are fairly new to me. I've read through the documentation on how to handle the tablet events but creating them seems much murkier.
I have searched around for this specific topic without getting much. An open-source tablet driver would be a great place to start but sadly I found none. I've also inquired with ChatGPT but only got high level tips and pseudocode.
Any help is greatly appreciated, thank you!
Post not yet marked as solved
Dear Sirs,
I've written a Swift App, a C++ application and a Driver Extension using DriverKit and AudioDriverKit. As it works on my development machine now I'd like to give it to some other users and so I'm trying to make a Release Build. I've created a Signing Certificate for "Apple Distribution" which I can use for my Swift App and the C++ application which also both use "com.apple.developer.driverkit.userclient-access". I've been given this entitlement and the "Distribution Support" is for "Development, Ad hoc, App Store, Developer ID". For my Driver Extension I'm using the entitlements "com.apple.developer.driverkit" and "com.apple.developer.driverkit.family.audio" which I've also been given and which show the identical "Distribution Support". But when I try to use my Signing Certificate XCode refuses to use the provisioning profile for the Dext and says "Xcode 14 and later requires a DriverKit development profile enabled for iOS and macOS. Visit the developer website to create or download a DriverKit profile." On the other hand I have to use the same Signing Certificate for my Swift App that embeds the Dext and the Dext itself. How can I create a Signing Certificate for Release mode that works for both, the Swift App and the Dext?
Thanks and best regards,
Johannes
Post not yet marked as solved
I'm struggling to build a driver for iPadOS in a particular project configuration.
If I put the driver code and dext target into the same Xcode project which contains the iPad app, all is well. This is the way the Xcode driver template does it.
However, I'd like to build and debug the dext on macOS, while eventually deploying on iPadOS. So I put the dext into a different project, which has a macOS target, a minimal iPadOS target and a DriverKit target.
I made a workspace which contains both projects. I dragged the macOS project into the iPadOS project so that I can refer to the products of the macOS project (specifically, its driver target) as a dependency of the iPadOS target.
Note that the main iPad app target depends on the driver target.
So the workspace organization looks like this:
Workspace
iPad project
main iPad app target (depends on driver)
test project reference
test project
test macOS/iPad app target
DriverKit dext target
When I build the iPadOS target, it builds the dependent driver target in the macOS project, but it fails to link because Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/15.0.0/lib/darwin/libclang_rt.profile_driverkit.a is not found.
If I just build the driver target directly in Xcode, there is no such complaint.
I looked closely at the build logs, and I see for the failed link, there are these two linker flags set which are not set in the successful case
-debug_variant
-fprofile-instr-generate
I can't seem to control the generation of this flag. I tried turning off the Profile switch in the Scheme editor for the driver, but is makes no difference. When I directly build the driver target, no -fprofile-instr-generate is set and it compiles and links. When i build the driver as a dependency of another target, -fprofile-instr-generate is passed to the linker, which fails.
The obvious workaround is to put the driver source code into a separate driver target in the iPadOS project, but I'd rather have just one DriverKit driver for both platforms, with a few settings (such as bundle ID) controlled by a configuration file. Has anyone else encountered this problem, and know of a workaround?
Post not yet marked as solved
Is there a way to synchronously retrieve configuration information from the app or read configuration information from a file within the Start method of DriverKit?
I have attempted to use OSMappedFile to read a file, but my driver crashes or I receive the error message "Sandbox: com.injection.epusbfilter.dext(20610) deny(1) file-read-data /private/tmp/driverkit_config.txt" in the console, even though I have set com.apple.security.app-sandbox to false.
OSMappedFile *mappedFile;
do {
const char *path = "/private/tmp/cfg";
// 创建 OSMappedFile 实例
kern_return_t result = OSMappedFile::createFromPath(path, 0, 0, &mappedFile);
if (result != KERN_SUCCESS) {
Log("Failed to create and map the file.");
ret = -1;
break;
}
*size = mappedFile->size();
// 获取映射到内存中的数据
char *charData = reinterpret_cast<char *>(const_cast<void *>(mappedFile->data()));
Log("get cfg:%s", charData);
if (strlen(charData) > 0) {
if (charData[0] == '1') {
ret = 1;
break;
}
}
else {
ret = -2;
break;
}
} while(false);
mappedFile->free();
Post not yet marked as solved
As i read Driverkit can be used to write the device driver.
But, I want to filter a device.
can Driverkit be used for filtering a particular device?
Post not yet marked as solved
I created a driver using DriverKit on Intel macOS 12.6.1 and Xcode 13.3. I enabled auto-manage signing, and set the signing certificate to 'Sign to Run Locally'. Then, I created a provision profile for the driver and selected my M1 test device. After installing the profile, I ran the app on the M1 device and successfully activated the driver.
However, when I tried to compile the project on M1 macOS 13.3 with Xcode 14.3.1, I encountered an error. It appears that DriverKit does not support the 'Sign to Run Locally' option on M1 devices. To resolve this issue, I switched to using the 'Apple Development' signing certificate. Unfortunately, even after making this change, I still received an error message regarding 'Sign to Run Locally' from the Xcode console.
Both devices are logged in with the same developer account. Could you please advise me on how to resolve this problem?
iig:
#include <Availability.h>
#include <DriverKit/IOService.iig>
#include <DriverKit/IOUserClient.iig>
//class OSAction;
class epusbfilter: public IOService
{
public:
virtual bool init() override;
virtual kern_return_t Start(IOService * provider) override;
virtual kern_return_t Stop(IOService * provider) override;
virtual void free() override;
virtual kern_return_t GetRegistryEntryID(uint64_t * registryEntryID) override;
};
cpp:
#include <os/log.h>
#include <DriverKit/IOUserServer.h>
#include <DriverKit/IOLib.h>
#include <USBDriverKit/IOUSBHostInterface.h>
#include <USBDriverKit/IOUSBHostPipe.h>
#include "epusbfilter.h"
#define Log(fmt, ...) os_log(OS_LOG_DEFAULT, "epusbfilter - no super," fmt "\n", ##__VA_ARGS__)
struct epusbfilter_IVars
{
IOUSBHostInterface *interface;
IOUSBHostPipe *inPipe;
OSAction *ioCompleteCallback;
IOBufferMemoryDescriptor *inData;
uint16_t maxPacketSize;
};
bool epusbfilter::init() {
bool result = false;
Log("init");
result = super::init();
return result;
}
void epusbfilter::free() {
super::free();
Log("free");
}
kern_return_t
IMPL(epusbfilter, Start)
{
kern_return_t ret;
Log("Start");
ret = Start(provider, SUPERDISPATCH);
return ret;
}
kern_return_t
IMPL(epusbfilter, Stop)
{
kern_return_t ret = kIOReturnSuccess;
Log("Stop");
ret = Stop(provider, SUPERDISPATCH);
return ret;
}
kern_return_t
IMPL(epusbfilter, GetRegistryEntryID) {
Log("GetRegistryEntryID");
return GetRegistryEntryID(registryEntryID, SUPERDISPATCH);
}
info.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IOKitPersonalities</key>
<dict>
<key>epusbfilter</key>
<dict>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleIdentifierKernel</key>
<string>com.apple.kpi.iokit</string>
<key>IOProviderClass</key>
<string>IOUSBHostInterface</string>
<key>IOClass</key>
<string>IOUserUserClient</string>
<!-- <key>IOResourceMatch</key>-->
<!-- <string>IOKit</string>-->
<key>IOUserClass</key>
<string>epusbfilter</string>
<key>IOUserServerName</key>
<string>com.injection.epusbfilter.dext</string>
<key>bConfigurationValue</key>
<integer>1</integer>-->
<key>bInterfaceNumber</key>
<integer>0</integer>
<key>idVendor</key>
<string>*</string>
<key>idProduct</key>
<string>*</string>
<key>UserClientProperties</key>
<dict>
<key>IOClass</key>
<string>IOUserUserClient</string>
<key>IOUserClass</key>
<string>epusbfilter</string>
</dict>
</dict>
</dict>
</dict>
</plist>
entitlemens:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.developer.driverkit</key>
<true/>
<key>com.apple.developer.driverkit.transport.usb</key>
<array>
<dict>
<key>idVendor</key>
<string>*</string>
<key>idProduct</key>
<string>*</string>
</dict>
</array>
</dict>
</plist>
I created a driver using DriverKit on Intel macOS 12.6.1 and Xcode 13.3. I enabled auto-manage signing, and set the signing certificate to 'Sign to Run Locally'. Then, I created a provision profile for the driver and selected my M1 test device. After installing the profile, I ran the app on the M1 device and successfully activated the driver.
When I plugin the USB device, I can see the following log:
DK: epusbfilter-0x100009dce::start(IOUSBHostInterface-0x10000946d) ok
epusbfilter - init
com.injection.epusbfilter.dext[57573] Corpse failure, too many 6
I also found a crash log
-------------------------------------
Translated Report (Full Report Below)
-------------------------------------
Process: com.injection.epusbfilter.dext [53185]
Path: /Library/SystemExtensions/*/com.injection.epusbfilter.dext
Identifier: com.injection.epusbfilter.dext
Version: 1.0 (1)
Code Type: ARM-64 (Native)
Parent Process: launchd [1]
User ID: 270
Date/Time: 2023-09-19 15:01:01.8502 +0800
OS Version: macOS 13.2 (22D49)
Report Version: 12
Anonymous UUID: 5EB7EBD9-A435-FC45-73E6-C2C5844A8082
Time Awake Since Boot: 79000 seconds
System Integrity Protection: disabled
Crashed Thread: 1 Dispatch queue: Root
Exception Type: EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Application Specific Information:
abort() called
Thread 0:
0 libsystem_kernel.dylib 0x1d5043b78 __semwait_signal_nocancel + 8
1 libsystem_c.dylib 0x1d4fcfec8 nanosleep$NOCANCEL + 212
2 libsystem_c.dylib 0x1d4fee204 sleep$NOCANCEL + 48
3 libdispatch.dylib 0x1d4f807b4 _dispatch_queue_cleanup2 + 200
4 libsystem_pthread.dylib 0x1d50fbc50 _pthread_tsd_cleanup + 132
5 libsystem_pthread.dylib 0x1d50f3220 _pthread_exit + 88
6 libsystem_pthread.dylib 0x1d50f4180 pthread_exit + 88
7 libdispatch.dylib 0x1d4f7bbcc dispatch_main + 128
8 DriverKit 0x1d4d33178 DriverExecutableMain + 84
9 dyld 0x104e95e50 start + 2544
Thread 1 Crashed:: Dispatch queue: Root
0 libsystem_kernel.dylib 0x1d5043720 __pthread_kill + 8
1 libsystem_pthread.dylib 0x1d50f40ec pthread_kill + 268
2 libsystem_c.dylib 0x1d5033cac abort + 180
3 DriverKit 0x1d4d5f890 panic + 256
4 DriverKit 0x1d4d5fa60 __assert_rtn + 88
5 DriverKit 0x1d4d60010 OSMetaClassBase::Invoke(IORPC) (.cold.1) + 44
6 DriverKit 0x1d4d32064 OSMetaClassBase::Invoke(IORPC) + 1396
7 DriverKit 0x1d4d32c5c Server(void*, mach_msg_header_t*, mach_msg_header_t*) + 520
8 DriverKit 0x1d4d3b420 uiomessage(void*) + 180
9 DriverKit 0x1d4d34694 uiomachchannel(void*, dispatch_mach_reason_t, dispatch_mach_msg_s*, int) + 380
10 libdispatch.dylib 0x1d4f8868c _dispatch_mach_msg_invoke + 472
11 libdispatch.dylib 0x1d4f74484 _dispatch_lane_serial_drain + 380
12 libdispatch.dylib 0x1d4f89620 _dispatch_mach_invoke + 852
13 libdispatch.dylib 0x1d4f74484 _dispatch_lane_serial_drain + 380
14 libdispatch.dylib 0x1d4f75130 _dispatch_lane_invoke + 436
15 libdispatch.dylib 0x1d4f7640c _dispatch_workloop_invoke + 1784
16 libdispatch.dylib 0x1d4f7ff5c _dispatch_workloop_worker_thread + 652
17 libsystem_pthread.dylib 0x1d50f5024 _pthread_wqthread + 404
18 libsystem_pthread.dylib 0x1d50fc678 start_wqthread + 8
Thread 2:
0 libsystem_pthread.dylib 0x1d50fc670 start_wqthread + 0
Thread 3:
0 libsystem_kernel.dylib 0x1d504401c __sigsuspend_nocancel + 8
1 libdispatch.dylib 0x1d4f808b4 _dispatch_sigsuspend + 48
2 libdispatch.dylib 0x1d4f80884 _dispatch_sig_thread + 56
Thread 1 crashed with ARM Thread State (64-bit):
x0: 0x0000000000000000 x1: 0x0000000000000000 x2: 0x0000000000000000 x3: 0x0000000000000000
x4: 0xffffa0016a011948 x5: 0x0000000000000010 x6: 0x00006000010481b0 x7: 0x0000000000000000
x8: 0x725b4b6e56620c88 x9: 0x725b4b6f3d67bc88 x10: 0x00000000000001b0 x11: 0x0000600001048000
x12: 0x0000000000000090 x13: 0x00000000ffffff92 x14: 0x00000000000007fb x15: 0x0000000080636ffb
x16: 0x0000000000000148 x17: 0x00000001d7176c60 x18: 0x0000000000000000 x19: 0x0000000000000006
x20: 0x0000000000004003 x21: 0x000000016b05b0e0 x22: 0x0000000000000000 x23: 0x00006000010480e8
x24: 0x0000600001048058 x25: 0xd200fde7d57ecca6 x26: 0x0000000000000085 x27: 0x000060000374c328
x28: 0x0000600001d4c000 fp: 0x000000016b059a90 lr: 0x00000001d50f40ec
sp: 0x000000016b059a70 pc: 0x00000001d5043720 cpsr: 0x40001000
far: 0x0000600002c48000 esr: 0x56000080 Address size fault
Binary Images:
0x1d503a000 - 0x1d5075fe3 libsystem_kernel.dylib (*) <60df52bd-fc1a-3888-b05b-24b44be3af15> /System/DriverKit/usr/lib/system/libsystem_kernel.dylib
0x1d4fc6000 - 0x1d5039fff libsystem_c.dylib (*) <eee04d9a-7574-3a74-8f4e-cfb05f89f7da> /System/DriverKit/usr/lib/system/libsystem_c.dylib
0x1d4f62000 - 0x1d4fadfff libdispatch.dylib (*) <4e310a5c-9629-305e-a1dd-6632bddd3362> /System/DriverKit/usr/lib/system/libdispatch.dylib
0x1d50ee000 - 0x1d50fdff3 libsystem_pthread.dylib (*) <c1ed564d-b480-3058-937e-b40c3d3df09d> /System/DriverKit/usr/lib/system/libsystem_pthread.dylib
0x1d4d27000 - 0x1d4d6b00d DriverKit (*) <839dc0a2-1e69-38e8-8bf5-ff0ecc531539> /System/DriverKit/System/Library/Frameworks/DriverKit.framework/DriverKit
0x104e90000 - 0x104f1bfff dyld (*) <fe8a9d9e-f65d-34ca-942c-175b99c0601b> /usr/lib/dyld
Could anyone please help me with resolving this problem?
Post not yet marked as solved
The "deployment target" for a DEXT is a number like 19.0 or 21.4. Xcode seems to pick the latest version on the machine you are creating the target on as a default - so if I make a new Driver target on Xcode 14 and Ventura, the Deployment Target for the driver will be 21.4. If I'm targeting macOS 12 (for example), what version of DriverKit should I choose, and where is this documented?
Post not yet marked as solved
Why can't Mac os 13.4 or xcode 14.3 build driverkit sign to run locally from xcode?
Post not yet marked as solved
Hi Apple support,
We requested the DriverKit Entitlement via below link back in early June.
https://developer.apple.com/contact/request/system-extension/
Unfortunately the request is NOT processed for months. Every time we check with Apple support, we just get boilerplate reply, and we have no idea whether the request is being processed or is stuck somewhere. No SLA is shared.
This unexpected delay really impacts our product development/release schedule. We are anxiously finding a way to escalate.
Can anyone from Apple in this forum help? I can share more details with the request. Thank you.
Thanks,
Jason
Post not yet marked as solved
Hello!
I'm curious about how com.apple.developer.hid.virtual.device entitlement works with apps. So the documentation hints that it should only be used within a driver. However, on macOS 13 I can successfully compile an app and create a virtual HID device.
On earlier versions, such as macOS 12, the app crashes on launch and there's a message in the console:
ASI found [libsystem_secinit.dylib] (sensitive) 'failed to compile sandbox profile
/System/Library/Sandbox/Profiles/application.sb:1010:15: unbound variable:
iokit-user-client-class-name
'
Everything seems to be working with the sandbox turned off. Is there a way to use the aforementioned entitlement in a sandboxed app or should I fall back to DriverKit?
My company is distributing a DriverKit System Extension as part of our software. As of recently (perhaps around a month or two ago -- I'm not sure on the exact timing), activating the System Extension only triggered one prompt to the user: the standard "System Extension Blocked" message that includes an option to open Security settings and allow the System Extension.
Now however for some reason there is suddenly a second prompt that comes before: a dialog opens with a message saying that my application is trying to "modify" a System Extension, and it asks for an admin username and password. Then once that's supplied, they get the other prompt requiring them to go into System Settings. (This new prompt is in fact the same one that appears when trying to deactivate the System Extension.)
At first I thought this was a new aspect of macOS Sonoma, but then I discovered that this prompt now appears in macOS Ventura and Monterey as well.
Why is this prompt now appearing when it wasn't there before? Did this come about as a result of a system update to Ventura and Monterey?
And more to the point, why is it there at all? Is this a bug, or is there otherwise anyway to avoid it? The user already has to enter their username and password to activate the System Extension. Why is there an additional prompt creating even more friction for this process? (Note that System Extension activation accounts for a sizeable portion of my company's macOS support requests, due to users not understanding what's going on or misunderstanding the steps necessary for activation. More friction to this process means more headaches for us!)
Post not yet marked as solved
Dear Sirs,
I've written a driver extension that can be configured through a user mode application. Now when the system reboots I'd like to start the dext again with the latest configuration right from the beginning and before the user mode applications is started (if it is started at all). What is the recommended way to do this and is there an example available? Should I do this using configuration files and through a special file API inside the dext or is there a kind of registry, or should I use sysctl variables and sysctlbyname?
Thanks and best regards,
Johannes
Post not yet marked as solved
We are developing driver for our USB device. Our approach is to run and test driver on macOS first and then verify on iPadOS 16. In the driver we add custom property -"kUSBSerialNumberString" into default properties:
OSDictionary * Driver::devicePropertiesWithSerialNumber() {
kern_return_t ret;
OSDictionary *properties = NULL;
OSDictionary *dictionary = NULL;
OSObjectPtr value;
const IOUSBDeviceDescriptor *deviceDescriptor;
deviceDescriptor = ivars->device->CopyDeviceDescriptor();
ret = CopyProperties(&properties);
value = copyStringAtIndex(deviceDescriptor->iSerialNumber, kIOUSBLanguageIDEnglishUS);
Log("Serial number: %{public}s", ((OSString *)value)->getCStringNoCopy());
dictionary = OSDictionary::withDictionary(properties, 0);
OSSafeReleaseNULL(properties);
if (value) {
OSDictionarySetValue(dictionary, "kUSBSerialNumberString", value);
OSSafeReleaseNULL(value);
}
return dictionary;
}
next in kern_return_t IMPL(Driver, Start) we call SetProperties:
ret = SetProperties(devicePropertiesWithSerialNumber());
if(ret != kIOReturnSuccess) {
Log("Start() - Failed to set properties: 0x%08x.", ret);
goto Exit;
}
We can read our property on macOS using:
func getDeviceProperty(device: io_object_t, key: String) -> AnyObject? {
IORegistryEntryCreateCFProperty(
device, key as CFString, kCFAllocatorDefault, .zero
)?.takeRetainedValue()
}
if let serialNumber = getDeviceProperty(device: driver, key: "kUSBSerialNumberString") {
print("serialNumber: \(serialNumber)")
}
However getDevicePropertyon iPadOS returns nil. We are wondering is any limitation for IORegistry entries(properties) on iPadOS16? Is any way to add custom property to IORegistry?
BTW, we added debug method to print all the available properties for IORegistry:
private func debugRegistry(device: io_object_t) {
var dictionary: Unmanaged<CFMutableDictionary>?
IORegistryEntryCreateCFProperties(device, &dictionary, kCFAllocatorDefault, .zero)
if let dictionary = dictionary {
let values = dictionary.takeUnretainedValue()
print(values)
}
}
It returns just 1 property for iPadOS:
{
IOClass = IOUserService;
}
and much more for macOS including our custom one:
{
CFBundleIdentifier = "****";
CFBundleIdentifierKernel = "com.apple.kpi.iokit";
IOClass = IOUserService;
IOMatchCategory = "***";
IOMatchedPersonality = {
CFBundleIdentifier = "****";
CFBundleIdentifierKernel = "com.apple.kpi.iokit";
IOClass = IOUserService;
IOMatchCategory = "****";
IOPersonalityPublisher = "****";
IOProviderClass = IOUSBHostInterface;
IOResourceMatch = IOKit;
IOUserClass = Driver;
IOUserServerCDHash = 9cfd03b5c1b90da709ffb1455a053c5d7cdf47ac;
IOUserServerName = "*****";
UserClientProperties = {
IOClass = IOUserUserClient;
IOUserClass = DriverUserClient;
};
bConfigurationValue = 1;
bInterfaceNumber = 1;
bcdDevice = 512;
idProduct = XXXXX;
idVendor = XXXXX;
};
IOPersonalityPublisher = "*****";
IOPowerManagement = {
CapabilityFlags = 2;
CurrentPowerState = 2;
MaxPowerState = 2;
};
IOProbeScore = 100000;
IOProviderClass = IOUSBHostInterface;
IOResourceMatch = IOKit;
IOUserClass = Driver;
IOUserServerCDHash = 9cfd03b5c1b90da709ffb1455a053c5d7cdf47ac;
IOUserServerName = "*****";
UserClientProperties = {
IOClass = IOUserUserClient;
IOUserClass = DriverUserClient;
};
bConfigurationValue = 1;
bInterfaceNumber = 1;
bcdDevice = 512;
idProduct = XXXXX;
idVendor = XXXXXX;
kUSBSerialNumberString = XXXXXXXXXXX;
}
Post not yet marked as solved
Dear Sirs,
I’d like to write a virtual audio driver that also exchanges data with a application and thus probably also offers a driver extension using IOUserClient.
My first implementation was based on the sample https://developer.apple.com/documentation/audiodriverkit/creating_an_audio_device_driver and everything works fine and as expected on my development machine and I can install/uninstall the dext from within my application. But I had to learn that I will not be given the required entitlement com.apple.developer.driverkit.family.audio as AudioDriverKit seems to be not intended to be used for virtual drivers.
So I found out that this sample should be used as starting point for virtual audio drivers: https://developer.apple.com/documentation/coreaudio/creating_an_audio_server_driver_plug-in. But this sample does not include a dext offering the IOUserClient interface which I think I need.
The next sample I found was https://developer.apple.com/documentation/coreaudio/building_an_audio_server_plug-in_and_driver_extension . This doesn’t use AudioDriverKit and it includes IOUserClient so it seems to be a good start. Nevertheless it also requires some entitlements which are com.apple.developer.driverkit and com.apple.developer.driverkit.transport.usb. The client also probably needs the entitlement com.apple.developer.driverkit.userclient-access. Would I be given these entitlements for a pure virtual audio driver and why would I need com.apple.developer.driverkit.transport.usb?
And is there a chance that AudioDriverKit will also be opened for virtual drivers as it seems to be a much more modern approach and doesn’t require a reboot for installing?
Thanks and best regards,
Johannes
Post not yet marked as solved
Hello,
I am trying to run a sample project from Apple's Developer Documentation that creates and interfaces with a DriverKit Dext. The project can be found here: Creating an Audio Device Driver.
I have followed all the steps in the README.md file: downloading the code, enabling automatic signing, building the app, moving it to the Applications folder, and launching it. I then open the app, press "Install Dext", enable it through System Preferences, and receive the message "SoundboardDriver has been activated and is ready to use."
However, the audio device does not appear in the MIDI app, there is no mention of it in the IORegistry, and I get the message “Driver extension is not running” when I try to press "Open User Client".
Is there another step I need to follow to get the app running? Perhaps it's an entitlement issue?
I don't see any error/fault message in the console app relating to the app or driver.
I am running MacOS 13.4.1 (22F82) and Xcode 14.3.1 (14E300c). I have tried with and without SIP enabled, but the issue persists.
Any help or guidance would be greatly appreciated.
Best,
Henry
Post not yet marked as solved
After DriverKit being released last year, I wonder if the background mode External accessory communication in Background Modes applies also for drivers made with DriverKit.
Is this mode only for products in the MFi group? If so, is there any plans to include DriverKit in this group in order to get data from an external device in the background, which is not in the MFi group?