45 lines
1.2 KiB
Python
45 lines
1.2 KiB
Python
|
__all__ = ['inject', 'signature']
|
||
|
|
||
|
import os
|
||
|
import sys
|
||
|
|
||
|
def _ensure_path(p):
|
||
|
p = os.path.realpath(p)
|
||
|
if isinstance(p, unicode):
|
||
|
p = p.encode(sys.getfilesystemencoding())
|
||
|
return p
|
||
|
|
||
|
def inject(pid, bundle, useMainThread=True):
|
||
|
"""Loads the given MH_BUNDLE in the target process identified by pid"""
|
||
|
try:
|
||
|
from _objc import _inject
|
||
|
from _dyld import dyld_find
|
||
|
except ImportError:
|
||
|
raise NotImplementedError("objc.inject is only supported on Mac OS X 10.3 and later")
|
||
|
bundlePath = bundle
|
||
|
systemPath = dyld_find('/usr/lib/libSystem.dylib')
|
||
|
carbonPath = dyld_find('/System/Library/Frameworks/Carbon.framework/Carbon')
|
||
|
paths = map(_ensure_path, (bundlePath, systemPath, carbonPath))
|
||
|
return _inject(
|
||
|
pid,
|
||
|
useMainThread,
|
||
|
*paths
|
||
|
)
|
||
|
|
||
|
def signature(signature, **kw):
|
||
|
"""
|
||
|
A Python method decorator that allows easy specification
|
||
|
of Objective-C selectors.
|
||
|
|
||
|
Usage::
|
||
|
|
||
|
@objc.signature('i@:if')
|
||
|
def methodWithX_andY_(self, x, y):
|
||
|
return 0
|
||
|
"""
|
||
|
from _objc import selector
|
||
|
kw['signature'] = signature
|
||
|
def makeSignature(func):
|
||
|
return selector(func, **kw)
|
||
|
return makeSignature
|