Your dext driver needs to create two iigs, one for your user space driver and one for your iouserclient.
Your user space driver can be written like this. . . .
kern_return_t IMPL( MyUserSpaceDriver, NewUserClient )
{
if(ivars->MyIoUserClient==NULL)
{
IOService *client = nullptr;
if(IOService::Create(this /* provider */, "MyIOUserClientProperty" /* IOPropertyName */, &client)!=kIOReturnSuccess)
{
return (kIOReturnError);
}
ivars->MyIoUserClient = (MyIOUserClient *) OSDynamicCast(IOUserClient, client);
if(ivars->MyIoUserClient==NULL)
{
client->release();
return kIOReturnError;
}
}
*userClient = ivars->MyIoUserClient;
return (kIOReturnSuccess);
}
kern_return_t IMPL( MyUserSpaceDriver, Start )
{
........
if(ivars->MyIoUserClient==NULL)
{
IOService *client = nullptr;
if(IOService::Create(this /* provider */, "MyIOUserClientProperty" /* IOPropertyName */, &client)!=kIOReturnSuccess)
{
goto start_fail;
}
ivars->MyIoUserClient = (MyIOUserClient *) OSDynamicCast(IOUserClient, client);
if(ivars->MyIoUserClient==NULL)
{
client->release();
goto start_fail;
}
ivars->MyIoUserClient->Start(this);
}
.....
}
If it is simply the Class used by the user space driver, it can be called in the form of namespace.
namespace
{
class RingBuffer
{
public:
void init(int desiredSize)
{
size=desiredSize + 1;
data=(char *)IOMalloc(size);
head=0;
tail=0;
return;
}
void deinit(void)
{
if(data != NULL)
{
IOFree(data, size);
data=NULL;
}
return;
}
private:
int head, tail, size;
char *data;
}
}