#ifndef _IOKIT_IOUSERCLIENT_H
#define _IOKIT_IOUSERCLIENT_H
#include <IOKit/IOTypes.h>
#include <IOKit/IOService.h>
#include <IOKit/OSMessageNotification.h>
enum {
kIOUCTypeMask = 0x0000000f,
kIOUCScalarIScalarO = 0,
kIOUCScalarIStructO = 2,
kIOUCStructIStructO = 3,
kIOUCScalarIStructI = 4,
kIOUCForegroundOnly = 0x00000010,
};
enum {
kIOUCVariableStructureSize = 0xffffffff
};
typedef IOReturn (IOService::*IOMethod)(void * p1, void * p2, void * p3,
void * p4, void * p5, void * p6 );
typedef IOReturn (IOService::*IOAsyncMethod)(OSAsyncReference asyncRef,
void * p1, void * p2, void * p3,
void * p4, void * p5, void * p6 );
typedef IOReturn (IOService::*IOTrap)(void * p1, void * p2, void * p3,
void * p4, void * p5, void * p6 );
struct IOExternalMethod {
IOService * object;
IOMethod func;
IOOptionBits flags;
IOByteCount count0;
IOByteCount count1;
};
struct IOExternalAsyncMethod {
IOService * object;
IOAsyncMethod func;
IOOptionBits flags;
IOByteCount count0;
IOByteCount count1;
};
struct IOExternalTrap {
IOService * object;
IOTrap func;
};
enum {
kIOUserNotifyMaxMessageSize = 64
};
#define kIOClientPrivilegeAdministrator "root"
#define kIOClientPrivilegeLocalUser "local"
#define kIOClientPrivilegeForeground "foreground"
enum {
kIOExternalMethodScalarInputCountMax = 16,
kIOExternalMethodScalarOutputCountMax = 16,
};
struct IOExternalMethodArguments
{
uint32_t version;
uint32_t selector;
mach_port_t asyncWakePort;
io_user_reference_t * asyncReference;
uint32_t asyncReferenceCount;
const uint64_t * scalarInput;
uint32_t scalarInputCount;
const void * structureInput;
uint32_t structureInputSize;
IOMemoryDescriptor * structureInputDescriptor;
uint64_t * scalarOutput;
uint32_t scalarOutputCount;
void * structureOutput;
uint32_t structureOutputSize;
IOMemoryDescriptor * structureOutputDescriptor;
uint32_t structureOutputDescriptorSize;
uint32_t __reserved[32];
};
typedef IOReturn (*IOExternalMethodAction)(OSObject * target, void * reference,
IOExternalMethodArguments * arguments);
struct IOExternalMethodDispatch
{
IOExternalMethodAction function;
uint32_t checkScalarInputCount;
uint32_t checkStructureInputSize;
uint32_t checkScalarOutputCount;
uint32_t checkStructureOutputSize;
};
enum {
#define IO_EXTERNAL_METHOD_ARGUMENTS_CURRENT_VERSION 1
kIOExternalMethodArgumentsCurrentVersion = IO_EXTERNAL_METHOD_ARGUMENTS_CURRENT_VERSION
};
class IOUserClient : public IOService
{
OSDeclareAbstractStructors(IOUserClient)
protected:
struct ExpansionData { };
ExpansionData * reserved;
#ifdef XNU_KERNEL_PRIVATE
public:
#else
private:
#endif
OSSet * mappings;
UInt8 sharedInstance;
UInt8 __reservedA[3];
void * __reserved[7];
public:
virtual IOReturn externalMethod( uint32_t selector, IOExternalMethodArguments * arguments,
IOExternalMethodDispatch * dispatch = 0, OSObject * target = 0, void * reference = 0 );
virtual IOReturn registerNotificationPort(
mach_port_t port, UInt32 type, io_user_reference_t refCon);
private:
#if __LP64__
OSMetaClassDeclareReservedUnused(IOUserClient, 0);
OSMetaClassDeclareReservedUnused(IOUserClient, 1);
#else
OSMetaClassDeclareReservedUsed(IOUserClient, 0);
OSMetaClassDeclareReservedUsed(IOUserClient, 1);
#endif
OSMetaClassDeclareReservedUnused(IOUserClient, 2);
OSMetaClassDeclareReservedUnused(IOUserClient, 3);
OSMetaClassDeclareReservedUnused(IOUserClient, 4);
OSMetaClassDeclareReservedUnused(IOUserClient, 5);
OSMetaClassDeclareReservedUnused(IOUserClient, 6);
OSMetaClassDeclareReservedUnused(IOUserClient, 7);
OSMetaClassDeclareReservedUnused(IOUserClient, 8);
OSMetaClassDeclareReservedUnused(IOUserClient, 9);
OSMetaClassDeclareReservedUnused(IOUserClient, 10);
OSMetaClassDeclareReservedUnused(IOUserClient, 11);
OSMetaClassDeclareReservedUnused(IOUserClient, 12);
OSMetaClassDeclareReservedUnused(IOUserClient, 13);
OSMetaClassDeclareReservedUnused(IOUserClient, 14);
OSMetaClassDeclareReservedUnused(IOUserClient, 15);
#ifdef XNU_KERNEL_PRIVATE
public:
static void initialize( void );
static void destroyUserReferences( OSObject * obj );
IOMemoryMap * mapClientMemory64( IOOptionBits type,
task_t task,
IOOptionBits mapFlags = kIOMapAnywhere,
mach_vm_address_t atAddress = 0 );
#endif
protected:
static IOReturn sendAsyncResult(OSAsyncReference reference,
IOReturn result, void *args[], UInt32 numArgs);
static void setAsyncReference(OSAsyncReference asyncRef,
mach_port_t wakePort,
void *callback, void *refcon);
static IOReturn sendAsyncResult64(OSAsyncReference64 reference,
IOReturn result, io_user_reference_t args[], UInt32 numArgs);
static void setAsyncReference64(OSAsyncReference64 asyncRef,
mach_port_t wakePort,
mach_vm_address_t callback, io_user_reference_t refcon);
public:
static IOReturn clientHasPrivilege( void * securityToken,
const char * privilegeName );
static IOReturn releaseAsyncReference64(OSAsyncReference64 reference);
static IOReturn releaseNotificationPort(mach_port_t port);
virtual bool init();
virtual bool init( OSDictionary * dictionary );
virtual bool initWithTask(
task_t owningTask, void * securityToken, UInt32 type,
OSDictionary * properties);
virtual bool initWithTask(
task_t owningTask, void * securityToken, UInt32 type);
virtual void free();
virtual IOReturn clientClose( void );
virtual IOReturn clientDied( void );
virtual IOService * getService( void );
virtual IOReturn registerNotificationPort(
mach_port_t port, UInt32 type, UInt32 refCon );
virtual IOReturn getNotificationSemaphore( UInt32 notification_type,
semaphore_t * semaphore );
virtual IOReturn connectClient( IOUserClient * client );
virtual IOReturn clientMemoryForType( UInt32 type,
IOOptionBits * options,
IOMemoryDescriptor ** memory );
#if !__LP64__
private:
APPLE_KEXT_COMPATIBILITY_VIRTUAL
IOMemoryMap * mapClientMemory( IOOptionBits type,
task_t task,
IOOptionBits mapFlags = kIOMapAnywhere,
IOVirtualAddress atAddress = 0 );
#endif
public:
IOMemoryMap * removeMappingForDescriptor(IOMemoryDescriptor * memory);
virtual IOReturn exportObjectToClient(task_t task,
OSObject *obj, io_object_t *clientObj);
virtual IOExternalMethod *
getExternalMethodForIndex( UInt32 index )
APPLE_KEXT_DEPRECATED;
virtual IOExternalAsyncMethod *
getExternalAsyncMethodForIndex( UInt32 index )
APPLE_KEXT_DEPRECATED;
virtual IOExternalMethod *
getTargetAndMethodForIndex( IOService ** targetP, UInt32 index );
virtual IOExternalAsyncMethod *
getAsyncTargetAndMethodForIndex( IOService ** targetP, UInt32 index );
virtual IOExternalTrap *
getExternalTrapForIndex( UInt32 index )
APPLE_KEXT_DEPRECATED;
virtual IOExternalTrap *
getTargetAndTrapForIndex( IOService **targetP, UInt32 index );
};
#endif