-
Notifications
You must be signed in to change notification settings - Fork 40
/
logKext_UC.cpp
107 lines (79 loc) · 2.69 KB
/
logKext_UC.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
/*
logKext_UC.cpp
logKext
Copyright 2007 Braden Thomas
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
#include "logKext.h"
#define super IOUserClient
OSDefineMetaClassAndStructors( logKextUserClient, IOUserClient );
bool logKextUserClient::initWithTask( task_t owningTask,
void * securityID,
UInt32 type,
OSDictionary * properties )
{
if (clientHasPrivilege(owningTask, kIOClientPrivilegeAdministrator)!=kIOReturnSuccess)
{
IOLog( "logKextUserClient::Error: unprivileged task attempted to init\n");
return false;
}
#ifdef LK_DEBUG
IOLog("logKextUserClient::initWithTask(type %ld)\n", type);
#endif
if (!super::initWithTask(owningTask, securityID, type))
return false;
if (!owningTask)
return false;
fTask = owningTask; // remember who instantiated us
fProvider = NULL;
return true;
}
bool logKextUserClient::start( IOService* provider )
{
#ifdef LK_DEBUG
IOLog( "logKextUserClient::start\n" );
#endif
if( !super::start( provider ) )
return false;
// see if it's the correct class and remember it at the same time
fProvider = OSDynamicCast( com_fsb_iokit_logKext, provider );
if( !fProvider )
return false;
fProvider->activate(); // call activate on kext to hook keyboards
return true;
}
void logKextUserClient::stop( IOService* provider )
{
#ifdef LK_DEBUG
IOLog( "logKextUserClient::stop\n" );
#endif
super::stop( provider );
}
IOReturn logKextUserClient::clientClose( void )
{
#ifdef LK_DEBUG
IOLog( "logKextUserClient::clientClose\n" );
#endif
fProvider->deactivate(); // call deactivate on kext to unhook keyboards
fTask = NULL;
fProvider = NULL;
terminate();
return kIOReturnSuccess;
}
IOExternalMethod* logKextUserClient::getTargetAndMethodForIndex(IOService** targetP, UInt32 index )
{
*targetP = fProvider; // driver is target of all our external methods
// validate index and return the appropriate IOExternalMethod
if( index < kNumlogKextMethods )
return (IOExternalMethod*) &externalMethods[index];
else
return NULL;
}