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