source: trunk/Cocoa/F-Script Anywhere/Source/SCPatch/SCPatchController/SCPatchController.h@ 284

Last change on this file since 284 was 231, checked in by rchin, 19 years ago

Updated FScript framework zip to current working version (pre-release). Also added code to better do upgrading of existing outdated fscript framework versions. Also better checking for procmod existence.

File size: 3.4 KB
Line 
1#pragma once
2#include <Carbon/Carbon.h>
3#include <list>
4
5using namespace std;
6
7#include "SCPatchPrivate.h"
8#include "SCPatchContext.h"
9#include "SCPatchRecord.h"
10#include "SCPatchMessenger.h"
11
12// Mac to Mach error morphing.
13#define err_mac err_system(0xf) /* Mac (Carbon) errors */
14#define mac_err(CODE) SCmac_err_FromOSErr((CODE))
15#define oserr(CODE) SCOSErrFrom_mac_err((CODE))
16mach_error_t SCmac_err_FromOSErr(OSErr err);
17OSErr SCOSErrFrom_mac_err(mach_error_t error);
18
19typedef OSErr (*SCPatchIterationProc)(ProcessSerialNumber *inPSN, OSType inCreator, UInt32 inFlags, void *data);
20
21class SCPatchController : public SCPatchMessenger
22{
23 public:
24
25 SCPatchController(void);
26 SCPatchController(CFStringRef bundleIdentifier);
27 ~SCPatchController(void);
28
29 // Use these to tell the controller where to find the patches
30 void AddPatch(CFStringRef patchBundleIdentifier,
31 CFStringRef subPath,
32 CFStringRef name);
33
34 // Inject the patches into running applications and start watching app launches
35 OSErr InstallPatches(void);
36
37 // Patch a single process (ignoring return value of ShouldPatchProcess)
38 mach_error_t PatchProcess(ProcessSerialNumber *psn);
39
40 // Overload these to customize patch loading and notification (note that
41 // UnpatchNotification is only called when the process dies, since the patches
42 // are not removable).
43 virtual Boolean ShouldPatchProcess(ProcessSerialNumber * /* inPSN */,
44 OSType /* inCreator */, OSType /* type */,
45 CFStringRef /* name */, UInt32 /* flags */) { return false; }
46 virtual void PatchNotification(ProcessSerialNumber * /* inPSN */,
47 OSType /* inCreator */, OSType /* type */,
48 CFStringRef /* name */, UInt32 /* flags */) {}
49 virtual void UnpatchNotification(ProcessSerialNumber * /* inPSN */,
50 OSType /* inCreator */, OSType /* type */,
51 CFStringRef /* name */, UInt32 /* flags */) {}
52
53 // You must also overload this method in SCPatchMessenger to receive messages.
54 // virtual void ReceiveMessage(const AppleEvent *theAE) = 0;
55
56 // Get info and keep tabs on patched processes
57 Boolean IsProcessPatched(ProcessSerialNumber *inPSN);
58 UInt32 GetPatchFlags(ProcessSerialNumber *inPSN);
59 void SetPatchFlags(ProcessSerialNumber *inPSN, UInt32 flags, UInt32 whichFlags);
60
61 // Loop through each patched process and execute a function. Note that this will
62 // not recognize patched processes until after you've called IsProcessPatched() on
63 // them or called InstallPatches() (which calls IsProcessPatched on every process).
64 OSErr ForEachPatchedProcess(SCPatchIterationProc proc, void *data);
65
66 private:
67 CFBundleRef mBundle;
68 CFStringRef mApplicationBundleIdentifier;
69
70 private:
71 list<SCPatchRecord> mPatchList;
72 SCPatchContextList mPatchContextList;
73
74
75 OSErr HandleMessage(const AppleEvent *theAE);
76 static pascal OSStatus ApplicationEventHandler(EventHandlerCallRef handlerRef,
77 EventRef event, void *userData);
78
79 mach_error_t InstallPatchesInProcess(ProcessSerialNumber *psn, bool onDemand=false);
80 OSErr AddPatchToParams(CFStringRef bundleID, CFURLRef url, SCPatchLoaderParams **params);
81 mach_error_t InjectPatches(ProcessSerialNumber *psn, SCPatchLoaderParams *params);
82 OSErr RecordPatchAndNotify(ProcessSerialNumber *psn, ProcessInfoRec *info);
83
84};
Note: See TracBrowser for help on using the repository browser.