1+ #include " stdafx.h"
2+ #include " Flash.h"
3+
4+
5+ /*
6+
7+ SD Card handling functions
8+
9+ */
10+
11+ int ChangeSDLock (LPCWSTR disk, BYTE* pin, int command) {
12+ if (pin == NULL )
13+ return false ;
14+ int result = 0xbad32 ;
15+
16+
17+ HANDLE hDevice = CreateFileW (disk,GENERIC_READ,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL ,OPEN_EXISTING,0 ,NULL );
18+ if (hDevice != INVALID_HANDLE_VALUE) {
19+ DWORD bytesReturned = 0 ;
20+ DWORD ioctlCode = (command == 0 ) ? 0x80032020 : 0x80032014 ;
21+
22+ result = DeviceIoControl (hDevice, ioctlCode, pin, 0x10 , NULL , 0 , &bytesReturned, NULL );
23+
24+ CloseHandle (hDevice);
25+ }
26+
27+ return result;
28+ }
29+
30+ int CheckMountStatus (WORD command) {
31+ HANDLE hDevice = INVALID_HANDLE_VALUE;
32+ BOOL success = FALSE ;
33+ DWORD result = 0xFFFFFFFF ;
34+ DWORD output = 0 ;
35+ DWORD bytesReturned = 0 ;
36+
37+ // Open device handle for SDC1: (SDC = SD Controller?)
38+ hDevice = CreateFileW (
39+ L" SDC1:" , // Device name
40+ GENERIC_READ | GENERIC_WRITE, // Read/write access
41+ 0 , // No sharing
42+ NULL , // No security attributes
43+ OPEN_EXISTING, // Open existing device
44+ 0 , // No special attributes
45+ NULL // No template file
46+ );
47+
48+ if (hDevice == INVALID_HANDLE_VALUE) {
49+ LogError (L" CheckMountStatus invalid handle" , command);
50+ return result; // Return 0xFFFFFFFF on failure
51+ }
52+
53+ // Send IOCTL command
54+ success = DeviceIoControl (
55+ hDevice, // Device handle
56+ 0x80032004 , // Custom IOCTL code
57+ &command, // Input buffer (16-bit command)
58+ sizeof (command), // Input buffer size
59+ &output, // Output buffer
60+ sizeof (output), // Output buffer size
61+ &bytesReturned, // Bytes returned
62+ NULL // No overlapped I/O
63+ );
64+
65+ LogError (L" CheckMountStatus" , output);
66+
67+ if (success) {
68+ // Process output: return inverted LSB
69+ result = (~output & 1 );
70+ }
71+
72+ LogError (L" CheckMountStatus result" , result);
73+
74+ // Clean up
75+ CloseHandle (hDevice);
76+ return result;
77+ }
78+
79+ /*
80+ This function signals the SD Card controller to initialise SD card slots.
81+ After inserting/removing a card, it is necessary to issue this command.
82+ */
83+ void InitSDCards ()
84+ {
85+ HANDLE hDevice = CreateFileW (L" SDC1:" ,
86+ GENERIC_READ | GENERIC_WRITE,
87+ 0 ,
88+ NULL ,
89+ OPEN_EXISTING,
90+ 0 ,
91+ NULL );
92+
93+ if (hDevice != INVALID_HANDLE_VALUE) {
94+ short index = 0 ;
95+ for (int i = 0 ; i < 2 ; ++i)
96+ {
97+ BOOL result = DeviceIoControl (hDevice,
98+ 0x80032004 ,
99+ &index,
100+ sizeof (index),
101+ NULL ,
102+ 0 ,
103+ NULL ,
104+ NULL );
105+ if (!result)
106+ break ;
107+
108+ index++;
109+ }
110+
111+ BYTE cmd = 0x11 ;
112+ DeviceIoControl (hDevice,
113+ 0x80032000 ,
114+ &cmd,
115+ sizeof (cmd),
116+ NULL ,
117+ 0 ,
118+ NULL ,
119+ NULL );
120+
121+ CloseHandle (hDevice);
122+ }
123+ }
124+
125+ void SDController_CMD17 () {
126+ HANDLE hDevice = CreateFileW (L" SDC1:" ,
127+ GENERIC_READ | GENERIC_WRITE,
128+ 0 ,
129+ NULL ,
130+ OPEN_EXISTING,
131+ 0 ,
132+ NULL );
133+
134+ if (hDevice != INVALID_HANDLE_VALUE) {
135+
136+ BYTE cmd = 0x11 ;
137+ BOOL cmdResult = DeviceIoControl (hDevice,
138+ 0x80032000 ,
139+ &cmd,
140+ sizeof (cmd),
141+ NULL ,
142+ 0 ,
143+ NULL ,
144+ NULL );
145+
146+ LogError (L" SDController_CMD0x11 result" , cmdResult);
147+ CloseHandle (hDevice);
148+ } else {
149+ LogError (L" SDController_CMD0x11, SDC1 handle is invalid" , (long )hDevice);
150+ }
151+ }
152+
153+
154+
155+ /*
156+
157+ NAND handling functions
158+
159+ */
160+
161+ int ReadSingleFlashBlock (int block, DWORD size, BYTE* output) {
162+ LogError (L" ReadSingleFlashBLK: Opening flash block" , block);
163+ LogError (L" ReadSingleFlashBLK: Reading size:" , size);
164+ HANDLE hFMD1 = CreateFileW (L" FMD1:" ,0xc0000000 ,0 ,0 ,0 ,0 ,0 );
165+ if ( hFMD1 != INVALID_HANDLE_VALUE ) {
166+ DWORD param[2 ] = { 5 , 0 };
167+ LogBufferContents (L" BFR: " , param, 4 );
168+ param[0 ] = block;
169+ LogBufferContents (L" AFTR: " , param, 4 );
170+ DWORD nRet = 0 ;
171+ if (DeviceIoControl (hFMD1,0x80112000 , param, 8 , &output, size, &nRet, 0 )) {
172+ if ( nRet == size ) {
173+ CloseHandle (hFMD1);
174+ return 0 ;
175+ }
176+ return 3 ;
177+ }
178+ return 2 ;
179+ }
180+ return 1 ;
181+ }
182+
183+ BOOL WriteProdDataToFile (int block, BYTE* prodData, DWORD dataSize) {
184+ WCHAR filePath[128 ];
185+ wsprintf (filePath, L" \\ SystemSD\\ %03dprod.bin" , block);
186+
187+ // Open or create the file
188+ HANDLE hFile = CreateFile (
189+ filePath,
190+ GENERIC_WRITE,
191+ 0 ,
192+ NULL ,
193+ CREATE_ALWAYS,
194+ FILE_ATTRIBUTE_NORMAL,
195+ NULL
196+ );
197+
198+ if (hFile == INVALID_HANDLE_VALUE) {
199+ DWORD error = GetLastError ();
200+ LogError (L" Failed to open prod.bin, Error code:" , error);
201+ return FALSE ;
202+ }
203+
204+ // Write prodData to the file
205+ DWORD bytesWritten = 0 ;
206+ BOOL success = WriteFile (
207+ hFile,
208+ prodData,
209+ dataSize,
210+ &bytesWritten,
211+ NULL
212+ );
213+
214+ if (!success || bytesWritten != dataSize) {
215+ // Handle write error
216+ DWORD error = GetLastError ();
217+ LogError (L" Failed to write prodbin. Error code: %d, Bytes written: %d\n " ,
218+ error);
219+ LogError (L" Bytes written:" , bytesWritten);
220+ CloseHandle (hFile);
221+ return FALSE ;
222+ }
223+
224+ CloseHandle (hFile);
225+
226+ LogError (L" Saved prodbin to \SystemSD\? ?prod.bin" , 0 );
227+ return TRUE ;
228+ }
229+
230+ int GetProdSection (CHAR* modelName, BYTE* productId, BYTE* serial, BYTE* pin) {
231+ if (modelName == NULL && serial == NULL && productId == NULL && pin == NULL ) {
232+ LogError (L" GetProd: invalid args!" , 3 );
233+ return 3 ;
234+ }
235+
236+ BYTE prodData[0x2D1 ];
237+ int flashBlockReadResult = ReadSingleFlashBlock (5 , 0x2D1 , (BYTE*)prodData);
238+ if (flashBlockReadResult != 0 ) {
239+ LogError (L" GetProd: Reading PROG from flash failed" , flashBlockReadResult);
240+ return 1 ;
241+ }
242+
243+ if (productId != NULL )
244+ memcpy (productId, ((BYTE*)prodData) + 0x18 , 4 );
245+
246+ if (modelName != NULL )
247+ memcpy (modelName, ((BYTE*)prodData) + 0x38 , 8 );
248+
249+ if (serial != NULL )
250+ memcpy (serial, ((BYTE*)prodData) + 0x48 , 4 );
251+
252+ if (pin != NULL )
253+ memcpy (pin, ((BYTE*)prodData) + 0x58 , 4 );
254+
255+ return 0 ;
256+ }
257+
258+ int ReadFullSDPin (BYTE* pin) {
259+ if (pin == NULL ) {
260+ LogError (L" ReadFullPin: invalid arg!" , 3 );
261+ return 3 ;
262+ }
263+ BYTE prodData[0x2D1 ];
264+ int flashBlockReadResult = ReadSingleFlashBlock (5 , 0x2D1 , (BYTE*)prodData);
265+ if (flashBlockReadResult != 0 ) {
266+ LogError (L" GetProd: Reading PROG from flash failed" , flashBlockReadResult);
267+ return 1 ;
268+ }
269+
270+ memcpy (pin, ((BYTE*)prodData) + 0xf8 , 0x10 );
271+ return 0 ;
272+ }
0 commit comments