Created
February 17, 2022 15:24
-
-
Save saidelike/61654966f4bd7b5957278afce3c3a617 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
unsigned int __fastcall pjl_ldwelcomescreen_internal3( | |
int was_last_write_success, | |
int (__fastcall *pjl_getc)(unsigned __int8 *p_char), | |
ssize_t (__fastcall *write_to_file)(int *p_fd, char *data_to_write, size_t len_to_write), | |
int *p_fd) | |
{ | |
unsigned int current_char_2; // r5 | |
size_t len_to_write; // r4 | |
int len_end_data; // r11 | |
int has_encountered_at_sign; // r6 | |
unsigned int current_char_3; // r0 | |
int ret; // r0 | |
int current_char_1; // r3 | |
ssize_t len_written; // r0 | |
unsigned int ret_2; // r3 | |
ssize_t len_written_1; // r0 | |
unsigned int ret_3; // r3 | |
ssize_t len_written_2; // r0 | |
unsigned int ret_4; // r3 | |
int was_last_write_success_1; // r3 | |
size_t len_to_write_final; // r4 | |
ssize_t len_written_final; // r0 | |
unsigned int ret_5; // r3 | |
unsigned int ret_1; // [sp+0h] [bp-20h] | |
unsigned __int8 current_char; // [sp+1Fh] [bp-1h] BYREF | |
_BYTE data_to_write[1028]; // [sp+20h] [bp+0h] BYREF | |
current_char_2 = 0xFFFFFFFF; | |
ret_1 = 0; | |
b_restart_from_scratch: | |
len_to_write = 0; | |
memset(data_to_write, 0, 0x401u); | |
len_end_data = 0; | |
has_encountered_at_sign = 0; | |
current_char_3 = current_char_2; | |
while ( 1 ) | |
{ | |
current_char = 0; | |
if ( current_char_3 == 0xFFFFFFFF ) | |
{ | |
// get one character from pjl_ctx->pData | |
ret = pjl_getc(¤t_char); | |
current_char_1 = current_char; | |
} | |
else | |
{ | |
// a previous character was already retrieved, let's use that for now | |
current_char_1 = (unsigned __int8)current_char_3; | |
ret = 1; // success | |
current_char = current_char_1; | |
} | |
if ( has_encountered_at_sign ) | |
break; // exit the loop forever | |
// is it an '@' sign for a PJL-specific command? | |
if ( current_char_1 != '@' ) | |
goto b_read_pjl_data; | |
len_end_data = 1; | |
has_encountered_at_sign = 1; | |
b_handle_pjl_at_sign: | |
// from here, current_char == '@' | |
if ( len_to_write + 13 > 0x400 ) // ? | |
{ | |
if ( was_last_write_success ) | |
{ | |
len_written = write_to_file(p_fd, data_to_write, len_to_write); | |
was_last_write_success = len_to_write == len_written; | |
current_char_2 = '@'; | |
ret_2 = ret_1; | |
if ( len_to_write != len_written ) | |
ret_2 = 0xFFFFFFFF; | |
ret_1 = ret_2; | |
} | |
else | |
{ | |
current_char_2 = '@'; | |
} | |
goto b_restart_from_scratch; | |
} | |
b_read_pjl_data: | |
if ( ret == 0xFFFFFFFF ) // error | |
{ | |
if ( !was_last_write_success ) | |
return ret_1; | |
len_written_1 = write_to_file(p_fd, data_to_write, len_to_write); | |
ret_3 = ret_1; | |
if ( len_to_write != len_written_1 ) | |
return 0xFFFFFFFF; // error | |
return ret_3; | |
} | |
if ( len_to_write > 0x400 ) | |
__und(0); | |
// append data to stack buffer | |
data_to_write[len_to_write++] = current_char_1; | |
current_char_3 = 0xFFFFFFFF; // reset to enforce reading another character | |
// at next loop iteration | |
// reached 0x400 bytes to write, let's write them | |
if ( len_to_write == 0x400 ) | |
{ | |
current_char_2 = 0xFFFFFFFF; // reset to enforce reading another character | |
// at next loop iteration | |
if ( was_last_write_success ) | |
{ | |
len_written_2 = write_to_file(p_fd, data_to_write, 0x400); | |
ret_4 = ret_1; | |
if ( len_written_2 != 0x400 ) | |
ret_4 = 0xFFFFFFFF; | |
ret_1 = ret_4; | |
was_last_write_success_1 = was_last_write_success; | |
if ( len_written_2 != 0x400 ) | |
was_last_write_success_1 = 0; | |
was_last_write_success = was_last_write_success_1; | |
} | |
goto b_restart_from_scratch; | |
} | |
} // end of while ( 1 ) | |
// we reach here if we encountered an '@' sign | |
// let's check it is a valid "@PJL END DATA" footer | |
if ( (unsigned __int8)aPjlEndData[len_end_data] != current_char_1 ) | |
{ | |
len_end_data = 1; | |
has_encountered_at_sign = 0; // reset so we read it again? | |
goto b_read_data_or_at; | |
} | |
if ( len_end_data != 12 ) // len("PJL END DATA") = 12 | |
{ | |
++len_end_data; | |
b_read_data_or_at: | |
// will go back to the while(1) loop but exit at the next | |
// iteration due to "break" and has_encountered_at_sign == 1 | |
if ( current_char_1 != '@' ) | |
goto b_read_pjl_data; | |
goto b_handle_pjl_at_sign; | |
} | |
// we reach here if all "PJL END DATA" was parsed | |
current_char = 0; | |
pjl_getc(¤t_char); // read '\r' | |
if ( current_char == '\r' ) | |
pjl_getc(¤t_char); // read '\n' | |
// write all the remaining data (len < 0x400), except the "PJL END DATA" footer | |
len_to_write_final = len_to_write - 0xC; | |
if ( !was_last_write_success ) | |
return ret_1; | |
len_written_final = write_to_file(p_fd, data_to_write, len_to_write_final); | |
ret_5 = ret_1; | |
if ( len_to_write_final != len_written_final ) | |
return 0xFFFFFFFF; | |
return ret_5; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment