1 | /*␊ |
2 | * RamDiskLoader.c␊ |
3 | * Chameleon␊ |
4 | *␊ |
5 | * Created by cparm on 05/12/10. <armelcadetpetit@gmail.com>␊ |
6 | * Copyright 2010,2012. All rights reserved.␊ |
7 | *␊ |
8 | */␊ |
9 | ␊ |
10 | #include "libsaio.h"␊ |
11 | #include "bootstruct.h"␊ |
12 | #include "modules.h"␊ |
13 | #include "ramdisk.h"␊ |
14 | #include "drivers.h"␊ |
15 | #include "disk.h"␊ |
16 | ␊ |
17 | ␊ |
18 | void loadPrebootRAMDisk_hook(void* arg1, void* arg2, void* arg3, void* arg4, void* arg5, void* arg6);␊ |
19 | void md0Ramdisk_hook(void* arg1, void* arg2, void* arg3, void* arg4, void* arg5, void* arg6);␊ |
20 | void processRAMDiskCommand_hook(void* arg1, void* arg2, void* arg3, void* arg4, void* arg5, void* arg6);␊ |
21 | void ramDiskLoadDrivers_hook(void* arg1, void* arg2, void* arg3, void* arg4, void* arg5, void* arg6);␊ |
22 | void newRamDisk_BVR_hook(void* arg1, void* arg2, void* arg3, void* arg4, void* arg5, void* arg6);␊ |
23 | void p_get_ramdisk_info_hook(void* arg1, void* arg2, void* arg3, void* arg4, void* arg5, void* arg6);␊ |
24 | void p_ramdiskReadBytes_hook(void* arg1, void* arg2, void* arg3, void* arg4, void* arg5, void* arg6);␊ |
25 | void is_Ram_Disk_Registred_Hook(void* arg1, void* arg2, void* arg3, void* arg4, void* arg5, void* arg6);␊ |
26 | ␊ |
27 | ␊ |
28 | enum {␊ |
29 | ␉kPseudoBIOSDevRAMDisk = 0x100,␊ |
30 | ␉kPseudoBIOSDevBooter = 0x101␊ |
31 | };␊ |
32 | ␊ |
33 | void loadPrebootRAMDisk_hook(void* arg1, void* arg2, void* arg3, void* arg4, void* arg5, void* arg6)␊ |
34 | {␊ |
35 | ␉loadPrebootRAMDisk();␉␊ |
36 | }␊ |
37 | ␊ |
38 | void md0Ramdisk_hook(void* arg1, void* arg2, void* arg3, void* arg4, void* arg5, void* arg6)␊ |
39 | {␊ |
40 | ␉md0Ramdisk();␉␊ |
41 | }␊ |
42 | ␊ |
43 | void processRAMDiskCommand_hook(void* arg1, void* arg2, void* arg3, void* arg4, void* arg5, void* arg6)␊ |
44 | {␊ |
45 | ␉char * argPtr = (char *)arg1;␊ |
46 | ␉const char*bp = (const char *)arg2;␊ |
47 | ␉processRAMDiskCommand(&argPtr, bp);␊ |
48 | }␊ |
49 | ␊ |
50 | void ramDiskLoadDrivers_hook(void* arg1, void* arg2, void* arg3, void* arg4, void* arg5, void* arg6)␊ |
51 | {␊ |
52 | ␉char dirSpecExtra[1024];␊ |
53 | ␉int step = *(int*)arg1;␉␊ |
54 | ␉switch (step) {␊ |
55 | ␉␉case 0:␊ |
56 | ␉␉␉if (LoadExtraDrivers_p != NULL)␊ |
57 | ␉␉␉{␊ |
58 | ␉␉␉␉(*LoadExtraDrivers_p)(&FileLoadDrivers);␊ |
59 | ␉␉␉}␊ |
60 | ␉␉␉break;␊ |
61 | ␉␉case 1:␊ |
62 | ␉␉␉// First try a specfic OS version folder ie 10.5␊ |
63 | ␉␉␉sprintf(dirSpecExtra, "rd(0,0)/Extra/%s/", (char*)gBootVolume->OSVersion);␊ |
64 | ␉␉␉if (FileLoadDrivers(dirSpecExtra, 0) != 0)␊ |
65 | ␉␉␉{␉␊ |
66 | ␉␉␉␉// Next we'll try the base␊ |
67 | ␉␉␉␉strcpy(dirSpecExtra, "rd(0,0)/Extra/");␊ |
68 | ␉␉␉␉FileLoadDrivers(dirSpecExtra, 0);␊ |
69 | ␉␉␉}␊ |
70 | ␉␉␉break;␊ |
71 | ␉␉case 2:␊ |
72 | ␉␉␉// First try a specfic OS version folder ie 10.5␊ |
73 | ␉␉␉sprintf(dirSpecExtra, "bt(0,0)/Extra/%s/", (char*)gBootVolume->OSVersion);␊ |
74 | ␉␉␉if (FileLoadDrivers(dirSpecExtra, 0) != 0)␊ |
75 | ␉␉␉{␉␊ |
76 | ␉␉␉␉// Next we'll try the base␊ |
77 | ␉␉␉␉strcpy(dirSpecExtra, "bt(0,0)/Extra/");␊ |
78 | ␉␉␉␉FileLoadDrivers(dirSpecExtra, 0);␊ |
79 | ␉␉␉}␊ |
80 | ␉␉␉break;␊ |
81 | ␉␉default:␊ |
82 | ␉␉␉break;␊ |
83 | ␉}␉␊ |
84 | }␊ |
85 | ␊ |
86 | void newRamDisk_BVR_hook(void* arg1, void* arg2, void* arg3, void* arg4, void* arg5, void* arg6)␊ |
87 | {␊ |
88 | ␉int biosdev = *(int*)arg1;␊ |
89 | ␉BVRef *bvr1 = (BVRef*)arg2;␊ |
90 | ␉if (biosdev == kPseudoBIOSDevRAMDisk)␊ |
91 | ␉{␉␉␊ |
92 | ␉␉if (gRAMDiskVolume)␊ |
93 | ␉␉ *bvr1 = gRAMDiskVolume;␊ |
94 | ␉} ␊ |
95 | ␉else if (biosdev == kPseudoBIOSDevBooter)␊ |
96 | ␉{␊ |
97 | ␉␉if (gRAMDiskVolume != NULL && gRAMDiskBTAliased)␊ |
98 | ␉␉␉*bvr1 = gRAMDiskVolume;␊ |
99 | ␉}␊ |
100 | }␊ |
101 | ␊ |
102 | void p_get_ramdisk_info_hook(void* arg1, void* arg2, void* arg3, void* arg4, void* arg5, void* arg6)␊ |
103 | {␊ |
104 | ␉int cc;␊ |
105 | ␉int biosdev = *(int *)arg1;␊ |
106 | ␉struct driveInfo *dip = (struct driveInfo *)arg2;␉␊ |
107 | ␉int *ret = (int *)arg3;␊ |
108 | ␉if(p_get_ramdisk_info != NULL)␊ |
109 | ␉␉cc = (*p_get_ramdisk_info)(biosdev, dip);␊ |
110 | ␉else␊ |
111 | ␉␉cc = -1;␊ |
112 | ␉if(cc < 0)␊ |
113 | ␉{␊ |
114 | ␉␉dip->valid = 0;␊ |
115 | ␉␉*ret = -1;␊ |
116 | ␉}␉␊ |
117 | }␊ |
118 | ␊ |
119 | void p_ramdiskReadBytes_hook(void* arg1, void* arg2, void* arg3, void* arg4, void* arg5, void* arg6)␊ |
120 | {␉␊ |
121 | ␉int biosdev␉␉␉␉␉= *(int*)arg1;␊ |
122 | ␉unsigned long long blkno␉= *(unsigned long long*)arg2;␊ |
123 | ␉unsigned int byteoff␉␉= *(unsigned int*)arg3;␊ |
124 | ␉unsigned int byteCount␉␉= *(unsigned int*)arg4;␊ |
125 | ␉void * buffer␉␉␉␉= (void*)arg5;␊ |
126 | ␉int *ret␉␉␉␉␉= (int*)arg6;␊ |
127 | ␉␊ |
128 | ␉if(p_ramdiskReadBytes != NULL && biosdev >= 0x100)␊ |
129 | *ret = (*p_ramdiskReadBytes)(biosdev, blkno, byteoff, byteCount, buffer);␉␊ |
130 | }␊ |
131 | ␊ |
132 | void is_Ram_Disk_Registred_Hook(void* arg1, void* arg2, void* arg3, void* arg4, void* arg5, void* arg6){}␊ |
133 | ␊ |
134 | void RamDiskLoader_start(void);␊ |
135 | void RamDiskLoader_start(void)␊ |
136 | {␊ |
137 | register_hook_callback("loadPrebootRAMDisk", &loadPrebootRAMDisk_hook);␊ |
138 | register_hook_callback("md0Ramdisk", &md0Ramdisk_hook);␊ |
139 | register_hook_callback("processRAMDiskCommand", &processRAMDiskCommand_hook);␊ |
140 | register_hook_callback("ramDiskLoadDrivers", &ramDiskLoadDrivers_hook);␉␊ |
141 | register_hook_callback("newRamDisk_BVR", &newRamDisk_BVR_hook);␊ |
142 | register_hook_callback("p_get_ramdisk_info", &p_get_ramdisk_info_hook);␊ |
143 | register_hook_callback("p_ramdiskReadBytes", &p_ramdiskReadBytes_hook);␊ |
144 | register_hook_callback("isRamDiskRegistred", &is_Ram_Disk_Registred_Hook);␊ |
145 | ␊ |
146 | } |