Skip to content

Instantly share code, notes, and snippets.

@OneCDOnly
Created February 27, 2025 05:02
Show Gist options
  • Save OneCDOnly/3fcc1fb6e5a5420f28e20877cd82480c to your computer and use it in GitHub Desktop.
Save OneCDOnly/3fcc1fb6e5a5420f28e20877cd82480c to your computer and use it in GitHub Desktop.
decompiled libuLinux_Util.so.0.0
/* This file was generated by the Hex-Rays decompiler version 8.4.0.240320.
Copyright (c) 2007-2021 Hex-Rays <[email protected]>
Detected compiler: GNU C++
*/
#include <defs.h>
#include <stdarg.h>
//-------------------------------------------------------------------------
// Function declarations
void (__fastcall *init_proc())();
void sub_9B40();
__int64 __fastcall _str_to_hex(const char *, __int64, int);
__int64 __fastcall Get_QPKG_Encrypt_String(_QWORD, _QWORD); // weak
// __int64 __fastcall SE_Set_Buzzer(_QWORD, _QWORD); weak
// __int64 Is_x59_ProII(void); weak
// int chmod(const char *file, __mode_t mode);
// __int64 __fastcall Enable_Autorun(_QWORD); weak
// int chdir(const char *path);
char *__fastcall get_string_until_ch(__int64, char, char *, int);
// int dup2(int fd, int fd2);
// int printf(const char *format, ...);
// __int64 __fastcall EVP_DigestInit(_QWORD, _QWORD); weak
char *__fastcall combine_string(const char *, const char *);
size_t __fastcall GetPrivateProfileStringNoLock(const char *, const char *, const char *, char *, int, const char *);
__int64 __fastcall Is_Mb_Word_By_Codepage(_BYTE *, int);
__int64 __fastcall iface_get_hwaddr(const char *, char *, int);
// void *memset(void *s, int c, size_t n);
// __int64 ftell(FILE *stream);
// __int64 __fastcall Blk_Dev_Write_Flash(_QWORD, _QWORD); weak
__int64 __fastcall Get_Sys_HWtype(_DWORD *);
// struct group *getgrnam(const char *name);
// int snprintf(char *s, size_t maxlen, const char *format, ...);
// __pid_t setsid(void);
// __int64 Is_x59_Plus(void); weak
// __int64 __fastcall Blk_Dev_Read_Flash(_QWORD, _QWORD, _QWORD); weak
__int64 __fastcall Get_All_QPKG_Info(void **);
__int64 __fastcall NAS_File_Lock(_QWORD, _QWORD); // weak
// int inet_pton(int af, const char *cp, void *buf);
// __int64 __fastcall Ini_Conf_Write_Lock_File_Timeout(_QWORD, _QWORD); weak
// int close(int fd);
__int64 __fastcall NAS_File_Unlock(_QWORD); // weak
// int utime(const char *file, const struct utimbuf *file_times);
// int ioctl(int fd, unsigned __int64 request, ...);
size_t __fastcall GetPrivateProfileString(__int64, __int64, const char *, char *, signed int, __int64);
// int shmdt(const void *shmaddr);
int *__fastcall qnap_auto_close_fd(int *);
_BOOL8 __fastcall Conf_Dir_Get_Bool(__int64, const char *, const char *, int, _BOOL4 *);
__int64 __fastcall mb_strcmp_ex(_QWORD, _QWORD, _QWORD); // weak
// __int64 __gmon_start__(void); weak
// int puts(const char *s);
// int fseek(FILE *stream, __int64 off, int whence);
// int toupper(int c);
// int execvp(const char *file, char *const argv[]);
// void __noreturn exit(int status);
// __int64 EVP_sha256(void); weak
int init_debugger();
// void __noreturn __assert_fail(const char *assertion, const char *file, unsigned int line, const char *function);
// __int64 EVP_CIPHER_CTX_new(void); weak
__int64 __fastcall Base64_Decode(_QWORD, _QWORD); // weak
_BYTE *__fastcall local_skip_white_space(_BYTE *);
// int strcasecmp(const char *s1, const char *s2);
// int gettimeofday(struct timeval *tv, __timezone_ptr_t tz);
void err_lock();
void __fastcall Conf_Dir_Free(__int64);
char *__fastcall Password_Encode(const char *, int, int);
_BOOL8 __fastcall is_commented_string(__int64);
// __int64 __fastcall Ini_Conf_Remove_Section_Compatible(_QWORD, _QWORD); weak
FILE *qnap_popen(char *, const char *, ...);
const char *__fastcall Conf_Dir_Get_Str(__int64, const char *, const char *, const char *, char *, int);
// ssize_t read(int fd, void *buf, size_t nbytes);
_BOOL8 __fastcall Set_Private_Profile_String(__int64, __int64, __int64, __int64);
// int strncmp(const char *s1, const char *s2, size_t n);
// void *malloc(size_t size);
// int regexec(const regex_t *preg, const char *string, size_t nmatch, regmatch_t pmatch[], int eflags);
// int system(const char *command);
__int64 __fastcall Get_All_QFIX_Info(void **);
// int unlink(const char *name);
__int64 __fastcall QNAP_Digest_MD5(_QWORD, _QWORD, _QWORD, _QWORD); // weak
// void __noreturn _exit(int status);
// int semget(key_t key, int nsems, int semflg);
__int64 __fastcall Conf_Dir_Set_Int(__int64, const char *, const char *, unsigned int);
// void *dlsym(void *handle, const char *name);
__int64 __fastcall Set_Device_SUID(_QWORD); // weak
__int64 __fastcall getQPKGDisplayNameIndex(const char *);
__int64 __fastcall Get_QPKG_Auth_Encrypt_String(_QWORD, _QWORD); // weak
// void srandom(unsigned int seed);
// __pid_t getpid(void);
// int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
// __int64 __fastcall naslog_event_add(_QWORD); weak
__int64 __fastcall is_pid_alive(unsigned int);
__int64 __fastcall Set_Device_CUID(_QWORD); // weak
// char *fgets(char *s, int n, FILE *stream);
// __int64 __fastcall EVP_CIPHER_CTX_free(_QWORD); weak
__int64 __fastcall _conf_set_field_err(_QWORD, _QWORD, _QWORD, _QWORD); // weak
size_t __fastcall GetProfileString(__int64, __int64, const char *, char *, signed int);
// struct passwd *getpwuid(__uid_t uid);
// int ioperm(unsigned __int64 from, unsigned __int64 num, int turn_on);
// double atof(const char *nptr);
int __fastcall uart_update_firmware_to_mcu(int, __int64, unsigned int);
_BOOL8 __fastcall Set_Profile_Boolean(__int64, __int64, int);
FILE **finish_debugger();
// key_t ftok(const char *pathname, int proj_id);
_BOOL8 __fastcall Is_Sound_Card_Playback_Running(unsigned int);
__int64 __fastcall find_char_in_string(__int64, char);
// int fputc(int c, FILE *stream);
_BOOL8 __fastcall WritePrivateProfileString(__int64, __int64, __int64, __int64);
__int64 __fastcall Get_QNAPFlag_File_Info(const char *, char *);
// void free(void *ptr);
// size_t strlen(const char *s);
__int64 __fastcall QNAP_Version_Compare(_QWORD, _QWORD); // weak
__int64 __fastcall qnap_pclose(_QWORD); // weak
// int ferror(FILE *stream);
// DIR *opendir(const char *name);
// int pclose(FILE *stream);
_BOOL8 __fastcall is_korea_word(_BYTE *);
__int64 __fastcall Is_Mb_Word(_BYTE *);
// int mkstemp64(char *template);
// const unsigned __int16 **__ctype_b_loc(void);
// int __fastcall __cxa_finalize(void *);
__int64 __fastcall is_black_str(__int64);
// int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
// char *realpath(const char *name, char *resolved);
__int64 __fastcall Close_File(__int64, __int64, FILE *);
// __int64 __fastcall EVP_DecryptFinal_ex(_QWORD, _QWORD, _QWORD); weak
// int msgctl(int msqid, int cmd, struct msqid_ds *buf);
__int64 __fastcall Base64_Encode(_QWORD, _QWORD, _QWORD); // weak
// __int64 __fastcall __tls_get_addr(_QWORD); weak
// int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
// int sprintf(char *s, const char *format, ...);
_BOOL8 __fastcall is_jis_word(_BYTE *);
__int64 __fastcall stripe_white_space_tail(_QWORD); // weak
// int readdir64_r(DIR *dirp, struct dirent64 *entry, struct dirent64 **result);
// FILE *fdopen(int fd, const char *modes);
char *__fastcall Password_Decode(const char *, int);
// char *strrchr(const char *s, int c);
__int64 __fastcall Conf_Dir_Add_Sec(__int64, const char *);
// __int64 syscall(__int64 sysno, ...);
// int statfs64(const char *file, struct statfs64 *buf);
// __int64 atol(const char *nptr);
__int64 __fastcall get_section_name(__int64, char *, int);
size_t __fastcall Get_Profile_String(__int64, __int64, const char *, char *, signed int);
// int sscanf(const char *s, const char *format, ...);
// char *strtok_r(char *s, const char *delim, char **save_ptr);
// int pipe(int pipedes[2]);
// unsigned int sleep(unsigned int seconds);
__int64 __fastcall Open_File(const char *, int, FILE **);
__int64 __fastcall Get_Str_By_Offset(const char *, __off64_t, int, char *);
__int64 get_hw_type(void); // weak
// __int64 __fastcall Ini_Conf_Unlock_File(_QWORD); weak
// __int64 __fastcall GPIO_Enable_USB_LED_BLINK(_QWORD, _QWORD); weak
// int usleep(__useconds_t useconds);
// int open64(const char *file, int oflag, ...);
__int64 __fastcall SHM_Set_Field(_QWORD, _QWORD, _QWORD); // weak
// char *strstr(const char *haystack, const char *needle);
// int socketpair(int domain, int type, int protocol, int fds[2]);
// __int64 EVP_aes_256_cbc(void); weak
__int64 __fastcall Pic_Send_Read_EEPROM(char, unsigned __int8, __int64);
// void rewind(FILE *stream);
// char *strcat(char *dest, const char *src);
// int scandir64(const char *dir, struct dirent64 ***namelist, int (*selector)(const struct dirent64 *), int (*cmp)(const struct dirent64 **, const struct dirent64 **));
__int64 __fastcall Pic_Send_Raw_Cmd(unsigned int);
__int64 __fastcall SendNoticeToLogEngine_V2(int, unsigned int, unsigned int, const char *, int, const char *, int, int, int, const char *, const char *, const char *, const char *, int, const char *, const char *, const char *, const char *, const char *);
// __int64 __fastcall Get_CPU_Model(_QWORD, _QWORD, _QWORD); weak
__int64 __fastcall Conf_Set_Field(__int64, __int64, __int64, __int64);
__int64 __fastcall shm_do_storage(const char *, char *, int, char *, int);
__int64 __fastcall Set_Buzzer_Status(_QWORD); // weak
// int fputs(const char *s, FILE *stream);
// __int64 strtol(const char *nptr, char **endptr, int base);
__int64 __fastcall Get_One_QPKG_Info_Dir(_QWORD, _QWORD, _QWORD); // weak
// int glob64(const char *pattern, int flags, int (*errfunc)(const char *, int), glob64_t *pglob);
// ssize_t readlink(const char *path, char *buf, size_t len);
__int64 check_nas_config(void); // weak
// int atoi(const char *nptr);
__int64 __fastcall Is_File_Exist(_QWORD); // weak
__int64 __fastcall qnap_sort_compare(_QWORD, _QWORD, _QWORD, _QWORD); // weak
// __int64 __fastcall EVP_DecryptInit_ex(_QWORD, _QWORD, _QWORD, _QWORD, _QWORD); weak
_BOOL8 __fastcall WriteProfileString(__int64, __int64, __int64);
__int64 __fastcall Conf_Dir_Wirte_File(_QWORD); // weak
// int regcomp(regex_t *preg, const char *pattern, int cflags);
__int64 __fastcall Get_Flash_Config(__int64, unsigned int, __int64);
// __int64 __fastcall EVP_CIPHER_CTX_set_padding(_QWORD, _QWORD); weak
_BOOL8 __fastcall is_sc_word(_BYTE *);
__int64 __fastcall uart_start_row(int, char);
_BOOL8 __fastcall string_ended_with_EOL(const char *);
__int64 __fastcall Get_Device_SUID(_QWORD, _QWORD); // weak
char *__fastcall skip_to_EOL(FILE *);
_BOOL8 _is_ram_almost_full();
const char *__fastcall get_filename(const char *);
// void *memmove(void *dest, const void *src, size_t n);
__int64 __fastcall Conf_Dir_Set_Str(__int64, const char *, const char *, const char *);
// char *strchr(const char *s, int c);
// int __lxstat64(int ver, const char *filename, struct stat64 *stat_buf);
// __pid_t waitpid(__pid_t pid, int *stat_loc, int options);
__int64 __fastcall skip_white_space(_QWORD); // weak
__int64 __fastcall shm_do_misc(const char *, char *, int, char *, int);
__int64 __fastcall iface_set_hwaddr(const char *, __int64, __int64);
// int vsnprintf(char *s, size_t maxlen, const char *format, __gnuc_va_list arg);
// size_t fread(void *ptr, size_t size, size_t n, FILE *stream);
// __int64 __fastcall EVP_MD_CTX_free(_QWORD, _QWORD, _QWORD); weak
// char *getenv(const char *name);
__int64 __fastcall Get_Mac_Address(char *, int);
__int64 __fastcall _conf_remove_section_err(const char *, const char *);
__int64 __fastcall mb_strcmp(_QWORD, _QWORD); // weak
// int *__errno_location(void);
_BOOL8 __fastcall Set_Profile_String(__int64, __int64, __int64);
// __int64 Get_System_Codepage(void); weak
// char *strdup(const char *s);
_BOOL8 __fastcall Is_QPKG_Installed(__int64);
__int64 __fastcall Get_String_Field(__int64, int, char, char *, int);
char *__fastcall Conf_Dir_Load(const char *);
// int strncasecmp(const char *s1, const char *s2, size_t n);
__int64 __fastcall AES_QTS_Encrypt(__int64, int, void *, const char *, int);
__int64 __fastcall qnap_sort_open(_QWORD); // weak
__int64 __fastcall Conf_Get_Field(__int64, __int64, __int64, __int64, unsigned int);
// int asprintf(char **ptr, const char *fmt, ...);
// struct passwd *fgetpwent(FILE *stream);
__int64 __fastcall Set_Flash_Config(__int64, __int64);
// int strcmp(const char *s1, const char *s2);
// int tolower(int c);
// __int64 __fastcall Ini_Conf_Set_Field_Compatible(_QWORD, _QWORD, _QWORD, _QWORD); weak
// __ssize_t getline(char **lineptr, size_t *n, FILE *stream);
__int64 __fastcall strip_EOL(const char *);
// __int64 __fastcall EVP_DigestFinal(_QWORD, _QWORD, _QWORD); weak
// char *strcpy(char *dest, const char *src);
__int64 qnap_sort_get_locale_of_display_language(void); // weak
// char *strtok(char *s, const char *delim);
__int64 __fastcall Conf_Dir_Get_Int(__int64, const char *, const char *, unsigned int, unsigned int *);
// __int64 __fastcall Ini_Conf_Get_Field_Compatible(_QWORD, _QWORD, _QWORD, _QWORD, _QWORD); weak
// __int64 __fastcall EVP_DecryptUpdate(_QWORD, _QWORD, _QWORD, _QWORD, _QWORD); weak
// __uid_t getuid(void);
size_t __fastcall Get_Private_Profile_String(__int64, __int64, const char *, char *, signed int, __int64);
__int64 __fastcall Get_Serial_Number(char *, int);
// __int64 __fastcall EVP_EncryptFinal_ex(_QWORD, _QWORD, _QWORD); weak
// void regfree(regex_t *preg);
// int memcmp(const void *s1, const void *s2, size_t n);
// void *calloc(size_t nmemb, size_t size);
__int64 __fastcall Conf_Dir_Add(__int64, const char *, const char *, const char *);
// int shmget(key_t key, size_t size, int shmflg);
// int feof(FILE *stream);
// int fclose(FILE *stream);
__int64 __fastcall shm_do_system(const char *, char *, int, char *, int);
__int64 __fastcall Pic_Send_Write_EEPROM(char, unsigned __int8, __int64);
// __int64 __fastcall EVP_EncryptInit_ex(_QWORD, _QWORD, _QWORD, _QWORD, _QWORD); weak
// __int64 random(void);
// char *strncpy(char *dest, const char *src, size_t n);
// int semop(int semid, struct sembuf *sops, size_t nsops);
// int __xstat64(int ver, const char *filename, struct stat64 *stat_buf);
// int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
// __off64_t lseek64(int fd, __off64_t offset, int whence);
// __int64 __fastcall Ini_Conf_Remove_Field_Compatible(_QWORD, _QWORD, _QWORD); weak
_BOOL8 __fastcall Is_QNAPFlag_Exist(const char *, const char *);
_BOOL8 __fastcall is_tc_word(_BYTE *);
__int64 __fastcall Conf_Dir_Remove(__int64, const char *, const char *);
// int msgget(key_t key, int msgflg);
__int64 __fastcall uart_prog_8byte(int, char, char *);
// int closedir(DIR *dirp);
// __int64 __fastcall EVP_EncryptUpdate(_QWORD, _QWORD, _QWORD, _QWORD, _QWORD); weak
// __pid_t fork(void);
// __int64 EVP_MD_CTX_new(void); weak
char *__fastcall Get_Random_Digit_String(int);
// FILE *fopen64(const char *filename, const char *modes);
// __int64 strtoll(const char *nptr, char **endptr, int base);
// size_t fwrite(const void *ptr, size_t size, size_t n, FILE *s);
// int pthread_mutex_lock(pthread_mutex_t *mutex);
// void *realloc(void *ptr, size_t size);
// __int64 EVP_md5(void); weak
_BOOL8 __fastcall Set_Profile_Integer(__int64, __int64, unsigned int);
_BOOL8 __fastcall is_pic_raw_running(unsigned int *);
// void perror(const char *s);
// int rand(void);
// int shmctl(int shmid, int cmd, struct shmid_ds *buf);
// __int64 QFAN_Is_Enable(void); weak
__int64 __fastcall local_conf_get_field(const char *, const char *, const char *, char *, int);
__int64 __fastcall Is_SUID_ENC_SALT_V2(const char *);
// int fprintf(FILE *stream, const char *format, ...);
// struct tm *localtime(const time_t *timer);
// ssize_t write(int fd, const void *buf, size_t n);
int __fastcall compare_string_by_flag(const char *, const char *);
// size_t strftime(char *s, size_t maxsize, const char *format, const struct tm *tp);
FILE *__fastcall qnap_auto_close_file(FILE **);
// void *dlopen(const char *file, int mode);
// FILE *popen(const char *command, const char *modes);
__int64 __fastcall get_one_line_of_string(_QWORD); // weak
// int sysinfo(struct sysinfo *info);
const char *__fastcall Skip_White_Space_Ex(const char *);
// int pthread_mutex_unlock(pthread_mutex_t *mutex);
// __int64 EVP_sha1(void); weak
// __mode_t umask(__mode_t mask);
// void *memcpy(void *dest, const void *src, size_t n);
// struct passwd *getpwnam(const char *name);
// int rename(const char *old, const char *new);
// __int64 __fastcall EVP_DigestUpdate(_QWORD, _QWORD, _QWORD); weak
__int64 __fastcall Conf_Get_Field_NoLock(const char *, const char *, const char *, char *, int);
__int64 __fastcall XOR_Encrypt(__int64, int, int);
// __int64 __fastcall GPIO_Enable_USB_LED(_QWORD, _QWORD); weak
// struct dirent64 *readdir64(DIR *dirp);
// int mkdir(const char *path, __mode_t mode);
// time_t time(time_t *timer);
// int dlclose(void *handle);
// void *shmat(int shmid, const void *shmaddr, int shmflg);
// __pid_t vfork(void);
// int fflush(FILE *stream);
__int64 __fastcall qnap_sort_close(_QWORD); // weak
void timeout(int);
__int64 (**start())(void);
__int64 sub_ADE0();
void sub_AE30();
__int64 sub_AEB0();
_BYTE *__fastcall local_skip_white_space(_BYTE *a1);
__int64 __fastcall local_conf_get_field(const char *a1, const char *a2, const char *a3, char *a4, int a5);
__int64 __fastcall get_tag_size(int a1);
__int64 __fastcall SHM_Debug_Section(const char *a1);
__int64 __fastcall shm_do_misc(const char *a1, char *a2, int a3, char *a4, int a5);
__int64 __fastcall shm_do_storage(const char *a1, char *a2, int a3, char *a4, int a5);
__int64 __fastcall shm_do_system(const char *a1, char *a2, int a3, char *a4, int a5);
__int64 __fastcall sub_DD1C(const char *a1, char *a2, int a3, char *a4, int a5);
__int64 __fastcall sub_E8BF(const char *a1, char *a2, int a3, char *a4, int a5);
__int64 __fastcall sub_EA70(const char *a1, char *a2, int a3, char *a4, int a5);
__int64 __fastcall SHM_Set_Field(const char *a1, const char *a2, char *a3);
__int64 __fastcall SHM_Get_Field(const char *a1, const char *a2, char *a3, int a4);
__int64 SHM_Destory(); // weak
__int64 SHM_Init(); // weak
__time_t sub_1002E();
int __fastcall sub_10055(const char *a1, const char *a2, int a3);
__int64 __fastcall sub_10098(key_t a1);
__int64 __fastcall sub_10135(int a1);
__int64 __fastcall sub_10189(int a1);
__int64 __fastcall sub_101CF(int a1);
int __fastcall sub_10223(const char *a1);
__int64 __fastcall sub_1026B(const char *a1, __int64 a2);
key_t __fastcall sub_102F1(const char *a1);
key_t __fastcall sub_103EB(const char *a1);
char *sub_104E8();
_DWORD *__fastcall sub_10580(const char *a1);
__int64 __fastcall sub_10707(const char *a1);
__int64 __fastcall sub_1074C(const char *a1, int a2);
char *__fastcall sub_10796(const char *a1);
__int64 __fastcall sub_107F1(const char *a1, const char *a2);
__int64 __fastcall sub_1084E(const char *a1);
__int64 __fastcall sub_10893(const char *a1, int a2);
char *__fastcall sub_108DD(const char *a1);
__int64 __fastcall sub_10938(const char *a1, const char *a2);
__int64 __fastcall sub_10995(const char *a1);
__int64 __fastcall sub_10A0D(const char *a1);
__int64 __fastcall sub_10A73(const char *a1);
__int64 __fastcall sub_10A93(const char *a1);
__int64 __fastcall sub_10AC0(key_t a1);
__int64 __fastcall sub_10AFB(const char *a1, int a2);
__time_t __fastcall sub_10BAE(char *a1);
__int64 __fastcall sub_10BEB(const char *a1);
__int64 __fastcall sub_10C34(const char *a1, __int64 a2);
__int64 __fastcall sub_10C82(const char *a1, int a2);
void *__fastcall sub_10D2F(const char *a1, int a2);
int __fastcall sub_10D93(const char *a1, int a2);
__int64 __fastcall sub_10DD8(const char *a1);
_BYTE *__fastcall sub_10E22(_BYTE *a1);
const char *__fastcall sub_10E4D(const char *a1);
__int64 __fastcall sub_10EB4(_BYTE *a1, char *a2);
__int64 __fastcall sub_10F8E(char *a1, char *a2, char *a3);
__int64 __fastcall sub_110E6(const char *a1);
__int64 __fastcall sub_11133(const char *a1);
__int64 __fastcall sub_11205(__int64 a1, __int64 a2);
__int64 __fastcall sub_1122F(__int64 a1);
__int64 __fastcall sub_11258(__int64 a1, int a2);
char *__fastcall sub_1127F(int *a1);
_DWORD *__fastcall sub_11299(_DWORD *a1, int a2);
__int64 __fastcall sub_112BD(__int64 a1);
__int64 __fastcall sub_112D8(__int64 a1, int a2);
__int64 __fastcall sub_112FD(__int64 a1, int a2);
__int64 __fastcall sub_11322(const char *a1, const char *a2, int a3, char a4);
char *__fastcall sub_1142F(int *a1, const char *a2);
__int64 __fastcall sub_114A7(const char *a1, const char *a2);
__int64 __fastcall sub_11616(const char *a1, __int64 a2, const char *a3, const char *a4);
__int64 __fastcall sub_117D4(const char *a1);
__int64 __fastcall sub_1187B(char *a1, const char *a2, char a3);
__int64 __fastcall Conf_Get_Sections_V2(char *a1, _QWORD *a2, char a3);
__int64 __fastcall Conf_Get_Fields_V2(char *a1, const char *a2, _QWORD *a3, char a4);
__int64 __fastcall Conf_Get_Value_V2(char *a1, const char *a2, const char *a3, char *a4, int a5, char a6);
__int64 __fastcall Conf_Add_Set_Count(const char *a1);
_BOOL8 is_ram_almost_full();
const char *__fastcall Skip_White_Space_Ex(const char *a1);
const char *__fastcall Skip_White_Space_HT(const char *a1);
__int64 __fastcall find_char_in_string(__int64 a1, char a2);
char *__fastcall get_string_until_ch(__int64 a1, char a2, char *a3, int a4);
_BOOL8 __fastcall is_commented_string(__int64 a1);
__int64 __fastcall Sed_Trans_Str(const char *a1, __int64 a2);
__int64 __fastcall get_section_name(__int64 a1, char *a2, int a3);
__int64 __fastcall get_field_name(__int64 a1, char *a2, int a3);
__int64 __fastcall compare_string(__int64 a1, __int64 a2);
int __fastcall compare_case_string(const char *a1, const char *a2);
__int64 __fastcall compare_string_ex(__int64 a1, __int64 a2, unsigned int a3);
int __fastcall compare_string_by_flag(const char *a1, const char *a2);
__int64 __fastcall sub_12A08(const char *a1, char *a2, int a3);
__int64 __fastcall String_To_Upper_Case(__int64 a1);
__int64 __fastcall is_pid_alive(unsigned int a1);
__int64 __fastcall Conf_Lock_File(const char *a1, char a2, int a3);
__int64 __fastcall Conf_Unlock_File(const char *a1, char a2);
__int64 __fastcall Open_File(const char *a1, int a2, FILE **a3);
__int64 __fastcall Close_File(__int64 a1, __int64 a2, FILE *a3);
__int64 __fastcall Get_String_Field(__int64 a1, int a2, char a3, char *a4, int a5);
__int64 __fastcall Set_String_Field(__int64 a1, int a2, char a3, const char *a4, char *a5, int a6);
__int64 __fastcall Insert_String_Field(__int64 a1, int a2, char a3, const char *a4, char *a5, int a6);
__int64 __fastcall Remove_String_Field(__int64 a1, int a2, char a3);
__int64 __fastcall Parse_String_Field(__int64 a1, __int64 a2);
__int64 __fastcall SYS_Get_One_String(const char *a1, int a2, char a3, const char *a4, char *a5, int a6);
__int64 __fastcall SYS_Set_One_String(char *a1, int a2, char a3, const char *a4, const char *a5);
const char *__fastcall Conf_Dir_Get_Str(__int64 a1, const char *a2, const char *a3, const char *a4, char *a5, int a6);
__int64 __fastcall Conf_Dir_Get_Int(__int64 a1, const char *a2, const char *a3, unsigned int a4, unsigned int *a5);
_BOOL8 __fastcall Conf_Dir_Get_Bool(__int64 a1, const char *a2, const char *a3, int a4, _BOOL4 *a5);
__int64 __fastcall Conf_Dir_Remove(__int64 a1, const char *a2, const char *a3);
__int64 __fastcall Conf_Dir_Dump(__int64 a1);
__int64 __fastcall Conf_Dir_Add_Sec(__int64 a1, const char *a2);
__int64 __fastcall Conf_Dir_Add(__int64 a1, const char *a2, const char *a3, const char *a4);
__int64 __fastcall Conf_Dir_Wirte_File(__int64 a1);
__int64 __fastcall Conf_Dir_Set_Str(__int64 a1, const char *a2, const char *a3, const char *a4);
__int64 __fastcall Conf_Dir_Set_Int(__int64 a1, const char *a2, const char *a3, unsigned int a4);
__int64 __fastcall Conf_Dir_Set_Bool(__int64 a1, const char *a2, const char *a3, int a4);
__int64 __fastcall Conf_Dir_Set_Long(__int64 a1, const char *a2, const char *a3, __int64 a4);
__int64 __fastcall Conf_Dir_Set_Longlong(__int64 a1, const char *a2, const char *a3, __int64 a4);
void __fastcall Conf_Dir_Free(__int64 a1);
char *__fastcall Conf_Dir_Load(const char *a1);
__int64 __fastcall Conf_Case_Sensitive(unsigned int a1);
__int64 __fastcall Conf_Force_Write(unsigned int a1);
__int64 __fastcall Conf_Get_Field(__int64 a1, __int64 a2, __int64 a3, __int64 a4, unsigned int a5);
__int64 __fastcall Conf_Get_Field_NoLock(const char *a1, const char *a2, const char *a3, char *a4, int a5);
__int64 __fastcall Conf_Enum_Section(const char *a1, char *a2, int a3);
__int64 __fastcall conf_remove_section_err(const char *a1, const char *a2);
__int64 __fastcall Conf_Remove_Section(__int64 a1, __int64 a2);
__int64 __fastcall Conf_Rename_Section(char *a1, const char *a2, const char *a3);
__int64 __fastcall conf_remove_field_err(const char *a1, const char *a2, const char *a3);
__int64 __fastcall Conf_Remove_Field(__int64 a1, __int64 a2, __int64 a3);
__int64 __fastcall conf_set_field_err(const char *a1, const char *a2, const char *a3, const char *a4);
__int64 __fastcall Conf_Set_Field(__int64 a1, __int64 a2, __int64 a3, __int64 a4);
size_t __fastcall GetPrivateProfileString(__int64 a1, __int64 a2, const char *a3, char *a4, signed int a5, __int64 a6);
size_t __fastcall GetPrivateProfileStringNoLock(const char *a1, const char *a2, const char *a3, char *a4, int a5, const char *a6);
_BOOL8 __fastcall WritePrivateProfileString(__int64 a1, __int64 a2, __int64 a3, __int64 a4);
size_t __fastcall GetProfileString(__int64 a1, __int64 a2, const char *a3, char *a4, signed int a5);
_BOOL8 __fastcall WriteProfileString(__int64 a1, __int64 a2, __int64 a3);
size_t __fastcall GetProfileStringServiceBinding(__int64 a1, __int64 a2, const char *a3, char *a4, signed int a5);
_BOOL8 __fastcall WriteProfileStringServiceBinding(__int64 a1, __int64 a2, __int64 a3);
size_t __fastcall GetProfileStringNetLinks(__int64 a1, __int64 a2, const char *a3, char *a4, signed int a5);
_BOOL8 __fastcall WriteProfileStringNetLinks(__int64 a1, __int64 a2, __int64 a3);
size_t __fastcall Get_Profile_String(__int64 a1, __int64 a2, const char *a3, char *a4, signed int a5);
_BOOL8 __fastcall Set_Profile_String(__int64 a1, __int64 a2, __int64 a3);
_BOOL8 __fastcall Get_Profile_Boolean(__int64 a1, __int64 a2, int a3);
_BOOL8 __fastcall Set_Profile_Boolean(__int64 a1, __int64 a2, int a3);
int __fastcall Get_Profile_Integer(__int64 a1, __int64 a2, unsigned int a3);
_BOOL8 __fastcall Set_Profile_Integer(__int64 a1, __int64 a2, unsigned int a3);
size_t __fastcall Get_Private_Profile_String(__int64 a1, __int64 a2, const char *a3, char *a4, signed int a5, __int64 a6);
_BOOL8 __fastcall Set_Private_Profile_String(__int64 a1, __int64 a2, __int64 a3, __int64 a4);
_BOOL8 __fastcall Get_Private_Profile_Boolean(__int64 a1, __int64 a2, int a3, __int64 a4);
_BOOL8 __fastcall Set_Private_Profile_Boolean(__int64 a1, __int64 a2, int a3, __int64 a4);
int __fastcall Get_Private_Profile_Integer(__int64 a1, __int64 a2, unsigned int a3, __int64 a4);
int __fastcall Get_Private_Profile_Integer_NoLock(const char *a1, const char *a2, unsigned int a3, const char *a4);
_BOOL8 __fastcall Set_Private_Profile_Integer(__int64 a1, __int64 a2, unsigned int a3, __int64 a4);
_BOOL8 __fastcall Set_Private_Profile_Long(__int64 a1, __int64 a2, __int64 a3, __int64 a4);
_BOOL8 __fastcall Set_Private_Profile_Longlong(__int64 a1, __int64 a2, __int64 a3, __int64 a4);
char *__fastcall File_Fgets(FILE *a1);
__int64 __fastcall Comp_Config_Disk_SN(const char *a1, const char *a2);
__int64 __fastcall Conf_Dir_Wirte_Section_To_File(__int64 a1, const char *a2, char *a3);
__int64 __fastcall conf_get_field(const char *a1, const char *a2, const char *a3, char *a4, int a5);
__int64 __fastcall is_black_str(__int64 a1);
_BOOL8 __fastcall is_tc_word(_BYTE *a1);
_BOOL8 __fastcall is_sc_word(_BYTE *a1);
_BOOL8 __fastcall is_jis_word(_BYTE *a1);
_BOOL8 __fastcall is_korea_word(_BYTE *a1);
__int64 __fastcall Is_Mb_Word(_BYTE *a1);
__int64 __fastcall Is_Mb_String(_BYTE *a1);
__int64 __fastcall Is_Mb_Word_By_Codepage(_BYTE *a1, int a2);
__int64 __fastcall sub_186DE(_BYTE *a1, const char *a2);
__int64 __fastcall Is_Legal_String(_BYTE *a1);
__int64 __fastcall Is_Share_Legal_String(_BYTE *a1);
__int64 __fastcall Is_Share_Path_Legal_String(_BYTE *a1);
__int64 __fastcall Is_No_LineBreaks_String(_BYTE *a1);
__int64 __fastcall mb_strcmp(char *a1, char *a2);
__int64 __fastcall mb_strcasecmp(const char *a1, const char *a2);
__int64 __fastcall mb_strcmp_ex(char *a1, char *a2, int a3);
void err_lock();
const char *__fastcall get_filename(const char *a1);
_BOOL8 __fastcall timeout(int a1);
__int64 __fastcall NAS_File_Lock(const char *a1, char a2);
__int64 __fastcall NAS_File_Unlock(const char *a1);
__int64 __fastcall Is_Exist_Another_Instance(const char *a1);
__int64 Become_Daemon(); // weak
__int64 __fastcall sub_19184(unsigned __int16 a1);
__int64 __fastcall sub_1919E(unsigned __int8 a1, unsigned __int16 a2);
__int64 __fastcall uart_start_row(int a1, char a2);
__int64 __fastcall uart_prog_8byte(int a1, char a2, char *a3);
int __fastcall uart_update_firmware_to_mcu(int a1, __int64 a2, unsigned int a3);
_BOOL8 __fastcall is_pic_raw_running(unsigned int *a1);
int __fastcall set_fan_pwm(const char *a1, unsigned int a2);
int __fastcall set_fan_pwm_2(int a1);
__int64 get_fan_pwm(); // weak
double __fastcall sub_19E90(const char *a1);
double __fastcall sub_19F5E(double a1);
__int64 Get_Hwmon_All_Status(); // weak
__int64 __fastcall sub_1A160(int a1);
__int64 sub_1A1D7();
__int64 __fastcall Set_Buzzer_Status(unsigned int a1);
__int64 __fastcall Pic_Send_Raw_Cmd(unsigned int a1);
__int64 __fastcall Pic_Send_Raw_Cmds(unsigned __int16 *a1, int a2);
__int64 __fastcall Pic_Send_Read_EEPROM(char a1, unsigned __int8 a2, __int64 a3);
__int64 __fastcall Pic_Send_Write_EEPROM(char a1, unsigned __int8 a2, __int64 a3);
__int64 __fastcall Pic_Read_Byte(char a1, unsigned __int8 a2, __int64 a3);
__int64 __fastcall Pic_Send_Message(__int16 a1, __int16 a2);
__int64 __fastcall Pic_Send_Write_To_MCU(__int64 a1, unsigned int a2);
__int64 __fastcall Pic_Backup_Block_Area(__int64 a1);
__int64 __fastcall Pic_Send_Read_Write_DIDO(__int64 a1);
__int64 __fastcall Pic_Read_Write(__int64 a1);
int sub_1AB0A();
__int64 __fastcall sub_1AB66(unsigned int a1);
__int64 stop_pic_raw(); // weak
__int64 __fastcall Util_Send_Message(int a1, const char *a2, int a3, __int64 a4);
_BOOL8 __fastcall Set_LOGO_LED_Mode(unsigned int a1);
_BOOL8 __fastcall Set_Buzzer_Quiet_Mode(int a1);
__int64 Get_Buzzer_Quiet_Mode(); // weak
__int64 lock_system_update(); // weak
int unlock_system_update();
__int64 Is_System_Update_Locked(); // weak
__int64 Is_Live_Update_In_Progress(); // weak
__int64 __fastcall Touch_File(const char *a1);
_BOOL8 Is_App_Install_In_Progress();
_BOOL8 __fastcall Is_File_Exist(char *a1);
char *__fastcall sub_1AFF0(__int64 a1, unsigned __int8 *a2, _DWORD *a3);
__int64 __fastcall Is_Alphabet_Num(_BYTE *a1);
__int64 __fastcall Is_Valid_Servername(_BYTE *a1);
__int64 __fastcall Is_Valid_Email(const char *a1);
__int64 __fastcall Base64_Decode(__int64 a1, unsigned __int8 *a2);
__int64 __fastcall sub_1B5E8(char *a1, unsigned __int8 *a2, int a3);
__int64 __fastcall Base64_Encode(__int64 a1, unsigned __int8 *a2, int a3);
__int64 __fastcall XOR_Encrypt(__int64 a1, int a2, int a3);
__int64 __fastcall Is_SUID_ENC_SALT_V2(const char *a1);
__int64 __fastcall str_to_hex(const char *a1, __int64 a2, int a3);
__int64 __fastcall AES_QTS_Encrypt(__int64 a1, int a2, void *a3, const char *a4, int a5);
char *__fastcall Password_Encode(const char *a1, int a2, int a3);
char *__fastcall Password_Decode(const char *a1, int a2);
__int64 model_is_pro(); // weak
__int64 get_hw_type(); // weak
unsigned int sync_cmd();
__int64 __fastcall getQPKGDisplayNameIndex(const char *a1);
char *__fastcall Get_Random_Digit_String(int a1);
__int64 __fastcall Get_Random_String(char *a1, int a2);
__int64 __fastcall Get_Flash_Config(__int64 a1, unsigned int a2, __int64 a3);
__int64 __fastcall Set_Flash_Config(__int64 a1, __int64 a2);
__int64 __fastcall iface_get_hwaddr(const char *a1, char *a2, int a3);
__int64 __fastcall Get_Sys_HWaddr(char *a1);
__int64 check_nas_config(); // weak
__int64 __fastcall iface_set_hwaddr(const char *a1, __int64 a2, __int64 a3);
__int64 __fastcall Set_Sys_HWaddr(__int64 a1);
__int64 __fastcall Get_Sys_HWtype(_DWORD *a1);
__int64 __fastcall Set_Sys_HWtype(int a1);
__int64 Create_HWtypeFile(); // weak
__int64 __fastcall Get_Str_By_Offset(const char *a1, __off64_t a2, int a3, char *a4);
__int64 __fastcall Remove_Last_Chars(const char *a1, int a2);
__int64 __fastcall Get_QPKG_Encrypt_String(char *a1, char *a2);
__int64 __fastcall Get_QPKG_Auth_Encrypt_String(char *a1, char *a2);
_BOOL8 __fastcall Is_QNAPFlag_Exist(const char *a1, const char *a2);
__int64 __fastcall Get_QNAPFlag_File_Info(const char *a1, char *a2);
__int64 __fastcall Is_QPKG_FW_Match(const char *a1);
_BOOL8 __fastcall Is_QNAP_QPKG(const char *a1);
_BOOL8 __fastcall Is_QNAP_Auth_QPKG(const char *a1);
__int64 __fastcall Set_QPKG_Encrypt(const char *a1);
__int64 __fastcall Set_QPKG_Auth_Encrypt(const char *a1);
__int64 __fastcall Set_QPKG_FW_Version(const char *a1);
__int64 __fastcall Set_QPKG_Flag(const char *a1, int a2, const char *a3);
__int64 __fastcall Get_One_QFIX_Info(const char *a1, __int64 a2);
__int64 __fastcall Get_All_QFIX_Info(void **a1);
__int64 __fastcall Get_One_QPKG_Info(const char *a1, __int64 a2);
__int64 __fastcall Get_One_QPKG_Info_Dir(__int64 a1, const char *a2, __int64 a3);
__int64 __fastcall sub_1F8BD(__int64 a1);
__int64 __fastcall Get_All_QPKG_Info(void **a1);
_BOOL8 __fastcall Is_QPKG_Installed(__int64 a1);
_BOOL8 __fastcall Is_SYS_QPKG_Removed(const char *a1);
__int64 __fastcall Set_QPKG_Disable_by_Default(const char *a1);
__int64 __fastcall Unset_QPKG_Disable_by_Default(const char *a1);
__int64 Get_EEPROM_Hwaddr(); // weak
__int64 __fastcall Get_Eth_Magic_Num(const char *a1, int *a2);
__int64 Set_EEPROM_Hwaddr(); // weak
__int64 Reset_EEPROM_To_Default(); // weak
_BOOL8 __fastcall sub_202AD(_BYTE *a1);
__int64 Is_Needed_Reset_EEPRM(); // weak
__int64 __fastcall Get_Firmware_MD5_Checksum(char *a1, int a2);
__int64 __fastcall Set_Firmware_MD5_Checksum(const char *a1);
__int64 __fastcall Get_Firmware_Checksum(char *a1, int a2);
__int64 __fastcall Set_Firmware_Checksum(const char *a1);
_BOOL8 __fastcall IS_IPv4_Address(const char *a1);
_BOOL8 __fastcall IS_IPv6_Address(const char *a1);
__int64 sub_20679();
__int64 __fastcall sub_20700(__int64 a1);
__int64 __fastcall sub_20782(char *a1, int a2);
__int64 __fastcall sub_20846(const char *a1);
__kernel_long_t sub_208A4();
__int64 __fastcall Get_External_IP(char *a1, int a2);
__int64 __fastcall Get_Multimedia_Share_Path(char *a1);
_BOOL8 __fastcall Is_Sound_Card_Playback_Running(unsigned int a1);
__int64 Stop_Local_Audio_Playback(); // weak
_BOOL8 Is_Local_Audio_Playing();
__int64 __fastcall Get_One_Audio_Alarm_Info(unsigned int a1, __int64 a2);
__int64 __fastcall Set_One_Audio_Alarm_Info(__int64 a1);
size_t __fastcall remove_tail_linefeed(const char *a1);
_BYTE *__fastcall trim_newline_carriage(__int64 a1);
_BYTE *__fastcall escape_str(const char *a1);
__int64 __fastcall Get_Serial_Number(char *a1, int a2);
__int64 __fastcall Get_Mac_Address(char *a1, int a2);
__int64 __fastcall Get_Specify_ID(const char *a1, char *a2, int a3);
__int64 __fastcall Get_Device_SUID(char *a1, int a2);
__int64 __fastcall Get_Device_SUID_Ex(void *a1, signed int a2);
__int64 __fastcall Set_Device_SUID(const char *a1);
__int64 Get_Country_Code(); // weak
__int64 __fastcall Set_Country_Code(int a1);
__int64 __fastcall getCountryCodeIndex(int a1);
__int64 __fastcall getCountryCodeIndexByAbbr(const char *a1);
__int64 __fastcall getFunctionCodeIndex(int a1);
__int64 __fastcall Get_Model_Prefix(char *a1);
__int64 __fastcall Set_Model_Prefix(const char *a1);
__int64 __fastcall Get_LED_Night_Mode_Status(_DWORD *a1);
__int64 __fastcall Set_LED_Night_Mode_Status(unsigned int *a1, int a2);
__int64 __fastcall Get_QOS_Lang(const char *a1, char *a2, signed int a3);
__int64 __fastcall Is_Valid_Source(const char *a1);
_BOOL8 __fastcall sub_22D74(int a1);
__int64 __fastcall sub_22D8C(int a1);
__int64 __fastcall utf8_strtolower(_BYTE *a1, __int64 a2);
__int64 __fastcall utf8_strcasecmp(_BYTE *a1, _BYTE *a2);
__int64 __fastcall utf8_strncasecmp(_BYTE *a1, _BYTE *a2, __int64 a3);
__int64 __fastcall mkdir_p(const char *a1, __mode_t a2);
__int64 __fastcall sub_231EA(const char *a1, const char *a2);
__int64 __fastcall QNAP_Version_Compare(const char *a1, const char *a2);
__int64 __fastcall Set_Encode_Field_To_Private_Conf(__int64 a1, __int64 a2, const char *a3, int a4, __int64 a5);
__int64 __fastcall Get_Decode_Field_From_Private_Conf(__int64 a1, __int64 a2, const char *a3, char *a4, int a5, int a6, __int64 a7);
__int64 __fastcall Get_Device_CUID(char *a1, int a2);
__int64 __fastcall Set_Device_CUID(const char *a1);
_BYTE *__fastcall Skip_Unicode_Control_Characters(_BYTE *a1);
__int64 __fastcall sub_23C97(char *a1, char *a2, void *a3, unsigned __int64 a4, char *a5);
__int64 __fastcall QNAP_Digest_MD5(char *a1, char *a2, void *a3, unsigned __int64 a4);
__int64 __fastcall QNAP_Digest_SHA256(char *a1, char *a2, void *a3, unsigned __int64 a4);
__int64 __fastcall QNAP_Digest_SHA1(char *a1, char *a2, void *a3, unsigned __int64 a4);
__int64 __fastcall sub_23E57(const char *a1);
void __fastcall sub_23EE2(const char *a1);
__int64 __fastcall sub_23F86(const char *a1, char *a2, int a3);
__int64 __fastcall sub_2405B(const char *a1, char *a2, int a3);
__int64 __fastcall sub_24130(const char *a1, char *a2, int a3);
__int64 __fastcall sub_2423B(const char *a1, char *a2, int a3, char *a4, int a5);
__int64 __fastcall sub_24365(_BYTE *a1, const char *a2, char *a3, int a4);
__int64 __fastcall sub_2446F(int a1, __int64 a2, int a3);
_BOOL8 __fastcall sub_24502(_BYTE *a1, const char *a2);
__int64 __fastcall QNAP_MAC_To_Cloudkey(const char *a1, char *a2, int a3);
__int64 __fastcall QNAP_Cloudkey_To_MAC(const char *a1, char *a2, int a3);
int init_debugger();
FILE **finish_debugger();
_BOOL8 __fastcall sub_24DA9(char *a1);
__int64 __fastcall sub_24DFC(FILE *a1);
__int64 __fastcall sub_24EF0(const char *a1);
__int64 __fastcall sub_24F33(__int64 a1, const char *a2);
__int64 __fastcall sub_24FFF(const char *a1, char *a2);
__int64 __fastcall sub_2517D(int a1);
__int64 __fastcall sub_251AB(char *a1, __int64 a2, __int64 a3);
__int64 __fastcall sub_2529F(char *a1);
__int64 __fastcall sub_253D9(char *a1);
void __fastcall sub_25530(char *a1);
char *__fastcall sub_25626(const char *a1, int a2);
__int64 __fastcall sub_256B0(__int64 a1);
unsigned int *sub_25729();
unsigned int *sub_257A5();
_BOOL8 __fastcall sub_25928(char a1);
__int64 __fastcall sub_2596B(const char *a1, __int64 a2);
__int64 __fastcall sub_25B57(const char *a1, __int64 a2, __int64 a3, unsigned int a4);
__int64 __fastcall sub_25DA3(const char *a1);
char *__fastcall sub_25E5A(const char *a1);
int *sub_25E8B();
__int64 __fastcall sub_25ED6(const char *a1);
__int64 __fastcall sub_261BD(const char *a1);
void __fastcall sub_2621E(const char *a1, char *a2);
char *__fastcall sub_26362(char *a1, signed int a2);
void __fastcall sub_263AC(char *a1);
void __fastcall sub_263F8(__int64 a1, int a2);
void sub_268B4();
void sub_26944();
__int64 __fastcall sub_26C76(char *a1);
__int64 __fastcall sub_26D33(char *a1);
__int64 __fastcall sub_26E75(const char *a1);
FILE *sub_26FE8();
_BOOL8 sub_2714C();
int sub_27169();
int sub_2717E();
int sub_27193();
__int64 __fastcall sub_274C6(const char *a1);
__int64 __fastcall sub_27563(const char *a1, unsigned int a2, unsigned int a3);
__int64 __fastcall sub_2772E(const char *a1);
__int64 __fastcall sub_2793C(const char *a1);
__int64 sub_27B6B();
__int64 sub_27C42();
FILE **check_for_startup();
__int64 NAS_Send_LCD_MSG(); // weak
__int64 __fastcall SendErrMsgToLcd(int a1, unsigned int a2);
__int64 __fastcall SendEnterStateToLcd(int a1);
__int64 __fastcall SendNotificationToLcd(int a1);
__int64 __fastcall SendHalExtentErrMsgToLcd(int a1, int a2, unsigned int a3);
__int64 __fastcall SendHalExtentNoticeToLcd(int a1, int a2);
__int64 __fastcall SendEVToLogEngine(int a1, const char *a2, const char *a3, const char *a4, const char *a5);
__int64 SendEVToLogEngineEx(int a1, const char *a2, const char *a3, const char *a4, const char *a5, ...);
__int64 __fastcall SendConnToLogEngine(int a1, const char *a2, const char *a3, const char *a4, int a5, int a6, const char *a7);
__int64 SendConnToLogEngineEx(int a1, const char *a2, const char *a3, const char *a4, int a5, int a6, char *format, ...);
__int64 SendConnToLogEngineEx2(int a1, const char *a2, const char *a3, const char *a4, const char *a5, int a6, int a7, char *format, ...);
__int64 SendConnToLogEngineEx3(int a1, const char *a2, const char *a3, const char *a4, const char *a5, int a6, int a7, char *format, int a9, ...);
__int64 SendConnToLogEngineEx4(int a1, const char *a2, const char *a3, const char *a4, const char *a5, int a6, int a7, int a8, const char *a9, const char *a10, const char *a11, char *format, ...);
__int64 __fastcall SendNoticeToLogEngine_V2(int a1, unsigned int a2, unsigned int a3, const char *a4, int a5, const char *a6, int a7, int a8, int a9, const char *a10, const char *a11, const char *a12, const char *a13, int a14, const char *a15, const char *a16, const char *a17, const char *a18, const char *a19);
__int64 __fastcall SendNoticeToLogEngine(int a1, unsigned int a2, unsigned int a3, const char *a4, int a5, const char *a6, int a7, int a8, int a9, const char *a10, const char *a11, const char *a12, const char *a13, int a14, const char *a15, const char *a16);
__int64 SendNoticeToLogEngineEx(int a1, unsigned int a2, unsigned int a3, const char *a4, int a5, const char *a6, int a7, int a8, int a9, const char *a10, const char *a11, const char *a12, const char *a13, int a14, const char *a15, char *format, ...);
__int64 __fastcall SendEVMsgidToLogEngine(int a1, const char *a2, const char *a3, const char *a4, const char *a5, const char *a6);
__int64 SendEVMsgidToLogEngineEx(int a1, const char *a2, const char *a3, const char *a4, const char *a5, const char *a6, ...);
__int64 SendEventToQSyslogd(); // weak
__int64 SendConnToQSyslogd(); // weak
char ***__fastcall set_proc_title_init(int a1, _QWORD *a2);
__int64 set_proc_title(const char *a1, ...);
_BYTE *__fastcall sub_29D78(_BYTE *a1, _BYTE *a2);
__int64 __fastcall sub_29EE1(const char *a1, __int64 a2);
__int64 __fastcall read_net_proc(const char *a1, __int64 a2);
int ctor_001();
void dtor_001();
int *__fastcall qnap_auto_close_fd(int *a1);
void *__fastcall qnap_auto_free_char(void **a1);
FILE *__fastcall qnap_auto_close_file(FILE **a1);
_QWORD *__fastcall qnap_auto_close_popen_file(_QWORD *a1);
void *__fastcall sub_2A21C(void **a1);
__int64 __fastcall qnap_mktmpname(char *a1);
size_t __fastcall erase_char(const char *a1);
const char *__fastcall stripe_white_space_tail(const char *a1);
_BOOL8 __fastcall string_ended_with_EOL(const char *a1);
__int64 __fastcall strip_EOL(const char *a1);
char *__fastcall combine_string(const char *a1, const char *a2);
char *__fastcall skip_to_EOL(FILE *a1);
_BYTE *__fastcall skip_white_space(_BYTE *a1);
__int64 __fastcall get_one_line_of_string(FILE *a1);
__int64 __fastcall get_uid_by_name(const char *a1);
__int64 __fastcall get_uid_by_name_from_file(const char *a1, const char *a2);
__int64 __fastcall get_gid_by_name(const char *a1);
int __fastcall sub_2A8F9(int a1);
__int64 __fastcall sub_2A9A4(unsigned int a1, int a2, int a3, const char *a4, unsigned __int8 a5, const char **a6);
__int64 __fastcall sub_2AE7A(unsigned int a1, int a2, int a3, const char *a4, unsigned __int8 a5, const char **a6);
__int64 __fastcall sub_2AF4F(const char *a1, const char *a2, const char *a3, unsigned __int8 a4, const char *a5, __int64 *a6);
__int64 qnap_exec(const char *a1, const char *a2, const char *a3, const char *a4, ...);
__int64 qnap_exec_glob(const char *a1, const char *a2, const char *a3, const char *a4, ...);
__int64 __fastcall qnap_exec_v(const char *a1, const char *a2, const char *a3, const char *a4, _QWORD *a5);
__int64 __fastcall qnap_exec_v2(const char *a1, const char *a2, const char *a3, const char *a4, int a5, int a6, const char *a7, _QWORD *a8);
__int64 qnap_exec_pipe(const char *a1, const char *a2, const char *a3, ...);
__int64 __fastcall sub_2B7F2(unsigned __int8 a1, const char *a2, __int64 *a3);
__int64 qnap_system(const char *a1, ...);
__int64 qnap_system_glob(const char *a1, ...);
FILE *__fastcall sub_2BAAD(char *a1, const char *a2, const char *a3, unsigned __int8 a4, char a5, const char **a6);
FILE *__fastcall sub_2BE5E(char *a1, unsigned __int8 a2, const char *a3, __int64 *a4);
FILE *qnap_popen(char *a1, const char *a2, ...);
FILE *qnap_popen_glob(char *a1, const char *a2, ...);
FILE *__fastcall sub_2C149(char *a1, const char *a2, const char *a3, unsigned __int8 a4, const char *a5, __int64 *a6);
FILE *qnap_popen_log(char *a1, const char *a2, const char *a3, const char *a4, ...);
FILE *qnap_popen_glob_log(char *a1, const char *a2, const char *a3, const char *a4, ...);
FILE *qnap_popen_pipe(const char *a1, ...);
__int64 __fastcall qnap_pclose(FILE *a1);
__int64 __fastcall qnap_pclose_pipe(__int64 a1);
__int64 __fastcall qnap_secure_exec(int a1, int a2, int a3, int a4, int a5, int a6, const char **a7, char a8, char *file, char *a10, int oflag, char *a12, int a13, const char *a14);
FILE *__fastcall qnap_secure_popen(char *a1, __int64 a2, __int64 a3, __int64 a4, __int64 a5, __int64 a6, char *a7, char a8, int a9, int a10, int a11, const char *a12, int a13, const char *a14);
__int64 __fastcall sub_2C9CF(char a1);
__int64 __fastcall sub_2CA69(char *a1, char *a2);
char *__fastcall sub_2CBC3(const char *a1, char *a2, int a3);
__int64 __fastcall sub_2CC2F(char *a1, char *a2);
__int64 __fastcall sub_2CEE9(__int64 a1, char *a2, char *a3);
__int64 __fastcall sub_2CF9D(__uid_t a1, char *a2, int a3);
void __fastcall sub_2D13D(__int64 a1);
__int64 __fastcall sub_2D1DB(const char *a1, char *a2, int a3);
char *qnap_sort_get_locale_of_display_language();
void __fastcall qnap_sort_close(__int64 a1);
void *__fastcall qnap_sort_open(const char *a1);
__int64 __fastcall qnap_sort_compare(__int64 a1, char *a2, char *a3, int a4);
__int64 __fastcall qnap_scandir(const char *a1, char **a2, unsigned int a3);
int __fastcall sub_2D9E0(char *filename, struct stat64 *stat_buf);
int __fastcall sub_2D9F0(char *filename, struct stat64 *stat_buf);
void (__fastcall *sub_2DA00())();
void term_proc();
// DIR *opendir(const char *name);
// int __fastcall _cxa_finalize(void *);
// int alphasort64(const struct dirent64 **e1, const struct dirent64 **e2);
// int closedir(DIR *dirp);
// struct dirent64 *readdir64(DIR *dirp);
// __int64 Jv_RegisterClasses(void); weak
// __int64 ITM_deregisterTMCloneTable(void); weak
//-------------------------------------------------------------------------
// Data declarations
__int64 qword_20 = 64LL; // weak
int dword_7C = 6; // weak
char byte_2E29E[2] = { '\0', '\0' }; // weak
_UNKNOWN unk_2E32E; // weak
_UNKNOWN unk_2E884; // weak
_UNKNOWN unk_2EA9D; // weak
char asc_2EE09[2] = "/"; // weak
_UNKNOWN unk_2F51D; // weak
char byte_2FA8E[2] = { '\0', '\0' }; // weak
__int64 (__fastcall *off_235008)() = &ctor_001; // weak
__int64 qword_235018[] = { -1LL }; // weak
__int64 qword_235028 = 0LL; // weak
_UNKNOWN unk_235030; // weak
_UNKNOWN qfunctioncode; // weak
_UNKNOWN qcountrycode; // weak
char *qpkg_display_name[12] =
{
"PlexMediaServer",
"Plex Media Server",
"XMail_phpxmail",
"XMail",
"VtigerCRM",
"vtiger CRM",
"Optware",
"Optware IPKG",
"djStation",
"DJ Station",
"PMS",
"PS3 Media Server"
}; // weak
tls_index_local stru_2355D0 = { 1uLL, 0uLL }; // weak
__int64 qword_2355E0 = 1LL; // weak
void *off_236100 = &off_236100; // idb
char MAP[1600] =
{
'\0',
'\0',
'\0',
'\0',
'S',
'y',
's',
't',
'e',
'm',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\x01',
'\0',
'\0',
'\0',
'S',
't',
'o',
'r',
'a',
'g',
'e',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\x02',
'\0',
'\0',
'\0',
'M',
'i',
's',
'c',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\x03',
'\0',
'\0',
'\0',
'L',
'D',
'A',
'P',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\x04',
'\0',
'\0',
'\0',
'W',
'e',
'b',
'F',
'S',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\x05',
'\0',
'\0',
'\0',
'S',
'a',
'm',
'b',
'a',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0'
}; // weak
char message00[43] = "The system is unable to save your settings"; // weak
char message01[134] = "due to insufficient ramdisk space. If restarting the server does not solve the problem please contact support for further assistance."; // weak
int dword_23688C = -1; // weak
_UNKNOWN uart_start_isp; // weak
_UNKNOWN uart_stop_mcu; // weak
_UNKNOWN uart_erase_all; // weak
_UNKNOWN uart_erase_block; // weak
_UNKNOWN uart_erase_chip_en; // weak
_UNKNOWN uart_erase_page_en; // weak
_UNKNOWN uart_cmd_finish; // weak
_UNKNOWN uart_reset; // weak
char aCde31qaz000000[33] = "cde31qaz00000000000000005tgb9ijn"; // weak
_BYTE byte_236940[256] =
{
0,
1,
1,
1,
1,
1,
1,
1,
1,
0,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
1,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
}; // weak
int dword_236A40[32] =
{
13,
19,
5,
15,
17,
6,
3,
18,
12,
10,
2,
14,
21,
22,
4,
7,
20,
8,
16,
1,
23,
9,
11,
0,
0,
0,
0,
0,
0,
0,
0,
0
}; // weak
_DWORD dword_236AC0[24] = { 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0 }; // weak
char oui_map[7] = "00089B"; // weak
char *off_236B48 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; // idb
char g_app_name[64] =
{
'\xBE',
'\xB6',
'\xC8',
'\xC6',
'\xD8',
'\xD5',
'\xCC',
'\xD7',
'\xDC',
'\xC0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0'
}; // weak
char found_malware_msg_1[192] =
{
'\xBE',
'\xB6',
'\xC8',
'\xC6',
'\xD8',
'\xD5',
'\xCC',
'\xD7',
'\xDC',
'\xC0',
'\x83',
'\xA7',
'\xC8',
'\xD7',
'\xC8',
'\xC6',
'\xD7',
'\xC8',
'\xC7',
'\x83',
'\xD8',
'\xD1',
'\xC4',
'\xD8',
'\xD7',
'\xCB',
'\xD2',
'\xD5',
'\xCC',
'\xDD',
'\xC8',
'\xC7',
'\x83',
'\xC6',
'\xCB',
'\xC4',
'\xD1',
'\xCA',
'\xC8',
'\xD6',
'\x83',
'\xD7',
'\xD2',
'\x83',
'\xC4',
'\xD3',
'\xD3',
'\xCF',
'\xCC',
'\xC6',
'\xC4',
'\xD7',
'\xCC',
'\xD2',
'\xD1',
'\xD6',
'\x83',
'\x8B',
'\xDE',
'\x93',
'\xE0',
'\x8C',
'\x91',
'\x83',
'\xA6',
'\xCB',
'\xC4',
'\xD1',
'\xCA',
'\xC8',
'\x83',
'\xC4',
'\xCF',
'\xCF',
'\x83',
'\xD8',
'\xD6',
'\xC8',
'\xD5',
'\x83',
'\xC4',
'\xC6',
'\xC6',
'\xD2',
'\xD8',
'\xD1',
'\xD7',
'\x83',
'\xD3',
'\xC4',
'\xD6',
'\xD6',
'\xDA',
'\xD2',
'\xD5',
'\xC7',
'\xD6',
'\x83',
'\xCC',
'\xD0',
'\xD0',
'\xC8',
'\xC7',
'\xCC',
'\xC4',
'\xD7',
'\xC8',
'\xCF',
'\xDC',
'\x83',
'\xC4',
'\xD1',
'\xC7',
'\x83',
'\xD8',
'\xD3',
'\xC7',
'\xC4',
'\xD7',
'\xC8',
'\x83',
'\xB1',
'\xA4',
'\xB6',
'\x83',
'\xC9',
'\xCC',
'\xD5',
'\xD0',
'\xDA',
'\xC4',
'\xD5',
'\xC8',
'\x83',
'\xC4',
'\xD1',
'\xC7',
'\x83',
'\xC4',
'\xD3',
'\xD3',
'\xCF',
'\xCC',
'\xC6',
'\xC4',
'\xD7',
'\xCC',
'\xD2',
'\xD1',
'\xD6',
'\x83',
'\xD7',
'\xD2',
'\x83',
'\xD7',
'\xCB',
'\xC8',
'\x83',
'\xCF',
'\xC4',
'\xD7',
'\xC8',
'\xD6',
'\xD7',
'\x83',
'\xD9',
'\xC8',
'\xD5',
'\xD6',
'\xCC',
'\xD2',
'\xD1',
'\x91',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0'
}; // weak
char found_malware_msg_2[256] =
{
'\xBE',
'\xB6',
'\xC8',
'\xC6',
'\xD8',
'\xD5',
'\xCC',
'\xD7',
'\xDC',
'\xC0',
'\x83',
'\xA7',
'\xC8',
'\xD7',
'\xC8',
'\xC6',
'\xD7',
'\xC8',
'\xC7',
'\x83',
'\xD8',
'\xD1',
'\xC4',
'\xD8',
'\xD7',
'\xCB',
'\xD2',
'\xD5',
'\xCC',
'\xDD',
'\xC8',
'\xC7',
'\x83',
'\xC6',
'\xCB',
'\xC4',
'\xD1',
'\xCA',
'\xC8',
'\xD6',
'\x83',
'\xD7',
'\xD2',
'\x83',
'\x85',
'\xC4',
'\xD8',
'\xD7',
'\xD2',
'\xD5',
'\xD8',
'\xD1',
'\x91',
'\xD6',
'\xCB',
'\x85',
'\x91',
'\x83',
'\xA6',
'\xCB',
'\xC4',
'\xD1',
'\xCA',
'\xC8',
'\x83',
'\xC4',
'\xCF',
'\xCF',
'\x83',
'\xD8',
'\xD6',
'\xC8',
'\xD5',
'\x83',
'\xC4',
'\xC6',
'\xC6',
'\xD2',
'\xD8',
'\xD1',
'\xD7',
'\x83',
'\xD3',
'\xC4',
'\xD6',
'\xD6',
'\xDA',
'\xD2',
'\xD5',
'\xC7',
'\xD6',
'\x83',
'\xCC',
'\xD0',
'\xD0',
'\xC8',
'\xC7',
'\xCC',
'\xC4',
'\xD7',
'\xC8',
'\xCF',
'\xDC',
'\x8F',
'\x83',
'\xD8',
'\xD3',
'\xC7',
'\xC4',
'\xD7',
'\xC8',
'\x83',
'\xB1',
'\xA4',
'\xB6',
'\x83',
'\xC9',
'\xCC',
'\xD5',
'\xD0',
'\xDA',
'\xC4',
'\xD5',
'\xC8',
'\x83',
'\xC4',
'\xD1',
'\xC7',
'\x83',
'\xC4',
'\xD3',
'\xD3',
'\xCF',
'\xCC',
'\xC6',
'\xC4',
'\xD7',
'\xCC',
'\xD2',
'\xD1',
'\xD6',
'\x83',
'\xD7',
'\xD2',
'\x83',
'\xD7',
'\xCB',
'\xC8',
'\x83',
'\xCF',
'\xC4',
'\xD7',
'\xC8',
'\xD6',
'\xD7',
'\x83',
'\xD9',
'\xC8',
'\xD5',
'\xD6',
'\xCC',
'\xD2',
'\xD1',
'\x8F',
'\x83',
'\xC4',
'\xD1',
'\xC7',
'\x83',
'\xC6',
'\xCB',
'\xC8',
'\xC6',
'\xCE',
'\x83',
'\xC4',
'\xD8',
'\xD7',
'\xD2',
'\xD5',
'\xD8',
'\xD1',
'\x91',
'\xD6',
'\xCB',
'\x83',
'\xC9',
'\xD2',
'\xD5',
'\x83',
'\xC4',
'\xC5',
'\xD1',
'\xD2',
'\xD5',
'\xD0',
'\xC4',
'\xCF',
'\x83',
'\xC8',
'\xD1',
'\xD7',
'\xD5',
'\xCC',
'\xC8',
'\xD6',
'\x91',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0'
}; // weak
char found_malware_msg_3[160] =
{
'\xBE',
'\xB6',
'\xC8',
'\xC6',
'\xD8',
'\xD5',
'\xCC',
'\xD7',
'\xDC',
'\xC0',
'\x83',
'\xA7',
'\xC8',
'\xD7',
'\xC8',
'\xC6',
'\xD7',
'\xC8',
'\xC7',
'\x83',
'\xD8',
'\xD1',
'\xC4',
'\xD8',
'\xD7',
'\xCB',
'\xD2',
'\xD5',
'\xCC',
'\xDD',
'\xC8',
'\xC7',
'\x83',
'\xC6',
'\xCB',
'\xC4',
'\xD1',
'\xCA',
'\xC8',
'\xD6',
'\x83',
'\xD7',
'\xD2',
'\x83',
'\xB4',
'\xB7',
'\xB6',
'\x91',
'\x83',
'\xA6',
'\xCB',
'\xC4',
'\xD1',
'\xCA',
'\xC8',
'\x83',
'\xC4',
'\xCF',
'\xCF',
'\x83',
'\xD8',
'\xD6',
'\xC8',
'\xD5',
'\x83',
'\xC4',
'\xC6',
'\xC6',
'\xD2',
'\xD8',
'\xD1',
'\xD7',
'\x83',
'\xD3',
'\xC4',
'\xD6',
'\xD6',
'\xDA',
'\xD2',
'\xD5',
'\xC7',
'\xD6',
'\x83',
'\xCC',
'\xD0',
'\xD0',
'\xC8',
'\xC7',
'\xCC',
'\xC4',
'\xD7',
'\xC8',
'\xCF',
'\xDC',
'\x83',
'\xC4',
'\xD1',
'\xC7',
'\x83',
'\xD8',
'\xD3',
'\xC7',
'\xC4',
'\xD7',
'\xC8',
'\x83',
'\xB1',
'\xA4',
'\xB6',
'\x83',
'\xC9',
'\xCC',
'\xD5',
'\xD0',
'\xDA',
'\xC4',
'\xD5',
'\xC8',
'\x83',
'\xC4',
'\xD1',
'\xC7',
'\x83',
'\xC4',
'\xD3',
'\xD3',
'\xCF',
'\xCC',
'\xC6',
'\xC4',
'\xD7',
'\xCC',
'\xD2',
'\xD1',
'\xD6',
'\x83',
'\xD7',
'\xD2',
'\x83',
'\xD7',
'\xCB',
'\xC8',
'\x83',
'\xCF',
'\xC4',
'\xD7',
'\xC8',
'\xD6',
'\xD7',
'\x83',
'\xD9',
'\xC8',
'\xD5',
'\xD6',
'\xCC',
'\xD2',
'\xD1',
'\x91',
'\0',
'\0'
}; // weak
char qpkg_conf[32] =
{
'\x92',
'\xC8',
'\xD7',
'\xC6',
'\x92',
'\xC6',
'\xD2',
'\xD1',
'\xC9',
'\xCC',
'\xCA',
'\x92',
'\xD4',
'\xD3',
'\xCE',
'\xCA',
'\x91',
'\xC6',
'\xD2',
'\xD1',
'\xC9',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0'
}; // weak
char cmd_mount_flash_config[64] =
{
'\x92',
'\xC8',
'\xD7',
'\xC6',
'\x92',
'\xCC',
'\xD1',
'\xCC',
'\xD7',
'\x91',
'\xC7',
'\x92',
'\xCC',
'\xD1',
'\xCC',
'\xD7',
'\xC2',
'\xC7',
'\xCC',
'\xD6',
'\xCE',
'\x91',
'\xD6',
'\xCB',
'\x83',
'\xD0',
'\xD2',
'\xD8',
'\xD1',
'\xD7',
'\xC2',
'\xC9',
'\xCF',
'\xC4',
'\xD6',
'\xCB',
'\xC2',
'\xC6',
'\xD2',
'\xD1',
'\xC9',
'\xCC',
'\xCA',
'\x83',
'\xA1',
'\x92',
'\xC7',
'\xC8',
'\xD9',
'\x92',
'\xD1',
'\xD8',
'\xCF',
'\xCF',
'\x83',
'\x95',
'\xA1',
'\x89',
'\x94',
'\0',
'\0',
'\0',
'\0',
'\0'
}; // weak
char cmd_unmount_flash_config[64] =
{
'\x92',
'\xC8',
'\xD7',
'\xC6',
'\x92',
'\xCC',
'\xD1',
'\xCC',
'\xD7',
'\x91',
'\xC7',
'\x92',
'\xCC',
'\xD1',
'\xCC',
'\xD7',
'\xC2',
'\xC7',
'\xCC',
'\xD6',
'\xCE',
'\x91',
'\xD6',
'\xCB',
'\x83',
'\xD8',
'\xD0',
'\xD2',
'\xD8',
'\xD1',
'\xD7',
'\xC2',
'\xC9',
'\xCF',
'\xC4',
'\xD6',
'\xCB',
'\xC2',
'\xC6',
'\xD2',
'\xD1',
'\xC9',
'\xCC',
'\xCA',
'\x83',
'\xA1',
'\x92',
'\xC7',
'\xC8',
'\xD9',
'\x92',
'\xD1',
'\xD8',
'\xCF',
'\xCF',
'\x83',
'\x95',
'\xA1',
'\x89',
'\x94',
'\0',
'\0',
'\0',
'\0'
}; // weak
char flash_config_mount_path[32] =
{
'\x92',
'\xD7',
'\xD0',
'\xD3',
'\x92',
'\xD1',
'\xC4',
'\xD6',
'\xC6',
'\xD2',
'\xD1',
'\xC9',
'\xCC',
'\xCA',
'\xC2',
'\xD7',
'\xD0',
'\xD3',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0'
}; // weak
char cmd_check_flash_config_mount[56] =
{
'\x92',
'\xC5',
'\xCC',
'\xD1',
'\x92',
'\xD0',
'\xD2',
'\xD8',
'\xD1',
'\xD7',
'\xDF',
'\x92',
'\xC5',
'\xCC',
'\xD1',
'\x92',
'\xCA',
'\xD5',
'\xC8',
'\xD3',
'\x83',
'\x92',
'\xD7',
'\xD0',
'\xD3',
'\x92',
'\xD1',
'\xC4',
'\xD6',
'\xC6',
'\xD2',
'\xD1',
'\xC9',
'\xCC',
'\xCA',
'\xC2',
'\xD7',
'\xD0',
'\xD3',
'\x83',
'\xA1',
'\x92',
'\xC7',
'\xC8',
'\xD9',
'\x92',
'\xD1',
'\xD8',
'\xCF',
'\xCF',
'\x83',
'\x95',
'\xA1',
'\x89',
'\x94',
'\0'
}; // weak
char autorun_sh[24] =
{
'\xC4',
'\xD8',
'\xD7',
'\xD2',
'\xD5',
'\xD8',
'\xD1',
'\x91',
'\xD6',
'\xCB',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0'
}; // weak
char runonce[32] =
{
'\x92',
'\xC8',
'\xD7',
'\xC6',
'\x92',
'\xC6',
'\xD2',
'\xD1',
'\xC9',
'\xCC',
'\xCA',
'\x92',
'\xD5',
'\xD8',
'\xD1',
'\xD2',
'\xD1',
'\xC6',
'\xC8',
'\x91',
'\xD6',
'\xCB',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0'
}; // weak
char g_debug_file[24] =
{
'\x92',
'\xD7',
'\xD0',
'\xD3',
'\x92',
'\xD0',
'\xC4',
'\xCF',
'\xDA',
'\xC4',
'\xD5',
'\xC8',
'\xC2',
'\xC7',
'\xC8',
'\xD7',
'\xC8',
'\xC6',
'\xD7',
'\x91',
'\xCF',
'\xD2',
'\xCA',
'\0'
}; // weak
char quarantine_dir[24] =
{
'\x91',
'\xA3',
'\xD4',
'\xD8',
'\xC4',
'\xD5',
'\xC4',
'\xD1',
'\xD7',
'\xCC',
'\xD1',
'\xC8',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0'
}; // weak
char g_internal_log_file[32] =
{
'\x92',
'\xD0',
'\xD1',
'\xD7',
'\x92',
'\xAB',
'\xA7',
'\xA4',
'\xC2',
'\xB5',
'\xB2',
'\xB2',
'\xB7',
'\x92',
'\x91',
'\xCF',
'\xD2',
'\xCA',
'\xD6',
'\x92',
'\x91',
'\xD4',
'\xC7',
'\xC9',
'\xC7',
'\x91',
'\xCF',
'\xD2',
'\xCA',
'\0',
'\0',
'\0'
}; // weak
char update_pkg_dir[32] =
{
'\x92',
'\xD0',
'\xD1',
'\xD7',
'\x92',
'\xAB',
'\xA7',
'\xA4',
'\xC2',
'\xB5',
'\xB2',
'\xB2',
'\xB7',
'\x92',
'\xD8',
'\xD3',
'\xC7',
'\xC4',
'\xD7',
'\xC8',
'\xC2',
'\xD3',
'\xCE',
'\xCA',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0'
}; // weak
char qts_cust_bin[32] =
{
'\xB4',
'\xB7',
'\xB6',
'\xA6',
'\xD8',
'\xD6',
'\xD7',
'\xD2',
'\xD0',
'\xCC',
'\xDD',
'\xC4',
'\xD7',
'\xCC',
'\xD2',
'\xD1',
'\x91',
'\xC5',
'\xCC',
'\xD1',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0'
}; // weak
char qts_cust_sh[96] =
{
'\x92',
'\xC8',
'\xD7',
'\xC6',
'\x92',
'\xCC',
'\xD1',
'\xCC',
'\xD7',
'\x91',
'\xC7',
'\x92',
'\xB4',
'\xB7',
'\xB6',
'\xA6',
'\xD8',
'\xD6',
'\xD7',
'\xD2',
'\xD0',
'\xCC',
'\xDD',
'\xC4',
'\xD7',
'\xCC',
'\xD2',
'\xD1',
'\xC2',
'\xCC',
'\xD1',
'\xCC',
'\xD7',
'\x91',
'\xD6',
'\xCB',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0'
}; // weak
void *plain_keyword_download = &unk_2F430; // weak
void *plain_keyword_infect_script = &unk_2F441; // weak
void *plain_keyword_exec_decode = &unk_2F45D; // weak
void *plain_keyword_download_except = &unk_2F478; // weak
void *qnap_qpkg_dot_folder = &unk_2F4AE; // weak
void *g_system_file = &unk_2F502; // weak
_UNKNOWN file_type_infos; // weak
int dword_2371B0 = 5240; // weak
_UNKNOWN unk_2371C0; // weak
char *off_237280 = "ENG"; // weak
char *off_237288 = "en_US"; // weak
_UNKNOWN edata; // weak
_UNKNOWN unk_2373F7; // weak
char byte_237400; // weak
__int64 qword_237408; // weak
char dest[128]; // idb
char byte_2374C0[16]; // idb
char byte_2374D0[48]; // idb
int dword_237500; // weak
int dword_237504; // weak
pthread_mutex_t mutex; // idb
__int64 qword_237548; // weak
char byte_237550; // weak
__int64 qword_237558; // weak
char byte_237580[1024]; // idb
int dword_237980; // weak
unsigned int g_match_type; // weak
int g_match_keyword_count; // weak
unsigned int g_keyword_decrypted; // weak
unsigned int g_strings_decrypted; // weak
unsigned int found_special_malware; // weak
unsigned int notified_special_malware; // weak
FILE *g_debug_fp; // weak
__int64 qword_2379B0; // weak
size_t maxlen; // idb
regex_t preg; // idb
__int64 qword_237A00; // weak
pthread_rwlock_t rwlock; // idb
_QWORD g_match_keyword_list[1024]; // weak
// extern char **environ;
// extern struct _IO_FILE *stderr;
// extern _UNKNOWN _gmon_start__; weak
//----- (0000000000009B18) ----------------------------------------------------
void (__fastcall *init_proc())()
{
if ( &_gmon_start__ )
__gmon_start__();
sub_AEB0();
return sub_2DA00();
}
// 9DA0: using guessed type __int64 __gmon_start__(void);
//----- (0000000000009B40) ----------------------------------------------------
void sub_9B40()
{
JUMPOUT(0LL);
}
// 9B46: control flows out of bounds to 0
//----- (000000000000ADA0) ----------------------------------------------------
__int64 (**start())(void)
{
__int64 (**result)(void); // rax
result = (__int64 (**)(void))(&unk_2373F7 - &edata);
if ( (unsigned __int64)(&unk_2373F7 - &edata) > 0xE )
{
result = &ITM_deregisterTMCloneTable;
if ( &ITM_deregisterTMCloneTable )
return (__int64 (**)(void))ITM_deregisterTMCloneTable();
}
return result;
}
// 23AFA8: using guessed type __int64 ITM_deregisterTMCloneTable(void);
//----- (000000000000ADE0) ----------------------------------------------------
__int64 sub_ADE0()
{
return 0LL;
}
//----- (000000000000AE30) ----------------------------------------------------
void sub_AE30()
{
__int64 v0; // rax
unsigned __int64 i; // rbx
if ( !byte_237400 )
{
if ( &_cxa_finalize )
__cxa_finalize(off_236100);
v0 = qword_237408;
for ( i = &qword_235028 - qword_235018 - 1; qword_237408 < i; v0 = qword_237408 )
{
qword_237408 = v0 + 1;
((void (*)(void))qword_235018[v0 + 1])();
}
start();
byte_237400 = 1;
}
}
// 235018: using guessed type __int64 qword_235018[];
// 235028: using guessed type __int64 qword_235028;
// 237400: using guessed type char byte_237400;
// 237408: using guessed type __int64 qword_237408;
//----- (000000000000AEB0) ----------------------------------------------------
__int64 sub_AEB0()
{
if ( unk_235030 && &Jv_RegisterClasses )
Jv_RegisterClasses();
return sub_ADE0();
}
// 23AF70: using guessed type __int64 Jv_RegisterClasses(void);
//----- (000000000000AEE0) ----------------------------------------------------
_BYTE *__fastcall local_skip_white_space(_BYTE *a1)
{
while ( *a1 == 32 || *a1 == 9 )
++a1;
return a1;
}
//----- (000000000000AF13) ----------------------------------------------------
__int64 __fastcall local_conf_get_field(const char *a1, const char *a2, const char *a3, char *a4, int a5)
{
size_t v6; // rdx
size_t v7; // rax
char s[1032]; // [rsp+30h] [rbp-450h] BYREF
char *src; // [rsp+438h] [rbp-48h]
char *v13; // [rsp+440h] [rbp-40h]
char *s1; // [rsp+448h] [rbp-38h]
char *v15; // [rsp+450h] [rbp-30h]
FILE *stream; // [rsp+458h] [rbp-28h]
int v17; // [rsp+464h] [rbp-1Ch]
char *i; // [rsp+468h] [rbp-18h]
v17 = 0;
stream = fopen64(a1, "r");
if ( !stream )
return 0xFFFFFFFFLL;
if ( !a2 || !*a2 )
v17 = 1;
while ( 1 )
{
do
{
while ( 1 )
{
do
{
if ( feof(stream) )
{
LABEL_43:
fclose(stream);
return 4294967290LL;
}
}
while ( !fgets(s, 1024, stream) );
v15 = local_skip_white_space(s);
if ( *v15 != 91 )
break;
s1 = v15 + 1;
v6 = strlen(v15 + 1) - 1;
for ( i = &s1[v6]; *i != 93 && i != s1; --i )
;
if ( i == s1 )
{
if ( v17 )
goto LABEL_20;
}
else
{
if ( v17 )
goto LABEL_43;
*i = 0;
s1 = local_skip_white_space(s1);
s1 = (char *)stripe_white_space_tail(s1);
if ( !strcasecmp(s1, a2) )
v17 = 1;
}
}
}
while ( !v17 );
LABEL_20:
if ( *v15 != 59 && *v15 != 35 )
{
i = v15;
v13 = v15;
while ( *i != 61 && *i )
++i;
if ( *i )
{
*i = 0;
src = i + 1;
v13 = (char *)stripe_white_space_tail(v13);
if ( !strcasecmp(a3, v13) )
break;
}
}
}
src = local_skip_white_space(src);
src = (char *)stripe_white_space_tail(src);
v7 = strlen(src);
for ( i = &src[v7 - 1]; (*i == 10 || *i == 13) && i != src; --i )
;
if ( *i == 10 || *i == 13 )
*i = 0;
i[1] = 0;
if ( a4 )
{
if ( a5 >= strlen(src) + 1 )
{
strcpy(a4, src);
fclose(stream);
return 0LL;
}
else
{
fclose(stream);
return 0xFFFFFFFFLL;
}
}
else
{
fclose(stream);
return (unsigned int)strlen(src) + 1;
}
}
// A2C0: using guessed type __int64 __fastcall stripe_white_space_tail(_QWORD);
//----- (000000000000B27D) ----------------------------------------------------
__int64 __fastcall get_tag_size(int a1)
{
unsigned int v2; // [rsp+10h] [rbp-4h]
v2 = 0;
if ( a1 )
{
if ( a1 == 1 )
return 272;
}
else
{
return 528;
}
return v2;
}
//----- (000000000000B2AF) ----------------------------------------------------
__int64 __fastcall SHM_Debug_Section(const char *a1)
{
const char *v2; // [rsp+18h] [rbp-68h]
const char *v3; // [rsp+30h] [rbp-50h]
const char *v4; // [rsp+38h] [rbp-48h]
const char *v5; // [rsp+40h] [rbp-40h]
int v6; // [rsp+4Ch] [rbp-34h]
const char *shmaddr; // [rsp+58h] [rbp-28h]
int shmid; // [rsp+64h] [rbp-1Ch]
int v9; // [rsp+6Ch] [rbp-14h]
const char *v10; // [rsp+70h] [rbp-10h]
int i; // [rsp+7Ch] [rbp-4h]
shmid = shmget(9998, 0x1000uLL, 438);
if ( shmid == -1 )
return 0LL;
shmaddr = (const char *)shmat(shmid, 0LL, 0);
if ( shmaddr == (const char *)-1LL )
return 0LL;
v9 = 4;
v10 = shmaddr + 4;
for ( i = 0; *(_DWORD *)shmaddr > i; ++i )
{
v6 = v9 + 8;
if ( !strcasecmp(a1, &MAP[260 * i + 4]) )
{
switch ( i )
{
case 0:
v2 = &shmaddr[v6];
printf("[%s]->model = %s\n", a1, v2);
printf("[%s]->server name = %s\n", a1, v2 + 16);
printf("[%s]->server comment = %s\n", a1, v2 + 32);
printf("[%s]->version = %s\n", a1, v2 + 160);
printf("[%s]->number = %s\n", a1, v2 + 192);
printf("[%s]->build = %s\n", a1, v2 + 208);
printf("[%s]->timezone = %s\n", a1, v2 + 240);
printf("[%s]->daylight = %s\n", a1, v2 + 304);
printf("[%s]->workgroup = %s\n", a1, v2 + 368);
printf("[%s]->system_dev = %s\n", a1, v2 + 400);
printf("[%s]->wan_access = %s\n", a1, v2 + 416);
printf("[%s]->lan_access = %s\n", a1, v2 + 432);
printf("[%s]->codepage = %s\n", a1, v2 + 448);
printf("[%s]->test_mode = %s\n", a1, v2 + 464);
printf("[%s]->auto_create_raid = %s\n", a1, v2 + 480);
printf("[%s]->www_port = %s\n", a1, v2 + 496);
printf("[%s]->acl_enable = %s\n", a1, v2 + 512);
goto LABEL_21;
case 1:
v5 = &shmaddr[v6];
printf("[%s]->auto_init = %s\n", a1, v5 + 80);
printf("[%s]->check_on_boot = %s\n", a1, v5 + 64);
printf("[%s]->disk_number = %s\n", a1, v5 + 96);
printf("[%s]->drive 1 = %s\n", a1, v5);
printf("[%s]->drive 2 = %s\n", a1, v5 + 16);
printf("[%s]->drive 3 = %s\n", a1, v5 + 32);
printf("[%s]->drive 4 = %s\n", a1, v5 + 48);
printf("[%s]->auto_fix_error = %s\n", a1, v5 + 112);
printf("[%s]->support_raid5 = %s\n", a1, v5 + 128);
printf("[%s]->support_hotswap = %s\n", a1, v5 + 144);
printf("[%s]->drive dma 1 = %s\n", a1, v5 + 160);
printf("[%s]->drive dma 2 = %s\n", a1, v5 + 176);
printf("[%s]->drive dma 3 = %s\n", a1, v5 + 192);
printf("[%s]->drive dma 4 = %s\n", a1, v5 + 208);
printf("[%s]->support hotspare = %s\n", a1, v5 + 224);
printf("[%s]->nas debug = %s\n", a1, v5 + 240);
printf("[%s]->debug size = %s\n", a1, v5 + 256);
break;
case 2:
v4 = &shmaddr[v6];
printf("[%s]->system_started = %s\n", a1, v4);
printf("[%s]->lcd = %s\n", a1, v4 + 16);
printf("[%s]->reset_pwd = %s\n", a1, v4 + 32);
printf("[%s]->disk standby = %s\n", a1, v4 + 48);
printf("[%s]->buzzer = %s\n", a1, v4 + 64);
printf("[%s]->buzzerwarn = %s\n", a1, v4 + 80);
break;
case 3:
v3 = &shmaddr[v6];
printf("[%s]->enable = %s\n", a1, v3);
printf("[%s]->host = %s\n", a1, v3 + 16);
printf("[%s]->base = %s\n", a1, v3 + 80);
printf("[%s]->ssl = %s\n", a1, v3 + 336);
printf("[%s]->rootbindn = %s\n", a1, v3 + 352);
printf("[%s]->nss_base_passwd = %s\n", a1, v3 + 608);
printf("[%s]->nss_base_passwd = %s\n", a1, v3 + 608);
printf("[%s]->nss_base_shadow = %s\n", a1, v3 + 864);
printf("[%s]->nss_base_group = %s\n", a1, v3 + 1120);
printf("[%s]->encrypt = %s\n", a1, v3 + 1376);
printf("[%s]->server_type = %s\n", a1, v3 + 1392);
printf("[%s]->nss_map_uidNumber = %s\n", a1, v3 + 1408);
printf("[%s]->hash_uidNumber = %s\n", a1, v3 + 1424);
printf("[%s]->nss_map_gidNumber = %s\n", a1, v3 + 1440);
printf("[%s]->hash_gidNumber = %s\n", a1, v3 + 1456);
break;
case 4:
printf("[%s]->enable = %s\n", a1, &shmaddr[v6]);
printf("[%s]->debug = %s\n", a1, &shmaddr[v6 + 16]);
break;
case 5:
printf("[%s]->enable = %s\n", a1, &shmaddr[v6]);
printf("[%s]->home_link = %s\n", a1, &shmaddr[v6 + 16]);
break;
}
}
v9 += *((_DWORD *)v10 + 1) + 8;
v10 = &shmaddr[v9];
}
LABEL_21:
shmdt(shmaddr);
return 0LL;
}
//----- (000000000000BC39) ----------------------------------------------------
__int64 __fastcall shm_do_misc(const char *a1, char *a2, int a3, char *a4, int a5)
{
if ( !strcasecmp(a1, "System Started") )
{
if ( a5 == 1 )
{
if ( a3 < strlen(a4) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x10 )
return 0xFFFFFFFFLL;
snprintf(a4, 0x10uLL, "%s", a2);
}
}
else if ( !strcasecmp(a1, "LCD Panel Setting Control") )
{
if ( a5 == 1 )
{
if ( a3 < strlen(a4 + 16) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4 + 16);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x10 )
return 0xFFFFFFFFLL;
snprintf(a4 + 16, 0x10uLL, "%s", a2);
}
}
else if ( !strcasecmp(a1, "Reset Password Switch") )
{
if ( a5 == 1 )
{
if ( a3 < strlen(a4 + 32) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4 + 32);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x10 )
return 0xFFFFFFFFLL;
snprintf(a4 + 32, 0x10uLL, "%s", a2);
}
}
else if ( !strcasecmp(a1, "Disk StandBy Timeout") )
{
if ( a5 == 1 )
{
if ( a3 < strlen(a4 + 48) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4 + 48);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x10 )
return 0xFFFFFFFFLL;
snprintf(a4 + 48, 0x10uLL, "%s", a2);
}
}
else if ( !strcasecmp(a1, "Buzzer") )
{
if ( a5 == 1 )
{
if ( a3 < strlen(a4 + 64) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4 + 64);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x10 )
return 0xFFFFFFFFLL;
snprintf(a4 + 64, 0x10uLL, "%s", a2);
}
}
else
{
if ( strcasecmp(a1, "Buzzer Warning Enable") )
return 4294967290LL;
if ( a5 == 1 )
{
if ( a3 < strlen(a4 + 80) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4 + 80);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x10 )
return 0xFFFFFFFFLL;
snprintf(a4 + 80, 0x10uLL, "%s", a2);
}
}
return 0LL;
}
//----- (000000000000C11A) ----------------------------------------------------
__int64 __fastcall shm_do_storage(const char *a1, char *a2, int a3, char *a4, int a5)
{
if ( !strcasecmp(a1, "Auto Init") )
{
if ( a5 == 1 )
{
if ( a3 < strlen(a4 + 80) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4 + 80);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x10 )
return 0xFFFFFFFFLL;
snprintf(a4 + 80, 0x10uLL, "%s", a2);
}
}
else if ( !strcasecmp(a1, "Disk Drive Number") )
{
if ( a5 == 1 )
{
if ( a3 < strlen(a4 + 96) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4 + 96);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x10 )
return 0xFFFFFFFFLL;
snprintf(a4 + 96, 0x10uLL, "%s", a2);
}
}
else if ( !strcasecmp(a1, "Drive 1") )
{
if ( a5 == 1 )
{
if ( a3 < strlen(a4) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x10 )
return 0xFFFFFFFFLL;
snprintf(a4, 0x10uLL, "%s", a2);
}
}
else if ( !strcasecmp(a1, "Drive 2") )
{
if ( a5 == 1 )
{
if ( a3 < strlen(a4 + 16) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4 + 16);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x10 )
return 0xFFFFFFFFLL;
snprintf(a4 + 16, 0x10uLL, "%s", a2);
}
}
else if ( !strcasecmp(a1, "Drive 3") )
{
if ( a5 == 1 )
{
if ( a3 < strlen(a4 + 32) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4 + 32);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x10 )
return 0xFFFFFFFFLL;
snprintf(a4 + 32, 0x10uLL, "%s", a2);
}
}
else if ( !strcasecmp(a1, "Drive 4") )
{
if ( a5 == 1 )
{
if ( a3 < strlen(a4 + 48) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4 + 48);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x10 )
return 0xFFFFFFFFLL;
snprintf(a4 + 48, 0x10uLL, "%s", a2);
}
}
else if ( !strcasecmp(a1, "Disk Check On Boot") )
{
if ( a5 == 1 )
{
if ( a3 < strlen(a4 + 64) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4 + 64);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x10 )
return 0xFFFFFFFFLL;
snprintf(a4 + 64, 0x10uLL, "%s", a2);
}
}
else if ( !strcasecmp(a1, "Auto Fix Disk Check Errors") )
{
if ( a5 == 1 )
{
if ( a3 < strlen(a4 + 112) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4 + 112);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x10 )
return 0xFFFFFFFFLL;
snprintf(a4 + 112, 0x10uLL, "%s", a2);
}
}
else if ( !strcasecmp(a1, "Support Raid 5") )
{
if ( a5 == 1 )
{
if ( a3 < strlen(a4 + 128) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4 + 128);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x10 )
return 0xFFFFFFFFLL;
snprintf(a4 + 128, 0x10uLL, "%s", a2);
}
}
else if ( !strcasecmp(a1, "Support HOTSWAP") )
{
if ( a5 == 1 )
{
if ( a3 < strlen(a4 + 144) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4 + 144);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x10 )
return 0xFFFFFFFFLL;
snprintf(a4 + 144, 0x10uLL, "%s", a2);
}
}
else if ( !strcasecmp(a1, "Drive 1 DMA") )
{
if ( a5 == 1 )
{
if ( a3 < strlen(a4 + 160) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4 + 160);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x10 )
return 0xFFFFFFFFLL;
snprintf(a4 + 160, 0x10uLL, "%s", a2);
}
}
else if ( !strcasecmp(a1, "Drive 2 DMA") )
{
if ( a5 == 1 )
{
if ( a3 < strlen(a4 + 176) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4 + 176);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x10 )
return 0xFFFFFFFFLL;
snprintf(a4 + 176, 0x10uLL, "%s", a2);
}
}
else if ( !strcasecmp(a1, "Drive 3 DMA") )
{
if ( a5 == 1 )
{
if ( a3 < strlen(a4 + 192) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4 + 192);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x10 )
return 0xFFFFFFFFLL;
snprintf(a4 + 192, 0x10uLL, "%s", a2);
}
}
else if ( !strcasecmp(a1, "Drive 4 DMA") )
{
if ( a5 == 1 )
{
if ( a3 < strlen(a4 + 208) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4 + 208);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x10 )
return 0xFFFFFFFFLL;
snprintf(a4 + 208, 0x10uLL, "%s", a2);
}
}
else if ( !strcasecmp(a1, "Support HOT Spare") )
{
if ( a5 == 1 )
{
if ( a3 < strlen(a4 + 224) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4 + 224);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x10 )
return 0xFFFFFFFFLL;
snprintf(a4 + 224, 0x10uLL, "%s", a2);
}
}
else if ( !strcasecmp(a1, "NAS DEBUG") )
{
if ( a5 == 1 )
{
if ( a3 < strlen(a4 + 240) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4 + 240);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x10 )
return 0xFFFFFFFFLL;
snprintf(a4 + 240, 0x10uLL, "%s", a2);
}
}
else
{
if ( strcasecmp(a1, "NAS DEBUG DISK SIZE") )
return 4294967290LL;
if ( a5 == 1 )
{
if ( a3 < strlen(a4 + 256) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4 + 256);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x10 )
return 0xFFFFFFFFLL;
snprintf(a4 + 256, 0x10uLL, "%s", a2);
}
}
return 0LL;
}
//----- (000000000000CF05) ----------------------------------------------------
__int64 __fastcall shm_do_system(const char *a1, char *a2, int a3, char *a4, int a5)
{
if ( !strcasecmp(a1, "Model") )
{
if ( a5 == 1 )
{
if ( a3 < strlen(a4) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x10 )
return 0xFFFFFFFFLL;
snprintf(a4, 0x10uLL, "%s", a2);
}
}
else if ( !strcasecmp(a1, "Server Comment") )
{
if ( a5 == 1 )
{
if ( a3 < strlen(a4 + 32) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4 + 32);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x80 )
return 0xFFFFFFFFLL;
snprintf(a4 + 32, 0x80uLL, "%s", a2);
}
}
else if ( !strcasecmp(a1, "Server Name") )
{
if ( a5 == 1 )
{
if ( a3 < strlen(a4 + 16) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4 + 16);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x10 )
return 0xFFFFFFFFLL;
snprintf(a4 + 16, 0x10uLL, "%s", a2);
}
}
else if ( !strcasecmp(a1, "Version") )
{
if ( a5 == 1 )
{
if ( a3 < strlen(a4 + 160) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4 + 160);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x20 )
return 0xFFFFFFFFLL;
snprintf(a4 + 160, 0x20uLL, "%s", a2);
}
}
else if ( !strcasecmp(a1, "Number") )
{
if ( a5 == 1 )
{
if ( a3 < strlen(a4 + 192) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4 + 192);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x10 )
return 0xFFFFFFFFLL;
snprintf(a4 + 192, 0x10uLL, "%s", a2);
}
}
else if ( !strcasecmp(a1, "Build Number") )
{
if ( a5 == 1 )
{
if ( a3 < strlen(a4 + 208) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4 + 208);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x20 )
return 0xFFFFFFFFLL;
snprintf(a4 + 208, 0x20uLL, "%s", a2);
}
}
else if ( !strcasecmp(a1, "Time Zone") )
{
if ( a5 == 1 )
{
if ( a3 < strlen(a4 + 240) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4 + 240);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x40 )
return 0xFFFFFFFFLL;
snprintf(a4 + 240, 0x40uLL, "%s", a2);
}
}
else if ( !strcasecmp(a1, "Enable Daylight Saving Time") )
{
if ( a5 == 1 )
{
if ( a3 < strlen(a4 + 304) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4 + 304);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x40 )
return 0xFFFFFFFFLL;
snprintf(a4 + 304, 0x40uLL, "%s", a2);
}
}
else if ( !strcasecmp(a1, "Workgroup") )
{
if ( a5 == 1 )
{
if ( a3 < strlen(a4 + 368) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4 + 368);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x20 )
return 0xFFFFFFFFLL;
snprintf(a4 + 368, 0x20uLL, "%s", a2);
}
}
else if ( !strcasecmp(a1, "Code Page") )
{
if ( a5 == 1 )
{
if ( a3 < strlen(a4 + 448) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4 + 448);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x10 )
return 0xFFFFFFFFLL;
snprintf(a4 + 448, 0x10uLL, "%s", a2);
}
}
else if ( !strcasecmp(a1, "System Device") )
{
if ( a5 == 1 )
{
if ( a3 < strlen(a4 + 400) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4 + 400);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x10 )
return 0xFFFFFFFFLL;
snprintf(a4 + 400, 0x10uLL, "%s", a2);
}
}
else if ( !strcasecmp(a1, "Test Mode") )
{
if ( a5 == 1 )
{
if ( a3 < strlen(a4 + 464) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4 + 464);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x10 )
return 0xFFFFFFFFLL;
snprintf(a4 + 464, 0x10uLL, "%s", a2);
}
}
else if ( !strcasecmp(a1, "Auto Create Raid") )
{
if ( a5 == 1 )
{
if ( a3 < strlen(a4 + 480) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4 + 480);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x10 )
return 0xFFFFFFFFLL;
snprintf(a4 + 480, 0x10uLL, "%s", a2);
}
}
else if ( !strcasecmp(a1, "Wan Access") )
{
if ( a5 == 1 )
{
if ( a3 < strlen(a4 + 416) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4 + 416);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x10 )
return 0xFFFFFFFFLL;
snprintf(a4 + 416, 0x10uLL, "%s", a2);
}
}
else if ( !strcasecmp(a1, "Lan Access") )
{
if ( a5 == 1 )
{
if ( a3 < strlen(a4 + 432) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4 + 432);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x10 )
return 0xFFFFFFFFLL;
snprintf(a4 + 432, 0x10uLL, "%s", a2);
}
}
else if ( !strcasecmp(a1, "Web Access Port") )
{
if ( a5 == 1 )
{
if ( a3 < strlen(a4 + 496) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4 + 496);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x10 )
return 0xFFFFFFFFLL;
snprintf(a4 + 496, 0x10uLL, "%s", a2);
}
}
else
{
if ( strcasecmp(a1, "ACL Enable") )
return 4294967290LL;
if ( a5 == 1 )
{
if ( a3 < strlen(a4 + 512) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4 + 512);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x10 )
return 0xFFFFFFFFLL;
snprintf(a4 + 512, 0x10uLL, "%s", a2);
}
}
return 0LL;
}
//----- (000000000000DD1C) ----------------------------------------------------
__int64 __fastcall sub_DD1C(const char *a1, char *a2, int a3, char *a4, int a5)
{
if ( !strcasecmp(a1, "Enable") )
{
if ( a5 == 1 )
{
if ( a3 < strlen(a4) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x10 )
return 0xFFFFFFFFLL;
snprintf(a4, 0x10uLL, "%s", a2);
}
}
else if ( !strcasecmp(a1, "host") )
{
if ( a5 == 1 )
{
if ( a3 < strlen(a4 + 16) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4 + 16);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x40 )
return 0xFFFFFFFFLL;
snprintf(a4 + 16, 0x40uLL, "%s", a2);
}
}
else if ( !strcasecmp(a1, "base") )
{
if ( a5 == 1 )
{
if ( a3 < strlen(a4 + 80) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4 + 80);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x100 )
return 0xFFFFFFFFLL;
snprintf(a4 + 80, 0x100uLL, "%s", a2);
}
}
else if ( !strcasecmp(a1, "ssl") )
{
if ( a5 == 1 )
{
if ( a3 < strlen(a4 + 336) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4 + 336);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x10 )
return 0xFFFFFFFFLL;
snprintf(a4 + 336, 0x10uLL, "%s", a2);
}
}
else if ( !strcasecmp(a1, "rootbindn") )
{
if ( a5 == 1 )
{
if ( a3 < strlen(a4 + 352) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4 + 352);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x100 )
return 0xFFFFFFFFLL;
snprintf(a4 + 352, 0x100uLL, "%s", a2);
}
}
else if ( !strcasecmp(a1, "nss_base_passwd") )
{
if ( a5 == 1 )
{
if ( a3 < strlen(a4 + 608) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4 + 608);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x100 )
return 0xFFFFFFFFLL;
snprintf(a4 + 608, 0x100uLL, "%s", a2);
}
}
else if ( !strcasecmp(a1, "nss_base_shadow") )
{
if ( a5 == 1 )
{
if ( a3 < strlen(a4 + 864) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4 + 864);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x100 )
return 0xFFFFFFFFLL;
snprintf(a4 + 864, 0x100uLL, "%s", a2);
}
}
else if ( !strcasecmp(a1, "nss_base_group") )
{
if ( a5 == 1 )
{
if ( a3 < strlen(a4 + 1120) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4 + 1120);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x100 )
return 0xFFFFFFFFLL;
snprintf(a4 + 1120, 0x100uLL, "%s", a2);
}
}
else if ( !strcasecmp(a1, "encrypt") )
{
if ( a5 == 1 )
{
if ( a3 < strlen(a4 + 1376) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4 + 1376);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x10 )
return 0xFFFFFFFFLL;
snprintf(a4 + 1376, 0x10uLL, "%s", a2);
}
}
else if ( !strcasecmp(a1, "LDAP Server Type") )
{
if ( a5 == 1 )
{
if ( a3 < strlen(a4 + 1392) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4 + 1392);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x10 )
return 0xFFFFFFFFLL;
snprintf(a4 + 1392, 0x10uLL, "%s", a2);
}
}
else if ( !strcasecmp(a1, "nss_map_uidNumber") )
{
if ( a5 == 1 )
{
if ( a3 < strlen(a4 + 1408) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4 + 1408);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x10 )
return 0xFFFFFFFFLL;
snprintf(a4 + 1408, 0x10uLL, "%s", a2);
}
}
else if ( !strcasecmp(a1, "hash_uidNumber") )
{
if ( a5 == 1 )
{
if ( a3 < strlen(a4 + 1424) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4 + 1424);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x10 )
return 0xFFFFFFFFLL;
snprintf(a4 + 1424, 0x10uLL, "%s", a2);
}
}
else if ( !strcasecmp(a1, "nss_map_gidNumber") )
{
if ( a5 == 1 )
{
if ( a3 < strlen(a4 + 1440) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4 + 1440);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x10 )
return 0xFFFFFFFFLL;
snprintf(a4 + 1440, 0x10uLL, "%s", a2);
}
}
else
{
if ( strcasecmp(a1, "hash_gidNumber") )
return 4294967290LL;
if ( a5 == 1 )
{
if ( a3 < strlen(a4 + 1456) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4 + 1456);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x10 )
return 0xFFFFFFFFLL;
snprintf(a4 + 1456, 0x10uLL, "%s", a2);
}
}
return 0LL;
}
//----- (000000000000E8BF) ----------------------------------------------------
__int64 __fastcall sub_E8BF(const char *a1, char *a2, int a3, char *a4, int a5)
{
if ( !strcasecmp(a1, "Enable") )
{
if ( a5 == 1 )
{
if ( a3 < strlen(a4) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x10 )
return 0xFFFFFFFFLL;
snprintf(a4, 0x10uLL, "%s", a2);
}
}
else
{
if ( strcasecmp(a1, "debug") )
return 4294967290LL;
if ( a5 == 1 )
{
if ( a3 < strlen(a4 + 16) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4 + 16);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x10 )
return 0xFFFFFFFFLL;
snprintf(a4 + 16, 0x10uLL, "%s", a2);
}
}
return 0LL;
}
//----- (000000000000EA70) ----------------------------------------------------
__int64 __fastcall sub_EA70(const char *a1, char *a2, int a3, char *a4, int a5)
{
if ( !strcasecmp(a1, "Enable") )
{
if ( a5 == 1 )
{
if ( a3 < strlen(a4) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x10 )
return 0xFFFFFFFFLL;
snprintf(a4, 0x10uLL, "%s", a2);
}
}
else
{
if ( strcasecmp(a1, "HomeLink") )
return 4294967290LL;
if ( a5 == 1 )
{
if ( a3 < strlen(a4 + 16) + 1 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", a4 + 16);
}
else if ( a5 == 2 )
{
if ( strlen(a2) + 1 > 0x10 )
return 0xFFFFFFFFLL;
snprintf(a4 + 16, 0x10uLL, "%s", a2);
}
}
return 0LL;
}
//----- (000000000000EC21) ----------------------------------------------------
__int64 __fastcall SHM_Set_Field(const char *a1, const char *a2, char *a3)
{
int v5; // [rsp+58h] [rbp-38h]
int v6; // [rsp+5Ch] [rbp-34h]
char *shmaddr; // [rsp+68h] [rbp-28h]
int shmid; // [rsp+74h] [rbp-1Ch]
int v9; // [rsp+7Ch] [rbp-14h]
char *v10; // [rsp+80h] [rbp-10h]
int i; // [rsp+8Ch] [rbp-4h]
shmid = shmget(9998, 0x1000uLL, 438);
if ( shmid == -1 )
return 0LL;
shmaddr = (char *)shmat(shmid, 0LL, 0);
if ( shmaddr == (char *)-1LL )
return 0LL;
v9 = 4;
v10 = shmaddr + 4;
v6 = strlen(a3);
for ( i = 0; *(_DWORD *)shmaddr > i; ++i )
{
v5 = v9 + 8;
if ( !strcasecmp(a1, &MAP[260 * i + 4]) )
{
switch ( i )
{
case 0:
shm_do_system(a2, a3, v6, &shmaddr[v5], 2);
goto LABEL_21;
case 1:
shm_do_storage(a2, a3, v6, &shmaddr[v5], 2);
goto LABEL_21;
case 2:
shm_do_misc(a2, a3, v6, &shmaddr[v5], 2);
goto LABEL_21;
case 3:
sub_DD1C(a2, a3, v6, &shmaddr[v5], 2);
goto LABEL_21;
case 4:
sub_E8BF(a2, a3, v6, &shmaddr[v5], 2);
goto LABEL_21;
case 5:
sub_EA70(a2, a3, v6, &shmaddr[v5], 2);
goto LABEL_21;
}
}
v9 += *((_DWORD *)v10 + 1) + 8;
v10 = &shmaddr[v9];
}
LABEL_21:
shmdt(shmaddr);
return 0LL;
}
//----- (000000000000EF35) ----------------------------------------------------
__int64 __fastcall SHM_Get_Field(const char *a1, const char *a2, char *a3, int a4)
{
int v7; // [rsp+5Ch] [rbp-34h]
char *shmaddr; // [rsp+68h] [rbp-28h]
int shmid; // [rsp+70h] [rbp-20h]
int v10; // [rsp+74h] [rbp-1Ch]
int v11; // [rsp+78h] [rbp-18h]
int v12; // [rsp+7Ch] [rbp-14h]
char *v13; // [rsp+80h] [rbp-10h]
int i; // [rsp+8Ch] [rbp-4h]
v11 = 0;
shmid = shmget(9998, 0x1000uLL, 438);
if ( shmid == -1 )
return local_conf_get_field("/etc/config/uLinux.conf", a1, a2, a3, a4);
shmaddr = (char *)shmat(shmid, 0LL, 0);
if ( shmaddr == (char *)-1LL )
return local_conf_get_field("/etc/config/uLinux.conf", a1, a2, a3, a4);
v12 = 4;
v13 = shmaddr + 4;
for ( i = 0; ; ++i )
{
if ( *(_DWORD *)shmaddr <= i )
goto LABEL_26;
v7 = v12 + 8;
if ( !strcasecmp(a1, &MAP[260 * i + 4]) )
{
switch ( i )
{
case 0:
v10 = shm_do_system(a2, a3, a4, &shmaddr[v7], 1);
if ( v10 >= 0 )
{
v11 = 1;
goto LABEL_26;
}
goto LABEL_32;
case 1:
v10 = shm_do_storage(a2, a3, a4, &shmaddr[v7], 1);
if ( v10 >= 0 )
{
v11 = 1;
goto LABEL_26;
}
goto LABEL_32;
case 2:
v10 = shm_do_misc(a2, a3, a4, &shmaddr[v7], 1);
if ( v10 >= 0 )
{
v11 = 1;
goto LABEL_26;
}
goto LABEL_32;
case 3:
v10 = sub_DD1C(a2, a3, a4, &shmaddr[v7], 1);
if ( v10 >= 0 )
{
v11 = 1;
goto LABEL_26;
}
goto LABEL_32;
case 4:
v10 = sub_E8BF(a2, a3, a4, &shmaddr[v7], 1);
if ( v10 >= 0 )
{
v11 = 1;
goto LABEL_26;
}
LABEL_32:
shmdt(shmaddr);
if ( v10 == -6 )
return 4294967290LL;
else
return 0xFFFFFFFFLL;
}
if ( i == 5 )
break;
}
v12 += *((_DWORD *)v13 + 1) + 8;
v13 = &shmaddr[v12];
}
v10 = sub_EA70(a2, a3, a4, &shmaddr[v7], 1);
if ( v10 < 0 )
goto LABEL_32;
v11 = 1;
LABEL_26:
if ( v11 || !(unsigned int)local_conf_get_field("/etc/config/uLinux.conf", a1, a2, a3, a4) )
{
shmdt(shmaddr);
if ( *a3 )
return 0LL;
else
return 4294967290LL;
}
else
{
shmdt(shmaddr);
return 4294967290LL;
}
}
//----- (000000000000F322) ----------------------------------------------------
__int64 SHM_Destory()
{
int shmid; // [rsp+Ch] [rbp-4h]
shmid = shmget(9998, 0x1000uLL, 950);
if ( shmctl(shmid, 0, 0LL) != -1 )
return 1LL;
puts("SHM destroy fail...");
return 0LL;
}
// F322: using guessed type __int64 SHM_Destory();
//----- (000000000000F374) ----------------------------------------------------
__int64 SHM_Init()
{
const void *shmaddr; // [rsp+50h] [rbp-10h]
int shmid; // [rsp+5Ch] [rbp-4h]
shmid = shmget(9998, 0x1000uLL, 950);
if ( shmid == -1 )
return 0LL;
shmaddr = shmat(shmid, 0LL, 0);
if ( shmaddr == (const void *)-1LL )
return 0LL;
*(_DWORD *)shmaddr = 0;
++*(_DWORD *)shmaddr;
*((_DWORD *)shmaddr + 1) = 0;
*((_DWORD *)shmaddr + 2) = 528;
local_conf_get_field("/etc/config/uLinux.conf", "System", "Model", (char *)shmaddr + 12, 64);
local_conf_get_field("/etc/config/uLinux.conf", "System", "Server Name", (char *)shmaddr + 28, 64);
local_conf_get_field("/etc/config/uLinux.conf", "System", "Server Comment", (char *)shmaddr + 44, 64);
local_conf_get_field("/etc/config/uLinux.conf", "System", "Version", (char *)shmaddr + 172, 64);
local_conf_get_field("/etc/config/uLinux.conf", "System", "Number", (char *)shmaddr + 204, 16);
local_conf_get_field("/etc/config/uLinux.conf", "System", "Build Number", (char *)shmaddr + 220, 64);
local_conf_get_field("/etc/config/uLinux.conf", "System", "Time Zone", (char *)shmaddr + 252, 64);
local_conf_get_field("/etc/config/uLinux.conf", "System", "Enable Daylight Saving Time", (char *)shmaddr + 316, 64);
local_conf_get_field("/etc/config/uLinux.conf", "System", "Workgroup", (char *)shmaddr + 380, 64);
local_conf_get_field("/etc/config/uLinux.conf", "System", "Code Page", (char *)shmaddr + 460, 64);
if ( !*((_BYTE *)shmaddr + 460) )
*((_DWORD *)shmaddr + 115) = 3617588;
local_conf_get_field("/etc/config/uLinux.conf", "System", "System Device", (char *)shmaddr + 412, 16);
local_conf_get_field("/etc/config/uLinux.conf", "System", "Test Mode", (char *)shmaddr + 476, 16);
local_conf_get_field("/etc/config/uLinux.conf", "System", "Auto Create Mode", (char *)shmaddr + 492, 16);
local_conf_get_field("/etc/config/uLinux.conf", "System", "Wan Access", (char *)shmaddr + 428, 16);
local_conf_get_field("/etc/config/uLinux.conf", "System", "Lan Access", (char *)shmaddr + 444, 16);
local_conf_get_field("/etc/config/uLinux.conf", "System", "Web Access Port", (char *)shmaddr + 508, 16);
local_conf_get_field("/etc/config/uLinux.conf", "System", "ACL Enable", (char *)shmaddr + 524, 16);
++*(_DWORD *)shmaddr;
*((_DWORD *)shmaddr + 135) = 1;
*((_DWORD *)shmaddr + 136) = 272;
local_conf_get_field("/etc/config/uLinux.conf", "Storage", "Auto Init", (char *)shmaddr + 628, 16);
local_conf_get_field("/etc/config/uLinux.conf", "Storage", "Disk Drive Number", (char *)shmaddr + 644, 16);
local_conf_get_field("/etc/config/uLinux.conf", "Storage", "Drive 1", (char *)shmaddr + 548, 16);
local_conf_get_field("/etc/config/uLinux.conf", "Storage", "Drive 2", (char *)shmaddr + 564, 16);
local_conf_get_field("/etc/config/uLinux.conf", "Storage", "Drive 3", (char *)shmaddr + 580, 16);
local_conf_get_field("/etc/config/uLinux.conf", "Storage", "Drive 4", (char *)shmaddr + 596, 16);
local_conf_get_field("/etc/config/uLinux.conf", "Storage", "Disk Check On Boot", (char *)shmaddr + 612, 16);
local_conf_get_field("/etc/config/uLinux.conf", "Storage", "Auto Fix Disk Check Errors", (char *)shmaddr + 660, 16);
local_conf_get_field("/etc/config/uLinux.conf", "Storage", "Support Raid 5", (char *)shmaddr + 676, 16);
local_conf_get_field("/etc/config/uLinux.conf", "Storage", "Support HOTSWAP", (char *)shmaddr + 692, 16);
local_conf_get_field("/etc/config/uLinux.conf", "Storage", "Drive 1 DMA", (char *)shmaddr + 708, 16);
local_conf_get_field("/etc/config/uLinux.conf", "Storage", "Drive 2 DMA", (char *)shmaddr + 724, 16);
local_conf_get_field("/etc/config/uLinux.conf", "Storage", "Drive 3 DMA", (char *)shmaddr + 740, 16);
local_conf_get_field("/etc/config/uLinux.conf", "Storage", "Drive 4 DMA", (char *)shmaddr + 756, 16);
local_conf_get_field("/etc/config/uLinux.conf", "Storage", "Support HOT Spare", (char *)shmaddr + 772, 16);
local_conf_get_field("/etc/config/uLinux.conf", "Storage", "NAS DEBUG", (char *)shmaddr + 788, 16);
local_conf_get_field("/etc/config/uLinux.conf", "Storage", "NAS DEBUG DISK SIZE", (char *)shmaddr + 804, 16);
++*(_DWORD *)shmaddr;
*((_DWORD *)shmaddr + 205) = 2;
*((_DWORD *)shmaddr + 206) = 96;
local_conf_get_field("/etc/config/uLinux.conf", "Misc", "System Started", (char *)shmaddr + 828, 16);
local_conf_get_field("/etc/config/uLinux.conf", "Misc", "LCD Panel Setting Control", (char *)shmaddr + 844, 16);
local_conf_get_field("/etc/config/uLinux.conf", "Misc", "Reset Password Switch", (char *)shmaddr + 860, 16);
local_conf_get_field("/etc/config/uLinux.conf", "Misc", "Disk StandBy Timeout", (char *)shmaddr + 876, 16);
local_conf_get_field("/etc/config/uLinux.conf", "Misc", "Buzzer", (char *)shmaddr + 892, 16);
local_conf_get_field("/etc/config/uLinux.conf", "Misc", "Buzzer Warning Enable", (char *)shmaddr + 908, 16);
++*(_DWORD *)shmaddr;
*((_DWORD *)shmaddr + 231) = 3;
*((_DWORD *)shmaddr + 232) = 1472;
local_conf_get_field("/etc/config/uLinux.conf", "LDAP", "Enable", (char *)shmaddr + 932, 16);
local_conf_get_field("/etc/config/uLinux.conf", "LDAP", "host", (char *)shmaddr + 948, 64);
local_conf_get_field("/etc/config/uLinux.conf", "LDAP", "base", (char *)shmaddr + 1012, 256);
local_conf_get_field("/etc/config/uLinux.conf", "LDAP", "ssl", (char *)shmaddr + 1268, 16);
local_conf_get_field("/etc/config/uLinux.conf", "LDAP", "rootbindn", (char *)shmaddr + 1284, 256);
local_conf_get_field("/etc/config/uLinux.conf", "LDAP", "nss_base_passwd", (char *)shmaddr + 1540, 256);
local_conf_get_field("/etc/config/uLinux.conf", "LDAP", "nss_base_shadow", (char *)shmaddr + 1796, 256);
local_conf_get_field("/etc/config/uLinux.conf", "LDAP", "nss_base_group", (char *)shmaddr + 2052, 256);
local_conf_get_field("/etc/config/uLinux.conf", "LDAP", "encrypt", (char *)shmaddr + 2308, 16);
local_conf_get_field("/etc/config/uLinux.conf", "LDAP", "LDAP Server Type", (char *)shmaddr + 2324, 16);
local_conf_get_field("/etc/config/uLinux.conf", "LDAP", "nss_map_uidNumber", (char *)shmaddr + 2340, 16);
local_conf_get_field("/etc/config/uLinux.conf", "LDAP", "hash_uidNumber", (char *)shmaddr + 2356, 16);
local_conf_get_field("/etc/config/uLinux.conf", "LDAP", "nss_map_gidNumber", (char *)shmaddr + 2372, 16);
local_conf_get_field("/etc/config/uLinux.conf", "LDAP", "hash_gidNumber", (char *)shmaddr + 2388, 16);
++*(_DWORD *)shmaddr;
*((_DWORD *)shmaddr + 601) = 4;
*((_DWORD *)shmaddr + 602) = 32;
local_conf_get_field("/etc/config/uLinux.conf", "WebFS", "Enable", (char *)shmaddr + 2412, 16);
local_conf_get_field("/etc/config/uLinux.conf", "WebFS", "debug", (char *)shmaddr + 2428, 16);
if ( !*((_BYTE *)shmaddr + 2428) )
*((_WORD *)shmaddr + 1214) = 48;
++*(_DWORD *)shmaddr;
*((_DWORD *)shmaddr + 611) = 5;
*((_DWORD *)shmaddr + 612) = 32;
local_conf_get_field("/etc/config/uLinux.conf", "Samba", "Enable", (char *)shmaddr + 2452, 16);
local_conf_get_field("/etc/config/uLinux.conf", "Samba", "HomeLink", (char *)shmaddr + 2468, 16);
shmdt(shmaddr);
return 0LL;
}
// F374: using guessed type __int64 SHM_Init();
//----- (000000000001002E) ----------------------------------------------------
__time_t sub_1002E()
{
struct timeval tv; // [rsp+0h] [rbp-20h] BYREF
gettimeofday(&tv, 0LL);
return tv.tv_sec;
}
//----- (0000000000010055) ----------------------------------------------------
int __fastcall sub_10055(const char *a1, const char *a2, int a3)
{
if ( a3 )
return strcasecmp(a1, a2);
else
return strcmp(a1, a2);
}
//----- (0000000000010098) ----------------------------------------------------
__int64 __fastcall sub_10098(key_t a1)
{
struct sembuf sops; // [rsp+10h] [rbp-10h] BYREF
int semid; // [rsp+1Ch] [rbp-4h]
semid = semget(a1, 1, 0);
if ( semid != -1 )
return (unsigned int)semid;
if ( *__errno_location() != 2 )
return 0xFFFFFFFFLL;
semid = semget(a1, 1, 1005);
if ( semid == -1 )
return 0xFFFFFFFFLL;
sops.sem_num = 0;
sops.sem_op = 1;
sops.sem_flg = 0;
if ( semop(semid, &sops, 1uLL) == -1 )
return 0xFFFFFFFFLL;
else
return (unsigned int)semid;
}
//----- (0000000000010135) ----------------------------------------------------
__int64 __fastcall sub_10135(int a1)
{
int i; // eax
struct sembuf sops; // [rsp+10h] [rbp-10h] BYREF
sops.sem_num = 0;
sops.sem_op = -1;
sops.sem_flg = 6144;
for ( i = semop(a1, &sops, 1uLL); i == -1; i = semop(a1, &sops, 1uLL) )
{
if ( *__errno_location() != 4 )
return 0xFFFFFFFFLL;
}
return 0LL;
}
//----- (0000000000010189) ----------------------------------------------------
__int64 __fastcall sub_10189(int a1)
{
struct sembuf sops; // [rsp+10h] [rbp-10h] BYREF
sops.sem_num = 0;
sops.sem_op = 1;
sops.sem_flg = 4096;
if ( semop(a1, &sops, 1uLL) == -1 )
return 0xFFFFFFFFLL;
else
return 0LL;
}
//----- (00000000000101CF) ----------------------------------------------------
__int64 __fastcall sub_101CF(int a1)
{
int i; // eax
struct sembuf sops; // [rsp+10h] [rbp-10h] BYREF
sops.sem_num = 0;
sops.sem_op = -1;
sops.sem_flg = 4096;
for ( i = semop(a1, &sops, 1uLL); i == -1; i = semop(a1, &sops, 1uLL) )
{
if ( *__errno_location() != 4 )
return 0xFFFFFFFFLL;
}
return 0LL;
}
//----- (0000000000010223) ----------------------------------------------------
int __fastcall sub_10223(const char *a1)
{
int result; // eax
result = open64(a1, 193, 384LL, 438LL);
if ( result >= 0 )
return close(result);
return result;
}
//----- (000000000001026B) ----------------------------------------------------
__int64 __fastcall sub_1026B(const char *a1, __int64 a2)
{
unsigned int v3; // eax
char resolved[512]; // [rsp+10h] [rbp-200h] BYREF
memset(resolved, 0, sizeof(resolved));
if ( !realpath(a1, resolved) )
return 0xFFFFFFFFLL;
v3 = strlen(resolved);
Base64_Encode(a2, resolved, v3);
return 0LL;
}
// A270: using guessed type __int64 __fastcall Base64_Encode(_QWORD, _QWORD, _QWORD);
//----- (00000000000102F1) ----------------------------------------------------
key_t __fastcall sub_102F1(const char *a1)
{
char dest[12]; // [rsp+10h] [rbp-D0h] BYREF
int v3; // [rsp+1Ch] [rbp-C4h]
char v4[112]; // [rsp+20h] [rbp-C0h] BYREF
char src[80]; // [rsp+90h] [rbp-50h] BYREF
memset(src, 0, 65);
if ( (int)sub_1026B(a1, (__int64)src) < 0 )
return -1;
strcpy(dest, "/var/lock/");
dest[11] = 0;
v3 = 0;
memset(v4, 0, sizeof(v4));
strcat(dest, src);
strcat(dest, ".lck");
sub_10223(dest);
return ftok(dest, 0);
}
//----- (00000000000103EB) ----------------------------------------------------
key_t __fastcall sub_103EB(const char *a1)
{
char dest[12]; // [rsp+10h] [rbp-D0h] BYREF
int v3; // [rsp+1Ch] [rbp-C4h]
char v4[112]; // [rsp+20h] [rbp-C0h] BYREF
char src[80]; // [rsp+90h] [rbp-50h] BYREF
memset(src, 0, 65);
if ( (int)sub_1026B(a1, (__int64)src) < 0 )
return -1;
strcpy(dest, "/var/lock/");
dest[11] = 0;
v3 = 0;
memset(v4, 0, sizeof(v4));
strcat(dest, src);
*(_QWORD *)&dest[strlen(dest)] = 0x6B636C2E64695FLL;
sub_10223(dest);
return ftok(dest, 0);
}
//----- (00000000000104E8) ----------------------------------------------------
char *sub_104E8()
{
char templatea[18]; // [rsp+10h] [rbp-90h] BYREF
__int16 v2; // [rsp+22h] [rbp-7Eh]
int v3; // [rsp+24h] [rbp-7Ch]
char v4[104]; // [rsp+28h] [rbp-78h] BYREF
int fd; // [rsp+9Ch] [rbp-4h]
strcpy(templatea, "/tmp/conf_XXXXXX");
templatea[17] = 0;
v2 = 0;
v3 = 0;
memset(v4, 0, sizeof(v4));
fd = mkstemp64(templatea);
if ( fd == -1 )
return 0LL;
close(fd);
strcpy(dest, templatea);
return dest;
}
//----- (0000000000010580) ----------------------------------------------------
_DWORD *__fastcall sub_10580(const char *a1)
{
char dest[8]; // [rsp+10h] [rbp-E0h] BYREF
char v3[120]; // [rsp+18h] [rbp-D8h] BYREF
char src[80]; // [rsp+90h] [rbp-60h] BYREF
_DWORD *v5; // [rsp+E0h] [rbp-10h]
int shmid; // [rsp+E8h] [rbp-8h]
key_t key; // [rsp+ECh] [rbp-4h]
memset(src, 0, 65);
if ( (int)sub_1026B(a1, (__int64)src) < 0 )
return 0LL;
*(_QWORD *)dest = 0x2F706D742FLL;
memset(v3, 0, sizeof(v3));
strcat(dest, src);
strcat(dest, ".stk");
sub_10223(dest);
key = ftok(dest, 0);
shmid = -1;
shmid = shmget(key, 0x58uLL, 950);
if ( shmid < 0 )
return 0LL;
v5 = 0LL;
v5 = shmat(shmid, 0LL, 0);
if ( v5 == (_DWORD *)-1LL )
return 0LL;
if ( v5[20] != 1 )
{
*(_QWORD *)v5 = 0LL;
v5[20] = 1;
v5[11] = -1;
v5[2] = -1;
}
return v5;
}
//----- (0000000000010707) ----------------------------------------------------
__int64 __fastcall sub_10707(const char *a1)
{
unsigned int v2; // [rsp+14h] [rbp-Ch]
_DWORD *shmaddr; // [rsp+18h] [rbp-8h]
shmaddr = sub_10580(a1);
if ( !shmaddr )
return 0xFFFFFFFFLL;
v2 = shmaddr[11];
shmdt(shmaddr);
return v2;
}
//----- (000000000001074C) ----------------------------------------------------
__int64 __fastcall sub_1074C(const char *a1, int a2)
{
_DWORD *shmaddr; // [rsp+18h] [rbp-8h]
shmaddr = sub_10580(a1);
if ( !shmaddr )
return 0xFFFFFFFFLL;
shmaddr[11] = a2;
shmdt(shmaddr);
return 0LL;
}
//----- (0000000000010796) ----------------------------------------------------
char *__fastcall sub_10796(const char *a1)
{
const char *shmaddr; // [rsp+18h] [rbp-8h]
shmaddr = (const char *)sub_10580(a1);
if ( !shmaddr )
return 0LL;
strncpy(byte_2374C0, shmaddr + 48, 0xFuLL);
shmdt(shmaddr);
return byte_2374C0;
}
//----- (00000000000107F1) ----------------------------------------------------
__int64 __fastcall sub_107F1(const char *a1, const char *a2)
{
char *shmaddr; // [rsp+18h] [rbp-8h]
shmaddr = (char *)sub_10580(a1);
if ( !shmaddr )
return 0xFFFFFFFFLL;
strncpy(shmaddr + 48, a2, 0x1FuLL);
shmdt(shmaddr);
return 0LL;
}
//----- (000000000001084E) ----------------------------------------------------
__int64 __fastcall sub_1084E(const char *a1)
{
unsigned int v2; // [rsp+14h] [rbp-Ch]
_DWORD *shmaddr; // [rsp+18h] [rbp-8h]
shmaddr = sub_10580(a1);
if ( !shmaddr )
return 0xFFFFFFFFLL;
v2 = shmaddr[2];
shmdt(shmaddr);
return v2;
}
//----- (0000000000010893) ----------------------------------------------------
__int64 __fastcall sub_10893(const char *a1, int a2)
{
_DWORD *shmaddr; // [rsp+18h] [rbp-8h]
shmaddr = sub_10580(a1);
if ( !shmaddr )
return 0xFFFFFFFFLL;
shmaddr[2] = a2;
shmdt(shmaddr);
return 0LL;
}
//----- (00000000000108DD) ----------------------------------------------------
char *__fastcall sub_108DD(const char *a1)
{
const char *shmaddr; // [rsp+18h] [rbp-8h]
shmaddr = (const char *)sub_10580(a1);
if ( !shmaddr )
return 0LL;
strncpy(byte_2374D0, shmaddr + 12, 0xFuLL);
shmdt(shmaddr);
return byte_2374D0;
}
//----- (0000000000010938) ----------------------------------------------------
__int64 __fastcall sub_10938(const char *a1, const char *a2)
{
char *shmaddr; // [rsp+18h] [rbp-8h]
shmaddr = (char *)sub_10580(a1);
if ( !shmaddr )
return 0xFFFFFFFFLL;
strncpy(shmaddr + 12, a2, 0x1FuLL);
shmdt(shmaddr);
return 0LL;
}
//----- (0000000000010995) ----------------------------------------------------
__int64 __fastcall sub_10995(const char *a1)
{
__int64 v2; // [rsp+10h] [rbp-10h]
FILE *stream; // [rsp+18h] [rbp-8h]
stream = fopen64(a1, "r");
if ( !stream )
return 0LL;
fseek(stream, 0LL, 2);
v2 = 2 * ftell(stream);
rewind(stream);
fclose(stream);
return v2;
}
//----- (0000000000010A0D) ----------------------------------------------------
__int64 __fastcall sub_10A0D(const char *a1)
{
unsigned int v2; // [rsp+14h] [rbp-Ch]
const char *pathname; // [rsp+18h] [rbp-8h]
pathname = sub_104E8();
v2 = ftok(pathname, 0);
if ( v2 == -1 )
return 0xFFFFFFFFLL;
sub_1074C(a1, v2);
sub_107F1(a1, pathname);
return v2;
}
//----- (0000000000010A73) ----------------------------------------------------
__int64 __fastcall sub_10A73(const char *a1)
{
return (unsigned int)sub_10707(a1);
}
//----- (0000000000010A93) ----------------------------------------------------
__int64 __fastcall sub_10A93(const char *a1)
{
unsigned int v2; // [rsp+1Ch] [rbp-4h]
v2 = sub_1084E(a1);
if ( v2 == -1 )
return 0xFFFFFFFFLL;
else
return v2;
}
//----- (0000000000010AC0) ----------------------------------------------------
__int64 __fastcall sub_10AC0(key_t a1)
{
int v2; // [rsp+1Ch] [rbp-4h]
v2 = shmget(a1, 0LL, 950);
if ( v2 >= 0 )
return (unsigned int)v2;
else
return 0xFFFFFFFFLL;
}
//----- (0000000000010AFB) ----------------------------------------------------
__int64 __fastcall sub_10AFB(const char *a1, int a2)
{
int v3; // eax
key_t *shmaddr; // [rsp+18h] [rbp-18h]
char *name; // [rsp+20h] [rbp-10h]
shmaddr = sub_10580(a1);
if ( !shmaddr )
return 0xFFFFFFFFLL;
if ( a2 )
{
name = (char *)(shmaddr + 12);
v3 = sub_10AC0(shmaddr[11]);
}
else
{
name = (char *)(shmaddr + 3);
v3 = sub_10AC0(shmaddr[2]);
}
shmctl(v3, 0, 0LL);
unlink(name);
shmdt(shmaddr);
return 0LL;
}
//----- (0000000000010BAE) ----------------------------------------------------
__time_t __fastcall sub_10BAE(char *a1)
{
struct stat64 stat_buf; // [rsp+10h] [rbp-90h] BYREF
if ( sub_2D9E0(a1, &stat_buf) == -1 )
return 0LL;
else
return stat_buf.st_mtim.tv_sec;
}
//----- (0000000000010BEB) ----------------------------------------------------
__int64 __fastcall sub_10BEB(const char *a1)
{
__int64 v2; // [rsp+10h] [rbp-10h]
_DWORD *shmaddr; // [rsp+18h] [rbp-8h]
shmaddr = sub_10580(a1);
if ( !shmaddr )
return -1LL;
v2 = *(_QWORD *)shmaddr;
shmdt(shmaddr);
return v2;
}
//----- (0000000000010C34) ----------------------------------------------------
__int64 __fastcall sub_10C34(const char *a1, __int64 a2)
{
_DWORD *shmaddr; // [rsp+18h] [rbp-8h]
shmaddr = sub_10580(a1);
if ( !shmaddr )
return -1LL;
*(_QWORD *)shmaddr = a2;
shmdt(shmaddr);
return 0LL;
}
//----- (0000000000010C82) ----------------------------------------------------
__int64 __fastcall sub_10C82(const char *a1, int a2)
{
__int64 size; // [rsp+10h] [rbp-10h]
int v4; // [rsp+18h] [rbp-8h]
int v5; // [rsp+18h] [rbp-8h]
key_t key; // [rsp+1Ch] [rbp-4h]
if ( a2 )
key = sub_10A73(a1);
else
key = sub_10A93(a1);
if ( key == -1 )
return 0xFFFFFFFFLL;
v4 = shmget(key, 0LL, 950);
if ( v4 >= 0 )
return (unsigned int)v4;
size = sub_10995(a1);
v5 = shmget(key, size, 950);
if ( v5 >= 0 )
return (unsigned int)v5;
else
return 0xFFFFFFFFLL;
}
//----- (0000000000010D2F) ----------------------------------------------------
void *__fastcall sub_10D2F(const char *a1, int a2)
{
void *v3; // [rsp+10h] [rbp-10h]
int shmid; // [rsp+1Ch] [rbp-4h]
shmid = sub_10C82(a1, a2);
if ( shmid == -1 )
return 0LL;
v3 = shmat(shmid, 0LL, 0);
if ( v3 == (void *)-1LL )
return 0LL;
else
return v3;
}
//----- (0000000000010D93) ----------------------------------------------------
int __fastcall sub_10D93(const char *a1, int a2)
{
_DWORD *v2; // rax
v2 = sub_10D2F(a1, 1);
if ( v2 )
{
v2[6] = a2;
LODWORD(v2) = shmdt(v2);
}
return (int)v2;
}
//----- (0000000000010DD8) ----------------------------------------------------
__int64 __fastcall sub_10DD8(const char *a1)
{
unsigned int v2; // [rsp+14h] [rbp-Ch]
_DWORD *shmaddr; // [rsp+18h] [rbp-8h]
shmaddr = sub_10D2F(a1, 1);
if ( !shmaddr )
return 0xFFFFFFFFLL;
v2 = shmaddr[6];
shmdt(shmaddr);
return v2;
}
//----- (0000000000010E22) ----------------------------------------------------
_BYTE *__fastcall sub_10E22(_BYTE *a1)
{
while ( *a1 == 32 || *a1 == 9 )
++a1;
return a1;
}
//----- (0000000000010E4D) ----------------------------------------------------
const char *__fastcall sub_10E4D(const char *a1)
{
int v1; // eax
const char *v3; // [rsp+18h] [rbp-8h]
v1 = strlen(a1);
v3 = &a1[v1 - 1];
if ( v1 > 0 )
{
while ( *v3 == 32 || *v3 == 9 || *v3 == 10 )
--v3;
}
return v3 + 1;
}
//----- (0000000000010EB4) ----------------------------------------------------
__int64 __fastcall sub_10EB4(_BYTE *a1, char *a2)
{
char *i; // rax
char *src; // [rsp+18h] [rbp-18h]
char *srca; // [rsp+18h] [rbp-18h]
char *v6; // [rsp+28h] [rbp-8h]
v6 = 0LL;
src = sub_10E22(a1);
if ( *src != 91 )
return 0xFFFFFFFFLL;
if ( !src )
return 0xFFFFFFFFLL;
srca = src + 1;
for ( i = strchr(srca, 93); i; i = strchr(i + 1, 93) )
v6 = i;
if ( !v6 )
return 0xFFFFFFFFLL;
strncpy(a2, srca, v6 - srca);
a2[v6 - srca] = 0;
return 0LL;
}
//----- (0000000000010F8E) ----------------------------------------------------
__int64 __fastcall sub_10F8E(char *a1, char *a2, char *a3)
{
const char *v4; // rax
char *v6; // [rsp+30h] [rbp-10h]
char *v7; // [rsp+30h] [rbp-10h]
char *s; // [rsp+38h] [rbp-8h]
char *sa; // [rsp+38h] [rbp-8h]
v6 = strchr(a1, 61);
if ( !v6 )
return 0xFFFFFFFFLL;
v4 = sub_10E22(a1);
strncpy(a2, v4, v6 - v4);
*sub_10E4D(a2) = 0;
s = v6 + 1;
v7 = strchr(v6 + 1, 10);
if ( !v7 )
return 0xFFFFFFFFLL;
sa = sub_10E22(s);
strncpy(a3, sa, v7 - sa);
*sub_10E4D(a3) = 0;
if ( *a2 )
return 0LL;
else
return 0xFFFFFFFFLL;
}
//----- (00000000000110E6) ----------------------------------------------------
__int64 __fastcall sub_110E6(const char *a1)
{
_DWORD *shmaddr; // [rsp+18h] [rbp-8h]
shmaddr = sub_10D2F(a1, 1);
if ( !shmaddr )
return 0xFFFFFFFFLL;
shmaddr[4] = 1;
shmdt(shmaddr);
return 0LL;
}
//----- (0000000000011133) ----------------------------------------------------
__int64 __fastcall sub_11133(const char *a1)
{
__int64 src[3]; // [rsp+10h] [rbp-30h] BYREF
int v3; // [rsp+28h] [rbp-18h]
size_t n; // [rsp+30h] [rbp-10h]
void *s; // [rsp+38h] [rbp-8h]
s = sub_10D2F(a1, 1);
if ( !s )
return 0xFFFFFFFFLL;
n = sub_10995(a1);
memset(s, 0, n);
src[0] = 0x1C0000001CLL;
src[1] = 0x1C0000001CLL;
src[2] = 0LL;
v3 = 0;
memcpy(s, src, 0x1CuLL);
shmdt(s);
return 0LL;
}
//----- (0000000000011205) ----------------------------------------------------
__int64 __fastcall sub_11205(__int64 a1, __int64 a2)
{
if ( a2 )
return a2 - a1;
else
return 0xFFFFFFFFLL;
}
//----- (000000000001122F) ----------------------------------------------------
__int64 __fastcall sub_1122F(__int64 a1)
{
if ( a1 )
return *(int *)(a1 + 8) + a1;
else
return 0LL;
}
//----- (0000000000011258) ----------------------------------------------------
__int64 __fastcall sub_11258(__int64 a1, int a2)
{
if ( a2 == -1 )
return 0LL;
else
return a2 + a1;
}
//----- (000000000001127F) ----------------------------------------------------
char *__fastcall sub_1127F(int *a1)
{
return (char *)a1 + *a1;
}
//----- (0000000000011299) ----------------------------------------------------
_DWORD *__fastcall sub_11299(_DWORD *a1, int a2)
{
_DWORD *result; // rax
result = a1;
*a1 = a2 - (_DWORD)a1;
return result;
}
//----- (00000000000112BD) ----------------------------------------------------
__int64 __fastcall sub_112BD(__int64 a1)
{
return *(int *)(a1 + 12) + a1;
}
//----- (00000000000112D8) ----------------------------------------------------
__int64 __fastcall sub_112D8(__int64 a1, int a2)
{
__int64 result; // rax
result = a1;
*(_DWORD *)(a1 + 8) = a2 - a1;
return result;
}
//----- (00000000000112FD) ----------------------------------------------------
__int64 __fastcall sub_112FD(__int64 a1, int a2)
{
__int64 result; // rax
result = a1;
*(_DWORD *)(a1 + 12) = a2 - a1;
return result;
}
//----- (0000000000011322) ----------------------------------------------------
__int64 __fastcall sub_11322(const char *a1, const char *a2, int a3, char a4)
{
const char *v6; // [rsp+28h] [rbp-28h]
__int64 v7; // [rsp+30h] [rbp-20h]
_DWORD *shmaddr; // [rsp+38h] [rbp-18h]
unsigned int v9; // [rsp+44h] [rbp-Ch]
int *v10; // [rsp+48h] [rbp-8h]
shmaddr = sub_10D2F(a1, a3);
if ( !shmaddr || !shmaddr[2] )
return 0xFFFFFFFFLL;
v7 = sub_1122F((__int64)shmaddr);
if ( v7 )
{
v10 = (int *)v7;
v9 = shmaddr[2];
while ( v10 )
{
v6 = (const char *)sub_11258((__int64)shmaddr, *v10);
if ( !sub_10055(v6, a2, a4 & 2) )
{
shmdt(shmaddr);
return v9;
}
v9 = v10[1];
v10 = (int *)sub_11258((__int64)shmaddr, v9);
}
}
shmdt(shmaddr);
return 0xFFFFFFFFLL;
}
//----- (000000000001142F) ----------------------------------------------------
char *__fastcall sub_1142F(int *a1, const char *a2)
{
int v2; // eax
char *dest; // [rsp+18h] [rbp-8h]
dest = sub_1127F(a1);
strcpy(dest, a2);
dest[strlen(a2)] = 0;
v2 = strlen(dest);
sub_11299(a1, (_DWORD)dest + v2 + 1);
return dest;
}
//----- (00000000000114A7) ----------------------------------------------------
__int64 __fastcall sub_114A7(const char *a1, const char *a2)
{
__int64 v3; // [rsp+18h] [rbp-28h]
char *v4; // [rsp+20h] [rbp-20h]
int v5; // [rsp+2Ch] [rbp-14h]
char *v6; // [rsp+30h] [rbp-10h]
int *shmaddr; // [rsp+38h] [rbp-8h]
shmaddr = (int *)sub_10D2F(a1, 1);
if ( !shmaddr || !shmaddr[2] )
return 0xFFFFFFFFLL;
v6 = sub_1142F(shmaddr, a2);
v5 = sub_11205((__int64)shmaddr, (__int64)v6);
v4 = sub_1127F(shmaddr);
*(_DWORD *)v4 = v5;
*((_DWORD *)v4 + 1) = sub_11205((__int64)shmaddr, 0LL);
*((_DWORD *)v4 + 2) = sub_11205((__int64)shmaddr, 0LL);
*((_DWORD *)v4 + 3) = sub_11205((__int64)shmaddr, 0LL);
if ( shmaddr[5] )
{
v3 = sub_112BD((__int64)shmaddr);
*(_DWORD *)(v3 + 4) = sub_11205((__int64)shmaddr, (__int64)v4);
}
else
{
sub_112D8((__int64)shmaddr, (int)v4);
}
sub_112FD((__int64)shmaddr, (int)v4);
sub_11299(shmaddr, (_DWORD)v4 + 16);
++shmaddr[5];
shmdt(shmaddr);
return 0LL;
}
//----- (0000000000011616) ----------------------------------------------------
__int64 __fastcall sub_11616(const char *a1, __int64 a2, const char *a3, const char *a4)
{
char *v7; // [rsp+20h] [rbp-40h]
int v8; // [rsp+2Ch] [rbp-34h]
char *v9; // [rsp+30h] [rbp-30h]
int v10; // [rsp+3Ch] [rbp-24h]
char *v11; // [rsp+40h] [rbp-20h]
int *shmaddr; // [rsp+48h] [rbp-18h]
__int64 v13; // [rsp+50h] [rbp-10h]
__int64 v14; // [rsp+58h] [rbp-8h]
shmaddr = (int *)sub_10D2F(a1, 1);
if ( !shmaddr || !shmaddr[2] )
return 0xFFFFFFFFLL;
v11 = sub_1142F(shmaddr, a3);
v10 = sub_11205((__int64)shmaddr, (__int64)v11);
v9 = sub_1142F(shmaddr, a4);
v8 = sub_11205((__int64)shmaddr, (__int64)v9);
v7 = sub_1127F(shmaddr);
*(_DWORD *)v7 = v10;
*((_DWORD *)v7 + 1) = v8;
*((_DWORD *)v7 + 2) = sub_11205((__int64)shmaddr, 0LL);
if ( *(_DWORD *)(a2 + 8) == -1 )
{
*(_DWORD *)(a2 + 8) = sub_11205((__int64)shmaddr, (__int64)v7);
*(_DWORD *)(a2 + 12) = sub_11205((__int64)shmaddr, (__int64)v7);
}
else
{
v14 = sub_11258((__int64)shmaddr, *(_DWORD *)(a2 + 8));
if ( v14 )
{
v13 = 0LL;
while ( v14 )
{
v13 = v14;
v14 = sub_11258((__int64)shmaddr, *(_DWORD *)(v14 + 8));
}
*(_DWORD *)(v13 + 8) = sub_11205((__int64)shmaddr, (__int64)v7);
}
}
sub_11299(shmaddr, (_DWORD)v7 + 12);
shmdt(shmaddr);
return 0LL;
}
//----- (00000000000117D4) ----------------------------------------------------
__int64 __fastcall sub_117D4(const char *a1)
{
key_t v1; // eax
key_t v2; // eax
int v4; // [rsp+18h] [rbp-18h]
int v5; // [rsp+1Ch] [rbp-14h]
char *v6; // [rsp+20h] [rbp-10h]
int v7; // [rsp+2Ch] [rbp-4h]
v7 = sub_10707(a1);
v6 = sub_10796(a1);
v1 = sub_103EB(a1);
v5 = sub_10098(v1);
sub_101CF(v5);
sub_10AFB(a1, 0);
sub_10893(a1, v7);
sub_10938(a1, v6);
v2 = sub_103EB(a1);
v4 = sub_10098(v2);
sub_10189(v4);
return 0LL;
}
//----- (000000000001187B) ----------------------------------------------------
__int64 __fastcall sub_1187B(char *a1, const char *a2, char a3)
{
key_t v4; // eax
key_t v5; // eax
__int64 v6; // rax
key_t v7; // eax
char v9[128]; // [rsp+20h] [rbp-1960h] BYREF
char v10[2048]; // [rsp+A0h] [rbp-18E0h] BYREF
char v11[128]; // [rsp+8A0h] [rbp-10E0h] BYREF
char s[4104]; // [rsp+920h] [rbp-1060h] BYREF
int v13; // [rsp+1928h] [rbp-58h]
int v14; // [rsp+192Ch] [rbp-54h]
FILE *stream; // [rsp+1930h] [rbp-50h]
int v16[4]; // [rsp+193Ch] [rbp-44h]
int v17; // [rsp+194Ch] [rbp-34h]
int v18; // [rsp+1950h] [rbp-30h]
int v19; // [rsp+1954h] [rbp-2Ch]
__time_t v20; // [rsp+1958h] [rbp-28h]
__int64 v21; // [rsp+1960h] [rbp-20h]
__time_t v22; // [rsp+1968h] [rbp-18h]
__int64 v23; // [rsp+1970h] [rbp-10h]
int v24; // [rsp+1978h] [rbp-8h]
_BOOL4 v25; // [rsp+197Ch] [rbp-4h]
v22 = sub_10BAE(a1);
v21 = sub_10BEB(a1);
v25 = 0;
v20 = sub_1002E();
if ( !v22 || !v21 || v22 != v21 )
v25 = 1;
if ( !v25 )
v25 = (int)sub_10DD8(a1) > 0;
if ( !v25 )
return 0LL;
v4 = sub_102F1(a1);
v18 = sub_10098(v4);
v19 = sub_10135(v18);
if ( v19 == -1 )
return 0LL;
v17 = sub_10A0D(a1);
if ( v17 == -1 )
return 0xFFFFFFFFLL;
*(_QWORD *)&v16[1] = sub_10D2F(a1, 1);
if ( *(_QWORD *)&v16[1] )
{
if ( (unsigned int)sub_11133(a1) == -1 )
{
sub_10AFB(a1, 1);
return 0xFFFFFFFFLL;
}
else
{
stream = fopen64(a2, "r");
if ( stream )
{
memset(s, 0, 0x1000uLL);
memset(v11, 0, sizeof(v11));
v24 = 0;
v14 = -1;
v23 = 0LL;
v6 = sub_10BAE(a1);
sub_10C34(a1, v6);
while ( fgets(s, 4096, stream) )
{
memset(v9, 0, sizeof(v9));
memset(v10, 0, sizeof(v10));
if ( (unsigned int)sub_10EB4(s, v11) == -1 )
{
if ( !v24 )
{
sub_114A7(a1, byte_2E29E);
v14 = sub_11322(a1, v11, 1, a3);
v23 = sub_11258(*(__int64 *)&v16[1], v14);
}
if ( (unsigned int)sub_10F8E(s, v9, v10) != -1 && v23 )
sub_11616(a1, v23, v9, v10);
}
else
{
v24 = 1;
sub_114A7(a1, v11);
v14 = sub_11322(a1, v11, 1, a3);
v23 = sub_11258(*(__int64 *)&v16[1], v14);
}
}
if ( stream )
fclose(stream);
shmdt(*(const void **)&v16[1]);
sub_110E6(a1);
sub_117D4(a1);
v7 = sub_102F1(a1);
v13 = sub_10098(v7);
sub_10189(v13);
return 0LL;
}
else
{
return 0xFFFFFFFFLL;
}
}
}
else
{
sub_10AFB(a1, 1);
v5 = sub_102F1(a1);
*(_QWORD *)v16 = (unsigned int)sub_10098(v5);
sub_10189(v16[0]);
return 0xFFFFFFFFLL;
}
}
// 1187B: using guessed type int var_44[4];
//----- (0000000000011C8E) ----------------------------------------------------
__int64 __fastcall Conf_Get_Sections_V2(char *a1, _QWORD *a2, char a3)
{
key_t v4; // eax
key_t v5; // eax
const char *v6; // rax
key_t v7; // eax
int v8; // [rsp+20h] [rbp-30h]
int v9; // [rsp+24h] [rbp-2Ch]
void *v10; // [rsp+28h] [rbp-28h]
int *shmaddr; // [rsp+30h] [rbp-20h]
int v12; // [rsp+38h] [rbp-18h]
unsigned int v13; // [rsp+3Ch] [rbp-14h]
int *v14; // [rsp+40h] [rbp-10h]
void *ptr; // [rsp+48h] [rbp-8h]
if ( (unsigned int)sub_1187B(a1, a1, a3) == -1 )
return 0xFFFFFFFFLL;
v4 = sub_103EB(a1);
v12 = sub_10098(v4);
sub_101CF(v12);
shmaddr = (int *)sub_10D2F(a1, 0);
if ( shmaddr && shmaddr[2] )
{
ptr = 0LL;
v14 = (int *)sub_11258((__int64)shmaddr, shmaddr[2]);
v13 = 0;
while ( v14 )
{
if ( ptr )
{
v10 = realloc(ptr, (int)((v13 + 1) << 7));
if ( !v10 )
{
free(ptr);
ptr = 0LL;
break;
}
ptr = v10;
}
else
{
ptr = calloc(1uLL, 0x80uLL);
}
v6 = (const char *)sub_11258((__int64)shmaddr, *v14);
strncpy((char *)ptr + 128 * (__int64)(int)v13++, v6, 0x7FuLL);
v14 = (int *)sub_11258((__int64)shmaddr, v14[1]);
}
shmdt(shmaddr);
v7 = sub_103EB(a1);
v9 = sub_10098(v7);
sub_10189(v9);
*a2 = ptr;
return v13;
}
else
{
v5 = sub_103EB(a1);
v8 = sub_10098(v5);
sub_10189(v8);
return 0xFFFFFFFFLL;
}
}
// 11DB3: conditional instruction was optimized away because %ptr.8!=0
//----- (0000000000011E73) ----------------------------------------------------
__int64 __fastcall Conf_Get_Fields_V2(char *a1, const char *a2, _QWORD *a3, char a4)
{
key_t v5; // eax
key_t v6; // eax
key_t v7; // eax
key_t v8; // eax
int v11; // [rsp+20h] [rbp-50h]
int v12; // [rsp+24h] [rbp-4Ch]
void *v13; // [rsp+28h] [rbp-48h]
char *src; // [rsp+30h] [rbp-40h]
__int64 v15; // [rsp+38h] [rbp-38h]
_DWORD *shmaddr; // [rsp+40h] [rbp-30h]
int v17; // [rsp+4Ch] [rbp-24h]
int v18; // [rsp+50h] [rbp-20h]
int v19; // [rsp+54h] [rbp-1Ch]
int *v20; // [rsp+58h] [rbp-18h]
unsigned int v21; // [rsp+64h] [rbp-Ch]
void *ptr; // [rsp+68h] [rbp-8h]
if ( (unsigned int)sub_1187B(a1, a1, a4) == -1 )
return 0xFFFFFFFFLL;
v5 = sub_103EB(a1);
v19 = sub_10098(v5);
sub_101CF(v19);
v18 = sub_11322(a1, a2, 0, a4);
if ( v18 == -1 )
{
v6 = sub_103EB(a1);
v17 = sub_10098(v6);
sub_10189(v17);
return 0xFFFFFFFFLL;
}
else
{
shmaddr = sub_10D2F(a1, 0);
if ( shmaddr && shmaddr[2] )
{
ptr = 0LL;
v15 = sub_11258((__int64)shmaddr, v18);
if ( v15 )
{
v21 = 0;
v20 = (int *)sub_11258((__int64)shmaddr, *(_DWORD *)(v15 + 8));
while ( v20 )
{
src = (char *)sub_11258((__int64)shmaddr, *v20);
if ( ptr )
{
v13 = realloc(ptr, (int)((v21 + 1) << 7));
if ( !v13 )
{
free(ptr);
ptr = 0LL;
break;
}
ptr = v13;
}
else
{
ptr = calloc(1uLL, 0x80uLL);
}
strncpy((char *)ptr + 128 * (__int64)(int)v21, src, 0x7FuLL);
v20 = (int *)sub_11258((__int64)shmaddr, v20[2]);
++v21;
}
shmdt(shmaddr);
v8 = sub_103EB(a1);
v12 = sub_10098(v8);
sub_10189(v12);
*a3 = ptr;
return v21;
}
else
{
return 0xFFFFFFFFLL;
}
}
else
{
v7 = sub_103EB(a1);
v11 = sub_10098(v7);
sub_10189(v11);
return 0xFFFFFFFFLL;
}
}
}
// 12027: conditional instruction was optimized away because %ptr.8!=0
//----- (00000000000120D5) ----------------------------------------------------
__int64 __fastcall Conf_Get_Value_V2(char *a1, const char *a2, const char *a3, char *a4, int a5, char a6)
{
key_t v7; // eax
key_t v8; // eax
key_t v9; // eax
key_t v10; // eax
key_t v11; // eax
key_t v12; // eax
key_t v13; // eax
int v18; // [rsp+30h] [rbp-50h]
int v19; // [rsp+34h] [rbp-4Ch]
int v20; // [rsp+38h] [rbp-48h]
int v21; // [rsp+3Ch] [rbp-44h]
int v22; // [rsp+40h] [rbp-40h]
int v23; // [rsp+44h] [rbp-3Ch]
char *s; // [rsp+48h] [rbp-38h]
const char *v25; // [rsp+50h] [rbp-30h]
__int64 v26; // [rsp+58h] [rbp-28h]
_DWORD *shmaddr; // [rsp+60h] [rbp-20h]
int v28; // [rsp+6Ch] [rbp-14h]
int v29; // [rsp+70h] [rbp-10h]
int v30; // [rsp+74h] [rbp-Ch]
int *i; // [rsp+78h] [rbp-8h]
if ( (unsigned int)sub_1187B(a1, a1, a6) == -1 )
return 4294967290LL;
v7 = sub_103EB(a1);
v30 = sub_10098(v7);
sub_101CF(v30);
v29 = sub_11322(a1, a2, 0, a6);
if ( v29 == -1 )
{
v8 = sub_103EB(a1);
v28 = sub_10098(v8);
sub_10189(v28);
return 4294967290LL;
}
else
{
shmaddr = sub_10D2F(a1, 0);
if ( shmaddr && shmaddr[2] )
{
v26 = sub_11258((__int64)shmaddr, v29);
if ( v26 )
{
for ( i = (int *)sub_11258((__int64)shmaddr, *(_DWORD *)(v26 + 8)); ; i = (int *)sub_11258(
(__int64)shmaddr,
i[2]) )
{
if ( !i )
{
shmdt(shmaddr);
v13 = sub_103EB(a1);
v19 = sub_10098(v13);
sub_10189(v19);
return 4294967290LL;
}
v25 = (const char *)sub_11258((__int64)shmaddr, *i);
if ( !sub_10055(v25, a3, a6 & 2) )
break;
}
s = (char *)sub_11258((__int64)shmaddr, i[1]);
v23 = strlen(s);
if ( a4 )
{
if ( v23 + 1 <= a5 )
{
strncpy(a4, s, a5);
shmdt(shmaddr);
v12 = sub_103EB(a1);
v20 = sub_10098(v12);
sub_10189(v20);
return 0LL;
}
else
{
shmdt(shmaddr);
v11 = sub_103EB(a1);
v21 = sub_10098(v11);
sub_10189(v21);
return 4294967287LL;
}
}
else
{
shmdt(shmaddr);
v10 = sub_103EB(a1);
v22 = sub_10098(v10);
sub_10189(v22);
return (unsigned int)(v23 + 1);
}
}
else
{
return 4294967290LL;
}
}
else
{
v9 = sub_103EB(a1);
v18 = sub_10098(v9);
sub_10189(v18);
return 4294967290LL;
}
}
}
//----- (00000000000123A1) ----------------------------------------------------
__int64 __fastcall Conf_Add_Set_Count(const char *a1)
{
int v2; // [rsp+1Ch] [rbp-4h]
v2 = sub_10DD8(a1) + 1;
sub_10D93(a1, v2);
return 0LL;
}
//----- (00000000000123D8) ----------------------------------------------------
_BOOL8 is_ram_almost_full()
{
struct statfs64 buf; // [rsp+0h] [rbp-90h] BYREF
int v2; // [rsp+7Ch] [rbp-14h]
__fsblkcnt64_t v3; // [rsp+80h] [rbp-10h]
__fsblkcnt64_t v4; // [rsp+88h] [rbp-8h]
v4 = 100LL;
v3 = 100LL;
v2 = statfs64("/", &buf);
if ( !v2 && buf.f_type != 2240043254LL )
v4 = (buf.f_bsize * buf.f_bavail) >> 10;
v2 = statfs64("/tmp", &buf);
if ( !v2 && buf.f_type != 2240043254LL )
v3 = (buf.f_bsize * buf.f_bavail) >> 10;
return v4 <= 8 || v3 <= 8;
}
//----- (00000000000124B2) ----------------------------------------------------
const char *__fastcall Skip_White_Space_Ex(const char *a1)
{
int i; // [rsp+2Ch] [rbp-4h]
while ( *a1 == 32 || *a1 == 9 )
++a1;
for ( i = strlen(a1) - 1; i >= 0; --i )
{
if ( a1[i] == 32 || a1[i] == 9 )
a1[i] = 0;
}
return a1;
}
//----- (0000000000012545) ----------------------------------------------------
const char *__fastcall Skip_White_Space_HT(const char *a1)
{
const char *i; // [rsp+10h] [rbp-10h]
while ( *a1 == 32 || *a1 == 9 )
++a1;
if ( *a1 )
{
for ( i = &a1[strlen(a1) - 1]; *i == 32 || *i == 9; --i )
;
*((_BYTE *)i + 1) = 0;
}
return a1;
}
//----- (00000000000125CA) ----------------------------------------------------
__int64 __fastcall find_char_in_string(__int64 a1, char a2)
{
unsigned int i; // [rsp+18h] [rbp-4h]
for ( i = 0; ; ++i )
{
while ( 1 )
{
if ( !*(_BYTE *)((int)i + a1) )
return 0xFFFFFFFFLL;
if ( a2 == 32 || a2 == 9 )
break;
if ( *(_BYTE *)((int)i + a1) == a2 )
return i;
++i;
}
if ( *(_BYTE *)((int)i + a1) == 32 || *(_BYTE *)((int)i + a1) == 9 )
break;
}
if ( *(_BYTE *)((int)i + 1LL + a1) == 32 || *(_BYTE *)((int)i + 1LL + a1) == 9 )
{
while ( *(_BYTE *)((int)i + 1LL + a1) == 32 || *(_BYTE *)((int)i + 1LL + a1) == 9 )
++i;
}
return i;
}
//----- (00000000000126C5) ----------------------------------------------------
char *__fastcall get_string_until_ch(__int64 a1, char a2, char *a3, int a4)
{
char *s; // [rsp+18h] [rbp-18h]
int char_in_string; // [rsp+2Ch] [rbp-4h]
s = (char *)skip_white_space(a1);
if ( a2 == 93 )
char_in_string = (unsigned int)strrchr(s, 93) - (_DWORD)s;
else
char_in_string = find_char_in_string((__int64)s, a2);
if ( char_in_string < 0 )
return 0LL;
if ( char_in_string >= a4 )
char_in_string = a4 - 1;
strncpy(a3, s, char_in_string);
a3[char_in_string] = 0;
stripe_white_space_tail(a3);
return a3;
}
// A2C0: using guessed type __int64 __fastcall stripe_white_space_tail(_QWORD);
// A6B0: using guessed type __int64 __fastcall skip_white_space(_QWORD);
//----- (0000000000012784) ----------------------------------------------------
_BOOL8 __fastcall is_commented_string(__int64 a1)
{
_BYTE *v2; // [rsp+18h] [rbp-8h]
v2 = (_BYTE *)skip_white_space(a1);
return *v2 == 35 || *v2 == 59;
}
// A6B0: using guessed type __int64 __fastcall skip_white_space(_QWORD);
//----- (00000000000127C4) ----------------------------------------------------
__int64 __fastcall Sed_Trans_Str(const char *a1, __int64 a2)
{
int v2; // eax
int v3; // eax
int v5; // [rsp+1Ch] [rbp-14h]
unsigned int v6; // [rsp+28h] [rbp-8h]
int i; // [rsp+2Ch] [rbp-4h]
v5 = strlen(a1);
v6 = 0;
for ( i = 0; i < v5; ++i )
{
if ( strchr(".*[]^$\\", a1[i]) )
{
v2 = v6++;
*(_BYTE *)(v2 + a2) = 92;
}
v3 = v6++;
*(_BYTE *)(a2 + v3) = a1[i];
}
*(_BYTE *)((int)v6 + a2) = 0;
return v6;
}
//----- (0000000000012880) ----------------------------------------------------
__int64 __fastcall get_section_name(__int64 a1, char *a2, int a3)
{
_BYTE *v5; // [rsp+28h] [rbp-8h]
v5 = (_BYTE *)skip_white_space(a1);
if ( *v5 == 91 && get_string_until_ch((__int64)(v5 + 1), 93, a2, a3) )
return 0LL;
else
return 0xFFFFFFFFLL;
}
// A6B0: using guessed type __int64 __fastcall skip_white_space(_QWORD);
//----- (00000000000128DF) ----------------------------------------------------
__int64 __fastcall get_field_name(__int64 a1, char *a2, int a3)
{
_BYTE *v5; // [rsp+28h] [rbp-8h]
if ( is_commented_string(a1) )
return 0xFFFFFFFFLL;
v5 = (_BYTE *)skip_white_space(a1);
if ( *v5 == 91 )
return 0xFFFFFFFFLL;
if ( !get_string_until_ch((__int64)v5, 61, a2, a3) )
return 0xFFFFFFFFLL;
else
return 0LL;
}
// A6B0: using guessed type __int64 __fastcall skip_white_space(_QWORD);
//----- (000000000001294F) ----------------------------------------------------
__int64 __fastcall compare_string(__int64 a1, __int64 a2)
{
return mb_strcmp(a1, a2);
}
// A740: using guessed type __int64 __fastcall mb_strcmp(_QWORD, _QWORD);
//----- (0000000000012974) ----------------------------------------------------
int __fastcall compare_case_string(const char *a1, const char *a2)
{
return strcasecmp(a1, a2);
}
//----- (0000000000012999) ----------------------------------------------------
__int64 __fastcall compare_string_ex(__int64 a1, __int64 a2, unsigned int a3)
{
return mb_strcmp_ex(a1, a2, a3);
}
// 9D90: using guessed type __int64 __fastcall mb_strcmp_ex(_QWORD, _QWORD, _QWORD);
//----- (00000000000129C4) ----------------------------------------------------
int __fastcall compare_string_by_flag(const char *a1, const char *a2)
{
if ( dword_237500 )
return strcmp(a1, a2);
else
return strcasecmp(a1, a2);
}
// 237500: using guessed type int dword_237500;
//----- (0000000000012A08) ----------------------------------------------------
__int64 __fastcall sub_12A08(const char *a1, char *a2, int a3)
{
char *v5; // [rsp+28h] [rbp-8h]
v5 = strrchr(a1, 47);
if ( v5 )
{
if ( strlen(v5 + 1) + 1 <= a3 )
{
strcpy(a2, v5 + 1);
}
else
{
strncpy(a2, v5 + 1, a3 - 1);
a2[a3] = 0;
}
}
else if ( strlen(a1) <= a3 )
{
strcpy(a2, a1);
}
else
{
strncpy(a2, a1, a3 - 1);
a2[a3] = 0;
}
return 0LL;
}
//----- (0000000000012B01) ----------------------------------------------------
__int64 __fastcall String_To_Upper_Case(__int64 a1)
{
int i; // [rsp+1Ch] [rbp-14h]
for ( i = 0; *(_BYTE *)(i + a1); ++i )
*(_BYTE *)(i + a1) = toupper(*(char *)(i + a1));
return a1;
}
//----- (0000000000012B64) ----------------------------------------------------
__int64 __fastcall is_pid_alive(unsigned int a1)
{
char s[32]; // [rsp+10h] [rbp-30h] BYREF
DIR *dirp; // [rsp+30h] [rbp-10h]
unsigned int v4; // [rsp+3Ch] [rbp-4h]
v4 = 1;
sprintf(s, "/proc/%d", a1);
dirp = opendir(s);
if ( dirp )
closedir(dirp);
else
return 0;
return v4;
}
//----- (0000000000012BC2) ----------------------------------------------------
__int64 __fastcall Conf_Lock_File(const char *a1, char a2, int a3)
{
size_t v3; // rax
int v5; // ebx
char v7[4]; // [rsp+10h] [rbp-490h] BYREF
__pid_t v8; // [rsp+14h] [rbp-48Ch]
int v9; // [rsp+18h] [rbp-488h]
time_t v10; // [rsp+20h] [rbp-480h]
char ptr[4]; // [rsp+30h] [rbp-470h] BYREF
unsigned int v12; // [rsp+34h] [rbp-46Ch]
int v13; // [rsp+38h] [rbp-468h]
time_t v14; // [rsp+40h] [rbp-460h]
char s[1032]; // [rsp+50h] [rbp-450h] BYREF
time_t v16; // [rsp+458h] [rbp-48h]
FILE *stream; // [rsp+460h] [rbp-40h]
int fd; // [rsp+46Ch] [rbp-34h]
DIR *dirp; // [rsp+470h] [rbp-30h]
char *file; // [rsp+478h] [rbp-28h]
int v21; // [rsp+484h] [rbp-1Ch]
int v22; // [rsp+488h] [rbp-18h]
unsigned int v23; // [rsp+48Ch] [rbp-14h]
v23 = 0;
sub_12A08(a1, s, 1024);
v3 = strlen(s);
file = (char *)malloc(v3 + 22);
if ( !file )
return 4294967286LL;
sprintf(file, "%s/%s.lck", "/var/lock/uLinux", s);
dirp = opendir("/var/lock/uLinux");
if ( dirp )
{
closedir(dirp);
}
else if ( mkdir("/var/lock/uLinux", 0x309u) == -1 )
{
v23 = -21;
if ( file )
{
free(file);
file = 0LL;
}
return v23;
}
fd = open64(file, 194, 511LL);
if ( fd == -1 )
{
stream = fopen64(file, "rb");
if ( stream )
{
v22 = 0;
v21 = 0;
v16 = time(0LL);
if ( fread(ptr, 0x18uLL, 1uLL, stream) != 24 && (feof(stream) || ferror(stream)) )
{
if ( file )
{
free(file);
file = 0LL;
}
v23 = -21;
if ( stream )
fclose(stream);
return v23;
}
fclose(stream);
if ( !(unsigned int)is_pid_alive(v12) )
v22 = 1;
if ( v14 < v16 )
v22 = 1;
if ( toupper(ptr[0]) == 82 )
{
v5 = toupper(ptr[0]);
if ( v5 == toupper(a2) )
v21 = 1;
}
if ( v22 <= 0 )
{
if ( v21 == 1 )
{
stream = fopen64(file, "wb");
if ( stream )
{
++v13;
v14 = time(0LL) + a3;
fwrite(ptr, 0x18uLL, 1uLL, stream);
fclose(stream);
}
else
{
v23 = -21;
}
}
else if ( toupper(a2) == 82 )
{
v23 = -22;
}
else
{
v23 = -23;
}
}
else
{
stream = fopen64(file, "wb");
if ( stream )
{
ptr[0] = a2;
v12 = getpid();
v13 = 1;
v14 = time(0LL) + a3;
fwrite(ptr, 0x18uLL, 1uLL, stream);
fclose(stream);
}
else
{
v23 = -21;
}
}
}
else
{
v23 = -21;
}
}
else
{
close(fd);
stream = fopen64(file, "wb");
if ( stream )
{
v7[0] = a2;
v8 = getpid();
v9 = 1;
v10 = time(0LL) + a3;
fwrite(v7, 0x18uLL, 1uLL, stream);
fclose(stream);
}
else
{
v23 = -21;
}
}
if ( v23 == -21 )
unlink(file);
free(file);
return v23;
}
// 12BC2: using guessed type char var_490[4];
//----- (000000000001305F) ----------------------------------------------------
__int64 __fastcall Conf_Unlock_File(const char *a1, char a2)
{
size_t v2; // rax
char ptr[8]; // [rsp+10h] [rbp-430h] BYREF
int v5; // [rsp+18h] [rbp-428h]
char s[1024]; // [rsp+30h] [rbp-410h] BYREF
FILE *stream; // [rsp+430h] [rbp-10h]
char *filename; // [rsp+438h] [rbp-8h]
sub_12A08(a1, s, 1024);
v2 = strlen(s);
filename = (char *)malloc(v2 + 22);
if ( !filename )
return 4294967286LL;
sprintf(filename, "%s/%s.lck", "/var/lock/uLinux", s);
stream = fopen64(filename, "rb");
if ( stream )
{
if ( fread(ptr, 0x18uLL, 1uLL, stream) != 24 && !feof(stream) )
ferror(stream);
fclose(stream);
if ( toupper(a2) == 87 && toupper(ptr[0]) == 87 )
unlink(filename);
if ( toupper(a2) == 82 && toupper(ptr[0]) == 82 )
{
if ( v5 > 1 && (stream = fopen64(filename, "wb")) != 0LL )
{
--v5;
fwrite(ptr, 0x18uLL, 1uLL, stream);
fclose(stream);
}
else
{
unlink(filename);
}
}
}
else
{
unlink(filename);
}
free(filename);
return 0LL;
}
// 1305F: using guessed type char ptr[8];
//----- (0000000000013269) ----------------------------------------------------
__int64 __fastcall Open_File(const char *a1, int a2, FILE **a3)
{
char modes[15]; // [rsp+20h] [rbp-10h] BYREF
char v6; // [rsp+2Fh] [rbp-1h]
v6 = 0;
modes[1] = 0;
if ( a2 )
{
if ( a2 == 1 )
{
modes[0] = 119;
v6 = 119;
}
}
else
{
modes[0] = 114;
v6 = 114;
}
if ( !(unsigned int)NAS_File_Lock(a1, (unsigned int)v6) )
return 4294967293LL;
*a3 = fopen64(a1, modes);
if ( *a3 )
return 0LL;
NAS_File_Unlock(a1);
return 4294967293LL;
}
// 9CE0: using guessed type __int64 __fastcall NAS_File_Lock(_QWORD, _QWORD);
// 9D20: using guessed type __int64 __fastcall NAS_File_Unlock(_QWORD);
//----- (000000000001330B) ----------------------------------------------------
__int64 __fastcall Close_File(__int64 a1, __int64 a2, FILE *a3)
{
int v4; // [rsp+2Ch] [rbp-4h]
v4 = 0;
if ( a3 )
v4 = fclose(a3);
NAS_File_Unlock(a1);
if ( v4 < 0 )
return (unsigned int)-1;
return (unsigned int)v4;
}
// 9D20: using guessed type __int64 __fastcall NAS_File_Unlock(_QWORD);
//----- (0000000000013359) ----------------------------------------------------
__int64 __fastcall Get_String_Field(__int64 a1, int a2, char a3, char *a4, int a5)
{
int i; // eax
char *s; // [rsp+18h] [rbp-28h]
int v11; // [rsp+34h] [rbp-Ch]
int v12; // [rsp+38h] [rbp-8h]
int v13; // [rsp+3Ch] [rbp-4h]
v13 = 0;
v12 = 0;
s = (char *)skip_white_space(a1);
for ( i = find_char_in_string((__int64)s, a3); ; i = find_char_in_string((__int64)&s[v11 + 1], a3) )
{
v11 = i;
if ( i == -1 )
break;
v11 = v12 + i;
if ( ++v13 == a2 )
break;
v12 = v11 + 1;
}
if ( v11 == -1 )
{
if ( v13 + 1 == a2 )
{
v11 = strlen(s) + 1;
}
else if ( v13 + 1 < a2 )
{
return 4294967284LL;
}
}
if ( !a4 )
return (unsigned int)(v11 - v12 + 1);
if ( v11 - v12 + 1 <= a5 )
{
strncpy(a4, &s[v12], v11 - v12);
a4[v11 - v12] = 0;
stripe_white_space_tail(a4);
if ( a4[strlen(a4) - 1] == 10 )
a4[strlen(a4) - 1] = 0;
return 0LL;
}
else
{
strncpy(a4, &s[v12], a5 - 1);
a4[a5 - 1] = 0;
return 4294967287LL;
}
}
// A2C0: using guessed type __int64 __fastcall stripe_white_space_tail(_QWORD);
// A6B0: using guessed type __int64 __fastcall skip_white_space(_QWORD);
//----- (0000000000013511) ----------------------------------------------------
__int64 __fastcall Set_String_Field(__int64 a1, int a2, char a3, const char *a4, char *a5, int a6)
{
int i; // eax
int v8; // ebx
char *s; // [rsp+28h] [rbp-38h]
unsigned int v14; // [rsp+34h] [rbp-2Ch]
int v15; // [rsp+44h] [rbp-1Ch]
int v16; // [rsp+48h] [rbp-18h]
int v17; // [rsp+4Ch] [rbp-14h]
v17 = 0;
v16 = 0;
s = (char *)skip_white_space(a1);
for ( i = find_char_in_string((__int64)s, a3); ; i = find_char_in_string((__int64)&s[v15 + 1], a3) )
{
v15 = i;
if ( i == -1 )
break;
v15 = v16 + i;
if ( ++v17 == a2 )
break;
v16 = v15 + 1;
}
if ( v15 == -1 )
{
if ( v17 + 1 == a2 )
{
v15 = strlen(s) + 1;
}
else if ( v17 + 1 < a2 )
{
return 4294967284LL;
}
}
v8 = strlen(s) + v16 - v15;
v14 = v8 + strlen(a4) + 1;
if ( !a5 )
return v14;
if ( a6 >= (int)v14 )
{
strncpy(a5, s, v16);
a5[v16] = 0;
strcat(a5, a4);
if ( v15 != strlen(s) + 1 )
strcat(a5, &s[v15]);
stripe_white_space_tail(a5);
return 0LL;
}
else
{
strncpy(a5, s, a6 - 1);
a5[a6 - 1] = 0;
return 4294967287LL;
}
}
// A2C0: using guessed type __int64 __fastcall stripe_white_space_tail(_QWORD);
// A6B0: using guessed type __int64 __fastcall skip_white_space(_QWORD);
//----- (00000000000136EC) ----------------------------------------------------
__int64 __fastcall Insert_String_Field(__int64 a1, int a2, char a3, const char *a4, char *a5, int a6)
{
int v6; // ebx
int i; // eax
int v9; // ebx
char *s; // [rsp+28h] [rbp-38h]
unsigned int v15; // [rsp+34h] [rbp-2Ch]
unsigned int v16; // [rsp+34h] [rbp-2Ch]
int v17; // [rsp+44h] [rbp-1Ch]
int v18; // [rsp+48h] [rbp-18h]
int v19; // [rsp+4Ch] [rbp-14h]
v19 = 0;
v18 = 0;
s = (char *)skip_white_space(a1);
if ( a2 )
{
for ( i = find_char_in_string((__int64)s, a3); ; i = find_char_in_string((__int64)&s[v17 + 1], a3) )
{
v17 = i;
if ( i == -1 )
break;
v17 = v18 + i;
if ( ++v19 == a2 )
break;
v18 = v17 + 1;
}
if ( v17 == -1 )
{
if ( v19 + 1 == a2 )
{
strlen(s);
}
else if ( v19 + 1 < a2 )
{
return 4294967284LL;
}
}
v9 = strlen(s);
v16 = v9 + strlen(a4) + 2;
if ( a5 )
{
if ( a6 < (int)v16 )
{
LABEL_5:
strncpy(a5, s, a6 - 1);
a5[a6 - 1] = 0;
return 4294967287LL;
}
strncpy(a5, s, v18);
a5[v18] = a3;
a5[v18 + 1] = 0;
strcat(a5, a4);
strcat(a5, &s[v18]);
stripe_white_space_tail(a5);
return 0LL;
}
else
{
return v16;
}
}
else
{
v6 = strlen(s);
v15 = v6 + strlen(a4) + 2;
if ( !a5 )
return v15;
if ( a6 < (int)v15 )
goto LABEL_5;
if ( *s )
sprintf(a5, "%s%c%s", s, (unsigned int)a3, a4);
else
strcpy(a5, a4);
return 0LL;
}
}
// A2C0: using guessed type __int64 __fastcall stripe_white_space_tail(_QWORD);
// A6B0: using guessed type __int64 __fastcall skip_white_space(_QWORD);
//----- (0000000000013983) ----------------------------------------------------
__int64 __fastcall Remove_String_Field(__int64 a1, int a2, char a3)
{
int i; // eax
size_t v5; // rax
char *s; // [rsp+8h] [rbp-28h]
int v8; // [rsp+24h] [rbp-Ch]
int v9; // [rsp+28h] [rbp-8h]
int v10; // [rsp+2Ch] [rbp-4h]
v10 = 0;
v9 = 0;
s = (char *)skip_white_space(a1);
for ( i = find_char_in_string((__int64)s, a3); ; i = find_char_in_string((__int64)&s[v8 + 1], a3) )
{
v8 = i;
if ( i == -1 )
break;
v8 = v9 + i;
if ( ++v10 == a2 )
break;
v9 = v8 + 1;
}
if ( v8 != -1 )
{
LABEL_14:
v5 = strlen(s);
memmove(&s[v9], &s[v8 + 1], v5 - v8);
return 0LL;
}
if ( v10 + 1 != a2 )
{
if ( v10 + 1 < a2 )
return 4294967284LL;
goto LABEL_14;
}
if ( v9 )
s[v9 - 1] = 0;
else
*s = 0;
return 0LL;
}
// A6B0: using guessed type __int64 __fastcall skip_white_space(_QWORD);
//----- (0000000000013AAC) ----------------------------------------------------
__int64 __fastcall Parse_String_Field(__int64 a1, __int64 a2)
{
int j; // [rsp+1Ch] [rbp-14h]
char *i; // [rsp+20h] [rbp-10h]
__int64 v5; // [rsp+28h] [rbp-8h]
v5 = a1;
if ( a1 )
{
qword_237548 = a1;
dword_23688C = -1;
}
else if ( qword_237548 )
{
if ( dword_23688C < 0 )
{
v5 = 0LL;
}
else
{
*(_BYTE *)(dword_23688C + qword_237548) = byte_237550;
v5 = dword_23688C + 1LL + qword_237548;
dword_23688C = -1;
}
}
if ( v5 )
{
for ( i = (char *)v5; *i; ++i )
{
for ( j = 0; *(_BYTE *)(j + a2); ++j )
{
if ( *i == *(_BYTE *)(j + a2) )
{
byte_237550 = *i;
dword_23688C = (_DWORD)i - qword_237548;
*i = 0;
return v5;
}
}
}
}
return v5;
}
// 23688C: using guessed type int dword_23688C;
// 237548: using guessed type __int64 qword_237548;
// 237550: using guessed type char byte_237550;
//----- (0000000000013BD3) ----------------------------------------------------
__int64 __fastcall SYS_Get_One_String(const char *a1, int a2, char a3, const char *a4, char *a5, int a6)
{
void *v7; // rsp
int v8; // eax
size_t v9; // rbx
char v10[12]; // [rsp+0h] [rbp-90h] BYREF
int v11; // [rsp+Ch] [rbp-84h]
char *dest; // [rsp+10h] [rbp-80h]
const char *v13; // [rsp+18h] [rbp-78h]
char v14; // [rsp+20h] [rbp-70h]
int v15; // [rsp+24h] [rbp-6Ch]
const char *v16; // [rsp+28h] [rbp-68h]
FILE *stream; // [rsp+30h] [rbp-60h] BYREF
const char *v18; // [rsp+38h] [rbp-58h]
__int64 v19; // [rsp+40h] [rbp-50h]
int String_Field; // [rsp+4Ch] [rbp-44h]
char *s; // [rsp+50h] [rbp-40h]
unsigned int v22; // [rsp+58h] [rbp-38h]
int v23; // [rsp+5Ch] [rbp-34h]
v16 = a1;
v15 = a2;
v13 = a4;
dest = a5;
v11 = a6;
v14 = a3;
stream = 0LL;
v22 = 0;
v23 = 0;
v22 = Open_File(a1, 0, &stream);
if ( v22 )
return v22;
if ( !stream )
return 4294967293LL;
rewind(stream);
while ( 1 )
{
s = (char *)get_one_line_of_string(stream);
if ( !s )
break;
String_Field = Get_String_Field((__int64)s, v15, v14, 0LL, 0);
if ( String_Field > 0 )
{
v19 = String_Field - 1LL;
v7 = alloca(16 * ((String_Field + 15LL) / 0x10uLL));
v18 = v10;
Get_String_Field((__int64)s, v15, v14, v10, String_Field);
if ( compare_string_by_flag(v13, v18) )
{
v8 = 1;
}
else
{
v23 = 1;
v8 = 0;
}
if ( v8 != 1 )
break;
}
}
Close_File((__int64)v16, 0LL, stream);
if ( !v23 )
return 4294967284LL;
if ( !dest )
return (unsigned int)strlen(s) + 1;
v9 = v11;
if ( v9 >= strlen(s) + 1 )
{
strcpy(dest, s);
return 0LL;
}
else
{
strncpy(dest, s, v11 - 1);
dest[v11 - 1] = 0;
return 4294967287LL;
}
}
// AC40: using guessed type __int64 __fastcall get_one_line_of_string(_QWORD);
//----- (0000000000013E0C) ----------------------------------------------------
__int64 __fastcall SYS_Set_One_String(char *a1, int a2, char a3, const char *a4, const char *a5)
{
unsigned int v5; // ebx
void *v6; // rsp
int v7; // eax
int v8; // eax
int v9; // eax
char v11[8]; // [rsp+0h] [rbp-D50h] BYREF
char *v12; // [rsp+8h] [rbp-D48h]
const char *v13; // [rsp+10h] [rbp-D40h]
const char *v14; // [rsp+18h] [rbp-D38h]
char v15; // [rsp+20h] [rbp-D30h]
int v16; // [rsp+24h] [rbp-D2Ch]
char *name; // [rsp+28h] [rbp-D28h]
struct stat64 stat_buf; // [rsp+30h] [rbp-D20h] BYREF
char s[1024]; // [rsp+C0h] [rbp-C90h] BYREF
char resolved[1024]; // [rsp+4C0h] [rbp-890h] BYREF
char old[1024]; // [rsp+8C0h] [rbp-490h] BYREF
char templatea[32]; // [rsp+CC0h] [rbp-90h] BYREF
FILE *v23; // [rsp+CE0h] [rbp-70h] BYREF
const char *v24; // [rsp+CE8h] [rbp-68h]
__int64 v25; // [rsp+CF0h] [rbp-60h]
int String_Field; // [rsp+CFCh] [rbp-54h]
char *one_line_of_string; // [rsp+D00h] [rbp-50h]
int fd; // [rsp+D08h] [rbp-48h]
unsigned int v29; // [rsp+D0Ch] [rbp-44h]
FILE *stream; // [rsp+D10h] [rbp-40h]
_BOOL4 v31; // [rsp+D18h] [rbp-38h]
int v32; // [rsp+D1Ch] [rbp-34h]
name = a1;
v16 = a2;
v14 = a4;
v13 = a5;
v15 = a3;
v23 = 0LL;
stream = 0LL;
v29 = 0;
v32 = 0;
strcpy(templatea, "/tmp/temp.XXXXXX");
v31 = sub_2D9E0(a1, &stat_buf) == 0;
snprintf(s, 0x400uLL, "%s.lckfile", a1);
if ( !(unsigned int)NAS_File_Lock(s, 1LL) )
return (unsigned int)-5;
fd = mkstemp64(templatea);
if ( fd < 0 )
{
NAS_File_Unlock(s);
return (unsigned int)-5;
}
close(fd);
v29 = Open_File(name, 0, &v23);
if ( v29 )
{
unlink(templatea);
NAS_File_Unlock(s);
return v29;
}
stream = fopen64(templatea, "wb");
if ( !stream )
{
Close_File((__int64)name, 0LL, v23);
unlink(templatea);
NAS_File_Unlock(s);
return (unsigned int)-5;
}
if ( v23 )
{
while ( 1 )
{
one_line_of_string = (char *)get_one_line_of_string(v23);
if ( !one_line_of_string )
break;
String_Field = Get_String_Field((__int64)one_line_of_string, v16, v15, 0LL, 0);
if ( String_Field > 0 )
{
v12 = v11;
v25 = String_Field - 1LL;
v6 = alloca(16 * ((String_Field + 15LL) / 0x10uLL));
v24 = v11;
Get_String_Field((__int64)one_line_of_string, v16, v15, v11, String_Field);
if ( compare_string_by_flag(v14, v24) )
{
if ( fputs(one_line_of_string, stream) >= 0 )
{
fputc(10, stream);
v7 = 2;
}
else
{
Close_File((__int64)name, 0LL, v23);
if ( stream )
fclose(stream);
unlink(templatea);
NAS_File_Unlock(s);
v5 = -5;
v7 = 1;
}
}
else
{
v32 = 1;
fprintf(stream, "%s\n", v13);
v7 = 0;
}
if ( v7 && v7 != 2 )
return v5;
}
}
Close_File((__int64)name, 0LL, v23);
if ( fflush(stream) < 0 && (*__errno_location() == 28 || *__errno_location() == 5) )
v8 = -1;
else
v8 = 0;
v29 = v8;
if ( fclose(stream) < 0 || (v29 & 0x80000000) != 0 )
goto LABEL_33;
if ( !v32 )
{
NAS_File_Unlock(s);
return (unsigned int)-12;
}
realpath(name, resolved);
sprintf(old, "%s.bak", resolved);
v29 = Open_File(old, 1, &v23);
if ( v29 )
{
NAS_File_Unlock(s);
return v29;
}
stream = fopen64(templatea, "rb");
if ( !stream )
{
Close_File((__int64)old, 1LL, v23);
unlink(old);
unlink(templatea);
NAS_File_Unlock(s);
return (unsigned int)-5;
}
while ( 1 )
{
one_line_of_string = (char *)get_one_line_of_string(stream);
if ( !one_line_of_string )
break;
fputs(one_line_of_string, v23);
fputc(10, v23);
}
if ( fflush(v23) < 0 && (*__errno_location() == 28 || *__errno_location() == 5) )
v9 = -1;
else
v9 = 0;
v29 = v9;
if ( (int)Close_File((__int64)old, 1LL, v23) < 0 || (v29 & 0x80000000) != 0 )
{
unlink(old);
if ( stream )
fclose(stream);
LABEL_33:
unlink(templatea);
NAS_File_Unlock(s);
return (unsigned int)-5;
}
if ( rename(old, resolved) == -1 )
{
unlink(old);
if ( stream )
fclose(stream);
LABEL_54:
unlink(templatea);
NAS_File_Unlock(s);
return (unsigned int)-1;
}
if ( v31 && chmod(resolved, stat_buf.st_mode) == -1 )
{
if ( stream )
fclose(stream);
goto LABEL_54;
}
if ( stream )
fclose(stream);
unlink(templatea);
NAS_File_Unlock(s);
return 0;
}
else
{
Close_File((__int64)name, 0LL, 0LL);
if ( stream )
fclose(stream);
unlink(templatea);
NAS_File_Unlock(s);
return (unsigned int)-3;
}
}
// 1455D: variable 'v5' is possibly undefined
// 9CE0: using guessed type __int64 __fastcall NAS_File_Lock(_QWORD, _QWORD);
// 9D20: using guessed type __int64 __fastcall NAS_File_Unlock(_QWORD);
// AC40: using guessed type __int64 __fastcall get_one_line_of_string(_QWORD);
// 13E0C: using guessed type char anonymous_0[8];
//----- (000000000001456E) ----------------------------------------------------
const char *__fastcall Conf_Dir_Get_Str(__int64 a1, const char *a2, const char *a3, const char *a4, char *a5, int a6)
{
int i; // [rsp+3Ch] [rbp-14h]
if ( !a1 || !a3 || !a2 )
return 0LL;
for ( i = 0; *(_DWORD *)(a1 + 1028) > i; ++i )
{
if ( *(_QWORD *)(8LL * i + *(_QWORD *)(a1 + 1072))
&& *(_QWORD *)(8LL * i + *(_QWORD *)(a1 + 1056))
&& !strcasecmp(a3, *(const char **)(8LL * i + *(_QWORD *)(a1 + 1072)))
&& !strcasecmp(a2, *(const char **)(8LL * i + *(_QWORD *)(a1 + 1056))) )
{
if ( *(_QWORD *)(8LL * i + *(_QWORD *)(a1 + 1064)) )
{
if ( !a5 || a6 < strlen(*(const char **)(8LL * i + *(_QWORD *)(a1 + 1064))) )
return *(const char **)(8LL * i + *(_QWORD *)(a1 + 1064));
strcpy(a5, *(const char **)(8LL * i + *(_QWORD *)(a1 + 1064)));
return *(const char **)(8LL * i + *(_QWORD *)(a1 + 1064));
}
break;
}
}
if ( a5 && a4 )
{
if ( strlen(a4) >= a6 )
{
strncpy(a5, a4, a6 - 1);
a5[a6] = 0;
}
else
{
strncpy(a5, a4, a6);
}
}
if ( a4 )
return a4;
else
return 0LL;
}
//----- (00000000000147C6) ----------------------------------------------------
__int64 __fastcall Conf_Dir_Get_Int(__int64 a1, const char *a2, const char *a3, unsigned int a4, unsigned int *a5)
{
char s[68]; // [rsp+30h] [rbp-50h] BYREF
unsigned int v9; // [rsp+74h] [rbp-Ch]
char *nptr; // [rsp+78h] [rbp-8h]
sprintf(s, "%d", a4);
nptr = (char *)Conf_Dir_Get_Str(a1, a2, a3, s, 0LL, 0);
v9 = atoi(nptr);
if ( a5 )
*a5 = v9;
return v9;
}
//----- (0000000000014848) ----------------------------------------------------
_BOOL8 __fastcall Conf_Dir_Get_Bool(__int64 a1, const char *a2, const char *a3, int a4, _BOOL4 *a5)
{
const char *v5; // rax
const char *Str; // rax
bool v7; // bl
const char *v8; // rax
const char *v9; // rax
int v10; // ebx
const char *v11; // rax
const char *v12; // rax
_BOOL4 v17; // [rsp+3Ch] [rbp-14h]
if ( a4 )
v5 = "TRUE";
else
v5 = "FALSE";
Str = Conf_Dir_Get_Str(a1, a2, a3, v5, 0LL, 0);
v7 = strcasecmp(Str, "TRUE") == 0;
if ( a4 )
v8 = "TRUE";
else
v8 = "FALSE";
v9 = Conf_Dir_Get_Str(a1, a2, a3, v8, 0LL, 0);
v10 = v7 | (strcasecmp(v9, "YES") == 0);
if ( a4 )
v11 = "TRUE";
else
v11 = "FALSE";
v12 = Conf_Dir_Get_Str(a1, a2, a3, v11, 0LL, 0);
v17 = (v10 | (atoi(v12) != 0)) != 0;
if ( a5 )
*a5 = v17;
return v17;
}
//----- (0000000000014972) ----------------------------------------------------
__int64 __fastcall Conf_Dir_Remove(__int64 a1, const char *a2, const char *a3)
{
int i; // [rsp+2Ch] [rbp-4h]
if ( !a1 || !a3 || !a2 )
return 1LL;
for ( i = 0; *(_DWORD *)(a1 + 1028) > i; ++i )
{
if ( *(_QWORD *)(8LL * i + *(_QWORD *)(a1 + 1072))
&& *(_QWORD *)(8LL * i + *(_QWORD *)(a1 + 1056))
&& !strcasecmp(a2, *(const char **)(8LL * i + *(_QWORD *)(a1 + 1056)))
&& !strcasecmp(a3, *(const char **)(8LL * i + *(_QWORD *)(a1 + 1072))) )
{
if ( *(_QWORD *)(8LL * i + *(_QWORD *)(a1 + 1064)) )
{
free(*(void **)(8LL * i + *(_QWORD *)(a1 + 1064)));
*(_QWORD *)(8LL * i + *(_QWORD *)(a1 + 1064)) = 0LL;
}
free(*(void **)(8LL * i + *(_QWORD *)(a1 + 1056)));
free(*(void **)(8LL * i + *(_QWORD *)(a1 + 1072)));
*(_QWORD *)(8LL * i + *(_QWORD *)(a1 + 1056)) = 0LL;
*(_QWORD *)(8LL * i + *(_QWORD *)(a1 + 1072)) = 0LL;
}
}
return 0LL;
}
//----- (0000000000014B5E) ----------------------------------------------------
__int64 __fastcall Conf_Dir_Dump(__int64 a1)
{
const char *v1; // rax
int j; // [rsp+18h] [rbp-8h]
int i; // [rsp+1Ch] [rbp-4h]
puts("======[DUMP CONFIG START]======");
for ( i = 0; *(_DWORD *)(a1 + 1032) > i; ++i )
{
if ( *(_QWORD *)(8LL * i + *(_QWORD *)(a1 + 1048)) )
{
printf("[%s]\n", *(const char **)(8LL * i + *(_QWORD *)(a1 + 1048)));
for ( j = 0; *(_DWORD *)(a1 + 1028) > j; ++j )
{
if ( *(_QWORD *)(8LL * j + *(_QWORD *)(a1 + 1056))
&& *(_QWORD *)(8LL * j + *(_QWORD *)(a1 + 1072))
&& !strcasecmp(
*(const char **)(8LL * j + *(_QWORD *)(a1 + 1056)),
*(const char **)(8LL * i + *(_QWORD *)(a1 + 1048))) )
{
if ( *(_QWORD *)(8LL * j + *(_QWORD *)(a1 + 1064)) )
v1 = *(const char **)(8LL * j + *(_QWORD *)(a1 + 1064));
else
v1 = (const char *)&unk_2E32E;
printf("%s = %s\n", *(const char **)(8LL * j + *(_QWORD *)(a1 + 1072)), v1);
}
}
}
}
puts("======[DUMP CONFIG FINISH]======");
return 0LL;
}
//----- (0000000000014D25) ----------------------------------------------------
__int64 __fastcall Conf_Dir_Add_Sec(__int64 a1, const char *a2)
{
char **v3; // rbx
int i; // [rsp+1Ch] [rbp-14h]
int v5; // [rsp+1Ch] [rbp-14h]
for ( i = 0; *(_DWORD *)(a1 + 1032) > i; ++i )
{
if ( *(_QWORD *)(8LL * i + *(_QWORD *)(a1 + 1048))
&& !strcmp(*(const char **)(8LL * i + *(_QWORD *)(a1 + 1048)), a2) )
{
return 0LL;
}
}
v5 = *(_DWORD *)(a1 + 1032);
if ( v5 == *(_DWORD *)(a1 + 1036) )
{
*(_QWORD *)(a1 + 1048) = realloc(*(void **)(a1 + 1048), 8LL * (*(_DWORD *)(a1 + 1036) + 128));
if ( !*(_QWORD *)(a1 + 1048) )
return 1LL;
memset((void *)(*(_QWORD *)(a1 + 1048) + 8LL * *(int *)(a1 + 1036)), 0, 0x400uLL);
*(_DWORD *)(a1 + 1036) += 128;
}
v3 = (char **)(*(_QWORD *)(a1 + 1048) + 8LL * v5);
*v3 = strdup(a2);
++*(_DWORD *)(a1 + 1032);
return 0LL;
}
//----- (0000000000014EBF) ----------------------------------------------------
__int64 __fastcall Conf_Dir_Add(__int64 a1, const char *a2, const char *a3, const char *a4)
{
char **v5; // rbx
char **v6; // rbx
char *v7; // rax
char **v8; // rbx
char *v9; // rax
int v12; // [rsp+2Ch] [rbp-14h]
v12 = *(_DWORD *)(a1 + 1028);
if ( v12 == *(_DWORD *)(a1 + 1040) )
{
*(_QWORD *)(a1 + 1064) = realloc(*(void **)(a1 + 1064), 8LL * (*(_DWORD *)(a1 + 1040) + 128));
*(_QWORD *)(a1 + 1072) = realloc(*(void **)(a1 + 1072), 8LL * (*(_DWORD *)(a1 + 1040) + 128));
*(_QWORD *)(a1 + 1056) = realloc(*(void **)(a1 + 1056), 8LL * (*(_DWORD *)(a1 + 1040) + 128));
if ( !*(_QWORD *)(a1 + 1064) || !*(_QWORD *)(a1 + 1072) || !*(_QWORD *)(a1 + 1056) )
{
_conf_set_field_err(a1, a2, a3, a4);
return 1LL;
}
memset((void *)(*(_QWORD *)(a1 + 1064) + 8LL * *(int *)(a1 + 1040)), 0, 0x80uLL);
memset((void *)(*(_QWORD *)(a1 + 1072) + 8LL * *(int *)(a1 + 1040)), 0, 0x80uLL);
memset((void *)(*(_QWORD *)(a1 + 1056) + 8LL * *(int *)(a1 + 1040)), 0, 0x80uLL);
*(_DWORD *)(a1 + 1040) += 128;
}
v5 = (char **)(*(_QWORD *)(a1 + 1056) + 8LL * v12);
*v5 = strdup(a2);
v6 = (char **)(*(_QWORD *)(a1 + 1072) + 8LL * v12);
if ( a3 )
v7 = strdup(a3);
else
v7 = 0LL;
*v6 = v7;
v8 = (char **)(*(_QWORD *)(a1 + 1064) + 8LL * v12);
if ( a4 )
v9 = strdup(a4);
else
v9 = 0LL;
*v8 = v9;
++*(_DWORD *)(a1 + 1028);
return 0LL;
}
// A070: using guessed type __int64 __fastcall _conf_set_field_err(_QWORD, _QWORD, _QWORD, _QWORD);
//----- (0000000000015165) ----------------------------------------------------
__int64 __fastcall Conf_Dir_Wirte_File(__int64 a1)
{
const char *v2; // rax
struct stat64 stat_buf; // [rsp+10h] [rbp-DE0h] BYREF
char ptr[272]; // [rsp+A0h] [rbp-D50h] BYREF
char filename[1024]; // [rsp+1B0h] [rbp-C40h] BYREF
char s[1024]; // [rsp+5B0h] [rbp-840h] BYREF
char resolved[1024]; // [rsp+9B0h] [rbp-440h] BYREF
char templatea[24]; // [rsp+DB0h] [rbp-40h] BYREF
int fd; // [rsp+DC8h] [rbp-28h]
unsigned int v10; // [rsp+DCCh] [rbp-24h]
_BOOL4 v11; // [rsp+DD0h] [rbp-20h]
unsigned int v12; // [rsp+DD4h] [rbp-1Ch]
FILE *v13; // [rsp+DD8h] [rbp-18h]
FILE *stream; // [rsp+DE0h] [rbp-10h]
int j; // [rsp+DE8h] [rbp-8h]
int i; // [rsp+DECh] [rbp-4h]
stream = 0LL;
v13 = 0LL;
strcpy(templatea, "/tmp/temp.XXXXXX");
v12 = -5;
v11 = sub_2D9E0((char *)a1, &stat_buf) == 0;
snprintf(s, 0x400uLL, "%s.lckfile", (const char *)a1);
v10 = Ini_Conf_Write_Lock_File_Timeout(s, 300LL);
if ( v10 == -1 )
return v12;
fd = mkstemp64(templatea);
if ( fd >= 0 )
{
close(fd);
stream = fopen64(templatea, "wb");
if ( stream )
{
for ( i = 0; *(_DWORD *)(a1 + 1032) > i; ++i )
{
if ( *(_QWORD *)(8LL * i + *(_QWORD *)(a1 + 1048)) )
{
fprintf(stream, "\n[%s]\n", *(const char **)(8LL * i + *(_QWORD *)(a1 + 1048)));
for ( j = 0; *(_DWORD *)(a1 + 1028) > j; ++j )
{
if ( *(_QWORD *)(8LL * j + *(_QWORD *)(a1 + 1056))
&& *(_QWORD *)(8LL * j + *(_QWORD *)(a1 + 1072))
&& !strcasecmp(
*(const char **)(8LL * j + *(_QWORD *)(a1 + 1056)),
*(const char **)(8LL * i + *(_QWORD *)(a1 + 1048))) )
{
if ( *(_QWORD *)(8LL * j + *(_QWORD *)(a1 + 1064)) )
v2 = *(const char **)(8LL * j + *(_QWORD *)(a1 + 1064));
else
v2 = (const char *)&unk_2E32E;
fprintf(stream, "%s = %s\n", *(const char **)(8LL * j + *(_QWORD *)(a1 + 1072)), v2);
}
}
}
}
fputc(10, stream);
if ( fflush(stream) >= 0 || *__errno_location() != 28 && *__errno_location() != 5 )
{
fclose(stream);
realpath((const char *)a1, resolved);
sprintf(filename, "%s.bak", resolved);
stream = fopen64(templatea, "rb");
v13 = fopen64(filename, "wb");
if ( stream )
{
if ( v13 )
{
while ( 1 )
{
i = fread(ptr, 1uLL, 0x101uLL, stream);
if ( i <= 0 )
break;
fwrite(ptr, 1uLL, i, v13);
}
if ( (fflush(v13) >= 0 || *__errno_location() != 28 && *__errno_location() != 5)
&& rename(filename, resolved) >= 0
&& (!v11 || chmod(resolved, stat_buf.st_mode) != -1) )
{
v12 = 0;
}
}
}
}
}
Ini_Conf_Unlock_File(v10);
unlink(templatea);
if ( stream )
fclose(stream);
if ( v13 )
fclose(v13);
return v12;
}
else
{
NAS_File_Unlock(s);
return v12;
}
}
// 9D00: using guessed type __int64 __fastcall Ini_Conf_Write_Lock_File_Timeout(_QWORD, _QWORD);
// 9D20: using guessed type __int64 __fastcall NAS_File_Unlock(_QWORD);
// A3E0: using guessed type __int64 __fastcall Ini_Conf_Unlock_File(_QWORD);
//----- (000000000001560F) ----------------------------------------------------
__int64 __fastcall Conf_Dir_Set_Str(__int64 a1, const char *a2, const char *a3, const char *a4)
{
char **v5; // rbx
int v8; // [rsp+28h] [rbp-18h]
int i; // [rsp+2Ch] [rbp-14h]
v8 = 0;
if ( !a1 || !a3 || !a2 || !a4 )
return 0xFFFFFFFFLL;
if ( *(int *)(a1 + 1028) > 0 )
{
for ( i = 0; *(_DWORD *)(a1 + 1028) > i; ++i )
{
if ( *(_QWORD *)(8LL * i + *(_QWORD *)(a1 + 1056)) )
{
if ( !strcasecmp(a2, *(const char **)(8LL * i + *(_QWORD *)(a1 + 1056))) )
{
v8 = 1;
if ( *(_QWORD *)(8LL * i + *(_QWORD *)(a1 + 1072)) )
{
if ( !strcmp(a3, *(const char **)(8LL * i + *(_QWORD *)(a1 + 1072))) )
{
if ( strcmp(a4, *(const char **)(8LL * i + *(_QWORD *)(a1 + 1064))) )
{
free(*(void **)(8LL * i + *(_QWORD *)(a1 + 1064)));
v5 = (char **)(*(_QWORD *)(a1 + 1064) + 8LL * i);
*v5 = strdup(a4);
}
return 0LL;
}
}
}
}
}
}
if ( !v8 )
Conf_Dir_Add_Sec(a1, a2);
if ( *(_DWORD *)(a1 + 1024)
&& (!strcasecmp(a2, "System")
|| !strcasecmp(a2, "Storage")
|| !strcasecmp(a2, "Misc")
|| !strcasecmp(a2, "LDAP")
|| !strcasecmp(a2, "WebFS")
|| !strcasecmp(a2, "Samba")) )
{
SHM_Set_Field(a2, a3, a4);
}
return Conf_Dir_Add(a1, a2, a3, a4);
}
// A420: using guessed type __int64 __fastcall SHM_Set_Field(_QWORD, _QWORD, _QWORD);
//----- (00000000000158AD) ----------------------------------------------------
__int64 __fastcall Conf_Dir_Set_Int(__int64 a1, const char *a2, const char *a3, unsigned int a4)
{
char s[64]; // [rsp+20h] [rbp-40h] BYREF
sprintf(s, "%d", a4);
return Conf_Dir_Set_Str(a1, a2, a3, s);
}
//----- (00000000000158F9) ----------------------------------------------------
__int64 __fastcall Conf_Dir_Set_Bool(__int64 a1, const char *a2, const char *a3, int a4)
{
const char *v4; // rax
if ( a4 )
v4 = "TRUE";
else
v4 = "FALSE";
return Conf_Dir_Set_Str(a1, a2, a3, v4);
}
//----- (000000000001593C) ----------------------------------------------------
__int64 __fastcall Conf_Dir_Set_Long(__int64 a1, const char *a2, const char *a3, __int64 a4)
{
char s[64]; // [rsp+20h] [rbp-40h] BYREF
sprintf(s, "%ld", a4);
return Conf_Dir_Set_Str(a1, a2, a3, s);
}
//----- (000000000001598A) ----------------------------------------------------
__int64 __fastcall Conf_Dir_Set_Longlong(__int64 a1, const char *a2, const char *a3, __int64 a4)
{
char s[64]; // [rsp+20h] [rbp-40h] BYREF
sprintf(s, "%lld", a4);
return Conf_Dir_Set_Str(a1, a2, a3, s);
}
//----- (00000000000159D8) ----------------------------------------------------
void __fastcall Conf_Dir_Free(__int64 a1)
{
int i; // [rsp+1Ch] [rbp-4h]
int j; // [rsp+1Ch] [rbp-4h]
if ( a1 )
{
for ( i = 0; *(_DWORD *)(a1 + 1028) > i; ++i )
{
if ( *(_QWORD *)(8LL * i + *(_QWORD *)(a1 + 1072)) )
free(*(void **)(8LL * i + *(_QWORD *)(a1 + 1072)));
if ( *(_QWORD *)(8LL * i + *(_QWORD *)(a1 + 1064)) )
free(*(void **)(8LL * i + *(_QWORD *)(a1 + 1064)));
if ( *(_QWORD *)(8LL * i + *(_QWORD *)(a1 + 1056)) )
free(*(void **)(8LL * i + *(_QWORD *)(a1 + 1056)));
}
for ( j = 0; *(_DWORD *)(a1 + 1032) > j; ++j )
{
if ( *(_QWORD *)(8LL * j + *(_QWORD *)(a1 + 1048)) )
free(*(void **)(8LL * j + *(_QWORD *)(a1 + 1048)));
}
free(*(void **)(a1 + 1048));
free(*(void **)(a1 + 1056));
free(*(void **)(a1 + 1064));
free(*(void **)(a1 + 1072));
free((void *)a1);
}
}
//----- (0000000000015B95) ----------------------------------------------------
char *__fastcall Conf_Dir_Load(const char *a1)
{
size_t v2; // rax
size_t v3; // rax
char s[128]; // [rsp+10h] [rbp-C0h] BYREF
char *v5; // [rsp+90h] [rbp-40h]
char *v6; // [rsp+98h] [rbp-38h]
char *src; // [rsp+A0h] [rbp-30h]
char *v8; // [rsp+A8h] [rbp-28h]
FILE *stream; // [rsp+B0h] [rbp-20h]
char *one_line_of_string; // [rsp+B8h] [rbp-18h]
char *v11; // [rsp+C0h] [rbp-10h]
int v12; // [rsp+CCh] [rbp-4h]
stream = 0LL;
v12 = 0;
memset(s, 0, sizeof(s));
stream = fopen64(a1, "r");
pthread_mutex_lock(&mutex);
v11 = (char *)calloc(1uLL, 0x438uLL);
if ( v11 )
{
if ( !strcmp(a1, "/etc/config/uLinux.conf") )
*((_DWORD *)v11 + 256) = 1;
snprintf(v11, 0x400uLL, "%s", a1);
*((_DWORD *)v11 + 260) = 128;
*((_DWORD *)v11 + 259) = 128;
*((_DWORD *)v11 + 257) = 0;
*((_DWORD *)v11 + 258) = 0;
*((_QWORD *)v11 + 132) = calloc(0x80uLL, 8uLL);
*((_QWORD *)v11 + 133) = calloc(0x80uLL, 8uLL);
*((_QWORD *)v11 + 134) = calloc(0x80uLL, 8uLL);
*((_QWORD *)v11 + 131) = calloc(0x80uLL, 8uLL);
if ( stream )
{
while ( 1 )
{
one_line_of_string = (char *)get_one_line_of_string(stream);
if ( !one_line_of_string )
break;
v8 = (char *)skip_white_space(one_line_of_string);
if ( *v8 == 91 )
{
src = v8 + 1;
v2 = strlen(v8 + 1);
for ( one_line_of_string = &src[v2 - 1];
*one_line_of_string != 93 && one_line_of_string != src;
--one_line_of_string )
{
;
}
*one_line_of_string = 0;
src = (char *)skip_white_space(src);
src = (char *)stripe_white_space_tail(src);
strncpy(s, src, 0x80uLL);
v12 = Conf_Dir_Add_Sec((__int64)v11, src);
}
else if ( !is_commented_string((__int64)v8) )
{
one_line_of_string = v8;
v6 = v8;
while ( *one_line_of_string != 61 && *one_line_of_string )
++one_line_of_string;
if ( *one_line_of_string )
{
*one_line_of_string = 0;
v5 = one_line_of_string + 1;
v6 = (char *)stripe_white_space_tail(v6);
v5 = (char *)skip_white_space(v5);
v5 = (char *)stripe_white_space_tail(v5);
v3 = strlen(v5);
for ( one_line_of_string = &v5[v3 - 1];
(*one_line_of_string == 10 || *one_line_of_string == 13) && one_line_of_string != v5;
--one_line_of_string )
{
;
}
if ( *one_line_of_string == 10 || *one_line_of_string == 13 )
*one_line_of_string = 0;
one_line_of_string[1] = 0;
v12 = Conf_Dir_Add((__int64)v11, s, v6, v5);
}
}
}
}
if ( v12 )
{
Conf_Dir_Free((__int64)v11);
v11 = 0LL;
}
if ( stream )
fclose(stream);
pthread_mutex_unlock(&mutex);
return v11;
}
else
{
if ( stream )
fclose(stream);
return 0LL;
}
}
// A2C0: using guessed type __int64 __fastcall stripe_white_space_tail(_QWORD);
// A6B0: using guessed type __int64 __fastcall skip_white_space(_QWORD);
// AC40: using guessed type __int64 __fastcall get_one_line_of_string(_QWORD);
//----- (0000000000015F73) ----------------------------------------------------
__int64 __fastcall Conf_Case_Sensitive(unsigned int a1)
{
__int64 result; // rax
result = a1;
dword_237500 = a1;
return result;
}
// 237500: using guessed type int dword_237500;
//----- (0000000000015F85) ----------------------------------------------------
__int64 __fastcall Conf_Force_Write(unsigned int a1)
{
__int64 result; // rax
result = a1;
dword_237504 = a1;
return result;
}
// 237504: using guessed type int dword_237504;
//----- (0000000000015F97) ----------------------------------------------------
__int64 __fastcall Conf_Get_Field(__int64 a1, __int64 a2, __int64 a3, __int64 a4, unsigned int a5)
{
return Ini_Conf_Get_Field_Compatible(a1, a2, a3, a4, a5);
}
// A8D0: using guessed type __int64 __fastcall Ini_Conf_Get_Field_Compatible(_QWORD, _QWORD, _QWORD, _QWORD, _QWORD);
//----- (0000000000015FD3) ----------------------------------------------------
__int64 __fastcall Conf_Get_Field_NoLock(const char *a1, const char *a2, const char *a3, char *a4, int a5)
{
__int64 v6; // rax
__int64 v7; // rax
char *src; // [rsp+38h] [rbp-48h]
const char *v12; // [rsp+40h] [rbp-40h]
char *s; // [rsp+48h] [rbp-38h]
char *sa; // [rsp+48h] [rbp-38h]
__int64 v15; // [rsp+50h] [rbp-30h]
FILE *stream; // [rsp+58h] [rbp-28h]
_BOOL4 v17; // [rsp+64h] [rbp-1Ch]
char *i; // [rsp+68h] [rbp-18h]
_BYTE *j; // [rsp+68h] [rbp-18h]
char *k; // [rsp+68h] [rbp-18h]
__int64 one_line_of_string; // [rsp+68h] [rbp-18h]
v17 = 0;
stream = fopen64(a1, "r");
if ( !stream )
return 4294967290LL;
if ( !a2 || !*a2 )
v17 = 1;
while ( 1 )
{
do
{
while ( 1 )
{
while ( 1 )
{
one_line_of_string = get_one_line_of_string(stream);
if ( !one_line_of_string )
{
LABEL_39:
fclose(stream);
return 4294967290LL;
}
v15 = skip_white_space(one_line_of_string);
if ( *(_BYTE *)v15 == 91 )
break;
if ( v17 )
goto LABEL_18;
}
s = (char *)(v15 + 1);
for ( i = (char *)(strlen((const char *)(v15 + 1)) + v15); *i != 93 && i != s; --i )
;
if ( i == s )
break;
if ( v17 )
goto LABEL_39;
*i = 0;
v6 = skip_white_space(s);
sa = (char *)stripe_white_space_tail(v6);
v17 = compare_string_by_flag(sa, a2) == 0;
}
}
while ( !v17 );
LABEL_18:
if ( !is_commented_string(v15) )
{
for ( j = (_BYTE *)v15; *j != 61 && *j; ++j )
;
if ( *j )
{
*j = 0;
v12 = (const char *)stripe_white_space_tail(v15);
if ( !compare_string_by_flag(a3, v12) )
break;
}
}
}
v7 = skip_white_space(j + 1);
src = (char *)stripe_white_space_tail(v7);
for ( k = &src[strlen(src) - 1]; (*k == 10 || *k == 13) && k != src; --k )
;
if ( *k == 10 || *k == 13 )
*k = 0;
k[1] = 0;
if ( a4 )
{
if ( a5 >= strlen(src) + 1 )
{
strcpy(a4, src);
fclose(stream);
return 0LL;
}
else
{
fclose(stream);
return 4294967287LL;
}
}
else
{
fclose(stream);
return (unsigned int)strlen(src) + 1;
}
}
// A2C0: using guessed type __int64 __fastcall stripe_white_space_tail(_QWORD);
// A6B0: using guessed type __int64 __fastcall skip_white_space(_QWORD);
// AC40: using guessed type __int64 __fastcall get_one_line_of_string(_QWORD);
//----- (00000000000162EF) ----------------------------------------------------
__int64 __fastcall Conf_Enum_Section(const char *a1, char *a2, int a3)
{
FILE *stream; // [rsp+28h] [rbp-18h] BYREF
__int64 one_line_of_string; // [rsp+30h] [rbp-10h]
unsigned int v7; // [rsp+3Ch] [rbp-4h]
stream = 0LL;
if ( a1 )
{
if ( qword_237558 )
{
Close_File((__int64)byte_237580, 0LL, (FILE *)qword_237558);
qword_237558 = 0LL;
}
v7 = Open_File(a1, 0, &stream);
if ( v7 )
return v7;
snprintf(byte_237580, 0x400uLL, "%s", a1);
qword_237558 = (__int64)stream;
rewind(stream);
}
if ( qword_237558 )
{
while ( 1 )
{
one_line_of_string = get_one_line_of_string(qword_237558);
if ( !one_line_of_string )
break;
if ( !(unsigned int)get_section_name(one_line_of_string, a2, a3) )
return 0LL;
}
}
if ( qword_237558 )
{
Close_File((__int64)byte_237580, 0LL, (FILE *)qword_237558);
qword_237558 = 0LL;
}
return 0xFFFFFFFFLL;
}
// AC40: using guessed type __int64 __fastcall get_one_line_of_string(_QWORD);
// 237558: using guessed type __int64 qword_237558;
//----- (000000000001642A) ----------------------------------------------------
__int64 __fastcall conf_remove_section_err(const char *a1, const char *a2)
{
__int64 result; // rax
char v3[4]; // [rsp+10h] [rbp-1120h] BYREF
int v4; // [rsp+14h] [rbp-111Ch]
char v5; // [rsp+50h] [rbp-10E0h]
char v6; // [rsp+91h] [rbp-109Fh]
char v7; // [rsp+D2h] [rbp-105Eh]
char v8[2061]; // [rsp+113h] [rbp-101Dh] BYREF
char s[2056]; // [rsp+920h] [rbp-810h] BYREF
char *v10; // [rsp+1128h] [rbp-8h]
result = _is_ram_almost_full();
if ( (_DWORD)result )
{
v10 = message01;
snprintf(s, 0x800uLL, "%s (file = [%s], section = [%s]) %s", message00, a1, a2, message01);
v4 = 2;
v6 = 0;
v5 = 0;
v7 = 0;
strncpy(v8, s, 0x800uLL);
return naslog_event_add(v3);
}
return result;
}
// A020: using guessed type __int64 __fastcall naslog_event_add(_QWORD);
// 1642A: using guessed type char var_1120[4];
// 1642A: using guessed type char anonymous_0[2061];
//----- (000000000001650A) ----------------------------------------------------
__int64 __fastcall Conf_Remove_Section(__int64 a1, __int64 a2)
{
return Ini_Conf_Remove_Section_Compatible(a1, a2);
}
// 9EC0: using guessed type __int64 __fastcall Ini_Conf_Remove_Section_Compatible(_QWORD, _QWORD);
//----- (000000000001652F) ----------------------------------------------------
__int64 __fastcall Conf_Rename_Section(char *a1, const char *a2, const char *a3)
{
struct stat64 stat_buf; // [rsp+20h] [rbp-F00h] BYREF
char s[1024]; // [rsp+B0h] [rbp-E70h] BYREF
char resolved[1024]; // [rsp+4B0h] [rbp-A70h] BYREF
char old[1024]; // [rsp+8B0h] [rbp-670h] BYREF
char templatea[32]; // [rsp+CB0h] [rbp-270h] BYREF
char v10[272]; // [rsp+CD0h] [rbp-250h] BYREF
char ptr[264]; // [rsp+DE0h] [rbp-140h] BYREF
FILE *v12; // [rsp+EE8h] [rbp-38h] BYREF
int v13; // [rsp+EF4h] [rbp-2Ch]
unsigned int v14; // [rsp+EF8h] [rbp-28h]
int fd; // [rsp+EFCh] [rbp-24h]
FILE *stream; // [rsp+F00h] [rbp-20h]
_BOOL4 v17; // [rsp+F0Ch] [rbp-14h]
unsigned int v18; // [rsp+F10h] [rbp-10h]
int v19; // [rsp+F14h] [rbp-Ch]
char *one_line_of_string; // [rsp+F18h] [rbp-8h]
v12 = 0LL;
stream = 0LL;
v19 = 0;
v18 = -1;
strcpy(templatea, "/tmp/temp.XXXXXX");
v17 = sub_2D9E0(a1, &stat_buf) == 0;
snprintf(s, 0x400uLL, "%s.lckfile", a1);
if ( !(unsigned int)NAS_File_Lock(s, 1LL) )
{
_conf_remove_section_err(a1, a2);
return 4294967291LL;
}
fd = mkstemp64(templatea);
if ( fd < 0 )
{
_conf_remove_section_err(a1, a2);
NAS_File_Unlock(s);
return 4294967291LL;
}
close(fd);
v14 = Open_File(a1, 0, &v12);
if ( v14 )
{
unlink(templatea);
_conf_remove_section_err(a1, a2);
NAS_File_Unlock(s);
return v14;
}
stream = fopen64(templatea, "wb");
if ( !stream )
{
Close_File((__int64)a1, 0LL, v12);
unlink(templatea);
_conf_remove_section_err(a1, a2);
NAS_File_Unlock(s);
return 4294967291LL;
}
if ( !v12 )
goto LABEL_48;
v13 = 0;
if ( !a2 || !*a2 )
v13 = 1;
while ( 1 )
{
one_line_of_string = (char *)get_one_line_of_string(v12);
if ( !one_line_of_string )
break;
if ( !(unsigned int)get_section_name((__int64)one_line_of_string, ptr, 257) && !compare_string_by_flag(a2, ptr) )
{
sprintf(v10, "[%s]", a3);
one_line_of_string = v10;
++v19;
}
if ( fputs(one_line_of_string, stream) < 0 )
{
Close_File((__int64)a1, 0LL, v12);
if ( stream )
fclose(stream);
goto LABEL_24;
}
fputc(10, stream);
}
Close_File((__int64)a1, 0LL, v12);
if ( fclose(stream) < 0 )
{
LABEL_24:
unlink(templatea);
_conf_remove_section_err(a1, a2);
NAS_File_Unlock(s);
return 4294967291LL;
}
if ( !v19 )
{
v18 = -6;
goto LABEL_48;
}
realpath(a1, resolved);
sprintf(old, "%s.bak", resolved);
v14 = Open_File(old, 1, &v12);
if ( v14 )
{
_conf_remove_section_err(a1, a2);
v18 = v14;
goto LABEL_48;
}
stream = fopen64(templatea, "rb");
if ( !stream )
{
Close_File((__int64)old, 1LL, v12);
unlink(old);
unlink(templatea);
_conf_remove_section_err(a1, a2);
NAS_File_Unlock(s);
return 4294967291LL;
}
while ( 1 )
{
v14 = fread(ptr, 1uLL, 0x101uLL, stream);
if ( (int)v14 <= 0 )
break;
fwrite(ptr, 1uLL, (int)v14, v12);
}
if ( (int)Close_File((__int64)old, 1LL, v12) < 0 )
{
unlink(old);
if ( stream )
fclose(stream);
goto LABEL_24;
}
if ( rename(old, resolved) == -1 )
{
unlink(old);
v18 = -1;
if ( !stream )
goto LABEL_48;
goto LABEL_45;
}
if ( v17 && chmod(resolved, stat_buf.st_mode) == -1 )
{
v18 = -1;
if ( !stream )
goto LABEL_48;
goto LABEL_45;
}
v18 = 0;
if ( stream )
LABEL_45:
fclose(stream);
LABEL_48:
unlink(templatea);
NAS_File_Unlock(s);
return v18;
}
// 9CE0: using guessed type __int64 __fastcall NAS_File_Lock(_QWORD, _QWORD);
// 9D20: using guessed type __int64 __fastcall NAS_File_Unlock(_QWORD);
// AC40: using guessed type __int64 __fastcall get_one_line_of_string(_QWORD);
//----- (0000000000016BC4) ----------------------------------------------------
__int64 __fastcall conf_remove_field_err(const char *a1, const char *a2, const char *a3)
{
__int64 result; // rax
char v5[4]; // [rsp+20h] [rbp-1120h] BYREF
int v6; // [rsp+24h] [rbp-111Ch]
char v7; // [rsp+60h] [rbp-10E0h]
char v8; // [rsp+A1h] [rbp-109Fh]
char v9; // [rsp+E2h] [rbp-105Eh]
char v10[2061]; // [rsp+123h] [rbp-101Dh] BYREF
char s[2056]; // [rsp+930h] [rbp-810h] BYREF
char *v12; // [rsp+1138h] [rbp-8h]
result = _is_ram_almost_full();
if ( (_DWORD)result )
{
v12 = message01;
snprintf(s, 0x800uLL, "%s (file = [%s], section = [%s], field = [%s]) %s", message00, a1, a2, a3, message01);
v6 = 2;
v8 = 0;
v7 = 0;
v9 = 0;
strncpy(v10, s, 0x800uLL);
return naslog_event_add(v5);
}
return result;
}
// A020: using guessed type __int64 __fastcall naslog_event_add(_QWORD);
// 16BC4: using guessed type char var_1120[4];
// 16BC4: using guessed type char anonymous_0[2061];
//----- (0000000000016CAD) ----------------------------------------------------
__int64 __fastcall Conf_Remove_Field(__int64 a1, __int64 a2, __int64 a3)
{
return Ini_Conf_Remove_Field_Compatible(a1, a2, a3);
}
// AA30: using guessed type __int64 __fastcall Ini_Conf_Remove_Field_Compatible(_QWORD, _QWORD, _QWORD);
//----- (0000000000016CDA) ----------------------------------------------------
__int64 __fastcall conf_set_field_err(const char *a1, const char *a2, const char *a3, const char *a4)
{
__int64 result; // rax
char v7[4]; // [rsp+20h] [rbp-1120h] BYREF
int v8; // [rsp+24h] [rbp-111Ch]
char v9; // [rsp+60h] [rbp-10E0h]
char v10; // [rsp+A1h] [rbp-109Fh]
char v11; // [rsp+E2h] [rbp-105Eh]
char v12[2061]; // [rsp+123h] [rbp-101Dh] BYREF
char s[2056]; // [rsp+930h] [rbp-810h] BYREF
char *v14; // [rsp+1138h] [rbp-8h]
result = _is_ram_almost_full();
if ( (_DWORD)result )
{
v14 = message01;
snprintf(
s,
0x800uLL,
"%s (file = [%s], section = [%s], field = [%s], value = [%s]) %s",
message00,
a1,
a2,
a3,
a4,
message01);
v8 = 2;
v10 = 0;
v9 = 0;
v11 = 0;
strncpy(v12, s, 0x800uLL);
return naslog_event_add(v7);
}
return result;
}
// A020: using guessed type __int64 __fastcall naslog_event_add(_QWORD);
// 16CDA: using guessed type char var_1120[4];
// 16CDA: using guessed type char anonymous_0[2061];
//----- (0000000000016DD4) ----------------------------------------------------
__int64 __fastcall Conf_Set_Field(__int64 a1, __int64 a2, __int64 a3, __int64 a4)
{
return Ini_Conf_Set_Field_Compatible(a1, a2, a3, a4);
}
// A850: using guessed type __int64 __fastcall Ini_Conf_Set_Field_Compatible(_QWORD, _QWORD, _QWORD, _QWORD);
//----- (0000000000016E06) ----------------------------------------------------
size_t __fastcall GetPrivateProfileString(__int64 a1, __int64 a2, const char *a3, char *a4, signed int a5, __int64 a6)
{
if ( (unsigned int)Conf_Get_Field(a6, a1, a2, (__int64)a4, a5) == -6 )
{
if ( strlen(a3) >= a5 )
{
strncpy(a4, a3, a5 - 1);
a3[a5] = 0;
}
else
{
strncpy(a4, a3, a5);
}
}
return strlen(a4);
}
//----- (0000000000016EBB) ----------------------------------------------------
size_t __fastcall GetPrivateProfileStringNoLock(
const char *a1,
const char *a2,
const char *a3,
char *a4,
int a5,
const char *a6)
{
if ( (unsigned int)Conf_Get_Field_NoLock(a6, a1, a2, a4, a5) == -6 )
{
if ( strlen(a3) >= a5 )
{
strncpy(a4, a3, a5 - 1);
a3[a5] = 0;
}
else
{
strncpy(a4, a3, a5);
}
}
return strlen(a4);
}
//----- (0000000000016F70) ----------------------------------------------------
_BOOL8 __fastcall WritePrivateProfileString(__int64 a1, __int64 a2, __int64 a3, __int64 a4)
{
return (unsigned int)Conf_Set_Field(a4, a1, a2, a3) == 0;
}
//----- (0000000000016FB2) ----------------------------------------------------
size_t __fastcall GetProfileString(__int64 a1, __int64 a2, const char *a3, char *a4, signed int a5)
{
return GetPrivateProfileString(a1, a2, a3, a4, a5, (__int64)"/etc/config/uLinux.conf");
}
//----- (0000000000016FF5) ----------------------------------------------------
_BOOL8 __fastcall WriteProfileString(__int64 a1, __int64 a2, __int64 a3)
{
return WritePrivateProfileString(a1, a2, a3, (__int64)"/etc/config/uLinux.conf");
}
//----- (0000000000017026) ----------------------------------------------------
size_t __fastcall GetProfileStringServiceBinding(__int64 a1, __int64 a2, const char *a3, char *a4, signed int a5)
{
return GetPrivateProfileString(a1, a2, a3, a4, a5, (__int64)"/etc/config/service_binding.conf");
}
//----- (0000000000017069) ----------------------------------------------------
_BOOL8 __fastcall WriteProfileStringServiceBinding(__int64 a1, __int64 a2, __int64 a3)
{
return WritePrivateProfileString(a1, a2, a3, (__int64)"/etc/config/service_binding.conf");
}
//----- (000000000001709A) ----------------------------------------------------
size_t __fastcall GetProfileStringNetLinks(__int64 a1, __int64 a2, const char *a3, char *a4, signed int a5)
{
return GetPrivateProfileString(a1, a2, a3, a4, a5, (__int64)"/etc/config/NetLinks.conf");
}
//----- (00000000000170DD) ----------------------------------------------------
_BOOL8 __fastcall WriteProfileStringNetLinks(__int64 a1, __int64 a2, __int64 a3)
{
return WritePrivateProfileString(a1, a2, a3, (__int64)"/etc/config/NetLinks.conf");
}
//----- (000000000001710E) ----------------------------------------------------
size_t __fastcall Get_Profile_String(__int64 a1, __int64 a2, const char *a3, char *a4, signed int a5)
{
return GetProfileString(a1, a2, a3, a4, a5);
}
//----- (000000000001714A) ----------------------------------------------------
_BOOL8 __fastcall Set_Profile_String(__int64 a1, __int64 a2, __int64 a3)
{
return WriteProfileString(a1, a2, a3);
}
//----- (0000000000017177) ----------------------------------------------------
_BOOL8 __fastcall Get_Profile_Boolean(__int64 a1, __int64 a2, int a3)
{
const char *v3; // rax
bool v4; // bl
int v5; // ebx
char s1[144]; // [rsp+20h] [rbp-90h] BYREF
if ( a3 )
v3 = "TRUE";
else
v3 = "FALSE";
Get_Profile_String(a1, a2, v3, s1, 128);
v4 = strcasecmp(s1, "TRUE") == 0;
v5 = v4 | (strcasecmp(s1, "YES") == 0);
return (v5 | (atoi(s1) != 0)) != 0;
}
//----- (0000000000017244) ----------------------------------------------------
_BOOL8 __fastcall Set_Profile_Boolean(__int64 a1, __int64 a2, int a3)
{
const char *v3; // rax
if ( a3 )
v3 = "TRUE";
else
v3 = "FALSE";
return Set_Profile_String(a1, a2, (__int64)v3);
}
//----- (0000000000017282) ----------------------------------------------------
int __fastcall Get_Profile_Integer(__int64 a1, __int64 a2, unsigned int a3)
{
char nptr[128]; // [rsp+20h] [rbp-C0h] BYREF
char s[64]; // [rsp+A0h] [rbp-40h] BYREF
sprintf(s, "%d", a3);
Get_Profile_String(a1, a2, s, nptr, 128);
return atoi(nptr);
}
//----- (00000000000172F7) ----------------------------------------------------
_BOOL8 __fastcall Set_Profile_Integer(__int64 a1, __int64 a2, unsigned int a3)
{
char s[64]; // [rsp+20h] [rbp-40h] BYREF
sprintf(s, "%d", a3);
return Set_Profile_String(a1, a2, (__int64)s);
}
//----- (000000000001733E) ----------------------------------------------------
size_t __fastcall Get_Private_Profile_String(
__int64 a1,
__int64 a2,
const char *a3,
char *a4,
signed int a5,
__int64 a6)
{
return GetPrivateProfileString(a1, a2, a3, a4, a5, a6);
}
//----- (0000000000017385) ----------------------------------------------------
_BOOL8 __fastcall Set_Private_Profile_String(__int64 a1, __int64 a2, __int64 a3, __int64 a4)
{
return WritePrivateProfileString(a1, a2, a3, a4);
}
//----- (00000000000173B7) ----------------------------------------------------
_BOOL8 __fastcall Get_Private_Profile_Boolean(__int64 a1, __int64 a2, int a3, __int64 a4)
{
const char *v4; // rax
bool v5; // bl
int v6; // ebx
char s1[144]; // [rsp+20h] [rbp-90h] BYREF
if ( a3 )
v4 = "TRUE";
else
v4 = "FALSE";
Get_Private_Profile_String(a1, a2, v4, s1, 128, a4);
v5 = strcasecmp(s1, "TRUE") == 0;
v6 = v5 | (strcasecmp(s1, "YES") == 0);
return (v6 | (atoi(s1) != 0)) != 0;
}
//----- (0000000000017495) ----------------------------------------------------
_BOOL8 __fastcall Set_Private_Profile_Boolean(__int64 a1, __int64 a2, int a3, __int64 a4)
{
const char *v4; // rax
if ( a3 )
v4 = "TRUE";
else
v4 = "FALSE";
return Set_Private_Profile_String(a1, a2, (__int64)v4, a4);
}
//----- (00000000000174DB) ----------------------------------------------------
int __fastcall Get_Private_Profile_Integer(__int64 a1, __int64 a2, unsigned int a3, __int64 a4)
{
char nptr[128]; // [rsp+20h] [rbp-C0h] BYREF
char s[64]; // [rsp+A0h] [rbp-40h] BYREF
sprintf(s, "%d", a3);
Get_Private_Profile_String(a1, a2, s, nptr, 128, a4);
return atoi(nptr);
}
//----- (0000000000017561) ----------------------------------------------------
int __fastcall Get_Private_Profile_Integer_NoLock(const char *a1, const char *a2, unsigned int a3, const char *a4)
{
char nptr[128]; // [rsp+20h] [rbp-C0h] BYREF
char s[64]; // [rsp+A0h] [rbp-40h] BYREF
sprintf(s, "%d", a3);
GetPrivateProfileStringNoLock(a1, a2, s, nptr, 128, a4);
return atoi(nptr);
}
//----- (00000000000175E7) ----------------------------------------------------
_BOOL8 __fastcall Set_Private_Profile_Integer(__int64 a1, __int64 a2, unsigned int a3, __int64 a4)
{
char s[64]; // [rsp+20h] [rbp-40h] BYREF
sprintf(s, "%d", a3);
return Set_Private_Profile_String(a1, a2, (__int64)s, a4);
}
//----- (0000000000017633) ----------------------------------------------------
_BOOL8 __fastcall Set_Private_Profile_Long(__int64 a1, __int64 a2, __int64 a3, __int64 a4)
{
char s[64]; // [rsp+20h] [rbp-40h] BYREF
sprintf(s, "%ld", a3);
return Set_Private_Profile_String(a1, a2, (__int64)s, a4);
}
//----- (0000000000017681) ----------------------------------------------------
_BOOL8 __fastcall Set_Private_Profile_Longlong(__int64 a1, __int64 a2, __int64 a3, __int64 a4)
{
char s[64]; // [rsp+20h] [rbp-40h] BYREF
sprintf(s, "%lld", a3);
return Set_Private_Profile_String(a1, a2, (__int64)s, a4);
}
//----- (00000000000176CF) ----------------------------------------------------
char *__fastcall File_Fgets(FILE *a1)
{
int v2; // [rsp+10h] [rbp-10h]
int v3; // [rsp+14h] [rbp-Ch]
char *ptr; // [rsp+18h] [rbp-8h]
v3 = 0;
v2 = 0;
ptr = (char *)calloc(1uLL, 0x400uLL);
if ( !ptr )
return 0LL;
while ( 1 )
{
fgets(&ptr[v3 - (__int64)v2], 1024, a1);
if ( feof(a1) )
{
free(ptr);
return 0LL;
}
if ( ptr[strlen(ptr) - 1] == 10 )
return ptr;
v3 += 1024;
++v2;
ptr = (char *)realloc(ptr, v3 + 1024);
if ( !ptr )
break;
memset(&ptr[v3], 0, 0x400uLL);
}
return 0LL;
}
//----- (00000000000177DF) ----------------------------------------------------
__int64 __fastcall Comp_Config_Disk_SN(const char *a1, const char *a2)
{
size_t v2; // rbx
int v3; // eax
size_t v4; // rbx
int v6; // eax
size_t v7; // rbx
size_t v8; // rbx
size_t v9; // rbx
int v10; // eax
int v11; // eax
size_t v12; // rbx
size_t v13; // rbx
size_t v14; // rbx
int v15; // eax
char *s2; // [rsp+0h] [rbp-140h]
char *s; // [rsp+8h] [rbp-138h]
char dest[264]; // [rsp+10h] [rbp-130h] BYREF
char *v19; // [rsp+118h] [rbp-28h]
char v20; // [rsp+127h] [rbp-19h]
int v21; // [rsp+128h] [rbp-18h]
int i; // [rsp+12Ch] [rbp-14h]
s = (char *)Skip_White_Space_Ex(a1);
s2 = (char *)Skip_White_Space_Ex(a2);
v2 = strlen(s);
if ( v2 <= strlen(s2) )
v3 = strlen(s);
else
v3 = strlen(s2);
v21 = v3;
if ( !v3 )
{
v4 = strlen(s);
if ( v4 != strlen(s2) )
return 0xFFFFFFFFLL;
}
if ( !strncmp(s, s2, v21) )
return 0LL;
strcpy(dest, s2);
for ( i = 0; ; dest[i++] = v20 )
{
v8 = i;
if ( v8 >= strlen(s2) )
break;
v6 = i++;
v20 = dest[v6];
v7 = i;
if ( v7 >= strlen(s2) )
break;
dest[i - 1] = dest[i];
}
v19 = (char *)Skip_White_Space_Ex(dest);
v9 = strlen(s);
v10 = v9 <= strlen(v19) ? strlen(s) : strlen(v19);
v21 = v10;
if ( !strncmp(s, v19, v10) )
return 0LL;
strcpy(dest, s);
for ( i = 0; ; dest[i++] = v20 )
{
v13 = i;
if ( v13 >= strlen(s) )
break;
v11 = i++;
v20 = dest[v11];
v12 = i;
if ( v12 >= strlen(s) )
break;
dest[i - 1] = dest[i];
}
v19 = (char *)Skip_White_Space_Ex(dest);
v14 = strlen(s2);
v15 = v14 <= strlen(v19) ? strlen(s2) : strlen(v19);
v21 = v15;
if ( !strncmp(s2, v19, v15) )
return 0LL;
return 0xFFFFFFFFLL;
}
// 177DF: using guessed type char dest[264];
//----- (0000000000017B0F) ----------------------------------------------------
__int64 __fastcall Conf_Dir_Wirte_Section_To_File(__int64 a1, const char *a2, char *a3)
{
const char *v4; // rax
struct stat64 stat_buf; // [rsp+20h] [rbp-DE0h] BYREF
char ptr[272]; // [rsp+B0h] [rbp-D50h] BYREF
char filename[1024]; // [rsp+1C0h] [rbp-C40h] BYREF
char s[1024]; // [rsp+5C0h] [rbp-840h] BYREF
char resolved[1024]; // [rsp+9C0h] [rbp-440h] BYREF
char templatea[24]; // [rsp+DC0h] [rbp-40h] BYREF
int fd; // [rsp+DD8h] [rbp-28h]
unsigned int v13; // [rsp+DDCh] [rbp-24h]
_BOOL4 v14; // [rsp+DE0h] [rbp-20h]
unsigned int v15; // [rsp+DE4h] [rbp-1Ch]
FILE *v16; // [rsp+DE8h] [rbp-18h]
FILE *stream; // [rsp+DF0h] [rbp-10h]
int j; // [rsp+DF8h] [rbp-8h]
int i; // [rsp+DFCh] [rbp-4h]
stream = 0LL;
v16 = 0LL;
strcpy(templatea, "/tmp/temp.XXXXXX");
v15 = -5;
v14 = 0;
if ( !a1 || !a2 || !a3 )
return 4294967294LL;
v14 = sub_2D9E0(a3, &stat_buf) == 0;
snprintf(s, 0x400uLL, "%s.lckfile", a3);
v13 = Ini_Conf_Write_Lock_File_Timeout(s, 300LL);
if ( v13 == -1 )
return v15;
fd = mkstemp64(templatea);
if ( fd >= 0 )
{
close(fd);
stream = fopen64(templatea, "wb");
if ( stream )
{
for ( i = 0; *(_DWORD *)(a1 + 1032) > i; ++i )
{
if ( *(_QWORD *)(8LL * i + *(_QWORD *)(a1 + 1048))
&& !strcasecmp(a2, *(const char **)(8LL * i + *(_QWORD *)(a1 + 1048))) )
{
fprintf(stream, "\n[%s]\n", *(const char **)(8LL * i + *(_QWORD *)(a1 + 1048)));
for ( j = 0; *(_DWORD *)(a1 + 1028) > j; ++j )
{
if ( *(_QWORD *)(8LL * j + *(_QWORD *)(a1 + 1056))
&& *(_QWORD *)(8LL * j + *(_QWORD *)(a1 + 1072))
&& !strcasecmp(
*(const char **)(8LL * j + *(_QWORD *)(a1 + 1056)),
*(const char **)(8LL * i + *(_QWORD *)(a1 + 1048))) )
{
if ( *(_QWORD *)(8LL * j + *(_QWORD *)(a1 + 1064)) )
v4 = *(const char **)(8LL * j + *(_QWORD *)(a1 + 1064));
else
v4 = (const char *)&unk_2E32E;
fprintf(stream, "%s = %s\n", *(const char **)(8LL * j + *(_QWORD *)(a1 + 1072)), v4);
}
}
}
}
fputc(10, stream);
if ( fflush(stream) >= 0 || *__errno_location() != 28 && *__errno_location() != 5 )
{
fclose(stream);
realpath(a3, resolved);
sprintf(filename, "%s.bak", resolved);
stream = fopen64(templatea, "rb");
v16 = fopen64(filename, "wb");
if ( stream )
{
if ( v16 )
{
while ( 1 )
{
i = fread(ptr, 1uLL, 0x101uLL, stream);
if ( i <= 0 )
break;
fwrite(ptr, 1uLL, i, v16);
}
if ( (fflush(v16) >= 0 || *__errno_location() != 28 && *__errno_location() != 5)
&& rename(filename, resolved) >= 0
&& (!v14 || chmod(resolved, stat_buf.st_mode) != -1) )
{
v15 = 0;
}
}
}
}
}
}
Ini_Conf_Unlock_File(v13);
unlink(templatea);
if ( stream )
fclose(stream);
if ( v16 )
fclose(v16);
return v15;
}
// 9D00: using guessed type __int64 __fastcall Ini_Conf_Write_Lock_File_Timeout(_QWORD, _QWORD);
// A3E0: using guessed type __int64 __fastcall Ini_Conf_Unlock_File(_QWORD);
//----- (0000000000018016) ----------------------------------------------------
__int64 __fastcall conf_get_field(const char *a1, const char *a2, const char *a3, char *a4, int a5)
{
int char_in_string; // eax
char v10[8]; // [rsp+30h] [rbp-230h] BYREF
char v11[120]; // [rsp+38h] [rbp-228h] BYREF
char v12[272]; // [rsp+B0h] [rbp-1B0h] BYREF
char s1[8]; // [rsp+1C0h] [rbp-A0h] BYREF
char v14[120]; // [rsp+1C8h] [rbp-98h] BYREF
FILE *stream; // [rsp+240h] [rbp-20h] BYREF
int v16; // [rsp+24Ch] [rbp-14h]
char *s; // [rsp+250h] [rbp-10h]
unsigned int v18; // [rsp+258h] [rbp-8h]
_BOOL4 v19; // [rsp+25Ch] [rbp-4h]
stream = 0LL;
*(_QWORD *)s1 = 0LL;
memset(v14, 0, sizeof(v14));
v19 = 0;
v18 = 0;
v18 = Open_File(a1, 0, &stream);
if ( v18 )
return v18;
rewind(stream);
if ( !a2 || !*a2 )
v19 = 1;
while ( 1 )
{
while ( 1 )
{
if ( !fgets(v12, 257, stream) )
{
LABEL_21:
Close_File((__int64)a1, 0LL, stream);
return 4294967290LL;
}
s = (char *)skip_white_space(v12);
if ( *s != 91 )
break;
if ( get_string_until_ch((__int64)(s + 1), 93, s1, 128) )
{
if ( v19 )
goto LABEL_21;
v19 = strcasecmp(s1, a2) == 0;
}
}
if ( v19 && !is_commented_string((__int64)s) )
{
*(_QWORD *)v10 = 0LL;
memset(v11, 0, sizeof(v11));
if ( get_string_until_ch((__int64)s, 61, v10, 128) )
{
if ( !strcasecmp(a3, v10) )
break;
}
}
}
char_in_string = find_char_in_string((__int64)s, 61);
s += char_in_string + 1;
s = (char *)skip_white_space(s);
if ( a4 )
{
*a4 = 0;
v16 = strlen(s);
if ( v16 + 1 <= a5 )
{
strncpy(a4, s, v16);
a4[v16] = 0;
stripe_white_space_tail(a4);
Close_File((__int64)a1, 0LL, stream);
return 0LL;
}
else
{
v16 = a5 - 1;
strncpy(a4, s, a5 - 1);
a4[v16] = 0;
stripe_white_space_tail(a4);
Close_File((__int64)a1, 0LL, stream);
return 4294967287LL;
}
}
else
{
Close_File((__int64)a1, 0LL, stream);
return (unsigned int)strlen(s) + 1;
}
}
// A2C0: using guessed type __int64 __fastcall stripe_white_space_tail(_QWORD);
// A6B0: using guessed type __int64 __fastcall skip_white_space(_QWORD);
//----- (0000000000018370) ----------------------------------------------------
__int64 __fastcall is_black_str(__int64 a1)
{
int v1; // eax
int v3; // [rsp+14h] [rbp-4h]
v3 = 0;
while ( *(_BYTE *)(v3 + a1) )
{
v1 = v3++;
if ( *(_BYTE *)(v1 + a1) != 32 )
return 0LL;
}
return 1LL;
}
//----- (00000000000183BD) ----------------------------------------------------
_BOOL8 __fastcall is_tc_word(_BYTE *a1)
{
return *a1 > 0xA0u && *a1 != 0xFF && (a1[1] > 0x3Fu && a1[1] <= 0x7Eu || a1[1] > 0xA0u && a1[1] != 0xFF);
}
//----- (000000000001842D) ----------------------------------------------------
_BOOL8 __fastcall is_sc_word(_BYTE *a1)
{
return *a1 > 0xA0u && *a1 <= 0xF7u && a1[1] > 0xA0u && a1[1] != 0xFF;
}
//----- (000000000001847F) ----------------------------------------------------
_BOOL8 __fastcall is_jis_word(_BYTE *a1)
{
return (*a1 > 0x80u && *a1 <= 0x9Fu || *a1 > 0xDFu && *a1 <= 0xEFu)
&& (a1[1] > 0x3Fu && a1[1] <= 0x7Eu || (char)a1[1] <= -4);
}
//----- (0000000000018505) ----------------------------------------------------
_BOOL8 __fastcall is_korea_word(_BYTE *a1)
{
return *a1 > 0xA0u && *a1 != 0xFF && (char)a1[1] < 0;
}
//----- (0000000000018548) ----------------------------------------------------
__int64 __fastcall Is_Mb_Word(_BYTE *a1)
{
int System_Codepage; // eax
System_Codepage = Get_System_Codepage();
if ( System_Codepage == 936 )
{
if ( is_sc_word(a1) )
return 1LL;
}
else if ( System_Codepage > 936 )
{
if ( System_Codepage == 949 )
{
if ( is_korea_word(a1) )
return 1LL;
}
else if ( System_Codepage == 950 && is_tc_word(a1) )
{
return 1LL;
}
}
else if ( System_Codepage == 932 && is_jis_word(a1) )
{
return 1LL;
}
return 0LL;
}
// A770: using guessed type __int64 Get_System_Codepage(void);
//----- (00000000000185F0) ----------------------------------------------------
__int64 __fastcall Is_Mb_String(_BYTE *a1)
{
_BYTE *v2; // [rsp+18h] [rbp-8h]
v2 = a1;
if ( a1 )
{
while ( *v2 )
{
if ( (unsigned int)Is_Mb_Word(v2) )
return 1LL;
++v2;
}
}
return 0LL;
}
//----- (000000000001863B) ----------------------------------------------------
__int64 __fastcall Is_Mb_Word_By_Codepage(_BYTE *a1, int a2)
{
if ( a2 == 936 )
{
if ( is_sc_word(a1) )
return 1LL;
}
else if ( a2 > 936 )
{
if ( a2 == 949 )
{
if ( is_korea_word(a1) )
return 1LL;
}
else if ( a2 == 950 && is_tc_word(a1) )
{
return 1LL;
}
}
else if ( a2 == 932 && is_jis_word(a1) )
{
return 1LL;
}
return 0LL;
}
//----- (00000000000186DE) ----------------------------------------------------
__int64 __fastcall sub_186DE(_BYTE *a1, const char *a2)
{
_BYTE *v3; // [rsp+18h] [rbp-8h]
if ( a1 )
{
if ( !*a1 || (unsigned int)is_black_str((__int64)a1) )
return 0LL;
if ( a2 )
{
v3 = a1;
while ( *v3 )
{
if ( (unsigned int)Is_Mb_Word(v3) )
{
v3 += 2;
}
else
{
if ( strchr(a2, (char)*v3) )
return 0LL;
++v3;
}
}
}
}
return 1LL;
}
//----- (000000000001877A) ----------------------------------------------------
__int64 __fastcall Is_Legal_String(_BYTE *a1)
{
return sub_186DE(a1, "\"/\\+=:|*?<>[];,%`{}$ '\n\r");
}
//----- (000000000001879B) ----------------------------------------------------
__int64 __fastcall Is_Share_Legal_String(_BYTE *a1)
{
return sub_186DE(a1, "\"/\\+=:|*?<>[];,%`'");
}
//----- (00000000000187BC) ----------------------------------------------------
__int64 __fastcall Is_Share_Path_Legal_String(_BYTE *a1)
{
return sub_186DE(a1, "\"\\:|*?<>;`',");
}
//----- (00000000000187DD) ----------------------------------------------------
__int64 __fastcall Is_No_LineBreaks_String(_BYTE *a1)
{
return sub_186DE(a1, "\n\r");
}
//----- (00000000000187FE) ----------------------------------------------------
__int64 __fastcall mb_strcmp(char *a1, char *a2)
{
char *s2; // [rsp+0h] [rbp-30h]
char *s; // [rsp+8h] [rbp-28h]
int System_Codepage; // [rsp+18h] [rbp-18h]
int v6; // [rsp+1Ch] [rbp-14h]
int v7; // [rsp+20h] [rbp-10h]
int v8; // [rsp+24h] [rbp-Ch]
int v9; // [rsp+28h] [rbp-8h]
int i; // [rsp+2Ch] [rbp-4h]
s = a1;
s2 = a2;
if ( !a1 || !a2 )
return 0xFFFFFFFFLL;
v7 = strlen(a1);
v6 = strlen(a2);
if ( v7 != v6 )
return (unsigned int)(v7 - v6);
System_Codepage = Get_System_Codepage();
Is_Mb_Word_By_Codepage(a1, System_Codepage);
Is_Mb_Word_By_Codepage(a2, System_Codepage);
for ( i = 0; i < v7; i += v9 )
{
v8 = Is_Mb_Word_By_Codepage(s, System_Codepage) != 0;
if ( (unsigned int)Is_Mb_Word_By_Codepage(s2, System_Codepage) )
v8 |= 2u;
v9 = 1;
if ( v8 > 2 )
{
if ( v8 == 3 )
{
v9 = 2;
if ( strncmp(s, s2, 2uLL) )
return 1LL;
}
}
else
{
if ( v8 >= 1 )
return 1LL;
if ( !v8 && strncmp(s, s2, 1uLL) )
return 1LL;
}
s += v9;
s2 += v9;
}
return 0LL;
}
// A770: using guessed type __int64 Get_System_Codepage(void);
//----- (000000000001898F) ----------------------------------------------------
__int64 __fastcall mb_strcasecmp(const char *a1, const char *a2)
{
char *s2; // [rsp+0h] [rbp-30h]
char *s; // [rsp+8h] [rbp-28h]
int System_Codepage; // [rsp+18h] [rbp-18h]
int v6; // [rsp+1Ch] [rbp-14h]
int v7; // [rsp+20h] [rbp-10h]
int v8; // [rsp+24h] [rbp-Ch]
int v9; // [rsp+28h] [rbp-8h]
int i; // [rsp+2Ch] [rbp-4h]
s = (char *)a1;
s2 = (char *)a2;
if ( !a1 || !a2 )
return 0xFFFFFFFFLL;
v7 = strlen(a1);
v6 = strlen(a2);
if ( v7 != v6 )
return (unsigned int)(v7 - v6);
System_Codepage = Get_System_Codepage();
for ( i = 0; i < v7; i += v9 )
{
v8 = Is_Mb_Word_By_Codepage(s, System_Codepage) != 0;
if ( (unsigned int)Is_Mb_Word_By_Codepage(s2, System_Codepage) )
v8 |= 2u;
v9 = 1;
if ( v8 > 2 )
{
if ( v8 == 3 )
{
v9 = 2;
if ( strncmp(s, s2, 2uLL) )
return 1LL;
}
}
else
{
if ( v8 >= 1 )
return 1LL;
if ( !v8 && strncasecmp(s, s2, 1uLL) )
return 1LL;
}
s += v9;
s2 += v9;
}
return 0LL;
}
// A770: using guessed type __int64 Get_System_Codepage(void);
//----- (0000000000018AEE) ----------------------------------------------------
__int64 __fastcall mb_strcmp_ex(char *a1, char *a2, int a3)
{
char *s2; // [rsp+10h] [rbp-30h]
char *s; // [rsp+18h] [rbp-28h]
int v7; // [rsp+2Ch] [rbp-14h]
int v8; // [rsp+30h] [rbp-10h]
int v9; // [rsp+34h] [rbp-Ch]
int v10; // [rsp+38h] [rbp-8h]
int i; // [rsp+3Ch] [rbp-4h]
s = a1;
s2 = a2;
if ( !a1 || !a2 )
return 0xFFFFFFFFLL;
v8 = strlen(a1);
v7 = strlen(a2);
if ( v8 != v7 )
return (unsigned int)(v8 - v7);
v9 = Is_Mb_Word_By_Codepage(a1, a3) != 0;
if ( (unsigned int)Is_Mb_Word_By_Codepage(a2, a3) )
v9 |= 2u;
for ( i = 0; i < v8; i += v10 )
{
v10 = 1;
if ( v9 > 2 )
{
if ( v9 == 3 )
{
v10 = 2;
if ( strncmp(s, s2, 2uLL) )
return 1LL;
}
}
else
{
if ( v9 >= 1 )
return 1LL;
if ( !v9 && strncmp(s, s2, 1uLL) )
return 1LL;
}
s += v10;
s2 += v10;
}
return 0LL;
}
//----- (0000000000018C41) ----------------------------------------------------
void err_lock()
{
;
}
//----- (0000000000018C4B) ----------------------------------------------------
const char *__fastcall get_filename(const char *a1)
{
char *v2; // [rsp+18h] [rbp-8h]
v2 = strrchr(a1, 47);
if ( v2 )
return v2 + 1;
else
return a1;
}
//----- (0000000000018C83) ----------------------------------------------------
_BOOL8 __fastcall timeout(int a1)
{
return (int)(time(0LL) - a1) > 5;
}
//----- (0000000000018CB4) ----------------------------------------------------
__int64 __fastcall NAS_File_Lock(const char *a1, char a2)
{
int v2; // eax
struct stat64 stat_buf; // [rsp+10h] [rbp-1C0h] BYREF
__pid_t buf; // [rsp+A0h] [rbp-130h] BYREF
char v6; // [rsp+A4h] [rbp-12Ch]
int v7; // [rsp+A8h] [rbp-128h]
char s[264]; // [rsp+B0h] [rbp-120h] BYREF
time_t v9; // [rsp+1B8h] [rbp-18h]
const char *filename; // [rsp+1C0h] [rbp-10h]
int v11; // [rsp+1C8h] [rbp-8h]
int fd; // [rsp+1CCh] [rbp-4h]
v11 = 100;
filename = get_filename(a1);
sprintf(s, "%s/%s.lck", "/var/lock/NAS", filename);
while ( v11 )
{
fd = open64(s, 194, 511LL);
if ( fd != -1 )
break;
--v11;
fd = open64(s, 0);
if ( fd != -1 )
{
if ( read(fd, &buf, 0xCuLL) == 12 && (timeout(v7), v2) )
{
close(fd);
fd = -1;
unlink(s);
err_lock();
}
else
{
close(fd);
fd = -1;
usleep(0x186A0u);
}
}
}
if ( fd == -1 || !v11 )
{
v9 = time(0LL);
if ( sub_2D9E0(s, &stat_buf) )
return 0LL;
if ( v9 - stat_buf.st_mtim.tv_sec > 10 )
{
unlink(s);
fd = open64(s, 194, 511LL);
}
if ( fd == -1 )
return 0LL;
}
v7 = time(0LL);
buf = getpid();
v6 = a2;
if ( write(fd, &buf, 0xCuLL) == 12 )
{
close(fd);
return 1LL;
}
else
{
close(fd);
unlink(s);
return 0LL;
}
}
// 18DAE: variable 'v2' is possibly undefined
//----- (0000000000018F14) ----------------------------------------------------
__int64 __fastcall NAS_File_Unlock(const char *a1)
{
char s[264]; // [rsp+10h] [rbp-110h] BYREF
const char *filename; // [rsp+118h] [rbp-8h]
filename = get_filename(a1);
sprintf(s, "%s/%s.lck", "/var/lock/NAS", filename);
syscall(451LL, s);
return 1LL;
}
//----- (0000000000018F82) ----------------------------------------------------
__int64 __fastcall Is_Exist_Another_Instance(const char *a1)
{
char *s; // [rsp+8h] [rbp-248h]
char v3[256]; // [rsp+10h] [rbp-240h] BYREF
char filename[264]; // [rsp+110h] [rbp-140h] BYREF
char *v5; // [rsp+218h] [rbp-38h]
FILE *stream; // [rsp+220h] [rbp-30h]
int v7; // [rsp+22Ch] [rbp-24h]
struct dirent64 *v8; // [rsp+230h] [rbp-20h]
DIR *dirp; // [rsp+238h] [rbp-18h]
char *s1; // [rsp+240h] [rbp-10h]
unsigned int v11; // [rsp+24Ch] [rbp-4h]
s = (char *)a1;
v11 = 0;
s1 = strrchr(a1, 47);
if ( s1 )
s = s1 + 1;
dirp = opendir("/proc");
if ( !dirp )
return v11;
while ( !v11 )
{
v8 = readdir64(dirp);
if ( !v8 )
break;
v7 = atoi(v8->d_name);
if ( v7 )
{
if ( getpid() != v7 )
{
sprintf(filename, "/proc/%s/stat", v8->d_name);
stream = fopen64(filename, "r");
if ( stream )
{
v3[0] = 0;
fgets(v3, 256, stream);
s1 = strchr(v3, 40);
v5 = strrchr(v3, 41);
if ( s1 && v5 )
{
++s1;
*v5 = 0;
if ( !strcmp(s1, s) )
v11 = 1;
}
fclose(stream);
}
}
}
}
closedir(dirp);
return v11;
}
//----- (000000000001912A) ----------------------------------------------------
__int64 Become_Daemon()
{
__pid_t v1; // [rsp+Ch] [rbp-4h]
v1 = fork();
if ( v1 < 0 )
return 0LL;
if ( v1 > 0 )
exit(0);
if ( setsid() < 0 )
return 0LL;
chdir("/");
umask(0);
return 1LL;
}
// 1912A: using guessed type __int64 Become_Daemon();
//----- (0000000000019184) ----------------------------------------------------
__int64 __fastcall sub_19184(unsigned __int16 a1)
{
__int64 result; // rax
LOBYTE(result) = __inbyte(a1);
return (unsigned __int8)result;
}
//----- (000000000001919E) ----------------------------------------------------
__int64 __fastcall sub_1919E(unsigned __int8 a1, unsigned __int16 a2)
{
__int64 result; // rax
result = a1;
__outbyte(a2, a1);
return result;
}
//----- (00000000000191B8) ----------------------------------------------------
__int64 __fastcall uart_start_row(int a1, char a2)
{
int v2; // eax
int v3; // eax
int v4; // eax
int v5; // eax
int v6; // eax
int v7; // eax
int v8; // eax
char v10[248]; // [rsp+10h] [rbp-130h] BYREF
int v11; // [rsp+108h] [rbp-38h]
__int16 v12; // [rsp+10Ch] [rbp-34h]
char v13; // [rsp+10Eh] [rbp-32h]
char *s; // [rsp+110h] [rbp-30h] BYREF
int v15; // [rsp+118h] [rbp-28h]
int v16; // [rsp+13Ch] [rbp-4h]
memset(v10, 0, sizeof(v10));
v11 = 0;
v12 = 0;
v13 = 0;
v16 = 0;
memset(&s, 0, 0x20uLL);
v2 = v16++;
v10[v2] = 15;
v3 = v16++;
v10[v3] = 14;
v4 = v16++;
v10[v4] = 0;
v5 = v16++;
v10[v5] = a2;
v6 = v16++;
v10[v6] = a2;
v7 = v16++;
v10[v7] = a2;
v8 = v16++;
v10[v8] = -1;
memset(&s, 0, 0x20uLL);
s = v10;
v15 = v16;
ioctl(a1, 0x402053F6uLL, &s);
usleep(0x2710u);
return 1LL;
}
// 191B8: using guessed type char var_130[248];
//----- (0000000000019305) ----------------------------------------------------
__int64 __fastcall uart_prog_8byte(int a1, char a2, char *a3)
{
int v3; // eax
int v4; // eax
int v5; // eax
int v6; // eax
int v7; // eax
int v8; // eax
int v9; // eax
int v10; // eax
int v11; // eax
int v12; // eax
int v13; // eax
int v14; // eax
char v17[248]; // [rsp+10h] [rbp-130h] BYREF
int v18; // [rsp+108h] [rbp-38h]
__int16 v19; // [rsp+10Ch] [rbp-34h]
char v20; // [rsp+10Eh] [rbp-32h]
char *s; // [rsp+110h] [rbp-30h] BYREF
int v22; // [rsp+118h] [rbp-28h]
int v23; // [rsp+13Ch] [rbp-4h]
memset(v17, 0, sizeof(v17));
v18 = 0;
v19 = 0;
v20 = 0;
v23 = 0;
memset(&s, 0, 0x20uLL);
v3 = v23++;
v17[v3] = 15;
v4 = v23++;
v17[v4] = 9;
v5 = v23++;
v17[v5] = a2;
v6 = v23++;
v17[v6] = *a3;
v7 = v23++;
v17[v7] = a3[1];
v8 = v23++;
v17[v8] = a3[2];
v9 = v23++;
v17[v9] = a3[3];
v10 = v23++;
v17[v10] = a3[4];
v11 = v23++;
v17[v11] = a3[5];
v12 = v23++;
v17[v12] = a3[6];
v13 = v23++;
v17[v13] = a3[7];
v14 = v23++;
v17[v14] = -1;
memset(&s, 0, 0x20uLL);
s = v17;
v22 = v23;
ioctl(a1, 0x402053F6uLL, &s);
usleep(0x2710u);
return 1LL;
}
// 19305: using guessed type char var_130[248];
//----- (00000000000194FB) ----------------------------------------------------
int __fastcall uart_update_firmware_to_mcu(int a1, __int64 a2, unsigned int a3)
{
__int64 s2[2]; // [rsp+10h] [rbp-A0h] BYREF
__int64 s[2]; // [rsp+20h] [rbp-90h] BYREF
void *v7; // [rsp+30h] [rbp-80h] BYREF
int v8; // [rsp+38h] [rbp-78h]
char v9; // [rsp+5Ah] [rbp-56h]
char v10; // [rsp+5Bh] [rbp-55h]
int v11; // [rsp+5Ch] [rbp-54h]
unsigned __int64 v12; // [rsp+60h] [rbp-50h]
__int64 v13; // [rsp+68h] [rbp-48h]
__int64 v14; // [rsp+70h] [rbp-40h]
unsigned __int64 v15; // [rsp+78h] [rbp-38h]
__int64 v16; // [rsp+80h] [rbp-30h]
__int64 v17; // [rsp+88h] [rbp-28h]
__int64 v18; // [rsp+90h] [rbp-20h]
char v19; // [rsp+9Fh] [rbp-11h]
unsigned __int64 i; // [rsp+A0h] [rbp-10h]
__int64 v21; // [rsp+A8h] [rbp-8h]
s[0] = 0LL;
v21 = 0LL;
v19 = -1;
memset(s, 255, 8uLL);
v18 = a2;
v17 = a3;
v16 = 0LL;
v21 = 0LL;
v15 = 0LL;
v14 = 48LL;
v13 = 48LL;
puts("Set PIC IOCTL Lock");
ioctl(a1, 0x53F4uLL);
usleep(0x7A120u);
puts("Connect to MCU chnage to ISP mode ..");
memset(&v7, 0, 0x20uLL);
v7 = &uart_start_isp;
v8 = 8;
ioctl(a1, 0x402053F6uLL, &v7);
usleep(0x7530u);
puts("MCU STOP ...........................");
memset(&v7, 0, 0x20uLL);
v7 = &uart_stop_mcu;
v8 = 7;
ioctl(a1, 0x402053F6uLL, &v7);
usleep(0x7530u);
if ( v16 )
{
puts("Begin erase chip page data .........");
for ( i = v15; v15 + v13 > i; ++i )
{
v19 = 2 * i;
uart_start_row(a1, 2 * i);
memset(&v7, 0, 0x20uLL);
v7 = &uart_erase_page_en;
v8 = 7;
ioctl(a1, 0x402053F6uLL, &v7);
usleep(0x7530u);
memset(&v7, 0, 0x20uLL);
v7 = &uart_erase_block;
v8 = 7;
ioctl(a1, 0x402053F6uLL, &v7);
usleep(0x186A0u);
memset(&v7, 0, 0x20uLL);
v7 = &uart_cmd_finish;
v8 = 7;
ioctl(a1, 0x402053F6uLL, &v7);
usleep(0x7530u);
}
}
else
{
puts("Begin erase chip all data ..........");
memset(&v7, 0, 0x20uLL);
v7 = &uart_erase_chip_en;
v8 = 7;
ioctl(a1, 0x402053F6uLL, &v7);
usleep(0x7530u);
memset(&v7, 0, 0x20uLL);
v7 = &uart_erase_all;
v8 = 7;
ioctl(a1, 0x402053F6uLL, &v7);
usleep(0x186A0u);
memset(&v7, 0, 0x20uLL);
v7 = &uart_cmd_finish;
v8 = 7;
ioctl(a1, 0x402053F6uLL, &v7);
usleep(0x7530u);
}
v12 = (unsigned __int64)(v17 - v16) >> 3;
v11 = ((_BYTE)v17 - (_BYTE)v16) & 7;
puts("Programming begin to MCU ...........");
for ( i = 0LL; i < v12; ++i )
{
v10 = BYTE1(v21);
if ( BYTE1(v21) != v19 )
{
v19 = v10;
uart_start_row(a1, v10);
}
memset(s2, 255, 8uLL);
s2[0] = *(_QWORD *)(v18 + v21);
v9 = v21;
if ( memcmp(s, s2, 8uLL) )
uart_prog_8byte(a1, v9, (char *)s2);
v21 += 8LL;
}
if ( v11 )
{
v10 = BYTE1(v21);
if ( BYTE1(v21) != v19 )
{
v19 = v10;
uart_start_row(a1, v10);
}
memset(s2, 255, 8uLL);
memcpy(s2, (const void *)(v21 + v18), v11);
v9 = v21;
uart_prog_8byte(a1, v21, (char *)s2);
}
memset(&v7, 0, 0x20uLL);
v7 = &uart_cmd_finish;
v8 = 7;
ioctl(a1, 0x402053F6uLL, &v7);
usleep(0x7530u);
memset(&v7, 0, 0x20uLL);
v7 = &uart_reset;
v8 = 7;
ioctl(a1, 0x402053F6uLL, &v7);
usleep(0x7530u);
puts("Set PIC IOCTL UnLock");
return ioctl(a1, 0x53F5uLL);
}
//----- (0000000000019AF2) ----------------------------------------------------
_BOOL8 __fastcall is_pic_raw_running(unsigned int *a1)
{
char filename[32]; // [rsp+10h] [rbp-60h] BYREF
char s[40]; // [rsp+30h] [rbp-40h] BYREF
char *v4; // [rsp+58h] [rbp-18h]
char *s2; // [rsp+60h] [rbp-10h]
FILE *stream; // [rsp+68h] [rbp-8h]
stream = fopen64("/var/run/pic_raw.pid", "r");
if ( !stream )
return 0LL;
fgets(s, 32, stream);
*a1 = atoi(s);
fclose(stream);
sprintf(filename, "/proc/%d/stat", *a1);
stream = fopen64(filename, "rb");
if ( !stream )
return 0LL;
s[0] = 0;
fgets(s, 32, stream);
fclose(stream);
s2 = strchr(s, 40);
v4 = strrchr(s, 41);
if ( !s2 || !v4 )
return 0LL;
++s2;
*v4 = 0;
return strcmp("pic_raw", s2) == 0;
}
//----- (0000000000019C3E) ----------------------------------------------------
int __fastcall set_fan_pwm(const char *a1, unsigned int a2)
{
char s[256]; // [rsp+10h] [rbp-100h] BYREF
if ( (unsigned int)QFAN_Is_Enable() )
return 0;
sprintf(s, "/bin/echo %d > %s", a2, a1);
return system(s);
}
// AB90: using guessed type __int64 QFAN_Is_Enable(void);
//----- (0000000000019CA4) ----------------------------------------------------
int __fastcall set_fan_pwm_2(int a1)
{
char s[128]; // [rsp+10h] [rbp-80h] BYREF
sprintf(s, "/sbin/pic_rw 1 1 0x%d >& /dev/null", (unsigned int)(a1 + 30));
return system(s);
}
//----- (0000000000019CE4) ----------------------------------------------------
__int64 get_fan_pwm()
{
char nptr[16]; // [rsp+0h] [rbp-1B0h] BYREF
char ptr[256]; // [rsp+10h] [rbp-1A0h] BYREF
char command[136]; // [rsp+110h] [rbp-A0h] BYREF
FILE *stream; // [rsp+198h] [rbp-18h]
char *v5; // [rsp+1A0h] [rbp-10h]
unsigned int v6; // [rsp+1ACh] [rbp-4h]
strcpy(command, "/sbin/pic_rw 0 2 0xf8 0xfa 4");
stream = popen(command, "r");
if ( !stream )
return 0LL;
v6 = fread(ptr, 1uLL, 0x100uLL, stream);
pclose(stream);
if ( (int)v6 <= 0 )
return 0LL;
ptr[v6] = 0;
v5 = &ptr[v6 - 1];
if ( *v5 == 13 || *v5 == 10 )
--v5;
if ( *v5 == 13 || *v5 == 10 )
--v5;
nptr[0] = *(v5 - 2);
nptr[1] = *(v5 - 1);
nptr[2] = 0;
v6 = atoi(nptr);
switch ( v6 )
{
case 1u:
v6 = 0;
break;
case 2u:
v6 = 1;
break;
case 4u:
v6 = 2;
break;
case 8u:
v6 = 3;
break;
case 0xAu:
v6 = 4;
break;
case 0x14u:
v6 = 5;
break;
case 0x28u:
v6 = 6;
break;
default:
return v6;
}
return v6;
}
// 19CE4: using guessed type __int64 get_fan_pwm();
// 19CE4: using guessed type char ptr[256];
//----- (0000000000019E90) ----------------------------------------------------
double __fastcall sub_19E90(const char *a1)
{
char s[256]; // [rsp+10h] [rbp-210h] BYREF
char command[260]; // [rsp+110h] [rbp-110h] BYREF
int v5; // [rsp+214h] [rbp-Ch]
FILE *stream; // [rsp+218h] [rbp-8h]
memset(s, 0, sizeof(s));
sprintf(command, "/bin/cat %s", a1);
stream = popen(command, "r");
if ( !stream )
return -1.0;
v5 = fread(s, 1uLL, 0x100uLL, stream);
pclose(stream);
return atof(s);
}
//----- (0000000000019F5E) ----------------------------------------------------
double __fastcall sub_19F5E(double a1)
{
int v1; // eax
char s[76]; // [rsp+10h] [rbp-70h] BYREF
int v5; // [rsp+5Ch] [rbp-24h]
int fd; // [rsp+60h] [rbp-20h]
int v7; // [rsp+64h] [rbp-1Ch]
int v8; // [rsp+68h] [rbp-18h]
int v9; // [rsp+6Ch] [rbp-14h]
int v10; // [rsp+70h] [rbp-10h]
unsigned int j; // [rsp+74h] [rbp-Ch]
unsigned int i; // [rsp+78h] [rbp-8h]
int v13; // [rsp+7Ch] [rbp-4h]
v13 = 0;
if ( (unsigned int)Is_x59_ProII() || (unsigned int)Is_x59_Plus() )
v13 = 1;
if ( v13 == 1 )
{
v8 = 4;
v7 = 4;
v10 = 0;
v9 = 0;
for ( i = 1; (int)i <= v8; ++i )
{
for ( j = 1; (int)j <= v7; ++j )
{
snprintf(s, 0x40uLL, "/sys/class/hwmon/hwmon%d/device/temp%d_label", i, j);
fd = open64(s, 0);
if ( fd >= 0 )
{
v5 = read(fd, s, 0x40uLL);
close(fd);
if ( v5 > 0 && !strncmp(s, "Core", 4uLL) )
{
snprintf(s, 0x40uLL, "/sys/class/hwmon/hwmon%d/device/temp%d_input", i, j);
fd = open64(s, 0);
if ( fd >= 0 )
{
v5 = read(fd, s, 0x40uLL);
close(fd);
if ( v5 > 0 )
{
++v9;
v1 = atoi(s);
v10 += v1 / 1000;
}
}
}
}
}
}
if ( v9 > 0 && v10 > 0 )
return (double)(v10 / v9);
}
return a1;
}
// 9B80: using guessed type __int64 Is_x59_ProII(void);
// 9CB0: using guessed type __int64 Is_x59_Plus(void);
//----- (000000000001A151) ----------------------------------------------------
__int64 Get_Hwmon_All_Status()
{
return 0LL;
}
// 1A151: using guessed type __int64 Get_Hwmon_All_Status();
//----- (000000000001A160) ----------------------------------------------------
__int64 __fastcall sub_1A160(int a1)
{
__int64 result; // rax
char v2; // al
result = (unsigned int)dword_237980;
if ( dword_237980 )
{
sub_1919E(0xB6u, 0x43u);
sub_1919E(1193180 / a1, 0x42u);
sub_1919E((unsigned __int16)(1193180 / a1) >> 8, 0x42u);
v2 = sub_19184(0x61u);
return sub_1919E(v2 | 3u, 0x61u);
}
return result;
}
// 237980: using guessed type int dword_237980;
//----- (000000000001A1D7) ----------------------------------------------------
__int64 sub_1A1D7()
{
__int64 result; // rax
char v1; // al
result = (unsigned int)dword_237980;
if ( dword_237980 )
{
v1 = sub_19184(0x61u);
return sub_1919E(v1 & 0xFC, 0x61u);
}
return result;
}
// 237980: using guessed type int dword_237980;
//----- (000000000001A207) ----------------------------------------------------
__int64 __fastcall Set_Buzzer_Status(unsigned int a1)
{
__int64 result; // rax
dword_237980 = 0;
if ( !ioperm(0x61uLL, 1uLL, 1) && !ioperm(0x42uLL, 1uLL, 1) && !ioperm(0x43uLL, 1uLL, 1) )
dword_237980 = 1;
result = a1;
if ( a1 == 81 )
{
sub_1A160(800);
sleep(1u);
return sub_1A1D7();
}
else if ( (int)a1 > 81 )
{
if ( a1 == 144 )
{
return sub_1A160(800);
}
else if ( a1 == 145 )
{
return sub_1A1D7();
}
}
else if ( a1 == 80 )
{
sub_1A160(800);
usleep(0x7A120u);
return sub_1A1D7();
}
return result;
}
// 237980: using guessed type int dword_237980;
//----- (000000000001A2EB) ----------------------------------------------------
__int64 __fastcall Pic_Send_Raw_Cmd(unsigned int a1)
{
unsigned int v2; // [rsp+1Ch] [rbp-4h]
v2 = 0;
switch ( a1 )
{
case 'P':
SE_Set_Buzzer(0LL, 0LL);
break;
case 'Q':
SE_Set_Buzzer(0LL, 1LL);
break;
case '`':
GPIO_Enable_USB_LED(0LL, 1LL);
break;
case 'a':
GPIO_Enable_USB_LED_BLINK(0LL, 1LL);
break;
case 'b':
GPIO_Enable_USB_LED(0LL, 0LL);
break;
default:
fprintf(stderr, "Not support command = 0x%x\n", a1);
v2 = -1;
break;
}
return v2;
}
// 9B70: using guessed type __int64 __fastcall SE_Set_Buzzer(_QWORD, _QWORD);
// A3F0: using guessed type __int64 __fastcall GPIO_Enable_USB_LED_BLINK(_QWORD, _QWORD);
// AD00: using guessed type __int64 __fastcall GPIO_Enable_USB_LED(_QWORD, _QWORD);
//----- (000000000001A3AD) ----------------------------------------------------
__int64 __fastcall Pic_Send_Raw_Cmds(unsigned __int16 *a1, int a2)
{
__int16 s[128]; // [rsp+10h] [rbp-120h] BYREF
int v4; // [rsp+110h] [rbp-20h]
unsigned int v5; // [rsp+120h] [rbp-10h]
int fd; // [rsp+124h] [rbp-Ch]
unsigned int v7; // [rsp+128h] [rbp-8h]
int i; // [rsp+12Ch] [rbp-4h]
v7 = *a1;
if ( v7 == 88 )
goto LABEL_7;
if ( (int)v7 > 88 )
{
if ( v7 - 144 > 1 )
goto LABEL_7;
}
else if ( v7 - 80 > 1 )
{
goto LABEL_7;
}
Set_Buzzer_Status(v7);
LABEL_7:
if ( a2 <= 128 )
{
fd = open64("/dev/pic", 2);
if ( fd >= 0 )
{
memset(s, 0, 0x104uLL);
for ( i = 0; i < a2; ++i )
s[i] = a1[i];
v4 = a2;
v5 = ioctl(fd, 0x410453EAuLL, s);
close(fd);
return v5;
}
else
{
fprintf(stderr, "fail to open %s\n", "/dev/pic");
return 0xFFFFFFFFLL;
}
}
else
{
fwrite("PIC command buffer overflow.\n", 1uLL, 0x1DuLL, stderr);
return 0xFFFFFFFFLL;
}
}
// A4F0: using guessed type __int64 __fastcall Set_Buzzer_Status(_QWORD);
// 1A3AD: using guessed type __int16 s[128];
//----- (000000000001A514) ----------------------------------------------------
__int64 __fastcall Pic_Send_Read_EEPROM(char a1, unsigned __int8 a2, __int64 a3)
{
char s[260]; // [rsp+10h] [rbp-110h] BYREF
unsigned int v6; // [rsp+114h] [rbp-Ch]
int fd; // [rsp+118h] [rbp-8h]
int i; // [rsp+11Ch] [rbp-4h]
fd = open64("/dev/pic", 2);
if ( fd >= 0 )
{
memset(s, 0, 0x102uLL);
s[0] = a1;
s[1] = a2;
v6 = ioctl(fd, 0x410253F3uLL, s);
s[259] = 0;
for ( i = 0; a2 >= i; ++i )
*(_BYTE *)(a3 + i) = s[i + 2];
close(fd);
return v6;
}
else
{
fprintf(stderr, "fail to open %s\n", "/dev/pic");
return 0xFFFFFFFFLL;
}
}
//----- (000000000001A620) ----------------------------------------------------
__int64 __fastcall Pic_Send_Write_EEPROM(char a1, unsigned __int8 a2, __int64 a3)
{
char s[260]; // [rsp+10h] [rbp-110h] BYREF
unsigned int v6; // [rsp+114h] [rbp-Ch]
int fd; // [rsp+118h] [rbp-8h]
int i; // [rsp+11Ch] [rbp-4h]
fd = open64("/dev/pic", 2);
if ( fd >= 0 )
{
memset(s, 0, 0x102uLL);
s[0] = a1;
s[1] = a2;
for ( i = 0; a2 > i; ++i )
s[i + 2] = *(_BYTE *)(i + a3);
v6 = ioctl(fd, 0x410253F2uLL, s);
close(fd);
return v6;
}
else
{
fprintf(stderr, "fail to open %s\n", "/dev/pic");
return 0xFFFFFFFFLL;
}
}
//----- (000000000001A728) ----------------------------------------------------
__int64 __fastcall Pic_Read_Byte(char a1, unsigned __int8 a2, __int64 a3)
{
char s[260]; // [rsp+10h] [rbp-110h] BYREF
unsigned int v6; // [rsp+114h] [rbp-Ch]
int fd; // [rsp+118h] [rbp-8h]
int i; // [rsp+11Ch] [rbp-4h]
fd = open64("/dev/pic", 2);
if ( fd >= 0 )
{
memset(s, 0, 0x102uLL);
s[0] = a1;
s[1] = a2;
v6 = ioctl(fd, 0x410253FBuLL, s);
close(fd);
for ( i = 0; a2 > i; ++i )
*(_BYTE *)(a3 + i) = s[i + 2];
return v6;
}
else
{
fprintf(stderr, "fail to open %s\n", "/dev/pic");
return 0xFFFFFFFFLL;
}
}
//----- (000000000001A830) ----------------------------------------------------
__int64 __fastcall Pic_Send_Message(__int16 a1, __int16 a2)
{
__int16 s[128]; // [rsp+10h] [rbp-110h] BYREF
int v4; // [rsp+110h] [rbp-10h]
unsigned int v5; // [rsp+118h] [rbp-8h]
int fd; // [rsp+11Ch] [rbp-4h]
fd = open64("/dev/pic", 2);
if ( fd >= 0 )
{
memset(s, 0, 0x104uLL);
s[0] = a1;
++v4;
s[1] = a2;
++v4;
v5 = ioctl(fd, 0x410453E9uLL, s);
close(fd);
return v5;
}
else
{
fprintf(stderr, "fail to open %s\n", "/dev/pic");
return 0xFFFFFFFFLL;
}
}
//----- (000000000001A904) ----------------------------------------------------
__int64 __fastcall Pic_Send_Write_To_MCU(__int64 a1, unsigned int a2)
{
int fd; // [rsp+1Ch] [rbp-4h]
fd = open64("/dev/pic", 2);
if ( fd >= 0 )
{
uart_update_firmware_to_mcu(fd, a1, a2);
close(fd);
return 0LL;
}
else
{
fprintf(stderr, "fail to open %s\n", "/dev/pic");
return 0xFFFFFFFFLL;
}
}
//----- (000000000001A983) ----------------------------------------------------
__int64 __fastcall Pic_Backup_Block_Area(__int64 a1)
{
int fd; // [rsp+1Ch] [rbp-4h]
fd = open64("/dev/pic", 2);
if ( fd >= 0 )
{
ioctl(fd, 0x802053F7uLL, a1);
close(fd);
return 0LL;
}
else
{
fprintf(stderr, "fail to open %s\n", "/dev/pic");
return 0xFFFFFFFFLL;
}
}
//----- (000000000001AA06) ----------------------------------------------------
__int64 __fastcall Pic_Send_Read_Write_DIDO(__int64 a1)
{
unsigned int v2; // [rsp+18h] [rbp-8h]
int fd; // [rsp+1Ch] [rbp-4h]
fd = open64("/dev/pic", 2);
if ( fd >= 0 )
{
v2 = ioctl(fd, 0x400453F9uLL, a1);
close(fd);
return v2;
}
else
{
fprintf(stderr, "fail to open %s\n", "/dev/pic");
return 0xFFFFFFFFLL;
}
}
//----- (000000000001AA87) ----------------------------------------------------
__int64 __fastcall Pic_Read_Write(__int64 a1)
{
int fd; // [rsp+1Ch] [rbp-4h]
fd = open64("/dev/pic", 2);
if ( fd >= 0 )
{
ioctl(fd, 0xC01053FAuLL, a1);
close(fd);
return 0LL;
}
else
{
fprintf(stderr, "fail to open %s\n", "/dev/pic");
return 0xFFFFFFFFLL;
}
}
//----- (000000000001AB0A) ----------------------------------------------------
int sub_1AB0A()
{
char s[72]; // [rsp+0h] [rbp-50h] BYREF
FILE *stream; // [rsp+48h] [rbp-8h]
stream = fopen64("/var/ledvalue", "r");
if ( !stream )
return 0;
fgets(s, 64, stream);
fclose(stream);
return atoi(s);
}
//----- (000000000001AB66) ----------------------------------------------------
__int64 __fastcall sub_1AB66(unsigned int a1)
{
char s[72]; // [rsp+10h] [rbp-50h] BYREF
FILE *stream; // [rsp+58h] [rbp-8h]
stream = fopen64("/var/ledvalue", "w+");
if ( !stream )
return 0xFFFFFFFFLL;
sprintf(s, "%d", a1);
fputs(s, stream);
fclose(stream);
return 0LL;
}
//----- (000000000001ABD7) ----------------------------------------------------
__int64 stop_pic_raw()
{
__int64 result; // rax
unsigned int v1; // [rsp+Ch] [rbp-84h] BYREF
char s[128]; // [rsp+10h] [rbp-80h] BYREF
result = is_pic_raw_running(&v1);
if ( (_DWORD)result )
{
result = NAS_File_Lock("/var/lock/pic_raw.lck", 119LL);
if ( (_DWORD)result )
{
if ( is_pic_raw_running(&v1) )
{
sprintf(s, "/bin/kill -9 %d", v1);
system(s);
unlink("/var/run/pic_raw.pid");
}
return NAS_File_Unlock("/var/lock/pic_raw.lck");
}
}
return result;
}
// 9CE0: using guessed type __int64 __fastcall NAS_File_Lock(_QWORD, _QWORD);
// 9D20: using guessed type __int64 __fastcall NAS_File_Unlock(_QWORD);
// 1ABD7: using guessed type __int64 stop_pic_raw();
//----- (000000000001AC61) ----------------------------------------------------
__int64 __fastcall Util_Send_Message(int a1, const char *a2, int a3, __int64 a4)
{
int s; // [rsp+20h] [rbp-50h] BYREF
char v8[52]; // [rsp+24h] [rbp-4Ch] BYREF
int v9; // [rsp+58h] [rbp-18h]
__int64 v10; // [rsp+60h] [rbp-10h]
int msqid; // [rsp+6Ch] [rbp-4h]
memset(&s, 0, 0x48uLL);
msqid = msgget(404, 950);
s = a1;
if ( a2 )
snprintf(v8, 0x32uLL, "%s", a2);
v9 = a3;
v10 = a4;
msgsnd(msqid, &s, 0x40uLL, 0);
return 0LL;
}
// 1AC61: using guessed type char anonymous_0[52];
//----- (000000000001ACFE) ----------------------------------------------------
_BOOL8 __fastcall Set_LOGO_LED_Mode(unsigned int a1)
{
switch ( a1 )
{
case 2u:
Pic_Send_Raw_Cmd(0xC1u);
break;
case 3u:
Pic_Send_Raw_Cmd(0xC0u);
sleep(2u);
Pic_Send_Raw_Cmd(0xC2u);
break;
case 1u:
Pic_Send_Raw_Cmd(0xC0u);
break;
}
return Set_Profile_Integer((__int64)"System", (__int64)"QNAP_LOGO_Mode", a1);
}
//----- (000000000001AD6C) ----------------------------------------------------
_BOOL8 __fastcall Set_Buzzer_Quiet_Mode(int a1)
{
if ( a1 == 1 )
return Set_Profile_Boolean((__int64)"Misc", (__int64)"Buzzer Quiet Enable", 1);
else
return Set_Profile_Boolean((__int64)"Misc", (__int64)"Buzzer Quiet Enable", 0);
}
//----- (000000000001ADC1) ----------------------------------------------------
__int64 Get_Buzzer_Quiet_Mode()
{
char s[16]; // [rsp+0h] [rbp-10h] BYREF
memset(s, 0, 6uLL);
Get_Profile_String((__int64)"Misc", (__int64)"Buzzer Quiet Enable", (const char *)&unk_2E884, s, 6);
if ( !strcmp(s, "TRUE") )
return 1LL;
if ( strcmp(s, "FALSE") )
{
usleep(0x186A0u);
Set_Profile_Boolean((__int64)"Misc", (__int64)"Buzzer Quiet Enable", 0);
}
return 0LL;
}
// 1ADC1: using guessed type __int64 Get_Buzzer_Quiet_Mode();
//----- (000000000001AE6B) ----------------------------------------------------
__int64 lock_system_update()
{
int fd; // [rsp+Ch] [rbp-4h]
fd = open64("/tmp/nas_system.lock", 192, 493LL);
if ( fd == -1 )
return 0xFFFFFFFFLL;
close(fd);
return 0LL;
}
// 1AE6B: using guessed type __int64 lock_system_update();
//----- (000000000001AEAF) ----------------------------------------------------
int unlock_system_update()
{
return unlink("/tmp/nas_system.lock");
}
//----- (000000000001AEC1) ----------------------------------------------------
__int64 Is_System_Update_Locked()
{
return Is_File_Exist("/tmp/nas_system.lock");
}
// A570: using guessed type __int64 __fastcall Is_File_Exist(_QWORD);
// 1AEC1: using guessed type __int64 Is_System_Update_Locked();
//----- (000000000001AED3) ----------------------------------------------------
__int64 Is_Live_Update_In_Progress()
{
return Is_File_Exist("/tmp/live_update_process");
}
// A570: using guessed type __int64 __fastcall Is_File_Exist(_QWORD);
// 1AED3: using guessed type __int64 Is_Live_Update_In_Progress();
//----- (000000000001AEE5) ----------------------------------------------------
__int64 __fastcall Touch_File(const char *a1)
{
int fd; // [rsp+18h] [rbp-8h]
unsigned int v3; // [rsp+1Ch] [rbp-4h]
v3 = 0;
if ( utime(a1, 0LL) && *__errno_location() == 2 )
{
fd = open64(a1, 66, 438LL);
if ( fd < 0 || close(fd) )
return (unsigned int)-1;
else
return 0;
}
return v3;
}
//----- (000000000001AF60) ----------------------------------------------------
_BOOL8 Is_App_Install_In_Progress()
{
return (unsigned int)Is_File_Exist("/tmp/qpkg_setup") || (unsigned int)Is_File_Exist("/tmp/qpkg_installing");
}
// A570: using guessed type __int64 __fastcall Is_File_Exist(_QWORD);
//----- (000000000001AF92) ----------------------------------------------------
_BOOL8 __fastcall Is_File_Exist(char *a1)
{
struct stat64 stat_buf; // [rsp+10h] [rbp-90h] BYREF
if ( !a1 )
__assert_fail("filename", "normalutil.c", 0x5Bu, "Is_File_Exist");
return sub_2D9F0(a1, &stat_buf) == 0;
}
//----- (000000000001AFF0) ----------------------------------------------------
char *__fastcall sub_1AFF0(__int64 a1, unsigned __int8 *a2, _DWORD *a3)
{
char *result; // rax
int v4; // eax
int v5; // eax
int v6; // eax
char *v8; // [rsp+20h] [rbp-10h]
char v9; // [rsp+20h] [rbp-10h]
char *v10; // [rsp+28h] [rbp-8h]
char *v11; // [rsp+28h] [rbp-8h]
*a3 = 0;
result = (char *)*a2;
if ( (_BYTE)result != 61 )
{
result = (char *)a2[1];
if ( (_BYTE)result != 61 )
{
v10 = strchr(off_236B48, *a2);
result = strchr(off_236B48, a2[1]);
v8 = result;
if ( v10 )
{
if ( result )
{
v4 = (*a3)++;
*(_BYTE *)(v4 + a1) = (4 * ((_BYTE)v10 - (_BYTE)off_236B48)) | ((v8 - off_236B48) >> 4);
result = (char *)a2[2];
if ( (_BYTE)result != 61 )
{
result = strchr(off_236B48, a2[2]);
v11 = result;
if ( result )
{
v5 = (*a3)++;
*(_BYTE *)(v5 + a1) = (16 * ((_BYTE)v8 - (_BYTE)off_236B48)) | ((v11 - off_236B48) >> 2);
result = (char *)a2[3];
if ( (_BYTE)result != 61 )
{
result = strchr(off_236B48, a2[3]);
v9 = (char)result;
if ( result )
{
v6 = (*a3)++;
result = (char *)(v6 + a1);
*result = (((_BYTE)v11 - (_BYTE)off_236B48) << 6) | (v9 - (_BYTE)off_236B48);
}
}
}
}
}
}
}
}
return result;
}
//----- (000000000001B1E3) ----------------------------------------------------
__int64 __fastcall Is_Alphabet_Num(_BYTE *a1)
{
_BYTE *v2; // [rsp+18h] [rbp-8h]
v2 = a1;
if ( !a1 )
return 0LL;
while ( *v2 )
{
if ( ((*__ctype_b_loc())[(char)*v2] & 8) == 0 )
return 0LL;
++v2;
}
return 1LL;
}
//----- (000000000001B24D) ----------------------------------------------------
__int64 __fastcall Is_Valid_Servername(_BYTE *a1)
{
_BYTE *v2; // [rsp+18h] [rbp-8h]
v2 = a1;
if ( !a1 )
return 0LL;
while ( *v2 )
{
if ( ((*__ctype_b_loc())[(char)*v2] & 8) != 0 )
{
++v2;
}
else
{
if ( *v2 != 45 )
return 0LL;
++v2;
}
}
return 1LL;
}
//----- (000000000001B2C9) ----------------------------------------------------
__int64 __fastcall Is_Valid_Email(const char *a1)
{
char *v2; // [rsp+10h] [rbp-30h]
int v3; // [rsp+20h] [rbp-20h]
int v4; // [rsp+24h] [rbp-1Ch]
char *v5; // [rsp+28h] [rbp-18h]
char *i; // [rsp+28h] [rbp-18h]
char *j; // [rsp+28h] [rbp-18h]
char *v8; // [rsp+30h] [rbp-10h]
unsigned int v9; // [rsp+3Ch] [rbp-4h]
v9 = 0;
v8 = 0LL;
v3 = 0;
if ( a1 )
{
v8 = strdup(a1);
if ( v8 )
{
v5 = strchr(v8, 64);
if ( v5 )
{
*v5 = 0;
v2 = v5 + 1;
for ( i = v8; *i; ++i )
{
if ( ((*__ctype_b_loc())[*i] & 2) != 0
|| *i < 0
|| ((*__ctype_b_loc())[*i] & 0x400) == 0
&& ((*__ctype_b_loc())[*i] & 0x800) == 0
&& *i != 45
&& *i != 43
&& *i != 46
&& *i != 95 )
{
goto LABEL_31;
}
}
if ( strlen(v2) <= 0x101 )
{
v4 = 0;
for ( j = v2; *j; ++j )
{
if ( ((*__ctype_b_loc())[*j] & 2) != 0
|| *j < 0
|| ((*__ctype_b_loc())[*j] & 0x400) == 0
&& ((*__ctype_b_loc())[*j] & 0x800) == 0
&& *j != 45
&& *j != 46
&& *j != 95 )
{
goto LABEL_31;
}
if ( *j == 46 )
{
if ( *j == v2[v4 - 1] )
goto LABEL_31;
++v3;
}
++v4;
}
if ( v3 > 0 )
v9 = 1;
}
}
}
}
LABEL_31:
if ( v8 )
free(v8);
return v9;
}
//----- (000000000001B593) ----------------------------------------------------
__int64 __fastcall Base64_Decode(__int64 a1, unsigned __int8 *a2)
{
int v4; // [rsp+18h] [rbp-8h] BYREF
unsigned int v5; // [rsp+1Ch] [rbp-4h]
v5 = 0;
while ( *a2 )
{
sub_1AFF0((int)v5 + a1, a2, &v4);
a2 += 4;
v5 += v4;
}
return v5;
}
//----- (000000000001B5E8) ----------------------------------------------------
__int64 __fastcall sub_1B5E8(char *a1, unsigned __int8 *a2, int a3)
{
unsigned __int8 v3; // al
unsigned __int8 v4; // al
unsigned __int8 v5; // al
char v6; // al
char v7; // al
char v8; // al
__int64 result; // rax
unsigned __int8 v10; // [rsp+14h] [rbp-10h]
unsigned __int8 v11; // [rsp+15h] [rbp-Fh]
unsigned __int8 v12; // [rsp+16h] [rbp-Eh]
if ( a3 <= 0 )
v3 = 0;
else
v3 = *a2;
v10 = v3;
if ( a3 <= 1 )
v4 = 0;
else
v4 = a2[1];
v11 = v4;
if ( a3 <= 2 )
v5 = 0;
else
v5 = a2[2];
v12 = v5;
if ( a3 <= 0 )
v6 = 61;
else
v6 = off_236B48[v10 >> 2];
*a1 = v6;
if ( a3 <= 0 )
v7 = 61;
else
v7 = off_236B48[(16 * (v10 & 3)) | (v11 >> 4)];
a1[1] = v7;
if ( a3 <= 1 )
v8 = 61;
else
v8 = off_236B48[(4 * (v11 & 0xF)) | (v12 >> 6)];
a1[2] = v8;
if ( a3 <= 2 )
result = 61LL;
else
result = (unsigned __int8)off_236B48[v12 & 0x3F];
a1[3] = result;
return result;
}
//----- (000000000001B722) ----------------------------------------------------
__int64 __fastcall Base64_Encode(__int64 a1, unsigned __int8 *a2, int a3)
{
int v3; // eax
unsigned int v7; // [rsp+24h] [rbp-4h]
v7 = 0;
while ( a3 > 0 )
{
v3 = 3;
if ( a3 <= 3 )
v3 = a3;
sub_1B5E8((char *)(a1 + (int)v7), a2, v3);
a3 -= 3;
a2 += 3;
v7 += 4;
}
return v7;
}
//----- (000000000001B781) ----------------------------------------------------
__int64 __fastcall XOR_Encrypt(__int64 a1, int a2, int a3)
{
char v4; // cl
char s[48]; // [rsp+10h] [rbp-50h] BYREF
char *v6; // [rsp+40h] [rbp-20h]
char *v7; // [rsp+48h] [rbp-18h]
int v8; // [rsp+54h] [rbp-Ch]
int v9; // [rsp+58h] [rbp-8h]
int i; // [rsp+5Ch] [rbp-4h]
i = 0;
v9 = 0;
v7 = aCde31qaz000000;
v6 = &aCde31qaz000000[16];
v8 = 0;
if ( a3 == 102 )
{
memset(s, 0, 0x21uLL);
if ( (int)Get_Private_Profile_String(
(__int64)&unk_2EA9D,
(__int64)"SUID",
(const char *)&unk_2EA9D,
s,
33,
(__int64)"/etc/platform.conf") <= 0
&& (memset(s, 0, 0x21uLL), (unsigned int)Get_Device_SUID(s, 32LL)) )
{
return a1;
}
else
{
v8 = strlen(s);
for ( i = 0; i < a2; ++i )
{
if ( v9 >= v8 )
v9 = 0;
*(_BYTE *)(a1 + i) = *(_BYTE *)(i + a1) ^ s[v9++];
}
return a1;
}
}
else if ( a3 == 101 )
{
memset(s, 0, 0x21uLL);
if ( (int)Get_Private_Profile_String(
(__int64)&unk_2EA9D,
(__int64)"SUID",
(const char *)&unk_2EA9D,
s,
33,
(__int64)"/etc/platform.conf") <= 0 )
{
memset(s, 0, 0x21uLL);
if ( (unsigned int)Get_Device_SUID(s, 32LL) )
return a1;
v8 = strlen(s);
}
for ( i = 0; i < a2; ++i )
{
if ( v9 >= v8 )
v9 = 0;
*(_BYTE *)(a1 + i) = *(_BYTE *)(i + a1) ^ s[v9++];
}
return a1;
}
else
{
v9 = a3 % 16;
for ( i = 0; i < a2; ++i )
{
if ( v9 > 15 )
v9 = 0;
if ( v9 <= 7 )
v4 = v7[v9];
else
v4 = v6[v9];
*(_BYTE *)(i + a1) ^= v4;
++v9;
}
return a1;
}
}
// A620: using guessed type __int64 __fastcall Get_Device_SUID(_QWORD, _QWORD);
// 1B781: using guessed type char s[48];
//----- (000000000001BA4B) ----------------------------------------------------
__int64 __fastcall Is_SUID_ENC_SALT_V2(const char *a1)
{
unsigned int v2; // [rsp+1Ch] [rbp-4h]
v2 = 0;
if ( a1 )
return strncmp(a1, "V2@", 3uLL) == 0;
return v2;
}
//----- (000000000001BA8F) ----------------------------------------------------
__int64 __fastcall str_to_hex(const char *a1, __int64 a2, int a3)
{
int v5; // [rsp+24h] [rbp-1Ch]
int i; // [rsp+28h] [rbp-18h]
unsigned int v7; // [rsp+2Ch] [rbp-14h]
v7 = -1;
v5 = 0;
if ( a1 && a2 )
{
for ( i = 0; i < strlen(a1); ++i )
v5 += snprintf((char *)(v5 + a2), a3 - v5, "%02X", (unsigned int)a1[i]);
return 0;
}
return v7;
}
//----- (000000000001BB36) ----------------------------------------------------
__int64 __fastcall AES_QTS_Encrypt(__int64 a1, int a2, void *a3, const char *a4, int a5)
{
__int64 v5; // rax
__int64 v6; // rax
int v11; // [rsp+28h] [rbp-78h] BYREF
int v12; // [rsp+2Ch] [rbp-74h] BYREF
__int64 v13[2]; // [rsp+30h] [rbp-70h] BYREF
char v14; // [rsp+40h] [rbp-60h]
__int64 v15[4]; // [rsp+50h] [rbp-50h] BYREF
char v16; // [rsp+70h] [rbp-30h]
size_t size; // [rsp+80h] [rbp-20h]
__int64 v18; // [rsp+88h] [rbp-18h]
void *src; // [rsp+90h] [rbp-10h]
unsigned int v20; // [rsp+9Ch] [rbp-4h]
memset(v15, 0, sizeof(v15));
v16 = 0;
v13[0] = 0LL;
v13[1] = 0LL;
v14 = 0;
size = a2 + 16;
v12 = 0;
v11 = 0;
v20 = -1;
src = 0LL;
v18 = 0LL;
if ( a1 )
{
if ( a3 )
{
if ( a4 )
{
if ( strlen(a4) <= 8 && a2 > 0 )
{
if ( (int)Get_Private_Profile_String(
(__int64)&unk_2EA9D,
(__int64)"SUID",
(const char *)&unk_2EA9D,
(char *)v15,
33,
(__int64)"/etc/platform.conf") > 0
|| (memset(v15, 0, 0x21uLL), !(unsigned int)Get_Device_SUID(v15, 33LL)) )
{
if ( (int)_str_to_hex(a4, (__int64)v13, 17) >= 0 )
{
v18 = EVP_CIPHER_CTX_new();
if ( v18 )
{
src = calloc(1uLL, size);
if ( src )
{
if ( a5 == 1 )
{
v5 = EVP_aes_256_cbc();
if ( (unsigned int)EVP_EncryptInit_ex(v18, v5, 0LL, v15, v13) != 1
|| (unsigned int)EVP_EncryptUpdate(v18, src, &v12, a1, (unsigned int)a2) != 1
|| (unsigned int)EVP_EncryptFinal_ex(v18, (char *)src + v12, &v11) != 1 )
{
goto LABEL_21;
}
LABEL_20:
memcpy(a3, src, a2);
v20 = 0;
goto LABEL_21;
}
if ( a5 )
goto LABEL_20;
v6 = EVP_aes_256_cbc();
if ( (unsigned int)EVP_DecryptInit_ex(v18, v6, 0LL, v15, v13) == 1 )
{
EVP_CIPHER_CTX_set_padding(v18, 0LL);
if ( (unsigned int)EVP_DecryptUpdate(v18, src, &v12, a1, (unsigned int)a2) == 1
&& (unsigned int)EVP_DecryptFinal_ex(v18, (char *)src + v12, &v11) == 1 )
{
goto LABEL_20;
}
}
}
}
}
}
}
}
}
}
LABEL_21:
if ( v18 )
EVP_CIPHER_CTX_free(v18);
if ( src )
free(src);
return v20;
}
// 9E30: using guessed type __int64 EVP_CIPHER_CTX_new(void);
// A060: using guessed type __int64 __fastcall EVP_CIPHER_CTX_free(_QWORD);
// A250: using guessed type __int64 __fastcall EVP_DecryptFinal_ex(_QWORD, _QWORD, _QWORD);
// A450: using guessed type __int64 EVP_aes_256_cbc(void);
// A590: using guessed type __int64 __fastcall EVP_DecryptInit_ex(_QWORD, _QWORD, _QWORD, _QWORD, _QWORD);
// A5E0: using guessed type __int64 __fastcall EVP_CIPHER_CTX_set_padding(_QWORD, _QWORD);
// A620: using guessed type __int64 __fastcall Get_Device_SUID(_QWORD, _QWORD);
// A8E0: using guessed type __int64 __fastcall EVP_DecryptUpdate(_QWORD, _QWORD, _QWORD, _QWORD, _QWORD);
// A920: using guessed type __int64 __fastcall EVP_EncryptFinal_ex(_QWORD, _QWORD, _QWORD);
// A9C0: using guessed type __int64 __fastcall EVP_EncryptInit_ex(_QWORD, _QWORD, _QWORD, _QWORD, _QWORD);
// AAA0: using guessed type __int64 __fastcall EVP_EncryptUpdate(_QWORD, _QWORD, _QWORD, _QWORD, _QWORD);
//----- (000000000001BE69) ----------------------------------------------------
char *__fastcall Password_Encode(const char *a1, int a2, int a3)
{
__int64 v3; // rax
char *v6; // [rsp+10h] [rbp-30h]
char *v7; // [rsp+18h] [rbp-28h]
char *v8; // [rsp+20h] [rbp-20h]
void *ptr; // [rsp+28h] [rbp-18h]
char *v10; // [rsp+30h] [rbp-10h]
int v11; // [rsp+3Ch] [rbp-4h]
v10 = 0LL;
ptr = 0LL;
v8 = 0LL;
v7 = 0LL;
v6 = 0LL;
if ( a1 )
{
v6 = strdup(a1);
if ( a3 == 100 )
{
if ( (a2 & 0xF) != 0 )
v11 = 16 * (a2 / 16 + 1);
else
v11 = a2;
ptr = calloc(1uLL, v11);
if ( ptr )
{
if ( (int)AES_QTS_Encrypt((__int64)v6, v11, ptr, "panq@stq", 1) >= 0 )
{
v8 = (char *)calloc(1uLL, 2 * v11);
if ( v8 )
{
if ( (int)Base64_Encode(v8, ptr, (unsigned int)v11) > 0 )
{
v7 = (char *)calloc(1uLL, 2 * (v11 + 2));
if ( v7 )
{
snprintf(v7, 2 * (v11 + 2), "%s%s", "V2@", v8);
v10 = strdup(v7);
}
}
}
}
}
}
else
{
v8 = (char *)calloc(1uLL, 2 * (a2 + 4));
if ( v8 )
{
v3 = XOR_Encrypt((__int64)v6, a2, a3);
if ( (int)Base64_Encode(v8, v3, (unsigned int)a2) > 0 )
v10 = strdup(v8);
}
}
}
if ( ptr )
free(ptr);
if ( v8 )
free(v8);
if ( v7 )
free(v7);
if ( v6 )
free(v6);
return v10;
}
// A270: using guessed type __int64 __fastcall Base64_Encode(_QWORD, _QWORD, _QWORD);
//----- (000000000001C0CA) ----------------------------------------------------
char *__fastcall Password_Decode(const char *a1, int a2)
{
size_t v2; // rax
size_t v3; // rax
int v4; // eax
size_t v5; // rax
const char *v6; // rax
char *s; // [rsp+10h] [rbp-30h]
char *sa; // [rsp+10h] [rbp-30h]
int v10; // [rsp+1Ch] [rbp-24h]
int v11; // [rsp+1Ch] [rbp-24h]
void *v12; // [rsp+20h] [rbp-20h]
void *ptr; // [rsp+28h] [rbp-18h]
char *v14; // [rsp+30h] [rbp-10h]
v14 = 0LL;
ptr = 0LL;
v12 = 0LL;
if ( a1 )
{
if ( a2 == 100 )
{
if ( (unsigned int)Is_SUID_ENC_SALT_V2(a1) )
{
s = strstr(a1, "V2@");
if ( s )
{
v2 = strlen(a1);
ptr = calloc(1uLL, 2 * v2);
if ( ptr )
{
sa = s + 3;
if ( strlen(sa) > 0xF )
{
v3 = strlen(sa);
v12 = calloc(1uLL, v3);
if ( v12 )
{
v10 = Base64_Decode(v12, sa);
if ( v10 > 0 )
{
v4 = (v10 & 0xF) != 0
? AES_QTS_Encrypt((__int64)v12, 16 * ((v10 >> 4) + 1), ptr, "panq@stq", 0)
: AES_QTS_Encrypt((__int64)v12, v10, ptr, "panq@stq", 0);
if ( v4 >= 0 )
{
v14 = (char *)ptr;
ptr = 0LL;
}
}
}
}
}
}
}
}
else
{
v5 = strlen(a1);
v12 = calloc(1uLL, v5);
if ( v12 )
{
v11 = Base64_Decode(v12, a1);
if ( v11 > 0 )
{
v6 = (const char *)XOR_Encrypt((__int64)v12, v11, a2);
v14 = strdup(v6);
}
}
}
}
if ( ptr )
free(ptr);
if ( v12 )
free(v12);
return v14;
}
// 1C200: conditional instruction was optimized away because %var_24.4>=1
// 9E40: using guessed type __int64 __fastcall Base64_Decode(_QWORD, _QWORD);
//----- (000000000001C2E9) ----------------------------------------------------
__int64 model_is_pro()
{
struct stat64 stat_buf; // [rsp+0h] [rbp-A0h] BYREF
int hw_type; // [rsp+9Ch] [rbp-4h]
hw_type = get_hw_type();
if ( hw_type == 2 )
return 0LL;
if ( hw_type == 1 )
return 0xFFFFFFFFLL;
if ( sub_2D9F0("/mnt/HDA_ROOT/.std", &stat_buf) )
return 0LL;
return 0xFFFFFFFFLL;
}
// A3D0: using guessed type __int64 get_hw_type(void);
// 1C2E9: using guessed type __int64 model_is_pro();
//----- (000000000001C33E) ----------------------------------------------------
__int64 get_hw_type()
{
char s[264]; // [rsp+0h] [rbp-110h] BYREF
FILE *stream; // [rsp+108h] [rbp-8h]
stream = fopen64("/tmp/hw_type", "a+");
if ( !stream )
return 0LL;
fgets(s, 257, stream);
fclose(stream);
if ( !strncmp(s, "0055", 4uLL) )
return 1LL;
if ( !strncmp(s, "0099", 4uLL) )
return 2LL;
return 0LL;
}
// 1C33E: using guessed type __int64 get_hw_type();
//----- (000000000001C3E5) ----------------------------------------------------
unsigned int sync_cmd()
{
system("/bin/sync");
return sleep(1u);
}
//----- (000000000001C401) ----------------------------------------------------
__int64 __fastcall getQPKGDisplayNameIndex(const char *a1)
{
unsigned int v2; // [rsp+18h] [rbp-8h]
unsigned int i; // [rsp+1Ch] [rbp-4h]
v2 = -1;
for ( i = 0; qpkg_display_name[2 * (int)i]; ++i )
{
if ( !strcmp(a1, qpkg_display_name[2 * (int)i]) )
return i;
}
return v2;
}
// 235340: using guessed type char *qpkg_display_name[12];
//----- (000000000001C47B) ----------------------------------------------------
char *__fastcall Get_Random_Digit_String(int a1)
{
unsigned int v1; // eax
__int64 v2; // rax
__int64 v3; // rax
int v5; // [rsp+Ch] [rbp-124h]
char v6[16]; // [rsp+10h] [rbp-120h] BYREF
char s[268]; // [rsp+20h] [rbp-110h] BYREF
int i; // [rsp+12Ch] [rbp-4h]
v5 = a1;
qmemcpy(v6, "0123456789", 10);
if ( a1 > 257 || a1 <= 0 )
v5 = 257;
v1 = time(0LL);
srandom(v1);
v2 = random();
sprintf(s, "%c", (unsigned int)v6[v2 % 8]);
for ( i = 1; i < v5; ++i )
{
v3 = random();
sprintf(s, "%s%c", s, (unsigned int)v6[v3 % 10]);
}
s[v5] = 0;
return strdup(s);
}
// 1C47B: using guessed type char s[268];
//----- (000000000001C5E6) ----------------------------------------------------
__int64 __fastcall Get_Random_String(char *a1, int a2)
{
unsigned int v2; // eax
int v4; // [rsp+4h] [rbp-15Ch]
char v5[36]; // [rsp+10h] [rbp-150h] BYREF
char s[272]; // [rsp+40h] [rbp-120h] BYREF
int v7; // [rsp+150h] [rbp-10h]
int v8; // [rsp+154h] [rbp-Ch]
int v9; // [rsp+158h] [rbp-8h]
int i; // [rsp+15Ch] [rbp-4h]
__int64 savedregs; // [rsp+160h] [rbp+0h] BYREF
v4 = a2;
v9 = 5;
qmemcpy(v5, "abcdefghijklmnopqrstuvwxyz0123456789", sizeof(v5));
if ( a2 > 256 || a2 <= 0 )
v4 = 256;
v2 = time(0LL);
srandom(v2);
v8 = rand() % (v9 + 1);
v7 = rand() % (v9 + 1);
sprintf(s, "%c", (unsigned int)*((char *)&savedregs + 6 * v8 + v7 - 336));
for ( i = 1; i < v4; ++i )
{
v8 = rand() % (v9 + 1);
v7 = rand() % (v9 + 1);
sprintf(s, "%s%c", s, (unsigned int)*((char *)&savedregs + 6 * v8 + v7 - 336));
}
s[v4] = 0;
strcpy(a1, s);
return 0LL;
}
// 1C5E6: using guessed type char s[272];
//----- (000000000001C862) ----------------------------------------------------
__int64 __fastcall Get_Flash_Config(__int64 a1, unsigned int a2, __int64 a3)
{
return Blk_Dev_Read_Flash(a1, a2, a3);
}
// 9CC0: using guessed type __int64 __fastcall Blk_Dev_Read_Flash(_QWORD, _QWORD, _QWORD);
//----- (000000000001C891) ----------------------------------------------------
__int64 __fastcall Set_Flash_Config(__int64 a1, __int64 a2)
{
return Blk_Dev_Write_Flash(a1, a2);
}
// 9C60: using guessed type __int64 __fastcall Blk_Dev_Write_Flash(_QWORD, _QWORD);
//----- (000000000001C8BB) ----------------------------------------------------
__int64 __fastcall iface_get_hwaddr(const char *a1, char *a2, int a3)
{
__int64 v3; // rdx
size_t v5; // rbx
size_t v6; // rax
char *v7; // rax
char src[256]; // [rsp+20h] [rbp-3B0h] BYREF
char v10; // [rsp+120h] [rbp-2B0h] BYREF
_BYTE v11[7]; // [rsp+121h] [rbp-2AFh] BYREF
char s[32]; // [rsp+130h] [rbp-2A0h] BYREF
char s2[32]; // [rsp+150h] [rbp-280h] BYREF
char s1[272]; // [rsp+170h] [rbp-260h] BYREF
char v15[264]; // [rsp+280h] [rbp-150h] BYREF
char *v16; // [rsp+388h] [rbp-48h]
char *v17; // [rsp+390h] [rbp-40h]
unsigned int v18; // [rsp+39Ch] [rbp-34h]
char *delim; // [rsp+3A0h] [rbp-30h]
int v20; // [rsp+3ACh] [rbp-24h]
char *nptr; // [rsp+3B0h] [rbp-20h]
unsigned int Flash_Config; // [rsp+3BCh] [rbp-14h]
delim = "=";
Flash_Config = -1;
memset(s, 0, 0x12uLL);
memset(s2, 255, 0x12uLL);
s2[17] = 0;
if ( a3 )
{
if ( (unsigned int)Get_CPU_Model(s2, 255LL, v3) == 6282 )
{
if ( (unsigned int)Pic_Send_Read_EEPROM(16, 0x12u, (__int64)s1) )
return 0xFFFFFFFFLL;
if ( !strncmp(s1, s2, 0x11uLL) || !strncmp(s1, s, 0x11uLL) )
{
Pic_Send_Write_EEPROM(16, 0x12u, (__int64)"00:00:00:00:05:09");
strcpy(s1, "00:00:00:00:05:09");
}
sprintf(v15, "MAC=%s", s1);
Flash_Config = 0;
}
else
{
Flash_Config = Get_Flash_Config(7340032LL, 0x16u, (__int64)v15);
}
}
else
{
v18 = 18;
v17 = "XXX";
nptr = 0LL;
memset(src, 0, sizeof(src));
v10 = 0;
v20 = 0;
if ( (unsigned int)Get_CPU_Model(&v10, 255LL, v11) == 6282 )
{
if ( !strncmp(a1, "eth0", 4uLL) )
{
if ( (unsigned int)Pic_Send_Read_EEPROM(16, 0x12u, (__int64)src) )
return 0xFFFFFFFFLL;
if ( !strncmp(src, s2, 0x11uLL) || !strncmp(src, s, 0x11uLL) )
{
Pic_Send_Write_EEPROM(16, 0x12u, (__int64)"00:00:00:00:05:09");
strcpy(src, "00:00:00:00:05:09");
}
}
else
{
if ( strncmp(a1, "eth1", 4uLL) )
return 0xFFFFFFFFLL;
if ( (unsigned int)Pic_Send_Read_EEPROM(36, 0x12u, (__int64)src) )
return 0xFFFFFFFFLL;
if ( !strcmp(src, s2) || !strcmp(src, s) )
{
Pic_Send_Write_EEPROM(36, 0x12u, (__int64)"00:00:00:00:05:09");
strcpy(src, "00:00:00:00:05:09");
}
}
strncpy(a2, src, (int)(v18 - 1));
Flash_Config = 0;
}
else
{
v5 = strlen(a1);
if ( v5 > strlen(v17) )
nptr = (char *)&a1[strlen(v17)];
if ( nptr )
v20 = atoi(nptr);
Flash_Config = Get_Flash_Config((int)(v18 * v20 + 7340960), v18, (__int64)src);
v6 = strlen(src);
if ( v6 == v18 - 1 )
strncpy(a2, src, (int)(v18 - 1));
else
Flash_Config = -1;
}
}
if ( !Flash_Config && a3 )
{
v16 = strtok(v15, delim);
if ( v16 && !strncmp(v16, "MAC", 3uLL) )
{
v7 = strtok(0LL, delim);
strncpy(s1, v7, 0x11uLL);
s1[17] = 0;
strcpy(a2, s1);
}
else
{
return (unsigned int)-1;
}
}
return Flash_Config;
}
// 1C938: variable 'v3' is possibly undefined
// A4C0: using guessed type __int64 __fastcall Get_CPU_Model(_QWORD, _QWORD, _QWORD);
//----- (000000000001CE02) ----------------------------------------------------
__int64 __fastcall Get_Sys_HWaddr(char *a1)
{
return iface_get_hwaddr("eth0", a1, 1);
}
//----- (000000000001CE28) ----------------------------------------------------
__int64 check_nas_config()
{
unsigned int Flash_Config; // [rsp+4h] [rbp-1Ch]
void *ptr; // [rsp+10h] [rbp-10h]
int i; // [rsp+1Ch] [rbp-4h]
ptr = calloc(0x101uLL, 1uLL);
if ( !ptr )
return 0xFFFFFFFFLL;
Flash_Config = Get_Flash_Config(7342080LL, 0x10u, (__int64)ptr);
for ( i = 0; i <= 15; ++i )
;
free(ptr);
return Flash_Config;
}
// 1CE28: using guessed type __int64 check_nas_config();
//----- (000000000001CEAC) ----------------------------------------------------
__int64 __fastcall iface_set_hwaddr(const char *a1, __int64 a2, __int64 a3)
{
size_t v4; // rbx
char s[260]; // [rsp+20h] [rbp-130h] BYREF
int v6; // [rsp+124h] [rbp-2Ch]
char *v7; // [rsp+128h] [rbp-28h]
int v8; // [rsp+130h] [rbp-20h]
int v9; // [rsp+134h] [rbp-1Ch]
char *nptr; // [rsp+138h] [rbp-18h]
v8 = -1;
if ( (_DWORD)a3 )
{
if ( (unsigned int)Get_CPU_Model(a1, a2, a3) == 6282 )
{
*(_BYTE *)(a2 + 17) = 0;
if ( (unsigned int)Pic_Send_Write_EEPROM(16, 0x12u, a2) )
return 0xFFFFFFFFLL;
v8 = 0;
}
else
{
check_nas_config();
memset(s, 0, 0x101uLL);
sprintf(s, "MAC=%s", (const char *)a2);
v8 = Set_Flash_Config(7340032LL, (__int64)s);
if ( v8 )
return 0xFFFFFFFFLL;
}
}
else
{
v7 = "XXX";
nptr = 0LL;
v9 = 0;
v6 = 18;
if ( (unsigned int)Get_CPU_Model(a1, a2, a3) == 6282 )
{
if ( !strncmp(a1, "eth0", 4uLL) )
{
if ( (unsigned int)Pic_Send_Write_EEPROM(16, 0x12u, a2) )
return 0xFFFFFFFFLL;
}
else
{
if ( strncmp(a1, "eth1", 4uLL) )
return 0xFFFFFFFFLL;
if ( (unsigned int)Pic_Send_Write_EEPROM(36, 0x12u, a2) )
return 0xFFFFFFFFLL;
}
v8 = 0;
}
else
{
check_nas_config();
v4 = strlen(a1);
if ( v4 > strlen(v7) )
nptr = (char *)&a1[strlen(v7)];
if ( nptr )
v9 = atoi(nptr);
v8 = Set_Flash_Config(v6 * v9 + 7340960, a2);
if ( v8 )
return 0xFFFFFFFFLL;
}
}
return (unsigned int)check_nas_config();
}
// A4C0: using guessed type __int64 __fastcall Get_CPU_Model(_QWORD, _QWORD, _QWORD);
// A550: using guessed type __int64 check_nas_config(void);
//----- (000000000001D126) ----------------------------------------------------
__int64 __fastcall Set_Sys_HWaddr(__int64 a1)
{
return iface_set_hwaddr("eth0", a1, 1LL);
}
//----- (000000000001D14C) ----------------------------------------------------
__int64 __fastcall Get_Sys_HWtype(_DWORD *a1)
{
int v1; // ebx
int v2; // eax
char s[260]; // [rsp+10h] [rbp-140h] BYREF
int v5; // [rsp+114h] [rbp-3Ch]
char *v6; // [rsp+118h] [rbp-38h]
char *nptr; // [rsp+120h] [rbp-30h]
char *s1; // [rsp+128h] [rbp-28h]
char *delim; // [rsp+130h] [rbp-20h]
unsigned int Flash_Config; // [rsp+13Ch] [rbp-14h]
delim = "=:";
Flash_Config = -1;
Flash_Config = Get_Flash_Config(7340064LL, 0xEu, (__int64)s);
if ( !Flash_Config )
{
s1 = strtok(s, delim);
if ( s1 && !strncmp(s1, "TYPE", 4uLL) )
{
nptr = strtok(0LL, delim);
v6 = strtok(0LL, delim);
v1 = atoi(nptr);
v2 = atoi(v6);
v5 = v1 + v2 - 9900;
if ( v1 + v2 == 9999 )
*a1 = 2;
else
*a1 = v5 == 55;
}
else
{
return (unsigned int)-1;
}
}
return Flash_Config;
}
//----- (000000000001D279) ----------------------------------------------------
__int64 __fastcall Set_Sys_HWtype(int a1)
{
char dest[272]; // [rsp+10h] [rbp-230h] BYREF
char s[264]; // [rsp+120h] [rbp-120h] BYREF
FILE *stream; // [rsp+228h] [rbp-18h]
void *ptr; // [rsp+230h] [rbp-10h]
unsigned int v6; // [rsp+238h] [rbp-8h]
unsigned int v7; // [rsp+23Ch] [rbp-4h]
v6 = -1;
v7 = 0;
ptr = Get_Random_Digit_String(4);
if ( !ptr )
return 0xFFFFFFFFLL;
free(ptr);
ptr = Get_Random_Digit_String(4);
if ( !ptr )
return 0xFFFFFFFFLL;
strncpy(dest, (const char *)ptr, 4uLL);
free(ptr);
ptr = 0LL;
dest[4] = 0;
if ( a1 == 1 )
{
v7 = 9955 - atoi(dest);
}
else if ( a1 == 2 )
{
v7 = 9999 - atoi(dest);
}
sprintf(s, "TYPE=%s:%d", dest, v7);
v6 = Set_Flash_Config(7340064LL, (__int64)s);
if ( !v6 )
{
stream = fopen64("/tmp/hw_type", "w");
if ( !stream )
return 0xFFFFFFFFLL;
if ( a1 == 1 )
{
fprintf(stream, "%s\n", "0055");
}
else if ( a1 == 2 )
{
fprintf(stream, "%s\n", "0099");
}
fclose(stream);
}
return v6;
}
//----- (000000000001D43A) ----------------------------------------------------
__int64 Create_HWtypeFile()
{
int v1; // [rsp+Ch] [rbp-14h] BYREF
FILE *stream; // [rsp+10h] [rbp-10h]
unsigned int Sys_HWtype; // [rsp+1Ch] [rbp-4h]
Sys_HWtype = -1;
v1 = 0;
Sys_HWtype = Get_Sys_HWtype(&v1);
if ( !Sys_HWtype )
{
stream = fopen64("/tmp/hw_type", "w");
if ( stream )
{
if ( v1 == 1 )
{
fprintf(stream, "%s\n", "0055");
}
else if ( v1 == 2 )
{
fprintf(stream, "%s\n", "0099");
}
else
{
fprintf(stream, "%s\n", "0000");
}
fclose(stream);
}
else
{
return (unsigned int)-1;
}
}
return Sys_HWtype;
}
// 1D43A: using guessed type __int64 Create_HWtypeFile();
//----- (000000000001D512) ----------------------------------------------------
__int64 __fastcall Get_Str_By_Offset(const char *a1, __off64_t a2, int a3, char *a4)
{
int v4; // eax
char buf[260]; // [rsp+20h] [rbp-110h] BYREF
int fd; // [rsp+124h] [rbp-Ch]
unsigned int nbytes; // [rsp+128h] [rbp-8h]
int nbytes_4; // [rsp+12Ch] [rbp-4h]
nbytes_4 = -1;
v4 = 257;
if ( a3 <= 257 )
v4 = a3;
nbytes = v4;
fd = open64(a1, 0);
if ( fd < 0 )
return 0xFFFFFFFFLL;
if ( a2 < 0 )
{
if ( lseek64(fd, a2, 2) == -1 )
goto LABEL_7;
}
else if ( lseek64(fd, a2, 0) == -1 )
{
LABEL_7:
close(fd);
return 0xFFFFFFFFLL;
}
if ( read(fd, buf, nbytes) == -1 )
{
close(fd);
return 0xFFFFFFFFLL;
}
else
{
close(fd);
buf[nbytes] = 0;
strcpy(a4, buf);
return 0LL;
}
}
// 1D512: using guessed type char buf[260];
//----- (000000000001D654) ----------------------------------------------------
__int64 __fastcall Remove_Last_Chars(const char *a1, int a2)
{
char s[1024]; // [rsp+10h] [rbp-820h] BYREF
char ptr[1024]; // [rsp+410h] [rbp-420h] BYREF
FILE *v5; // [rsp+810h] [rbp-20h]
FILE *stream; // [rsp+818h] [rbp-18h]
int v7; // [rsp+824h] [rbp-Ch]
int v8; // [rsp+828h] [rbp-8h]
int v9; // [rsp+82Ch] [rbp-4h]
v7 = 0;
stream = fopen64(a1, "rb+");
if ( !stream )
return 0xFFFFFFFFLL;
sprintf(s, "%s.tmp", a1);
v5 = fopen64(s, "wb");
if ( v5 )
{
fseek(stream, 0LL, 2);
v8 = ftell(stream);
rewind(stream);
for ( v8 -= a2; v8 > 0; v8 -= v9 )
{
v9 = 1024;
if ( v8 <= 1023 )
v9 = v8;
if ( !fread(ptr, 1uLL, v9, stream) && (feof(stream) || ferror(stream)) )
{
fclose(stream);
fclose(v5);
return 0xFFFFFFFFLL;
}
fwrite(ptr, 1uLL, v9, v5);
}
fclose(stream);
fclose(v5);
unlink(a1);
return (unsigned int)rename(s, a1);
}
else
{
fclose(stream);
return 0xFFFFFFFFLL;
}
}
//----- (000000000001D824) ----------------------------------------------------
__int64 __fastcall Get_QPKG_Encrypt_String(char *a1, char *a2)
{
char v3[2064]; // [rsp+10h] [rbp-9B0h] BYREF
struct stat64 stat_buf; // [rsp+820h] [rbp-1A0h] BYREF
char s[264]; // [rsp+8B0h] [rbp-110h] BYREF
__off_t v6; // [rsp+9B8h] [rbp-8h]
if ( sub_2D9F0(a1, &stat_buf) )
return 0xFFFFFFFFLL;
if ( (stat_buf.st_mode & 0xF000) != 0x8000 )
return 0xFFFFFFFFLL;
if ( !Is_QNAPFlag_Exist(a1, "QNAPQPKG") && !Is_QNAPFlag_Exist(a1, "QNAPQFIX") )
return 0xFFFFFFFFLL;
if ( (unsigned int)Get_QNAPFlag_File_Info(a1, v3) )
return 0xFFFFFFFFLL;
v6 = 3589 * stat_buf.st_size + 1000000000;
sprintf(s, "%llu", v6);
s[10] = 0;
strcpy(a2, s);
return 0LL;
}
// 1D824: using guessed type char var_9B0[2064];
//----- (000000000001D940) ----------------------------------------------------
__int64 __fastcall Get_QPKG_Auth_Encrypt_String(char *a1, char *a2)
{
char v3[2064]; // [rsp+10h] [rbp-9B0h] BYREF
struct stat64 stat_buf; // [rsp+820h] [rbp-1A0h] BYREF
char s[264]; // [rsp+8B0h] [rbp-110h] BYREF
__off_t v6; // [rsp+9B8h] [rbp-8h]
if ( sub_2D9F0(a1, &stat_buf) )
return 0xFFFFFFFFLL;
if ( (stat_buf.st_mode & 0xF000) != 0x8000 )
return 0xFFFFFFFFLL;
if ( !Is_QNAPFlag_Exist(a1, "QNAPQPKG") && !Is_QNAPFlag_Exist(a1, "QNAPQFIX") )
return 0xFFFFFFFFLL;
if ( (unsigned int)Get_QNAPFlag_File_Info(a1, v3) )
return 0xFFFFFFFFLL;
v6 = 9151 * stat_buf.st_size + 1000000000;
sprintf(s, "%llu", v6);
s[10] = 0;
strcpy(a2, s);
return 0LL;
}
// 1D940: using guessed type char var_9B0[2064];
//----- (000000000001DA5C) ----------------------------------------------------
_BOOL8 __fastcall Is_QNAPFlag_Exist(const char *a1, const char *a2)
{
char s2[268]; // [rsp+10h] [rbp-120h] BYREF
int Str_By_Offset; // [rsp+11Ch] [rbp-14h]
__int64 v5; // [rsp+120h] [rbp-10h]
int v6; // [rsp+12Ch] [rbp-4h]
if ( !a2 )
return 0LL;
v6 = strlen(a2);
v5 = -10LL;
Str_By_Offset = Get_Str_By_Offset(a1, -10LL, 10, s2);
return !Str_By_Offset && !strncmp(a2, s2, v6);
}
//----- (000000000001DAFC) ----------------------------------------------------
__int64 __fastcall Get_QNAPFlag_File_Info(const char *a1, char *a2)
{
char src[260]; // [rsp+10h] [rbp-110h] BYREF
unsigned int Str_By_Offset; // [rsp+114h] [rbp-Ch]
__int64 v5; // [rsp+118h] [rbp-8h]
v5 = -100LL;
Str_By_Offset = Get_Str_By_Offset(a1, -100LL, 10, src);
if ( Str_By_Offset )
return 0xFFFFFFFFLL;
strncpy(a2, src, 0x101uLL);
v5 = -10LL;
Str_By_Offset = Get_Str_By_Offset(a1, -10LL, 10, src);
if ( Str_By_Offset )
return 0xFFFFFFFFLL;
strncpy(a2 + 771, src, 0x101uLL);
v5 = -20LL;
Str_By_Offset = Get_Str_By_Offset(a1, -20LL, 10, src);
if ( Str_By_Offset )
return 0xFFFFFFFFLL;
strncpy(a2 + 514, src, 0x101uLL);
v5 = -40LL;
Str_By_Offset = Get_Str_By_Offset(a1, -40LL, 20, src);
if ( Str_By_Offset )
return 0xFFFFFFFFLL;
strncpy(a2 + 257, src, 0x101uLL);
v5 = -50LL;
Str_By_Offset = Get_Str_By_Offset(a1, -50LL, 10, src);
if ( Str_By_Offset )
return 0xFFFFFFFFLL;
strncpy(a2 + 1542, src, 0x101uLL);
v5 = -60LL;
Str_By_Offset = Get_Str_By_Offset(a1, -60LL, 10, src);
if ( Str_By_Offset )
return 0xFFFFFFFFLL;
strncpy(a2 + 1028, src, 0x101uLL);
v5 = -70LL;
Str_By_Offset = Get_Str_By_Offset(a1, -70LL, 10, src);
if ( Str_By_Offset )
return 0xFFFFFFFFLL;
strncpy(a2 + 1285, src, 0x101uLL);
v5 = -80LL;
Str_By_Offset = Get_Str_By_Offset(a1, -80LL, 10, src);
if ( Str_By_Offset )
return 0xFFFFFFFFLL;
strncpy(a2 + 1799, src, 0x101uLL);
return Str_By_Offset;
}
//----- (000000000001DE20) ----------------------------------------------------
__int64 __fastcall Is_QPKG_FW_Match(const char *a1)
{
size_t v2; // rax
char s1[272]; // [rsp+10h] [rbp-220h] BYREF
char s2[260]; // [rsp+120h] [rbp-110h] BYREF
int Str_By_Offset; // [rsp+224h] [rbp-Ch]
__int64 v6; // [rsp+228h] [rbp-8h]
if ( !Is_QNAPFlag_Exist(a1, "QNAPQPKG") && !Is_QNAPFlag_Exist(a1, "QNAPQFIX") )
return 0LL;
Get_Profile_String((__int64)"System", (__int64)"Version", "--", s1, 257);
if ( !strcasecmp(s1, "--") )
return 0xFFFFFFFFLL;
v6 = -50LL;
Str_By_Offset = Get_Str_By_Offset(a1, -50LL, 10, s2);
if ( Str_By_Offset )
return 0LL;
if ( !strncmp("HAL", s2, 3uLL) )
return 1LL;
v2 = strlen(s1);
Str_By_Offset = strncmp(s1, s2, v2);
return !Str_By_Offset || !strncmp(s2, " ", 0xAuLL);
}
//----- (000000000001DF82) ----------------------------------------------------
_BOOL8 __fastcall Is_QNAP_QPKG(const char *a1)
{
char s1[16]; // [rsp+10h] [rbp-120h] BYREF
char s2[260]; // [rsp+20h] [rbp-110h] BYREF
__int64 v5; // [rsp+128h] [rbp-8h]
if ( !Is_QNAPFlag_Exist(a1, "QNAPQPKG") && !Is_QNAPFlag_Exist(a1, "QNAPQFIX") )
return 0LL;
if ( (unsigned int)Get_QPKG_Encrypt_String(a1, s1) )
return 0LL;
v5 = -60LL;
return !(unsigned int)Get_Str_By_Offset(a1, -60LL, 10, s2) && strncmp(s1, s2, 0xAuLL) == 0;
}
// 9B60: using guessed type __int64 __fastcall Get_QPKG_Encrypt_String(_QWORD, _QWORD);
//----- (000000000001E065) ----------------------------------------------------
_BOOL8 __fastcall Is_QNAP_Auth_QPKG(const char *a1)
{
char s1[16]; // [rsp+10h] [rbp-120h] BYREF
char s2[260]; // [rsp+20h] [rbp-110h] BYREF
__int64 v5; // [rsp+128h] [rbp-8h]
if ( !Is_QNAPFlag_Exist(a1, "QNAPQPKG") && !Is_QNAPFlag_Exist(a1, "QNAPQFIX") )
return 0LL;
if ( (unsigned int)Get_QPKG_Auth_Encrypt_String(a1, s1) )
return 0LL;
v5 = -70LL;
return !(unsigned int)Get_Str_By_Offset(a1, -70LL, 10, s2) && strncmp(s1, s2, 0xAuLL) == 0;
}
// 9FE0: using guessed type __int64 __fastcall Get_QPKG_Auth_Encrypt_String(_QWORD, _QWORD);
//----- (000000000001E148) ----------------------------------------------------
__int64 __fastcall Set_QPKG_Encrypt(const char *a1)
{
char v2[16]; // [rsp+10h] [rbp-20h] BYREF
FILE *stream; // [rsp+20h] [rbp-10h]
int i; // [rsp+2Ch] [rbp-4h]
if ( (unsigned int)Get_QPKG_Encrypt_String(a1, v2) )
return 0xFFFFFFFFLL;
stream = fopen64(a1, "rb+");
if ( !stream )
return 0xFFFFFFFFLL;
fseek(stream, -60LL, 2);
for ( i = 0; i <= 9; ++i )
fputc(v2[i], stream);
fclose(stream);
return 0LL;
}
// 9B60: using guessed type __int64 __fastcall Get_QPKG_Encrypt_String(_QWORD, _QWORD);
// 1E148: using guessed type char var_20[16];
//----- (000000000001E1F0) ----------------------------------------------------
__int64 __fastcall Set_QPKG_Auth_Encrypt(const char *a1)
{
char v2[16]; // [rsp+10h] [rbp-20h] BYREF
FILE *stream; // [rsp+20h] [rbp-10h]
int i; // [rsp+2Ch] [rbp-4h]
if ( (unsigned int)Get_QPKG_Auth_Encrypt_String(a1, v2) )
return 0xFFFFFFFFLL;
stream = fopen64(a1, "rb+");
if ( !stream )
return 0xFFFFFFFFLL;
fseek(stream, -70LL, 2);
for ( i = 0; i <= 9; ++i )
fputc(v2[i], stream);
fclose(stream);
return 0LL;
}
// 9FE0: using guessed type __int64 __fastcall Get_QPKG_Auth_Encrypt_String(_QWORD, _QWORD);
// 1E1F0: using guessed type char var_20[16];
//----- (000000000001E298) ----------------------------------------------------
__int64 __fastcall Set_QPKG_FW_Version(const char *a1)
{
size_t v2; // rbx
char s1[272]; // [rsp+10h] [rbp-130h] BYREF
FILE *stream; // [rsp+120h] [rbp-20h]
int i; // [rsp+12Ch] [rbp-14h]
Get_Profile_String((__int64)"System", (__int64)"Version", "--", s1, 257);
if ( !strcasecmp(s1, "--") )
return 0xFFFFFFFFLL;
stream = fopen64(a1, "rb+");
if ( !stream )
return 0xFFFFFFFFLL;
if ( fseek(stream, -50LL, 2) == -1 )
{
fclose(stream);
return 0xFFFFFFFFLL;
}
else
{
if ( strlen(s1) > 9 )
{
for ( i = 0; i <= 9; ++i )
fputc(s1[i], stream);
}
else
{
for ( i = 0; ; ++i )
{
v2 = i;
if ( v2 >= strlen(s1) )
break;
fputc(s1[i], stream);
}
}
fclose(stream);
return 0LL;
}
}
// 1E298: using guessed type char s1[272];
//----- (000000000001E3FF) ----------------------------------------------------
__int64 __fastcall Set_QPKG_Flag(const char *a1, int a2, const char *a3)
{
FILE *stream; // [rsp+20h] [rbp-20h]
int i; // [rsp+2Ch] [rbp-14h]
if ( a2 > 0 )
return 0xFFFFFFFFLL;
stream = fopen64(a1, "rb+");
if ( !stream )
return 0xFFFFFFFFLL;
if ( fseek(stream, 10 * a2, 2) == -1 )
{
fclose(stream);
return 0xFFFFFFFFLL;
}
else
{
for ( i = 0; i <= 9; ++i )
{
if ( a3[i] && i < strlen(a3) )
fputc(a3[i], stream);
else
fputc(0, stream);
}
fclose(stream);
return 0LL;
}
}
//----- (000000000001E509) ----------------------------------------------------
__int64 __fastcall Get_One_QFIX_Info(const char *a1, __int64 a2)
{
char *v3; // [rsp+18h] [rbp-18h]
int v4; // [rsp+24h] [rbp-Ch]
int i; // [rsp+28h] [rbp-8h]
unsigned int One_QPKG_Info_Dir; // [rsp+2Ch] [rbp-4h]
One_QPKG_Info_Dir = -1;
v4 = 0;
v3 = Conf_Dir_Load("/etc/config/qfix.conf");
if ( !v3 )
return 0xFFFFFFFFLL;
for ( i = 0; *((_DWORD *)v3 + 258) > i; ++i )
{
if ( !strcasecmp(a1, *(const char **)(8LL * i + *((_QWORD *)v3 + 131))) )
{
v4 = 1;
break;
}
}
if ( v4 )
One_QPKG_Info_Dir = Get_One_QPKG_Info_Dir(v3, a1, a2);
Conf_Dir_Free((__int64)v3);
return One_QPKG_Info_Dir;
}
// A520: using guessed type __int64 __fastcall Get_One_QPKG_Info_Dir(_QWORD, _QWORD, _QWORD);
//----- (000000000001E5D1) ----------------------------------------------------
__int64 __fastcall Get_All_QFIX_Info(void **a1)
{
struct stat64 stat_buf; // [rsp+10h] [rbp-2CC0h] BYREF
char src[11272]; // [rsp+A0h] [rbp-2C30h] BYREF
char *v4; // [rsp+2CA8h] [rbp-28h]
char *v5; // [rsp+2CB0h] [rbp-20h]
int One_QPKG_Info_Dir; // [rsp+2CBCh] [rbp-14h]
int i; // [rsp+2CC0h] [rbp-10h]
unsigned int v8; // [rsp+2CC4h] [rbp-Ch]
void *ptr; // [rsp+2CC8h] [rbp-8h]
ptr = 0LL;
One_QPKG_Info_Dir = -1;
v8 = 0;
v5 = 0LL;
if ( sub_2D9F0("/etc/config/qfix.conf", &stat_buf) )
return 0xFFFFFFFFLL;
v4 = Conf_Dir_Load("/etc/config/qfix.conf");
if ( !v4 )
return 0LL;
for ( i = 0; ; ++i )
{
if ( *((_DWORD *)v4 + 258) <= i )
{
Conf_Dir_Free((__int64)v4);
*a1 = ptr;
return v8;
}
One_QPKG_Info_Dir = Get_One_QPKG_Info_Dir(v4, *(_QWORD *)(8LL * i + *((_QWORD *)v4 + 131)), src);
if ( One_QPKG_Info_Dir >= 0 )
break;
LABEL_14:
;
}
v5 = (char *)realloc(ptr, 11268LL * (int)(v8 + 1));
if ( v5 )
{
ptr = v5;
memcpy(&v5[11268 * v8++], src, 0x2C04uLL);
goto LABEL_14;
}
if ( ptr )
free(ptr);
if ( v4 )
Conf_Dir_Free((__int64)v4);
return 4294967286LL;
}
// A520: using guessed type __int64 __fastcall Get_One_QPKG_Info_Dir(_QWORD, _QWORD, _QWORD);
//----- (000000000001E756) ----------------------------------------------------
__int64 __fastcall Get_One_QPKG_Info(const char *a1, __int64 a2)
{
char *v3; // [rsp+18h] [rbp-18h]
int v4; // [rsp+24h] [rbp-Ch]
int i; // [rsp+28h] [rbp-8h]
unsigned int One_QPKG_Info_Dir; // [rsp+2Ch] [rbp-4h]
One_QPKG_Info_Dir = -1;
v4 = 0;
v3 = Conf_Dir_Load("/etc/config/qpkg.conf");
if ( !v3 )
return 0xFFFFFFFFLL;
for ( i = 0; *((_DWORD *)v3 + 258) > i; ++i )
{
if ( !strcasecmp(a1, *(const char **)(8LL * i + *((_QWORD *)v3 + 131))) )
{
v4 = 1;
break;
}
}
if ( v4 )
One_QPKG_Info_Dir = Get_One_QPKG_Info_Dir(v3, a1, a2);
Conf_Dir_Free((__int64)v3);
return One_QPKG_Info_Dir;
}
// A520: using guessed type __int64 __fastcall Get_One_QPKG_Info_Dir(_QWORD, _QWORD, _QWORD);
//----- (000000000001E81E) ----------------------------------------------------
__int64 __fastcall Get_One_QPKG_Info_Dir(__int64 a1, const char *a2, __int64 a3)
{
unsigned int v3; // edx
char nptr[8]; // [rsp+20h] [rbp-A60h] BYREF
__int64 v7; // [rsp+28h] [rbp-A58h]
__int64 v8; // [rsp+30h] [rbp-A50h]
__int64 v9; // [rsp+38h] [rbp-A48h]
char v10[2568]; // [rsp+40h] [rbp-A40h] BYREF
__int16 v11; // [rsp+A48h] [rbp-38h]
char v12; // [rsp+A4Ah] [rbp-36h]
int v13; // [rsp+A58h] [rbp-28h]
int v14; // [rsp+A5Ch] [rbp-24h]
char *delim; // [rsp+A60h] [rbp-20h]
int v16; // [rsp+A68h] [rbp-18h]
int QPKGDisplayNameIndex; // [rsp+A6Ch] [rbp-14h]
char *src; // [rsp+A70h] [rbp-10h]
int v19; // [rsp+A7Ch] [rbp-4h]
QPKGDisplayNameIndex = -1;
v19 = 0;
v16 = 0;
memset(v10, 0, sizeof(v10));
v11 = 0;
v12 = 0;
delim = ":";
src = 0LL;
*(_DWORD *)(a3 + 10988) = 0;
if ( !Conf_Dir_Get_Str(a1, a2, "Name", 0LL, (char *)a3, 257) )
{
*(_DWORD *)(a3 + 10988) = 1;
snprintf((char *)a3, 0x101uLL, "%s", a2);
}
if ( strcasecmp(a2, (const char *)a3) )
{
*(_DWORD *)(a3 + 10988) = 1;
snprintf((char *)a3, 0x101uLL, "%s", a2);
}
if ( !Conf_Dir_Get_Str(a1, a2, "Display_Name", 0LL, (char *)(a3 + 257), 257) )
{
QPKGDisplayNameIndex = getQPKGDisplayNameIndex((const char *)a3);
if ( QPKGDisplayNameIndex < 0 )
snprintf((char *)(a3 + 257), 0x101uLL, "%s", (const char *)a3);
else
snprintf((char *)(a3 + 257), 0x101uLL, "%s", qpkg_display_name[2 * QPKGDisplayNameIndex + 1]);
}
Conf_Dir_Get_Str(a1, a2, "Version", "null", (char *)(a3 + 514), 257);
Conf_Dir_Get_Str(a1, a2, "Enable", "null", (char *)(a3 + 771), 257);
Conf_Dir_Get_Str(a1, a2, "Date", "null", (char *)(a3 + 1032), 257);
Conf_Dir_Get_Str(a1, a2, "Shell", "null", (char *)(a3 + 1289), 257);
Conf_Dir_Get_Str(a1, a2, "Install_Path", "null", (char *)(a3 + 1546), 514);
Conf_Dir_Get_Str(a1, a2, "Config_Path", "null", (char *)(a3 + 2060), 514);
Conf_Dir_Get_Str(a1, a2, "WebUI", "null", (char *)(a3 + 2574), 514);
Conf_Dir_Get_Str(a1, a2, "Proxy_Path", "null", (char *)(a3 + 6268), 514);
Conf_Dir_Get_Str(a1, a2, "QPKG_File", "null", (char *)(a3 + 3602), 257);
Conf_Dir_Get_Str(a1, a2, "Provider", "null", (char *)(a3 + 3088), 257);
Conf_Dir_Get_Str(a1, a2, "Author", "null", (char *)(a3 + 3345), 257);
Conf_Dir_Get_Str(a1, a2, "Pid_File", "null", (char *)(a3 + 3868), 514);
Conf_Dir_Get_Str(a1, a2, "Class", "null", (char *)(a3 + 4382), 257);
Conf_Dir_Get_Str(a1, a2, "store", "null", (char *)(a3 + 4639), 257);
Conf_Dir_Get_Str(a1, a2, "Status", "null", (char *)(a3 + 4896), 257);
Conf_Dir_Get_Str(a1, a2, "User_Data_Path", "null", (char *)(a3 + 5180), 257);
Conf_Dir_Get_Str(a1, a2, "Open_In", "null", (char *)(a3 + 5437), 257);
Conf_Dir_Get_Str(a1, a2, "Add_On", "null", (char *)(a3 + 5694), 257);
Conf_Dir_Get_Int(a1, a2, "Installed", 1u, (unsigned int *)(a3 + 1028));
Conf_Dir_Get_Int(a1, a2, "Web_Port", 0, (unsigned int *)(a3 + 3860));
Conf_Dir_Get_Int(a1, a2, "Web_SSL_Port", 0xFFFFFFFE, (unsigned int *)v16);
Conf_Dir_Get_Int(a1, a2, "Service_Port", 0, (unsigned int *)(a3 + 3864));
Conf_Dir_Get_Int(a1, a2, "Sys_App", 0, (unsigned int *)(a3 + 5164));
if ( *(_DWORD *)(a3 + 5164) == 1 )
v3 = 2;
else
v3 = 1;
Conf_Dir_Get_Int(a1, a2, "Visible", v3, (unsigned int *)(a3 + 5156));
Conf_Dir_Get_Int(a1, a2, "Force_Visible", 3u, (unsigned int *)(a3 + 5160));
Conf_Dir_Get_Int(a1, a2, "Volume_Select", 0, (unsigned int *)(a3 + 6264));
Conf_Dir_Get_Int(a1, a2, "App_Route", 0, (unsigned int *)(a3 + 6784));
Conf_Dir_Get_Str(a1, a2, "App_Route_Rule", (const char *)&unk_2EA9D, (char *)(a3 + 6788), 514);
Conf_Dir_Get_Int(a1, a2, "Desktop", 0, (unsigned int *)(a3 + 5168));
Conf_Dir_Get_Int(a1, a2, "Sys_Prohibit", 0, (unsigned int *)(a3 + 10996));
Conf_Dir_Get_Int(a1, a2, "Sys_Prohibit", 0, (unsigned int *)(a3 + 10996));
Conf_Dir_Get_Int(a1, a2, "Use_Proxy", 0, (unsigned int *)(a3 + 11000));
Conf_Dir_Get_Str(a1, a2, "Mig_Status", (const char *)&unk_2EA9D, (char *)(a3 + 7302), 32);
Conf_Dir_Get_Str(a1, a2, "Timeout", (const char *)&unk_2EA9D, (char *)(a3 + 10938), 18);
Conf_Dir_Get_Str(a1, a2, "Operating_Status", (const char *)&unk_2EA9D, (char *)(a3 + 10956), 32);
Conf_Dir_Get_Int(a1, a2, "Official", 1u, (unsigned int *)(a3 + 10992));
Conf_Dir_Get_Int(a1, a2, "Need_Configure", 0, (unsigned int *)(a3 + 11264));
if ( *(int *)(a3 + 5168) <= 0 )
{
*(_DWORD *)(a3 + 5172) = 0;
*(_DWORD *)(a3 + 5176) = 0;
}
else
{
Conf_Dir_Get_Int(a1, a2, "Win_Width", 0, (unsigned int *)(a3 + 5172));
Conf_Dir_Get_Int(a1, a2, "Win_Height", 0, (unsigned int *)(a3 + 5176));
Conf_Dir_Get_Int(a1, a2, "Win_Max_Width", 0, (unsigned int *)(a3 + 6248));
Conf_Dir_Get_Int(a1, a2, "Win_Max_Height", 0, (unsigned int *)(a3 + 6252));
Conf_Dir_Get_Int(a1, a2, "Win_Min_Width", 0, (unsigned int *)(a3 + 6256));
Conf_Dir_Get_Int(a1, a2, "Win_Min_Height", 0, (unsigned int *)(a3 + 6260));
}
*(_DWORD *)(a3 + 5952) = (*(int *)(a3 + 3860) >= -1 || v16 >= -1)
&& *(_BYTE *)(a3 + 2574) == asc_2EE09[0]
&& Conf_Dir_Get_Int(a1, a2, "Login_Screen", 0, 0LL) == 1;
Conf_Dir_Get_Str(a1, a2, "Build", "null", (char *)(a3 + 5956), 32);
Conf_Dir_Get_Str(a1, a2, "Alt_Shell", "null", (char *)(a3 + 5988), 257);
Conf_Dir_Get_Str(a1, a2, "Task_Info", (const char *)&unk_2EA9D, (char *)(a3 + 7334), 514);
Conf_Dir_Get_Str(a1, a2, "FW_Ver_Min", "null", (char *)(a3 + 7848), 257);
Conf_Dir_Get_Str(a1, a2, "FW_Ver_Max", "null", (char *)(a3 + 8105), 257);
Conf_Dir_Get_Str(a1, a2, "Dependency", (const char *)&unk_2EA9D, v10, 2571);
src = strtok(v10, delim);
while ( src )
{
if ( *src )
{
strncpy((char *)(257LL * v19++ + 8368 + a3), src, 0x100uLL);
src = strtok(0LL, delim);
}
}
*(_DWORD *)(a3 + 8364) = v19;
if ( !strcmp((const char *)(a3 + 3602), "null") || !*(_BYTE *)(a3 + 3602) )
{
if ( !*(_DWORD *)(a3 + 10988) )
{
*(_DWORD *)(a3 + 10988) = 1;
if ( (!strcmp((const char *)(a3 + 4896), "queue")
|| !strcmp((const char *)(a3 + 4896), "download")
|| !strcmp((const char *)(a3 + 4896), "install")
|| !strcmp((const char *)(a3 + 4896), "fail")
|| !strcmp((const char *)(a3 + 4896), "cancel"))
&& !strcmp((const char *)(a3 + 1289), "null")
&& !strcmp((const char *)(a3 + 5988), "null") )
{
*(_DWORD *)(a3 + 10988) = 0;
}
}
if ( *(_DWORD *)(a3 + 10988) == 1 )
{
*(_QWORD *)nptr = 0LL;
v7 = 0LL;
v8 = 0LL;
v9 = 0LL;
v14 = -1;
v13 = -1;
GetPrivateProfileString((__int64)a2, (__int64)"stcode", "-1", nptr, 32, (__int64)"/etc/config/qpkg_job.conf");
v13 = atoi(nptr);
GetPrivateProfileString((__int64)a2, (__int64)"opcode", "-1", nptr, 32, (__int64)"/etc/config/qpkg_job.conf");
v14 = atoi(nptr);
if ( v14 == 1 && v13 == 4 )
*(_DWORD *)(a3 + 10988) = 0;
}
}
Conf_Dir_Get_Str(a1, a2, "Role_Delegation", "null", (char *)(a3 + 11004), 257);
return 0LL;
}
// 235340: using guessed type char *qpkg_display_name[12];
//----- (000000000001F8BD) ----------------------------------------------------
__int64 __fastcall sub_1F8BD(__int64 a1)
{
char **v2; // rbx
char **v3; // rbx
unsigned int v4; // eax
char **v5; // rbx
char **v6; // rbx
char s[8]; // [rsp+10h] [rbp-130h] BYREF
char v8[248]; // [rsp+18h] [rbp-128h] BYREF
unsigned int v9; // [rsp+11Ch] [rbp-24h]
int j; // [rsp+120h] [rbp-20h]
int v11; // [rsp+124h] [rbp-1Ch]
_BOOL4 v12; // [rsp+128h] [rbp-18h]
unsigned int i; // [rsp+12Ch] [rbp-14h]
i = 0;
v9 = 0;
*(_QWORD *)s = 0LL;
memset(v8, 0, sizeof(v8));
if ( !a1 )
return 0LL;
for ( i = 0; *(_DWORD *)(a1 + 1032) > (signed int)i; ++i )
{
v11 = 0;
s[0] = 0;
v12 = **(_BYTE **)(8LL * (int)i + *(_QWORD *)(a1 + 1048)) == 0;
if ( Conf_Dir_Get_Str(a1, *(const char **)(8LL * (int)i + *(_QWORD *)(a1 + 1048)), "Name", 0LL, s, 256) )
{
if ( !s[0] )
v11 = 1;
}
else
{
v11 = 1;
}
if ( v12 && !v11 )
{
Conf_Dir_Set_Str(a1, *(const char **)(8LL * (int)i + *(_QWORD *)(a1 + 1048)), "Name", (const char *)&unk_2EA9D);
for ( j = 0; *(_DWORD *)(a1 + 1028) > j; ++j )
{
if ( *(_QWORD *)(8LL * j + *(_QWORD *)(a1 + 1056))
&& !strcasecmp(
*(const char **)(8LL * j + *(_QWORD *)(a1 + 1056)),
*(const char **)(8LL * (int)i + *(_QWORD *)(a1 + 1048))) )
{
free(*(void **)(8LL * j + *(_QWORD *)(a1 + 1056)));
v2 = (char **)(*(_QWORD *)(a1 + 1056) + 8LL * j);
*v2 = strdup(s);
}
}
free(*(void **)(8LL * (int)i + *(_QWORD *)(a1 + 1048)));
v3 = (char **)(*(_QWORD *)(a1 + 1048) + 8LL * (int)i);
*v3 = strdup(s);
v9 = 1;
}
if ( v12 && v11 )
{
v4 = getpid();
snprintf(s, 0x100uLL, "%d%d", v4, i);
for ( j = 0; *(_DWORD *)(a1 + 1028) > j; ++j )
{
if ( *(_QWORD *)(8LL * j + *(_QWORD *)(a1 + 1056)) )
{
if ( !strcasecmp(
*(const char **)(8LL * j + *(_QWORD *)(a1 + 1056)),
*(const char **)(8LL * (int)i + *(_QWORD *)(a1 + 1048))) )
{
free(*(void **)(8LL * j + *(_QWORD *)(a1 + 1056)));
v5 = (char **)(*(_QWORD *)(a1 + 1056) + 8LL * j);
*v5 = strdup(s);
}
}
}
free(*(void **)(8LL * (int)i + *(_QWORD *)(a1 + 1048)));
v6 = (char **)(*(_QWORD *)(a1 + 1048) + 8LL * (int)i);
*v6 = strdup(s);
v9 = 1;
}
}
return v9;
}
//----- (000000000001FD18) ----------------------------------------------------
__int64 __fastcall Get_All_QPKG_Info(void **a1)
{
struct stat64 stat_buf; // [rsp+10h] [rbp-2CC0h] BYREF
char src[11272]; // [rsp+A0h] [rbp-2C30h] BYREF
char *v4; // [rsp+2CA8h] [rbp-28h]
int One_QPKG_Info_Dir; // [rsp+2CB4h] [rbp-1Ch]
char *v6; // [rsp+2CB8h] [rbp-18h]
int i; // [rsp+2CC0h] [rbp-10h]
unsigned int v8; // [rsp+2CC4h] [rbp-Ch]
void *ptr; // [rsp+2CC8h] [rbp-8h]
ptr = 0LL;
One_QPKG_Info_Dir = -1;
v8 = 0;
v4 = 0LL;
if ( sub_2D9F0("/etc/config/qpkg.conf", &stat_buf) )
return 0xFFFFFFFFLL;
v6 = Conf_Dir_Load("/etc/config/qpkg.conf");
if ( !v6 )
return 0LL;
if ( (unsigned int)sub_1F8BD((__int64)v6) )
{
Conf_Dir_Wirte_File(v6);
Conf_Dir_Free((__int64)v6);
v6 = Conf_Dir_Load("/etc/config/qpkg.conf");
if ( !v6 )
return 0LL;
}
for ( i = 0; ; ++i )
{
if ( *((_DWORD *)v6 + 258) <= i )
{
Conf_Dir_Free((__int64)v6);
*a1 = ptr;
return v8;
}
One_QPKG_Info_Dir = Get_One_QPKG_Info_Dir(v6, *(_QWORD *)(8LL * i + *((_QWORD *)v6 + 131)), src);
if ( One_QPKG_Info_Dir >= 0 )
break;
LABEL_17:
;
}
v4 = (char *)realloc(ptr, 11268LL * (int)(v8 + 1));
if ( v4 )
{
ptr = v4;
memcpy(&v4[11268 * v8++], src, 0x2C04uLL);
goto LABEL_17;
}
if ( ptr )
free(ptr);
if ( v6 )
Conf_Dir_Free((__int64)v6);
return 4294967286LL;
}
// A520: using guessed type __int64 __fastcall Get_One_QPKG_Info_Dir(_QWORD, _QWORD, _QWORD);
// A5B0: using guessed type __int64 __fastcall Conf_Dir_Wirte_File(_QWORD);
//----- (000000000001FEE6) ----------------------------------------------------
_BOOL8 __fastcall Is_QPKG_Installed(__int64 a1)
{
char s1[272]; // [rsp+10h] [rbp-110h] BYREF
GetPrivateProfileString(a1, (__int64)"Name", "null", s1, 257, (__int64)"/etc/config/qpkg.conf");
return s1[0] && strcmp(s1, "null");
}
//----- (000000000001FF62) ----------------------------------------------------
_BOOL8 __fastcall Is_SYS_QPKG_Removed(const char *a1)
{
struct stat64 stat_buf; // [rsp+10h] [rbp-1A0h] BYREF
char s[272]; // [rsp+A0h] [rbp-110h] BYREF
sprintf(s, "%s/.%s_removed", "/mnt/HDA_ROOT/update_pkg", a1);
return !sub_2D9E0(s, &stat_buf) && !Is_QPKG_Installed((__int64)a1);
}
//----- (000000000001FFDE) ----------------------------------------------------
__int64 __fastcall Set_QPKG_Disable_by_Default(const char *a1)
{
char s[264]; // [rsp+10h] [rbp-110h] BYREF
FILE *stream; // [rsp+118h] [rbp-8h]
sprintf(s, "%s/.%s_disabled", "/mnt/HDA_ROOT/update_pkg", a1);
stream = fopen64(s, "w");
if ( !stream )
return 0xFFFFFFFFLL;
fclose(stream);
return 0LL;
}
//----- (0000000000020057) ----------------------------------------------------
__int64 __fastcall Unset_QPKG_Disable_by_Default(const char *a1)
{
struct stat64 stat_buf; // [rsp+10h] [rbp-1A0h] BYREF
char s[272]; // [rsp+A0h] [rbp-110h] BYREF
sprintf(s, "%s/.%s_disabled", "/mnt/HDA_ROOT/update_pkg", a1);
if ( !sub_2D9E0(s, &stat_buf) )
unlink(s);
return 0LL;
}
//----- (00000000000200C8) ----------------------------------------------------
__int64 Get_EEPROM_Hwaddr()
{
return 0xFFFFFFFFLL;
}
// 200C8: using guessed type __int64 Get_EEPROM_Hwaddr();
//----- (00000000000200E3) ----------------------------------------------------
__int64 __fastcall Get_Eth_Magic_Num(const char *a1, int *a2)
{
char buf[32]; // [rsp+10h] [rbp-230h] BYREF
char s[512]; // [rsp+30h] [rbp-210h] BYREF
int v5; // [rsp+230h] [rbp-10h]
int v6; // [rsp+234h] [rbp-Ch]
int v7; // [rsp+238h] [rbp-8h]
int fd; // [rsp+23Ch] [rbp-4h]
snprintf(s, 0x200uLL, "/sys/class/net/%s/device/vendor", a1);
fd = open64(s, 0);
if ( fd < 0 )
return 0xFFFFFFFFLL;
v7 = read(fd, buf, 0x20uLL);
if ( v7 <= 0 )
goto LABEL_4;
close(fd);
v6 = strtol(buf, 0LL, 0);
snprintf(s, 0x200uLL, "/sys/class/net/%s/device/device", a1);
fd = open64(s, 0);
if ( fd < 0 )
return 0xFFFFFFFFLL;
v7 = read(fd, buf, 0x20uLL);
if ( v7 <= 0 )
{
LABEL_4:
close(fd);
return 0xFFFFFFFFLL;
}
close(fd);
v5 = strtol(buf, 0LL, 0);
*a2 = v6 | (v5 << 16);
return 0LL;
}
//----- (0000000000020281) ----------------------------------------------------
__int64 Set_EEPROM_Hwaddr()
{
return 0xFFFFFFFFLL;
}
// 20281: using guessed type __int64 Set_EEPROM_Hwaddr();
//----- (0000000000020299) ----------------------------------------------------
__int64 Reset_EEPROM_To_Default()
{
return 0xFFFFFFFFLL;
}
// 20299: using guessed type __int64 Reset_EEPROM_To_Default();
//----- (00000000000202AD) ----------------------------------------------------
_BOOL8 __fastcall sub_202AD(_BYTE *a1)
{
int s2; // [rsp+10h] [rbp-10h] BYREF
__int16 v3; // [rsp+14h] [rbp-Ch]
s2 = 0;
v3 = 0;
return (*a1 & 1) == 0 && memcmp(a1, &s2, 6uLL);
}
//----- (0000000000020301) ----------------------------------------------------
__int64 Is_Needed_Reset_EEPRM()
{
return 0LL;
}
// 20301: using guessed type __int64 Is_Needed_Reset_EEPRM();
//----- (0000000000020315) ----------------------------------------------------
__int64 __fastcall Get_Firmware_MD5_Checksum(char *a1, int a2)
{
char s[264]; // [rsp+10h] [rbp-120h] BYREF
char *s1; // [rsp+118h] [rbp-18h]
char *delim; // [rsp+120h] [rbp-10h]
unsigned int Flash_Config; // [rsp+12Ch] [rbp-4h]
delim = "=";
s1 = 0LL;
Flash_Config = -1;
Flash_Config = Get_Flash_Config(7341088LL, 0x24u, (__int64)s);
s[36] = 0;
if ( !Flash_Config )
{
Flash_Config = -1;
s1 = strtok(s, delim);
if ( s1 )
{
if ( !strncmp(s1, "MD5", 3uLL) )
{
s1 = strtok(0LL, delim);
if ( a2 > 31 )
{
strncpy(a1, s1, 0x20uLL);
return 0;
}
}
}
}
return Flash_Config;
}
//----- (00000000000203FD) ----------------------------------------------------
__int64 __fastcall Set_Firmware_MD5_Checksum(const char *a1)
{
char s[268]; // [rsp+10h] [rbp-110h] BYREF
unsigned int v3; // [rsp+11Ch] [rbp-4h]
v3 = -1;
sprintf(s, "MD5=%s", a1);
if ( strlen(s) == 36 )
return (unsigned int)Set_Flash_Config(7341088LL, (__int64)s);
return v3;
}
//----- (0000000000020469) ----------------------------------------------------
__int64 __fastcall Get_Firmware_Checksum(char *a1, int a2)
{
char s[264]; // [rsp+10h] [rbp-120h] BYREF
char *s1; // [rsp+118h] [rbp-18h]
char *delim; // [rsp+120h] [rbp-10h]
unsigned int Flash_Config; // [rsp+12Ch] [rbp-4h]
delim = "=";
s1 = 0LL;
Flash_Config = -1;
Flash_Config = Get_Flash_Config(7341088LL, 0x40u, (__int64)s);
s[64] = 0;
if ( !Flash_Config )
{
Flash_Config = -1;
s1 = strtok(s, delim);
if ( s1 )
{
if ( !strncmp(s1, "CKSUM", 5uLL) )
{
s1 = strtok(0LL, delim);
if ( a2 > 57 )
{
strncpy(a1, s1, 0x3AuLL);
return 0;
}
}
}
}
return Flash_Config;
}
//----- (0000000000020551) ----------------------------------------------------
__int64 __fastcall Set_Firmware_Checksum(const char *a1)
{
char s[268]; // [rsp+10h] [rbp-110h] BYREF
unsigned int v3; // [rsp+11Ch] [rbp-4h]
v3 = -1;
sprintf(s, "CKSUM=%s=", a1);
if ( strlen(s) <= 0x3F )
return (unsigned int)Set_Flash_Config(7341088LL, (__int64)s);
return v3;
}
//----- (00000000000205BD) ----------------------------------------------------
_BOOL8 __fastcall IS_IPv4_Address(const char *a1)
{
char dest[128]; // [rsp+10h] [rbp-90h] BYREF
char buf[12]; // [rsp+90h] [rbp-10h] BYREF
memset(dest, 0, sizeof(dest));
strncpy(dest, a1, 0x7FuLL);
return inet_pton(2, dest, buf) > 0;
}
// 205BD: using guessed type char buf[12];
//----- (0000000000020633) ----------------------------------------------------
_BOOL8 __fastcall IS_IPv6_Address(const char *a1)
{
char buf[28]; // [rsp+10h] [rbp-20h] BYREF
return a1 && inet_pton(10, a1, buf) > 0;
}
// 20633: using guessed type char buf[28];
//----- (0000000000020679) ----------------------------------------------------
__int64 sub_20679()
{
char s[272]; // [rsp+0h] [rbp-120h] BYREF
FILE *stream; // [rsp+110h] [rbp-10h]
__int64 v3; // [rsp+118h] [rbp-8h]
v3 = 0LL;
stream = fopen64("/tmp/ms_external_ip.time", "r");
if ( stream )
{
memset(s, 0, 0x101uLL);
fgets(s, 257, stream);
v3 = atol(s);
fclose(stream);
}
return v3;
}
//----- (0000000000020700) ----------------------------------------------------
__int64 __fastcall sub_20700(__int64 a1)
{
char s[264]; // [rsp+10h] [rbp-110h] BYREF
FILE *stream; // [rsp+118h] [rbp-8h]
stream = fopen64("/tmp/ms_external_ip.time", "w");
if ( !stream )
return 0xFFFFFFFFLL;
sprintf(s, "%ld", a1);
fputs(s, stream);
fclose(stream);
return 0LL;
}
//----- (0000000000020782) ----------------------------------------------------
__int64 __fastcall sub_20782(char *a1, int a2)
{
int v3; // [rsp+1Ch] [rbp-14h]
FILE *stream; // [rsp+20h] [rbp-10h]
stream = fopen64("/tmp/ms_external_ip", "r");
if ( !stream )
return 0xFFFFFFFFLL;
if ( fgets(a1, a2, stream) )
{
v3 = strlen(a1) - 1;
if ( v3 > 0 && (a1[v3] == 10 || a1[v3] == 13) )
a1[v3] = 0;
}
pclose(stream);
return 0LL;
}
//----- (0000000000020846) ----------------------------------------------------
__int64 __fastcall sub_20846(const char *a1)
{
FILE *stream; // [rsp+18h] [rbp-8h]
stream = fopen64("/tmp/ms_external_ip", "w");
if ( !stream )
return 0xFFFFFFFFLL;
if ( a1 )
fputs(a1, stream);
fclose(stream);
return 0LL;
}
//----- (00000000000208A4) ----------------------------------------------------
__kernel_long_t sub_208A4()
{
struct sysinfo v1; // [rsp+0h] [rbp-70h] BYREF
if ( sysinfo(&v1) )
return 0LL;
else
return v1.uptime;
}
//----- (00000000000208C9) ----------------------------------------------------
__int64 __fastcall Get_External_IP(char *a1, int a2)
{
int v3; // [rsp+14h] [rbp-2Ch]
__int64 v4; // [rsp+18h] [rbp-28h]
__int64 v5; // [rsp+28h] [rbp-18h]
FILE *stream; // [rsp+30h] [rbp-10h]
unsigned int v7; // [rsp+3Ch] [rbp-4h]
v7 = 0;
v4 = sub_208A4();
v5 = sub_20679();
if ( (unsigned __int64)(v4 - v5) > 0x707 || v5 <= 0 )
{
stream = popen("/etc/init.d/get_external_ip.sh", "r");
if ( stream )
{
if ( fgets(a1, a2, stream) )
{
v3 = strlen(a1) - 1;
if ( v3 > 0 )
{
if ( a1[v3] == 10 || a1[v3] == 13 )
a1[v3] = 0;
if ( !(unsigned int)sub_20846(a1) )
sub_20700(v4);
}
}
else
{
v7 = -2;
}
pclose(stream);
return v7;
}
else
{
return 0xFFFFFFFFLL;
}
}
else
{
sub_20782(a1, a2);
return 0LL;
}
}
//----- (0000000000020A13) ----------------------------------------------------
__int64 __fastcall Get_Multimedia_Share_Path(char *a1)
{
char v2[272]; // [rsp+10h] [rbp-220h] BYREF
char src[272]; // [rsp+120h] [rbp-110h] BYREF
Get_Private_Profile_String(
(__int64)"SHARE_DEF",
(__int64)"defMultimedia",
"Qmultimedia",
v2,
257,
(__int64)"/etc/config/def_share.info");
Get_Private_Profile_String(
(__int64)v2,
(__int64)"path",
"/share/Qmultimedia",
src,
257,
(__int64)"/etc/config/smb.conf");
strncpy(a1, src, 0x101uLL);
return 0LL;
}
//----- (0000000000020AAF) ----------------------------------------------------
_BOOL8 __fastcall Is_Sound_Card_Playback_Running(unsigned int a1)
{
char s[272]; // [rsp+10h] [rbp-110h] BYREF
sprintf(s, "/bin/cat /proc/asound/card%d/pcm0p/sub0/status | /bin/grep RUNNING 1>>/dev/null 2>>/dev/null", a1);
return system(s) == 0;
}
//----- (0000000000020B02) ----------------------------------------------------
__int64 Stop_Local_Audio_Playback()
{
char s[268]; // [rsp+0h] [rbp-110h] BYREF
int v2; // [rsp+10Ch] [rbp-4h]
v2 = 0;
sprintf(
s,
"/bin/kill `/bin/ps | /bin/grep -v grep | /bin/grep %s | /bin/awk '{print $1}'` 1>/dev/null 2>/dev/null",
"Music_D_Play");
v2 = system(s);
usleep(0x186A0u);
if ( Is_Sound_Card_Playback_Running(0) && (v2 = system(s), usleep(0x493E0u), Is_Sound_Card_Playback_Running(0)) )
return 0xFFFFFFFFLL;
else
return 0LL;
}
// 20B02: using guessed type __int64 Stop_Local_Audio_Playback();
//----- (0000000000020B98) ----------------------------------------------------
_BOOL8 Is_Local_Audio_Playing()
{
char s[268]; // [rsp+0h] [rbp-110h] BYREF
int v2; // [rsp+10Ch] [rbp-4h]
v2 = 0;
sprintf(s, "/bin/ps | /bin/grep -v grep | /bin/grep %s 1>/dev/null 2>/dev/null", "Music_D_Play");
return system(s) == 0;
}
//----- (0000000000020BF2) ----------------------------------------------------
__int64 __fastcall Get_One_Audio_Alarm_Info(unsigned int a1, __int64 a2)
{
int v3; // ebx
char nptr[16]; // [rsp+10h] [rbp-140h] BYREF
char v5[272]; // [rsp+20h] [rbp-130h] BYREF
char *v6; // [rsp+130h] [rbp-20h]
unsigned int v7; // [rsp+138h] [rbp-18h]
int i; // [rsp+13Ch] [rbp-14h]
i = 1;
v7 = -1;
sprintf((char *)a2, "%s%d", "ALARM_", a1);
*(_DWORD *)(a2 + 260) = a1;
v6 = Conf_Dir_Load("/tmp/.alarm_info.conf");
if ( !v6 )
return v7;
Conf_Dir_Get_Str((__int64)v6, (const char *)a2, "Desc", "null", (char *)(a2 + 264), 257);
Conf_Dir_Get_Str((__int64)v6, (const char *)a2, "Time", "null", (char *)(a2 + 568), 257);
Conf_Dir_Get_Str((__int64)v6, (const char *)a2, "Dir_Path", "null", (char *)(a2 + 832), 257);
Conf_Dir_Get_Str((__int64)v6, (const char *)a2, "File_Path", "null", (char *)(a2 + 4928), 257);
Conf_Dir_Get_Str((__int64)v6, (const char *)a2, "WeekDay", "0,0,0,0,0,0,0", v5, 257);
Conf_Dir_Get_Int((__int64)v6, (const char *)a2, "Enable", 0, (unsigned int *)(a2 + 524));
Conf_Dir_Get_Int((__int64)v6, (const char *)a2, "Offset", 0, (unsigned int *)(a2 + 528));
Conf_Dir_Get_Int((__int64)v6, (const char *)a2, "Volume", 0x14u, (unsigned int *)(a2 + 532));
Conf_Dir_Get_Int((__int64)v6, (const char *)a2, "Mode", 1u, (unsigned int *)(a2 + 536));
Conf_Dir_Get_Int((__int64)v6, (const char *)a2, "Pl_ID", 0, (unsigned int *)(a2 + 828));
Conf_Dir_Get_Str((__int64)v6, (const char *)a2, "Device_ID", "null", (char *)(a2 + 9024), 100);
Conf_Dir_Get_Str((__int64)v6, (const char *)a2, "API_Type", "null", (char *)(a2 + 9124), 20);
for ( i = 1; (int)Get_String_Field((__int64)v5, i, 44, nptr, 3) >= 0 && i <= 7; ++i )
{
if ( nptr[0] )
{
v3 = i - 1;
*(_DWORD *)(a2 + 4 * (v3 + 132LL) + 12) = atoi(nptr);
}
else
{
*(_DWORD *)(a2 + 4 * (i - 1 + 132LL) + 12) = 0;
}
}
Conf_Dir_Free((__int64)v6);
return 0LL;
}
//----- (0000000000020FA3) ----------------------------------------------------
__int64 __fastcall Set_One_Audio_Alarm_Info(__int64 a1)
{
char s[264]; // [rsp+10h] [rbp-110h] BYREF
char *v3; // [rsp+118h] [rbp-8h]
v3 = Conf_Dir_Load("/tmp/.alarm_info.conf");
if ( !v3 )
return 0xFFFFFFFFLL;
sprintf(
s,
"%d,%d,%d,%d,%d,%d,%d",
*(unsigned int *)(a1 + 540),
*(unsigned int *)(a1 + 544),
*(unsigned int *)(a1 + 548),
*(unsigned int *)(a1 + 552),
*(unsigned int *)(a1 + 556),
*(unsigned int *)(a1 + 560),
*(unsigned int *)(a1 + 564));
Conf_Dir_Set_Int((__int64)v3, (const char *)a1, "Number", *(_DWORD *)(a1 + 260));
Conf_Dir_Set_Int((__int64)v3, (const char *)a1, "Enable", *(_DWORD *)(a1 + 524));
Conf_Dir_Set_Int((__int64)v3, (const char *)a1, "Offset", *(_DWORD *)(a1 + 528));
Conf_Dir_Set_Int((__int64)v3, (const char *)a1, "Volume", *(_DWORD *)(a1 + 532));
Conf_Dir_Set_Int((__int64)v3, (const char *)a1, "Pl_ID", *(_DWORD *)(a1 + 828));
Conf_Dir_Set_Int((__int64)v3, (const char *)a1, "Mode", *(_DWORD *)(a1 + 536));
Conf_Dir_Set_Str((__int64)v3, (const char *)a1, "WeekDay", s);
Conf_Dir_Set_Str((__int64)v3, (const char *)a1, "Time", (const char *)(a1 + 568));
Conf_Dir_Set_Str((__int64)v3, (const char *)a1, "Dir_Path", (const char *)(a1 + 832));
Conf_Dir_Set_Str((__int64)v3, (const char *)a1, "File_Path", (const char *)(a1 + 4928));
Conf_Dir_Set_Str((__int64)v3, (const char *)a1, "Desc", (const char *)(a1 + 264));
Conf_Dir_Wirte_File(v3);
Conf_Dir_Free((__int64)v3);
return 0LL;
}
// A5B0: using guessed type __int64 __fastcall Conf_Dir_Wirte_File(_QWORD);
//----- (0000000000021243) ----------------------------------------------------
size_t __fastcall remove_tail_linefeed(const char *a1)
{
size_t result; // rax
int v2; // [rsp+1Ch] [rbp-4h]
result = strlen(a1);
v2 = result;
while ( v2 > 0 )
{
if ( a1[--v2] != 13 )
{
result = (unsigned __int8)a1[v2];
if ( (_BYTE)result != 10 )
break;
}
result = (size_t)&a1[v2];
*(_BYTE *)result = 0;
}
return result;
}
//----- (00000000000212A8) ----------------------------------------------------
_BYTE *__fastcall trim_newline_carriage(__int64 a1)
{
_BYTE *result; // rax
int i; // [rsp+14h] [rbp-4h]
if ( a1 )
{
for ( i = 0; ; ++i )
{
result = (_BYTE *)*(unsigned __int8 *)(i + a1);
if ( !(_BYTE)result )
break;
if ( *(_BYTE *)(i + a1) == 10 || *(_BYTE *)(i + a1) == 13 )
{
result = (_BYTE *)(i + a1);
*result = 0;
return result;
}
}
}
return result;
}
//----- (000000000002131D) ----------------------------------------------------
_BYTE *__fastcall escape_str(const char *a1)
{
size_t v1; // rax
int v3; // eax
_BYTE *v4; // [rsp+10h] [rbp-10h]
int v5; // [rsp+18h] [rbp-8h]
int v6; // [rsp+1Ch] [rbp-4h]
if ( !a1 )
__assert_fail("filename", "normalutil.c", 0xDFBu, "escape_str");
v1 = strlen(a1);
v4 = malloc(2 * v1 + 1);
if ( !v4 )
return 0LL;
v6 = 0;
v5 = 0;
while ( a1[v6] )
{
v3 = a1[v6];
if ( v3 == 36 )
goto LABEL_12;
if ( v3 > 36 )
{
if ( v3 == 92 || v3 == 96 )
LABEL_12:
v4[v5++] = 92;
}
else if ( v3 == 34 )
{
goto LABEL_12;
}
v4[v5++] = a1[v6++];
}
v4[v5] = 0;
return v4;
}
//----- (0000000000021422) ----------------------------------------------------
__int64 __fastcall Get_Serial_Number(char *a1, int a2)
{
char s1[12]; // [rsp+10h] [rbp-110h] BYREF
int v4; // [rsp+1Ch] [rbp-104h]
char v5[241]; // [rsp+20h] [rbp-100h] BYREF
int Field; // [rsp+11Ch] [rbp-4h]
strcpy(s1, "QNAP0000NO");
s1[11] = 0;
v4 = 0;
memset(v5, 0, sizeof(v5));
Field = 0;
Field = Conf_Get_Field(
(__int64)"/var/hw_serial_number",
(__int64)"Hardware",
(__int64)"serial number",
(__int64)s1,
0x101u);
if ( Field && !system("/sbin/get_hwsn 1>>/dev/null 2>&1") )
Field = Conf_Get_Field(
(__int64)"/var/hw_serial_number",
(__int64)"Hardware",
(__int64)"serial number",
(__int64)s1,
0x101u);
if ( !Field && s1[0] && strcmp(s1, "null") && s1[0] == 81 && strlen(s1) == 10 )
{
strncpy(a1, s1, a2);
return 0LL;
}
else
{
strcpy(a1, "QNAP0000NO");
return 0xFFFFFFFFLL;
}
}
//----- (00000000000215D6) ----------------------------------------------------
__int64 __fastcall Get_Mac_Address(char *a1, int a2)
{
char v3[260]; // [rsp+10h] [rbp-110h] BYREF
int Field; // [rsp+114h] [rbp-Ch]
int v5; // [rsp+118h] [rbp-8h]
int i; // [rsp+11Ch] [rbp-4h]
i = 0;
v5 = 0;
Field = 0;
strcpy(v3, "00:00:00:00:05:09");
memset(&v3[18], 0, 239);
if ( a2 > 12 )
{
Field = Conf_Get_Field((__int64)"/var/MacAddress", (__int64)"MAC", (__int64)"eth0", (__int64)v3, 0x101u);
if ( !Field )
{
for ( i = 0; i <= 256; ++i )
{
if ( v3[i] != 58 )
{
if ( !v3[i] )
{
a1[v5] = 0;
break;
}
a1[v5++] = v3[i];
}
}
}
if ( Field || strlen(a1) != 12 )
strncpy(a1, "000000000509", a2);
return 0LL;
}
else
{
strncpy(a1, "0", a2);
return 0xFFFFFFFFLL;
}
}
//----- (0000000000021768) ----------------------------------------------------
__int64 __fastcall Get_Specify_ID(const char *a1, char *a2, int a3)
{
char command[512]; // [rsp+20h] [rbp-570h] BYREF
char s[272]; // [rsp+220h] [rbp-370h] BYREF
char v7[272]; // [rsp+330h] [rbp-260h] BYREF
char v8[272]; // [rsp+440h] [rbp-150h] BYREF
char templatea[32]; // [rsp+550h] [rbp-40h] BYREF
char *v10; // [rsp+570h] [rbp-20h]
int fd; // [rsp+57Ch] [rbp-14h]
FILE *stream; // [rsp+580h] [rbp-10h]
unsigned int v13; // [rsp+58Ch] [rbp-4h]
strcpy(templatea, "/tmp/.qbox_nas.XXXXXX");
stream = 0LL;
v13 = -1;
if ( !a1 )
return 0xFFFFFFFFLL;
fd = mkstemp64(templatea);
if ( fd < 0 )
return 0xFFFFFFFFLL;
close(fd);
Get_Mac_Address(v8, 257);
Get_Serial_Number(v7, 257);
snprintf(s, 0x101uLL, "%s%s%s", v8, v7, a1);
stream = fopen64(templatea, "w");
if ( !stream )
return 0xFFFFFFFFLL;
fputs(s, stream);
if ( fclose(stream) && *__errno_location() == 28 )
{
v13 = -1;
}
else
{
snprintf(command, 0x200uLL, "/bin/md5sum \"%s\"", templatea);
stream = popen(command, "r");
if ( stream )
{
v10 = fgets(a2, a3, stream);
pclose(stream);
if ( v10 )
{
v10 = strchr(a2, 32);
if ( v10 )
*v10 = 0;
v10 = strchr(a2, 10);
if ( v10 )
*v10 = 0;
v13 = 0;
}
}
}
unlink(templatea);
return v13;
}
//----- (00000000000219AD) ----------------------------------------------------
__int64 __fastcall Get_Device_SUID(char *a1, int a2)
{
char v3[272]; // [rsp+10h] [rbp-230h] BYREF
char s[264]; // [rsp+120h] [rbp-120h] BYREF
char *s1; // [rsp+228h] [rbp-18h]
char *delim; // [rsp+230h] [rbp-10h]
unsigned int Flash_Config; // [rsp+23Ch] [rbp-4h]
delim = "=";
s1 = 0LL;
Flash_Config = -1;
memset(s, 0, 0x101uLL);
Flash_Config = Get_Flash_Config(7864320LL, 0x25u, (__int64)s);
s[37] = 0;
if ( !Flash_Config )
{
Flash_Config = -1;
s1 = strtok(s, delim);
if ( s1 )
{
if ( !strncmp(s1, "SUID", 4uLL) )
{
s1 = strtok(0LL, delim);
if ( a2 > 31 )
{
strncpy(a1, s1, 0x20uLL);
Flash_Config = 0;
}
}
}
}
if ( Flash_Config )
{
memset(s, 0, 0x101uLL);
if ( !(unsigned int)Get_Flash_Config(8387584LL, 0x25u, (__int64)s) )
{
s1 = strtok(s, delim);
if ( s1 )
{
if ( !strncmp(s1, "SUID", 4uLL) )
{
s1 = strtok(0LL, delim);
if ( a2 > 31 )
{
memset(v3, 0, 0x101uLL);
strncpy(v3, s1, 0x20uLL);
Set_Device_SUID(v3);
strncpy(a1, s1, 0x20uLL);
return 0;
}
}
}
}
}
return Flash_Config;
}
// 9FC0: using guessed type __int64 __fastcall Set_Device_SUID(_QWORD);
//----- (0000000000021BBA) ----------------------------------------------------
__int64 __fastcall Get_Device_SUID_Ex(void *a1, signed int a2)
{
unsigned int Device_SUID; // [rsp+1Ch] [rbp-4h]
memset(a1, 0, a2);
if ( (int)Get_Private_Profile_String(
(__int64)&unk_2EA9D,
(__int64)"SUID",
(const char *)&unk_2EA9D,
(char *)a1,
a2,
(__int64)"/etc/platform.conf") <= 0
&& (Device_SUID = Get_Device_SUID(a1, (unsigned int)a2)) != 0 )
{
return Device_SUID;
}
else
{
return 0LL;
}
}
// A620: using guessed type __int64 __fastcall Get_Device_SUID(_QWORD, _QWORD);
//----- (0000000000021C38) ----------------------------------------------------
__int64 __fastcall Set_Device_SUID(const char *a1)
{
char s[268]; // [rsp+10h] [rbp-110h] BYREF
unsigned int v3; // [rsp+11Ch] [rbp-4h]
v3 = -1;
memset(s, 0, 0x101uLL);
sprintf(s, "%s=%s", "SUID", a1);
if ( strlen(s) == 37 )
return (unsigned int)Set_Flash_Config(7864320LL, (__int64)s);
return v3;
}
//----- (0000000000021CC7) ----------------------------------------------------
__int64 Get_Country_Code()
{
char dest[272]; // [rsp+0h] [rbp-230h] BYREF
char s[264]; // [rsp+110h] [rbp-120h] BYREF
char *s1; // [rsp+218h] [rbp-18h]
char *delim; // [rsp+220h] [rbp-10h]
unsigned int v5; // [rsp+22Ch] [rbp-4h]
delim = "=";
s1 = 0LL;
v5 = 0;
if ( !(unsigned int)Get_Flash_Config(7864384LL, 0xCu, (__int64)s) )
{
s[12] = 0;
s1 = strtok(s, delim);
if ( s1 )
{
if ( !strncmp(s1, "CCODE", 5uLL) )
{
s1 = strtok(0LL, delim);
memset(dest, 0, 0x101uLL);
strncpy(dest, s1, 6uLL);
return (unsigned int)atoi(dest);
}
}
}
return v5;
}
// 21CC7: using guessed type __int64 Get_Country_Code();
//----- (0000000000021DB1) ----------------------------------------------------
__int64 __fastcall Set_Country_Code(int a1)
{
unsigned int v2; // [rsp+Ch] [rbp-114h]
char s[268]; // [rsp+10h] [rbp-110h] BYREF
unsigned int v4; // [rsp+11Ch] [rbp-4h]
v2 = a1;
v4 = -1;
if ( a1 < 0 )
v2 = 0;
memset(s, 0, 0x101uLL);
sprintf(s, "%s=%06d", "CCODE", v2);
if ( strlen(s) == 12 )
return (unsigned int)Set_Flash_Config(7864384LL, (__int64)s);
return v4;
}
//----- (0000000000021E50) ----------------------------------------------------
__int64 __fastcall getCountryCodeIndex(int a1)
{
unsigned int v2; // [rsp+Ch] [rbp-8h]
unsigned int i; // [rsp+10h] [rbp-4h]
v2 = 0;
for ( i = 0; *((_QWORD *)&qcountrycode + 4 * (int)i + 1); ++i )
{
if ( *((_DWORD *)&qcountrycode + 8 * (int)i) == a1 )
return i;
}
return v2;
}
//----- (0000000000021EB7) ----------------------------------------------------
__int64 __fastcall getCountryCodeIndexByAbbr(const char *a1)
{
unsigned int v2; // [rsp+18h] [rbp-8h]
unsigned int i; // [rsp+1Ch] [rbp-4h]
v2 = 0;
for ( i = 0; *((_QWORD *)&qcountrycode + 4 * (int)i + 1); ++i )
{
if ( a1 && !strcmp(a1, *((const char **)&qcountrycode + 4 * (int)i + 1)) )
return i;
}
return v2;
}
//----- (0000000000021F3A) ----------------------------------------------------
__int64 __fastcall getFunctionCodeIndex(int a1)
{
unsigned int v2; // [rsp+Ch] [rbp-8h]
unsigned int i; // [rsp+10h] [rbp-4h]
v2 = 0;
for ( i = 0; *((_QWORD *)&qfunctioncode + 4 * (int)i + 1); ++i )
{
if ( *((_DWORD *)&qfunctioncode + 8 * (int)i) == a1 )
return i;
}
return v2;
}
//----- (0000000000021FA1) ----------------------------------------------------
__int64 __fastcall Get_Model_Prefix(char *a1)
{
char s[264]; // [rsp+10h] [rbp-120h] BYREF
char *s1; // [rsp+118h] [rbp-18h]
char *delim; // [rsp+120h] [rbp-10h]
unsigned int Flash_Config; // [rsp+12Ch] [rbp-4h]
delim = "=";
s1 = 0LL;
Flash_Config = -1;
memset(s, 0, 0x101uLL);
Flash_Config = Get_Flash_Config(7864448LL, 0xBu, (__int64)s);
s[11] = 0;
if ( !Flash_Config )
{
Flash_Config = -1;
s1 = strtok(s, delim);
if ( s1 )
{
if ( !strncmp(s1, "MP", 2uLL) )
{
s1 = strtok(0LL, delim);
if ( s1 )
{
strncpy(a1, s1, 8uLL);
a1[8] = 0;
Flash_Config = 0;
}
}
}
}
if ( Flash_Config )
strncpy(a1, "TS", 8uLL);
return Flash_Config;
}
//----- (00000000000220C9) ----------------------------------------------------
__int64 __fastcall Set_Model_Prefix(const char *a1)
{
char s[260]; // [rsp+10h] [rbp-110h] BYREF
int v3; // [rsp+114h] [rbp-Ch]
unsigned int v4; // [rsp+118h] [rbp-8h]
int i; // [rsp+11Ch] [rbp-4h]
v4 = -1;
i = 0;
v3 = 0;
memset(s, 0, 0x101uLL);
sprintf(s, "%s=%s", "MP", a1);
v3 = strlen(s);
if ( v3 > 11 )
return v4;
for ( i = v3; i <= 11; ++i )
s[i] = 0;
return (unsigned int)Set_Flash_Config(7864448LL, (__int64)s);
}
// 220C9: using guessed type char s[260];
//----- (000000000002218D) ----------------------------------------------------
__int64 __fastcall Get_LED_Night_Mode_Status(_DWORD *a1)
{
char v2[8]; // [rsp+10h] [rbp-30h] BYREF
char s[8]; // [rsp+20h] [rbp-20h] BYREF
char *v4; // [rsp+28h] [rbp-18h]
char *v5; // [rsp+30h] [rbp-10h]
char *nptr; // [rsp+38h] [rbp-8h]
*(_QWORD *)s = 0LL;
*(_QWORD *)v2 = 0LL;
nptr = 0LL;
v5 = 0LL;
v4 = Conf_Dir_Load("/etc/config/uLinux.conf");
if ( !v4 )
return 0xFFFFFFFFLL;
Conf_Dir_Get_Bool((__int64)v4, "LED", "LED Enable", 1, a1);
Conf_Dir_Get_Int((__int64)v4, "LED", "LED Brightness Value", 0x64u, a1 + 1);
Conf_Dir_Get_Bool((__int64)v4, "LED", "LED Time Period", 0, a1 + 2);
if ( a1[2] == 1 )
{
Conf_Dir_Get_Str((__int64)v4, "LED", "LED Start Time", "00:00", s, 8);
Conf_Dir_Get_Str((__int64)v4, "LED", "LED End Time", "23:59", v2, 8);
nptr = strtok(s, ":");
if ( nptr )
a1[3] = atoi(nptr);
nptr = strtok(0LL, ":");
if ( nptr )
a1[4] = atoi(nptr);
v5 = strtok(v2, ":");
if ( v5 )
a1[5] = atoi(v5);
v5 = strtok(0LL, ":");
if ( v5 )
a1[6] = atoi(v5);
}
else
{
a1[3] = 0;
a1[4] = 0;
a1[5] = 23;
a1[6] = 59;
}
Conf_Dir_Free((__int64)v4);
return 0LL;
}
//----- (00000000000223D1) ----------------------------------------------------
__int64 __fastcall Set_LED_Night_Mode_Status(unsigned int *a1, int a2)
{
const char *v2; // rax
unsigned int v3; // eax
const char *v4; // rax
const char *v5; // rax
char v7[8]; // [rsp+10h] [rbp-C0h] BYREF
char s[8]; // [rsp+20h] [rbp-B0h] BYREF
char command[128]; // [rsp+30h] [rbp-A0h] BYREF
__int64 v10; // [rsp+B0h] [rbp-20h] BYREF
char *v11; // [rsp+B8h] [rbp-18h]
unsigned int v12; // [rsp+C4h] [rbp-Ch]
unsigned int v13; // [rsp+C8h] [rbp-8h]
unsigned int v14; // [rsp+CCh] [rbp-4h]
v14 = -1;
v13 = 100;
v12 = 2;
v10 = 0LL;
memset(command, 0, sizeof(command));
*(_QWORD *)s = 0LL;
*(_QWORD *)v7 = 0LL;
v11 = 0LL;
if ( !a1 )
goto LABEL_46;
v11 = Conf_Dir_Load("/etc/config/uLinux.conf");
if ( !v11 )
goto LABEL_46;
if ( *a1 )
v2 = "TRUE";
else
v2 = "FALSE";
Conf_Dir_Set_Str((__int64)v11, "LED", "LED Enable", v2);
Conf_Dir_Set_Int((__int64)v11, "LED", "LED Brightness Value", a1[1]);
if ( a2 )
{
if ( a2 != 1 )
goto LABEL_46;
qmemcpy(&v10, "PWM", 3);
v13 = (int)(float)(int)a1[1];
}
else
{
LODWORD(v10) = 1330204743;
v3 = a1[1];
switch ( v3 )
{
case 0x32u:
v12 = 1;
break;
case 0x64u:
v12 = 2;
break;
case 0u:
v12 = 0;
break;
}
}
if ( *a1 == 1 )
{
if ( a1[2] == 1 )
{
if ( a1[3] <= 0x17 && a1[5] <= 0x17 && a1[4] <= 0x3B && a1[6] <= 0x3B )
{
snprintf(s, 8uLL, "%02d:%02d", a1[3], a1[4]);
snprintf(v7, 8uLL, "%02d:%02d", a1[5], a1[6]);
if ( a1[2] )
v4 = "TRUE";
else
v4 = "FALSE";
Conf_Dir_Set_Str((__int64)v11, "LED", "LED Time Period", v4);
Conf_Dir_Set_Str((__int64)v11, "LED", "LED Start Time", s);
Conf_Dir_Set_Str((__int64)v11, "LED", "LED End Time", v7);
if ( a2 )
snprintf(
command,
0x80uLL,
"%s night_mode %s %d %d %d %d %d %d 1>/dev/null 2>/dev/null",
"/etc/init.d/set_led.sh",
(const char *)&v10,
*a1,
v13,
a1[3],
a1[4],
a1[5],
a1[6]);
else
snprintf(
command,
0x80uLL,
"%s night_mode %s %d %d %d %d %d %d 1>/dev/null 2>/dev/null",
"/etc/init.d/set_led.sh",
(const char *)&v10,
*a1,
v12,
a1[3],
a1[4],
a1[5],
a1[6]);
if ( a1[3] == a1[5] && a1[4] == a1[6] )
{
Conf_Dir_Set_Str((__int64)v11, "LED", "LED Time Period", "FALSE");
Conf_Dir_Remove((__int64)v11, "LED", "LED Start Time");
Conf_Dir_Remove((__int64)v11, "LED", "LED End Time");
if ( a2 )
snprintf(
command,
0x80uLL,
"%s night_mode %s %d %d 1>/dev/null 2>/dev/null",
"/etc/init.d/set_led.sh",
(const char *)&v10,
*a1,
v13);
else
snprintf(
command,
0x80uLL,
"%s night_mode %s %d %d 1>/dev/null 2>/dev/null",
"/etc/init.d/set_led.sh",
(const char *)&v10,
*a1,
v12);
}
goto LABEL_44;
}
Conf_Dir_Set_Str((__int64)v11, "LED", "LED Time Period", "FALSE");
Conf_Dir_Remove((__int64)v11, "LED", "LED Start Time");
Conf_Dir_Remove((__int64)v11, "LED", "LED End Time");
if ( !a2 )
goto LABEL_36;
}
else
{
if ( a1[2] )
v5 = "TRUE";
else
v5 = "FALSE";
Conf_Dir_Set_Str((__int64)v11, "LED", "LED Time Period", v5);
Conf_Dir_Remove((__int64)v11, "LED", "LED Start Time");
Conf_Dir_Remove((__int64)v11, "LED", "LED End Time");
if ( !a2 )
{
LABEL_36:
snprintf(
command,
0x80uLL,
"%s night_mode %s %d %d 1>/dev/null 2>/dev/null",
"/etc/init.d/set_led.sh",
(const char *)&v10,
*a1,
v12);
goto LABEL_44;
}
}
snprintf(
command,
0x80uLL,
"%s night_mode %s %d %d 1>/dev/null 2>/dev/null",
"/etc/init.d/set_led.sh",
(const char *)&v10,
*a1,
v13);
}
else
{
Conf_Dir_Set_Str((__int64)v11, "LED", "LED Time Period", "FALSE");
Conf_Dir_Remove((__int64)v11, "LED", "LED Brightness Value");
Conf_Dir_Remove((__int64)v11, "LED", "LED Start Time");
Conf_Dir_Remove((__int64)v11, "LED", "LED End Time");
snprintf(
command,
0x80uLL,
"%s night_mode %s %d 1>/dev/null 2>/dev/null",
"/etc/init.d/set_led.sh",
(const char *)&v10,
*a1);
}
LABEL_44:
if ( !(unsigned int)Conf_Dir_Wirte_File(v11) )
{
system(command);
v14 = 0;
}
LABEL_46:
if ( v11 )
Conf_Dir_Free((__int64)v11);
return v14;
}
// 22768: conditional instruction was optimized away because esi.4==1
// 228BC: conditional instruction was optimized away because esi.4==1
// 229BE: conditional instruction was optimized away because esi.4==1
// 22ADB: conditional instruction was optimized away because esi.4==1
// A5B0: using guessed type __int64 __fastcall Conf_Dir_Wirte_File(_QWORD);
//----- (0000000000022C15) ----------------------------------------------------
__int64 __fastcall Get_QOS_Lang(const char *a1, char *a2, signed int a3)
{
char s[1024]; // [rsp+20h] [rbp-400h] BYREF
sprintf(s, "%s/%s/config", "/etc/config/.qos_config/users", a1);
if ( !(unsigned int)Is_File_Exist(s) )
return 0xFFFFFFFFLL;
Get_Private_Profile_String((__int64)"common", (__int64)"lang", "eng", a2, a3, (__int64)s);
return 0LL;
}
// A570: using guessed type __int64 __fastcall Is_File_Exist(_QWORD);
//----- (0000000000022CB8) ----------------------------------------------------
__int64 __fastcall Is_Valid_Source(const char *a1)
{
const char *v2; // [rsp+18h] [rbp-8h]
v2 = a1;
if ( !a1 )
return 0LL;
if ( strlen(a1) <= 1 )
return 0LL;
while ( *v2 )
{
if ( ((*__ctype_b_loc())[*v2] & 8) != 0 )
{
++v2;
}
else
{
switch ( *v2 )
{
case '.':
++v2;
break;
case ':':
++v2;
break;
case ' ':
++v2;
break;
default:
return 0LL;
}
}
}
return 1LL;
}
//----- (0000000000022D74) ----------------------------------------------------
_BOOL8 __fastcall sub_22D74(int a1)
{
return (unsigned int)(a1 - 128) <= 0x3F;
}
//----- (0000000000022D8C) ----------------------------------------------------
__int64 __fastcall sub_22D8C(int a1)
{
if ( !sub_22D74(a1) )
return (unsigned int)a1;
if ( a1 > 127 && a1 <= 133 || a1 > 159 && a1 <= 165 )
return 97LL;
if ( a1 > 135 && a1 <= 139 || a1 > 167 && a1 <= 171 )
return 101LL;
if ( a1 > 139 && a1 <= 143 || a1 > 171 && a1 <= 175 )
return 105LL;
if ( a1 > 145 && a1 <= 150 || a1 > 177 && a1 <= 182 || a1 == 152 || a1 == 184 )
return 111LL;
if ( a1 > 152 && a1 <= 156 || a1 > 184 && a1 <= 188 )
return 117LL;
switch ( a1 )
{
case 157:
case 189:
case 191:
return 121LL;
case 135:
case 167:
return 99LL;
case 145:
case 177:
return 110LL;
}
return (unsigned int)a1;
}
//----- (0000000000022EF9) ----------------------------------------------------
__int64 __fastcall utf8_strtolower(_BYTE *a1, __int64 a2)
{
_BYTE *v2; // rbx
char v4; // dl
__int64 v5; // [rsp+0h] [rbp-20h]
_BYTE *v6; // [rsp+8h] [rbp-18h]
v6 = a1;
v5 = a2;
v2 = a1;
if ( !a1 || !a2 )
return 0xFFFFFFFFLL;
while ( 1 )
{
if ( *v2 == 0xC3 )
v4 = sub_22D8C((unsigned __int8)*++v2);
else
v4 = tolower((unsigned __int8)*v2);
*v6 = v4;
if ( !*v2 )
break;
if ( --v5 )
{
++v2;
++v6;
if ( *v2 )
continue;
}
goto LABEL_11;
}
++v6;
LABEL_11:
*v6 = 0;
return 0LL;
}
//----- (0000000000022F99) ----------------------------------------------------
__int64 __fastcall utf8_strcasecmp(_BYTE *a1, _BYTE *a2)
{
_BYTE *v2; // r12
_BYTE *v3; // rbx
unsigned __int8 v5; // [rsp+1Eh] [rbp-12h]
unsigned __int8 v6; // [rsp+1Fh] [rbp-11h]
v2 = a1;
v3 = a2;
if ( a1 == a2 )
return 0LL;
do
{
if ( *v2 == 0xC3 )
v6 = sub_22D8C((unsigned __int8)*++v2);
else
v6 = tolower((unsigned __int8)*v2);
if ( *v3 == 0xC3 )
v5 = sub_22D8C((unsigned __int8)*++v3);
else
v5 = tolower((unsigned __int8)*v3);
if ( !v6 )
break;
++v2;
++v3;
}
while ( v6 == v5 );
return v6 - (unsigned int)v5;
}
//----- (0000000000023051) ----------------------------------------------------
__int64 __fastcall utf8_strncasecmp(_BYTE *a1, _BYTE *a2, __int64 a3)
{
_BYTE *v3; // r12
_BYTE *v4; // rbx
__int64 v6; // [rsp+8h] [rbp-38h]
unsigned __int8 v7; // [rsp+2Eh] [rbp-12h]
unsigned __int8 v8; // [rsp+2Fh] [rbp-11h]
v6 = a3;
v3 = a1;
v4 = a2;
if ( a1 == a2 || !a3 )
return 0LL;
do
{
if ( *v3 == 0xC3 )
{
v8 = sub_22D8C((unsigned __int8)*++v3);
--v6;
}
else
{
v8 = tolower((unsigned __int8)*v3);
}
if ( *v4 == 0xC3 )
v7 = sub_22D8C((unsigned __int8)*++v4);
else
v7 = tolower((unsigned __int8)*v4);
if ( !v8 )
break;
if ( !--v6 )
break;
++v3;
++v4;
}
while ( v8 == v7 );
return v8 - (unsigned int)v7;
}
//----- (0000000000023127) ----------------------------------------------------
__int64 __fastcall mkdir_p(const char *a1, __mode_t a2)
{
char *i; // rax
char *v4; // [rsp+10h] [rbp-20h]
char *path; // [rsp+18h] [rbp-18h]
unsigned int v6; // [rsp+2Ch] [rbp-4h]
v6 = -1;
path = strdup(a1);
for ( i = strchr(path, 47); ; i = strchr(v4 + 1, 47) )
{
v4 = i;
if ( i )
*i = 0;
if ( *path )
{
v6 = mkdir(path, a2);
if ( v6 && *__errno_location() == 17 )
v6 = 0;
if ( v6 )
break;
}
if ( !v4 )
break;
*v4 = 47;
}
free(path);
return v6;
}
//----- (00000000000231EA) ----------------------------------------------------
__int64 __fastcall sub_231EA(const char *a1, const char *a2)
{
int v3; // eax
char nptr[64]; // [rsp+10h] [rbp-A0h] BYREF
char dest[64]; // [rsp+50h] [rbp-60h] BYREF
int v6; // [rsp+90h] [rbp-20h]
int v7; // [rsp+94h] [rbp-1Ch]
int v8; // [rsp+98h] [rbp-18h]
int v9; // [rsp+9Ch] [rbp-14h]
int v10; // [rsp+A0h] [rbp-10h]
int v11; // [rsp+A4h] [rbp-Ch]
int i; // [rsp+A8h] [rbp-8h]
unsigned int v13; // [rsp+ACh] [rbp-4h]
v13 = 0;
v10 = 0;
i = 0;
v11 = 0;
memset(dest, 0, sizeof(dest));
memset(nptr, 0, sizeof(nptr));
v9 = strlen(a1);
v8 = strlen(a2);
while ( v9 > i && a1[i] > 47 && a1[i] <= 57 )
++i;
while ( v8 > v11 && a2[v11] > 47 && a2[v11] <= 57 )
++v11;
strncpy(dest, a1, i);
strncpy(nptr, a2, v11);
v7 = atoi(dest);
v6 = atoi(nptr);
if ( v7 < v6 )
return 0xFFFFFFFFLL;
if ( v7 > v6 )
return 1LL;
strcpy(dest, &a1[i]);
strcpy(nptr, &a2[v11]);
v9 = strlen(dest);
v8 = strlen(nptr);
v3 = v9;
if ( v8 >= v9 )
v3 = v8;
v10 = v3;
for ( i = 0; i < v10; ++i )
{
if ( dest[i] > nptr[i] )
return 1;
if ( dest[i] < nptr[i] )
return (unsigned int)-1;
}
return v13;
}
// 231EA: using guessed type char dest[64];
// 231EA: using guessed type char nptr[64];
//----- (0000000000023437) ----------------------------------------------------
__int64 __fastcall QNAP_Version_Compare(const char *a1, const char *a2)
{
char v3[8]; // [rsp+10h] [rbp-A0h] BYREF
char v4[56]; // [rsp+18h] [rbp-98h] BYREF
char dest[8]; // [rsp+50h] [rbp-60h] BYREF
char v6[56]; // [rsp+58h] [rbp-58h] BYREF
unsigned int v7; // [rsp+94h] [rbp-1Ch]
char *v8; // [rsp+98h] [rbp-18h]
char *v9; // [rsp+A0h] [rbp-10h]
int v10; // [rsp+A8h] [rbp-8h]
int v11; // [rsp+ACh] [rbp-4h]
*(_QWORD *)dest = 0LL;
memset(v6, 0, sizeof(v6));
*(_QWORD *)v3 = 0LL;
memset(v4, 0, sizeof(v4));
v9 = strchr(a1, 46);
v8 = strchr(a2, 46);
if ( v9 )
v11 = (_DWORD)v9 - (_DWORD)a1;
else
v11 = strlen(a1);
if ( v8 )
v10 = (_DWORD)v8 - (_DWORD)a2;
else
v10 = strlen(a2);
strncpy(dest, a1, v11);
strncpy(v3, a2, v10);
v7 = sub_231EA(dest, v3);
if ( v7 )
return v7;
v9 = strchr(a1, 46);
v8 = strchr(a2, 46);
memset(dest, 0, 0x40uLL);
memset(v3, 0, 0x40uLL);
if ( v9 && v8 )
{
strcpy(dest, v9);
strcpy(v3, v8);
return QNAP_Version_Compare(&dest[1], &v3[1]);
}
else if ( v9 || !v8 )
{
return v9 && !v8;
}
else
{
return 0xFFFFFFFFLL;
}
}
// A170: using guessed type __int64 __fastcall QNAP_Version_Compare(_QWORD, _QWORD);
//----- (0000000000023665) ----------------------------------------------------
__int64 __fastcall Set_Encode_Field_To_Private_Conf(__int64 a1, __int64 a2, const char *a3, int a4, __int64 a5)
{
int v5; // eax
char dest[512]; // [rsp+30h] [rbp-210h] BYREF
void *ptr; // [rsp+230h] [rbp-10h]
unsigned int v11; // [rsp+23Ch] [rbp-4h]
v11 = -1;
memset(dest, 0, sizeof(dest));
ptr = 0LL;
if ( a1 )
{
if ( a2 )
{
if ( a3 )
{
if ( a5 )
{
strncpy(dest, a3, 0x1FFuLL);
v5 = strlen(dest);
ptr = Password_Encode(dest, v5, a4);
if ( ptr )
{
Set_Private_Profile_String(a1, a2, (__int64)ptr, a5);
v11 = 0;
}
}
}
}
}
if ( ptr )
{
free(ptr);
ptr = 0LL;
}
return v11;
}
//----- (0000000000023787) ----------------------------------------------------
__int64 __fastcall Get_Decode_Field_From_Private_Conf(
__int64 a1,
__int64 a2,
const char *a3,
char *a4,
int a5,
int a6,
__int64 a7)
{
char v12[512]; // [rsp+30h] [rbp-210h] BYREF
char *src; // [rsp+230h] [rbp-10h]
unsigned int v14; // [rsp+23Ch] [rbp-4h]
v14 = -1;
memset(v12, 0, sizeof(v12));
src = 0LL;
if ( a1 && a2 && a3 && a4 && a7 )
{
if ( (int)Get_Private_Profile_String(a1, a2, a3, v12, 512, a7) <= 0 )
{
strncpy(a4, a3, a5 - 1);
}
else
{
src = Password_Decode(v12, a6);
if ( !src )
goto LABEL_11;
strncpy(a4, src, a5 - 1);
}
v14 = 0;
}
LABEL_11:
if ( src )
{
free(src);
src = 0LL;
}
return v14;
}
//----- (00000000000238EB) ----------------------------------------------------
__int64 __fastcall Get_Device_CUID(char *a1, int a2)
{
size_t v3; // rax
char v4[16]; // [rsp+10h] [rbp-170h] BYREF
char src[2]; // [rsp+20h] [rbp-160h] BYREF
char v6; // [rsp+22h] [rbp-15Eh]
char v7[8]; // [rsp+30h] [rbp-150h] BYREF
__int64 v8; // [rsp+38h] [rbp-148h]
__int64 v9; // [rsp+40h] [rbp-140h]
__int64 v10; // [rsp+48h] [rbp-138h]
char v11; // [rsp+50h] [rbp-130h]
__int64 s[32]; // [rsp+60h] [rbp-120h] BYREF
char v13; // [rsp+160h] [rbp-20h]
FILE *stream; // [rsp+168h] [rbp-18h]
unsigned int v15; // [rsp+174h] [rbp-Ch]
int i; // [rsp+178h] [rbp-8h]
int v17; // [rsp+17Ch] [rbp-4h]
memset(s, 0, sizeof(s));
v13 = 0;
*(_QWORD *)v7 = 0LL;
v8 = 0LL;
v9 = 0LL;
v10 = 0LL;
v11 = 0;
v15 = -1;
v17 = 0;
*(_WORD *)src = 0;
v6 = 0;
memset(s, 0, 0x101uLL);
memset(v7, 0, 0x21uLL);
if ( (unsigned int)Is_File_Exist("/etc/config/.cuid") )
{
stream = fopen64("/etc/config/.cuid", "r");
if ( stream )
{
memset(s, 0, 0x101uLL);
if ( fgets((char *)s, 33, stream) && strlen((const char *)s) == 32 )
v17 = 1;
fclose(stream);
}
}
if ( v17 )
{
strncpy(a1, (const char *)s, a2);
if ( a2 > 32 )
a1[32] = 0;
return v15;
}
else if ( (unsigned int)Get_Device_SUID(s, 257LL) )
{
return v15;
}
else
{
v3 = strlen((const char *)s);
QNAP_Digest_MD5(s, v3, v4, 16LL);
for ( i = 0; i <= 15; ++i )
{
sprintf(src, "%2.2x", (unsigned __int8)v4[i]);
strcat(v7, src);
}
strncpy(a1, v7, a2);
if ( a2 > 32 )
a1[32] = 0;
Set_Device_CUID(a1);
return 0LL;
}
}
// 9F70: using guessed type __int64 __fastcall QNAP_Digest_MD5(_QWORD, _QWORD, _QWORD, _QWORD);
// A040: using guessed type __int64 __fastcall Set_Device_CUID(_QWORD);
// A570: using guessed type __int64 __fastcall Is_File_Exist(_QWORD);
// A620: using guessed type __int64 __fastcall Get_Device_SUID(_QWORD, _QWORD);
// 238EB: using guessed type char var_170[16];
//----- (0000000000023B7C) ----------------------------------------------------
__int64 __fastcall Set_Device_CUID(const char *a1)
{
char s[264]; // [rsp+10h] [rbp-110h] BYREF
FILE *stream; // [rsp+118h] [rbp-8h]
if ( !a1 )
return 0xFFFFFFFFLL;
stream = fopen64("/etc/config/.cuid", "w");
if ( !stream )
return 0xFFFFFFFFLL;
memset(s, 0, 0x101uLL);
snprintf(s, 0x101uLL, "%s", a1);
fputs(s, stream);
fclose(stream);
return 0LL;
}
//----- (0000000000023C33) ----------------------------------------------------
_BYTE *__fastcall Skip_Unicode_Control_Characters(_BYTE *a1)
{
_BYTE *v1; // rax
_BYTE *result; // rax
_BYTE *v3; // [rsp+8h] [rbp-10h]
_BYTE *v4; // [rsp+10h] [rbp-8h]
v3 = a1;
v4 = a1;
while ( *v3 )
{
if ( !byte_236940[(unsigned __int8)*v3] )
{
v1 = v4++;
*v1 = *v3;
}
++v3;
}
result = v4;
*v4 = 0;
return result;
}
// 236940: using guessed type _BYTE byte_236940[256];
//----- (0000000000023C97) ----------------------------------------------------
__int64 __fastcall sub_23C97(char *a1, char *a2, void *a3, unsigned __int64 a4, char *a5)
{
char *v5; // rdx
size_t v6; // rdx
char *v11; // [rsp+20h] [rbp-70h]
unsigned int v12; // [rsp+3Ch] [rbp-54h] BYREF
char src[64]; // [rsp+40h] [rbp-50h] BYREF
__int64 v14; // [rsp+80h] [rbp-10h]
unsigned int v15; // [rsp+8Ch] [rbp-4h]
v11 = a2;
v14 = EVP_MD_CTX_new();
v5 = src;
memset(src, 0, sizeof(src));
v12 = 0;
v15 = -1;
if ( v14 )
{
if ( a1 )
{
if ( a3 )
{
a2 = a5;
if ( (unsigned int)EVP_DigestInit(v14, a5) == 1 )
{
a2 = a1;
if ( (unsigned int)EVP_DigestUpdate(v14, a1, v11) == 1 )
{
a2 = src;
if ( (unsigned int)EVP_DigestFinal(v14, src, &v12) == 1 )
{
v6 = v12;
if ( v12 > a4 )
v6 = a4;
a2 = src;
memcpy(a3, src, v6);
v15 = 0;
}
}
}
}
}
}
if ( v14 )
EVP_MD_CTX_free(v14, a2, v5);
return v15;
}
// 23D96: variable 'v5' is possibly undefined
// 9BF0: using guessed type __int64 __fastcall EVP_DigestInit(_QWORD, _QWORD);
// A700: using guessed type __int64 __fastcall EVP_MD_CTX_free(_QWORD, _QWORD, _QWORD);
// A880: using guessed type __int64 __fastcall EVP_DigestFinal(_QWORD, _QWORD, _QWORD);
// AAC0: using guessed type __int64 EVP_MD_CTX_new(void);
// ACD0: using guessed type __int64 __fastcall EVP_DigestUpdate(_QWORD, _QWORD, _QWORD);
//----- (0000000000023DA0) ----------------------------------------------------
__int64 __fastcall QNAP_Digest_MD5(char *a1, char *a2, void *a3, unsigned __int64 a4)
{
char *v4; // rax
v4 = (char *)EVP_md5();
return sub_23C97(a1, a2, a3, a4, v4);
}
// AB30: using guessed type __int64 EVP_md5(void);
//----- (0000000000023DDD) ----------------------------------------------------
__int64 __fastcall QNAP_Digest_SHA256(char *a1, char *a2, void *a3, unsigned __int64 a4)
{
char *v4; // rax
v4 = (char *)EVP_sha256();
return sub_23C97(a1, a2, a3, a4, v4);
}
// 9E00: using guessed type __int64 EVP_sha256(void);
//----- (0000000000023E1A) ----------------------------------------------------
__int64 __fastcall QNAP_Digest_SHA1(char *a1, char *a2, void *a3, unsigned __int64 a4)
{
char *v4; // rax
v4 = (char *)EVP_sha1();
return sub_23C97(a1, a2, a3, a4, v4);
}
// AC80: using guessed type __int64 EVP_sha1(void);
//----- (0000000000023E57) ----------------------------------------------------
__int64 __fastcall sub_23E57(const char *a1)
{
int i; // [rsp+1Ch] [rbp-4h]
if ( !a1 )
return 0LL;
if ( (unsigned int)strlen(a1) != 12 )
return 0LL;
for ( i = 0; i <= 11; ++i )
{
if ( ((*__ctype_b_loc())[a1[i]] & 0x1000) == 0 )
return 0LL;
}
return 1LL;
}
//----- (0000000000023EE2) ----------------------------------------------------
void __fastcall sub_23EE2(const char *a1)
{
char v1; // [rsp+13h] [rbp-Dh]
int i; // [rsp+18h] [rbp-8h]
int v3; // [rsp+1Ch] [rbp-4h]
if ( a1 )
{
v3 = 0;
for ( i = strlen(a1) - 1; v3 < i; --i )
{
v1 = a1[v3];
a1[v3] = a1[i];
a1[i] = v1;
++v3;
}
}
}
//----- (0000000000023F86) ----------------------------------------------------
__int64 __fastcall sub_23F86(const char *a1, char *a2, int a3)
{
__int64 v5[3]; // [rsp+20h] [rbp-30h] BYREF
char v6; // [rsp+38h] [rbp-18h]
int v7; // [rsp+48h] [rbp-8h]
int i; // [rsp+4Ch] [rbp-4h]
i = 0;
v7 = 0;
memset(v5, 0, sizeof(v5));
v6 = 0;
if ( !a1 || !a2 || a3 <= 23 )
return 0xFFFFFFFFLL;
v7 = strlen(a1);
for ( i = 0; i < v7; ++i )
*((_BYTE *)v5 + i) = a1[dword_236A40[i]];
snprintf(a2, a3, "%s", (const char *)v5);
return 0LL;
}
// 236A40: using guessed type int dword_236A40[32];
//----- (000000000002405B) ----------------------------------------------------
__int64 __fastcall sub_2405B(const char *a1, char *a2, int a3)
{
__int64 v5[3]; // [rsp+20h] [rbp-30h] BYREF
char v6; // [rsp+38h] [rbp-18h]
int v7; // [rsp+48h] [rbp-8h]
int i; // [rsp+4Ch] [rbp-4h]
i = 0;
v7 = 0;
memset(v5, 0, sizeof(v5));
v6 = 0;
if ( !a1 || !a2 || a3 <= 23 )
return 0xFFFFFFFFLL;
v7 = strlen(a1);
for ( i = 0; i < v7; ++i )
*((_BYTE *)v5 + dword_236A40[i]) = a1[i];
snprintf(a2, a3, "%s", (const char *)v5);
return 0LL;
}
// 236A40: using guessed type int dword_236A40[32];
//----- (0000000000024130) ----------------------------------------------------
__int64 __fastcall sub_24130(const char *a1, char *a2, int a3)
{
char v4; // dl
__int64 v6[3]; // [rsp+20h] [rbp-30h] BYREF
char v7; // [rsp+38h] [rbp-18h]
int v8; // [rsp+48h] [rbp-8h]
int i; // [rsp+4Ch] [rbp-4h]
i = 0;
v8 = 0;
memset(v6, 0, sizeof(v6));
v7 = 0;
if ( !a1 || !a2 || a3 <= 23 )
return 0xFFFFFFFFLL;
v8 = strlen(a1);
for ( i = 0; i < v8; ++i )
{
if ( dword_236AC0[i] == 1 )
{
if ( a1[i] == 49 )
v4 = 48;
else
v4 = 49;
*((_BYTE *)v6 + i) = v4;
}
else
{
*((_BYTE *)v6 + i) = a1[i];
}
}
snprintf(a2, a3, "%s", (const char *)v6);
return 0LL;
}
// 236AC0: using guessed type _DWORD dword_236AC0[24];
//----- (000000000002423B) ----------------------------------------------------
__int64 __fastcall sub_2423B(const char *a1, char *a2, int a3, char *a4, int a5)
{
unsigned int v9; // [rsp+28h] [rbp-8h]
unsigned int i; // [rsp+2Ch] [rbp-4h]
v9 = -1;
if ( !a1 || !a2 || !a4 )
return 0xFFFFFFFFLL;
for ( i = 0; i <= 2; ++i )
{
if ( !strcmp(&oui_map[12 * i], a1) )
{
snprintf(a2, a3, "%c", (unsigned int)oui_map[12 * i + 7]);
snprintf(a4, a5, "%s", &oui_map[12 * i + 8]);
return 0;
}
}
return v9;
}
//----- (0000000000024365) ----------------------------------------------------
__int64 __fastcall sub_24365(_BYTE *a1, const char *a2, char *a3, int a4)
{
unsigned int v7; // [rsp+28h] [rbp-8h]
unsigned int i; // [rsp+2Ch] [rbp-4h]
v7 = -1;
if ( !a3 || !a1 || !a2 )
return 0xFFFFFFFFLL;
for ( i = 0; i <= 2; ++i )
{
if ( oui_map[12 * i + 7] == *a1 && !strcmp(&oui_map[12 * i + 8], a2) )
{
snprintf(a3, a4, "%s", &oui_map[12 * i]);
return 0;
}
}
return v7;
}
//----- (000000000002446F) ----------------------------------------------------
__int64 __fastcall sub_2446F(int a1, __int64 a2, int a3)
{
char v4; // al
int i; // [rsp+1Ch] [rbp-4h]
if ( !a2 )
return 0xFFFFFFFFLL;
for ( i = a3 - 1; i >= 0; --i )
{
if ( ((a1 >> i) & 1) != 0 )
v4 = 49;
else
v4 = 48;
*(_BYTE *)(a2 + a3 - 2 - i) = v4;
}
*(_BYTE *)(a3 - 1LL + a2) = 0;
return 0LL;
}
//----- (0000000000024502) ----------------------------------------------------
_BOOL8 __fastcall sub_24502(_BYTE *a1, const char *a2)
{
int v3; // [rsp+10h] [rbp-50h] BYREF
__int16 v4; // [rsp+14h] [rbp-4Ch]
char v5; // [rsp+16h] [rbp-4Ah]
int v6[4]; // [rsp+20h] [rbp-40h] BYREF
__int64 v7[3]; // [rsp+30h] [rbp-30h] BYREF
int v8; // [rsp+48h] [rbp-18h]
int v9; // [rsp+58h] [rbp-8h]
int i; // [rsp+5Ch] [rbp-4h]
i = 0;
v9 = 0;
memset(v7, 0, sizeof(v7));
v8 = 0;
v6[0] = 0;
v3 = 0;
v4 = 0;
v5 = 0;
if ( !a1 || !a2 )
return 0LL;
if ( strlen(a2) != 8 )
return 0LL;
for ( i = 0; i <= 7; ++i )
{
if ( ((*__ctype_b_loc())[a2[i]] & 0x1000) == 0 )
return 0LL;
}
v9 = strtoll(a2, 0LL, 10);
if ( (unsigned int)sub_2446F(v9, (__int64)v7, 28) )
return 0LL;
for ( i = 0; i <= 2; ++i )
*((_BYTE *)v6 + i) = *((_BYTE *)v7 + i);
return (unsigned int)sub_24365(a1, (const char *)v6, (char *)&v3, 7) == 0;
}
//----- (0000000000024664) ----------------------------------------------------
__int64 __fastcall QNAP_MAC_To_Cloudkey(const char *a1, char *a2, int a3)
{
__int64 v5[3]; // [rsp+20h] [rbp-F0h] BYREF
char v6; // [rsp+38h] [rbp-D8h]
__int64 v7[3]; // [rsp+40h] [rbp-D0h] BYREF
char v8; // [rsp+58h] [rbp-B8h]
__int64 v9[3]; // [rsp+60h] [rbp-B0h] BYREF
char v10; // [rsp+78h] [rbp-98h]
int v11[4]; // [rsp+80h] [rbp-90h] BYREF
__int16 v12[8]; // [rsp+90h] [rbp-80h] BYREF
char nptr[4]; // [rsp+A0h] [rbp-70h] BYREF
__int16 v14; // [rsp+A4h] [rbp-6Ch]
char v15; // [rsp+A6h] [rbp-6Ah]
int v16; // [rsp+B0h] [rbp-60h] BYREF
__int16 v17; // [rsp+B4h] [rbp-5Ch]
char v18; // [rsp+B6h] [rbp-5Ah]
__int64 v19[4]; // [rsp+C0h] [rbp-50h] BYREF
char v20[8]; // [rsp+E0h] [rbp-30h] BYREF
__int64 v21; // [rsp+E8h] [rbp-28h]
__int64 v22; // [rsp+F0h] [rbp-20h]
int v23; // [rsp+F8h] [rbp-18h]
unsigned int v24; // [rsp+FCh] [rbp-14h]
int v25; // [rsp+100h] [rbp-10h]
unsigned int v26; // [rsp+104h] [rbp-Ch]
int v27; // [rsp+108h] [rbp-8h]
unsigned int i; // [rsp+10Ch] [rbp-4h]
*(_QWORD *)v20 = 0LL;
v21 = 0LL;
v22 = 0LL;
v23 = 0;
memset(v19, 0, sizeof(v19));
v16 = 0;
v17 = 0;
v18 = 0;
*(_DWORD *)nptr = 0;
v14 = 0;
v15 = 0;
v12[0] = 0;
v11[0] = 0;
memset(v9, 0, sizeof(v9));
v10 = 0;
memset(v7, 0, sizeof(v7));
v8 = 0;
memset(v5, 0, sizeof(v5));
v6 = 0;
i = 0;
v27 = 0;
v25 = 0;
v26 = -1;
v24 = 0;
if ( a1 && a2 && a3 > 10 )
{
v25 = strlen(a1);
while ( v27 < v25 )
{
if ( a1[v27] == 58 )
{
++v27;
}
else
{
*((_BYTE *)v19 + (int)i++) = toupper(a1[v27]);
if ( i > 0x1E )
break;
++v27;
}
}
if ( (unsigned int)sub_23E57((const char *)v19) )
{
for ( i = 0; (int)i <= 5; ++i )
{
*((_BYTE *)&v16 + (int)i) = *((_BYTE *)v19 + (int)i);
nptr[i] = *((_BYTE *)v19 + (int)(i + 6));
}
v24 = strtoll(nptr, 0LL, 16);
if ( !(unsigned int)sub_2446F(v24, (__int64)v9, 25) )
{
sub_23EE2((const char *)v9);
if ( !(unsigned int)sub_23F86((const char *)v9, (char *)v7, 25)
&& !(unsigned int)sub_24130((const char *)v7, (char *)v5, 25) )
{
sub_23EE2((const char *)v5);
if ( !(unsigned int)sub_2423B((const char *)&v16, (char *)v12, 2, (char *)v11, 4) )
{
snprintf(v20, 0x1CuLL, "%s%s", (const char *)v11, (const char *)v5);
v24 = strtoll(v20, 0LL, 2);
snprintf(a2, a3, "%s%08d", (const char *)v12, v24);
return 0;
}
}
}
}
}
return v26;
}
//----- (00000000000249D8) ----------------------------------------------------
__int64 __fastcall QNAP_Cloudkey_To_MAC(const char *a1, char *a2, int a3)
{
__int64 v5[3]; // [rsp+20h] [rbp-E0h] BYREF
char v6; // [rsp+38h] [rbp-C8h]
__int64 v7[3]; // [rsp+40h] [rbp-C0h] BYREF
char v8; // [rsp+58h] [rbp-A8h]
char v9[8]; // [rsp+60h] [rbp-A0h] BYREF
__int64 v10; // [rsp+68h] [rbp-98h]
__int64 v11; // [rsp+70h] [rbp-90h]
char v12; // [rsp+78h] [rbp-88h]
__int64 v13[3]; // [rsp+80h] [rbp-80h] BYREF
int v14; // [rsp+98h] [rbp-68h]
char nptr[8]; // [rsp+A0h] [rbp-60h] BYREF
char v16; // [rsp+A8h] [rbp-58h]
int v17[4]; // [rsp+B0h] [rbp-50h] BYREF
__int16 v18[8]; // [rsp+C0h] [rbp-40h] BYREF
char v19[4]; // [rsp+D0h] [rbp-30h] BYREF
__int16 v20; // [rsp+D4h] [rbp-2Ch]
char v21; // [rsp+D6h] [rbp-2Ah]
int v22; // [rsp+E0h] [rbp-20h] BYREF
__int16 v23; // [rsp+E4h] [rbp-1Ch]
char v24; // [rsp+E6h] [rbp-1Ah]
unsigned int v25; // [rsp+F0h] [rbp-10h]
int v26; // [rsp+F4h] [rbp-Ch]
int i; // [rsp+F8h] [rbp-8h]
unsigned int v28; // [rsp+FCh] [rbp-4h]
v28 = -1;
v25 = 0;
i = 0;
v26 = 0;
v22 = 0;
v23 = 0;
v24 = 0;
*(_DWORD *)v19 = 0;
v20 = 0;
v21 = 0;
v18[0] = 0;
v17[0] = 0;
*(_QWORD *)nptr = 0LL;
v16 = 0;
memset(v13, 0, sizeof(v13));
v14 = 0;
*(_QWORD *)v9 = 0LL;
v10 = 0LL;
v11 = 0LL;
v12 = 0;
memset(v7, 0, sizeof(v7));
v8 = 0;
memset(v5, 0, sizeof(v5));
v6 = 0;
if ( a1 )
{
if ( a2 )
{
if ( a3 > 12 && strlen(a1) == 9 )
{
LOBYTE(v18[0]) = *a1;
snprintf(nptr, 9uLL, "%s", a1 + 1);
if ( sub_24502(v18, nptr) )
{
v25 = strtoll(nptr, 0LL, 10);
if ( !(unsigned int)sub_2446F(v25, (__int64)v13, 28) )
{
for ( i = 0; i <= 2; ++i )
*((_BYTE *)v17 + i) = *((_BYTE *)v13 + i);
i = 3;
v26 = 0;
while ( i <= 26 )
*((_BYTE *)v5 + v26++) = *((_BYTE *)v13 + i++);
if ( !(unsigned int)sub_24365(v18, (const char *)v17, (char *)&v22, 7) )
{
sub_23EE2((const char *)v5);
if ( !(unsigned int)sub_24130((const char *)v5, (char *)v7, 25)
&& !(unsigned int)sub_2405B((const char *)v7, v9, 25) )
{
sub_23EE2(v9);
v25 = strtoll(v9, 0LL, 2);
snprintf(v19, 7uLL, "%06X", v25);
snprintf(a2, a3, "%s%s", (const char *)&v22, v19);
return 0;
}
}
}
}
}
}
}
return v28;
}
//----- (0000000000024D18) ----------------------------------------------------
int init_debugger()
{
FILE **v0; // rax
FILE *v1; // rdx
struct stat64 stat_buf; // [rsp+0h] [rbp-90h] BYREF
LODWORD(v0) = sub_2D9E0(g_debug_file, &stat_buf);
if ( !(_DWORD)v0 )
{
LODWORD(v0) = stat_buf.st_mode & 0xF000;
if ( (_DWORD)v0 == 0x8000 )
{
v1 = fopen64(g_debug_file, "a");
v0 = &g_debug_fp;
g_debug_fp = v1;
}
}
return (int)v0;
}
// 2379A8: using guessed type FILE *g_debug_fp;
//----- (0000000000024D74) ----------------------------------------------------
FILE **finish_debugger()
{
FILE **result; // rax
result = (FILE **)g_debug_fp;
if ( g_debug_fp )
{
fclose(g_debug_fp);
result = &g_debug_fp;
g_debug_fp = 0LL;
}
return result;
}
// 2379A8: using guessed type FILE *g_debug_fp;
//----- (0000000000024DA9) ----------------------------------------------------
_BOOL8 __fastcall sub_24DA9(char *a1)
{
struct stat64 stat_buf; // [rsp+10h] [rbp-90h] BYREF
return !sub_2D9E0(a1, &stat_buf) && (stat_buf.st_mode & 0xF000) == 0x8000;
}
//----- (0000000000024DFC) ----------------------------------------------------
__int64 __fastcall sub_24DFC(FILE *a1)
{
FILE *stream; // [rsp+8h] [rbp-1028h]
char s[4104]; // [rsp+10h] [rbp-1020h] BYREF
char *v4; // [rsp+1018h] [rbp-18h]
unsigned int v5; // [rsp+1024h] [rbp-Ch]
size_t i; // [rsp+1028h] [rbp-8h]
stream = a1;
if ( !a1 )
return 0LL;
i = 0LL;
v5 = 0;
while ( 1 )
{
do
{
if ( !fgets(s, 4096, stream) )
return 0LL;
for ( i = strlen(s); i; --i )
{
v4 = &s[i - 1];
if ( *v4 != 13 && *v4 != 10 )
break;
*v4 = 0;
}
}
while ( !i );
if ( s[0] != 35 )
break;
if ( i != 1 && s[1] == 33 )
return 1;
}
return v5;
}
//----- (0000000000024EF0) ----------------------------------------------------
__int64 __fastcall sub_24EF0(const char *a1)
{
unsigned int v2; // [rsp+14h] [rbp-Ch]
FILE *stream; // [rsp+18h] [rbp-8h]
stream = fopen64(a1, "r");
v2 = sub_24DFC(stream);
fclose(stream);
return v2;
}
//----- (0000000000024F33) ----------------------------------------------------
__int64 __fastcall sub_24F33(__int64 a1, const char *a2)
{
struct tm *v3; // rax
const char *v4; // rax
char s[64]; // [rsp+10h] [rbp-50h] BYREF
time_t timer; // [rsp+50h] [rbp-10h] BYREF
FILE *stream; // [rsp+58h] [rbp-8h]
if ( !a1 )
return 0LL;
timer = time(0LL);
v3 = localtime(&timer);
strftime(s, 0x40uLL, "%F %T", v3);
stream = fopen64(g_internal_log_file, "a");
if ( !stream )
return (unsigned int)-*__errno_location();
if ( a2 )
v4 = a2;
else
v4 = (const char *)&unk_2F51D;
fprintf(stream, "%s,%.8lx,%s\n", s, a1, v4);
fclose(stream);
return 0LL;
}
//----- (0000000000024FFF) ----------------------------------------------------
__int64 __fastcall sub_24FFF(const char *a1, char *a2)
{
const char *newa; // [rsp+0h] [rbp-C0h]
char *ptr; // [rsp+18h] [rbp-A8h] BYREF
struct stat64 stat_buf; // [rsp+20h] [rbp-A0h] BYREF
unsigned int v6; // [rsp+B8h] [rbp-8h]
int fd; // [rsp+BCh] [rbp-4h]
newa = a2;
ptr = 0LL;
if ( !sub_2D9F0(a2, &stat_buf) )
{
asprintf(&ptr, "%s.XXXXXX", a2);
if ( g_debug_fp )
{
fprintf(g_debug_fp, "%s is existed\n", a2);
fflush(g_debug_fp);
}
if ( ptr )
{
fd = mkstemp64(ptr);
if ( fd != -1 )
{
if ( g_debug_fp )
{
fprintf(g_debug_fp, "change to %s\n", ptr);
fflush(g_debug_fp);
}
newa = ptr;
close(fd);
unlink(ptr);
}
}
}
v6 = rename(a1, newa);
if ( ptr )
free(ptr);
return v6;
}
// 2379A8: using guessed type FILE *g_debug_fp;
//----- (000000000002517D) ----------------------------------------------------
__int64 __fastcall sub_2517D(int a1)
{
int *v1; // rdx
__int64 result; // rax
unsigned int v3; // [rsp+1Ch] [rbp-4h]
v3 = *__errno_location();
close(a1);
v1 = __errno_location();
result = v3;
*v1 = v3;
return result;
}
//----- (00000000000251AB) ----------------------------------------------------
__int64 __fastcall sub_251AB(char *a1, __int64 a2, __int64 a3)
{
__int64 v4; // [rsp+8h] [rbp-B8h] BYREF
__int64 v5; // [rsp+10h] [rbp-B0h]
char *file; // [rsp+18h] [rbp-A8h]
struct stat64 stat_buf; // [rsp+20h] [rbp-A0h] BYREF
int fd; // [rsp+B8h] [rbp-8h]
unsigned int v9; // [rsp+BCh] [rbp-4h]
file = a1;
v5 = a2;
v4 = a3;
if ( sub_2D9E0(a1, &stat_buf) || (stat_buf.st_mode & 0xF000) == 0x8000 || (stat_buf.st_mode & 0xF000) == 0x4000 )
{
fd = open64(file, 2048);
if ( fd == -1 )
{
return 0xFFFFFFFFLL;
}
else
{
if ( v5 )
v9 = ioctl(fd, 0x80086601uLL, v5);
else
v9 = ioctl(fd, 0x40086602uLL, &v4);
sub_2517D(fd);
return v9;
}
}
else
{
*__errno_location() = 95;
return 0xFFFFFFFFLL;
}
}
//----- (000000000002529F) ----------------------------------------------------
__int64 __fastcall sub_2529F(char *a1)
{
__int64 v2; // [rsp+10h] [rbp-10h] BYREF
unsigned int v3; // [rsp+1Ch] [rbp-4h]
v3 = sub_251AB(a1, (__int64)&v2, 0LL);
if ( v3 )
{
if ( g_debug_fp )
fprintf(g_debug_fp, "Get attr of file %s failed\n", a1);
return v3;
}
else
{
if ( g_debug_fp )
fprintf(g_debug_fp, "File (%s) original attr(%.8lx)\n", a1, v2);
v2 = (unsigned int)v2 & 0xFFFFFFCF;
if ( g_debug_fp )
fprintf(g_debug_fp, "File (%s) target attr(%.8lx)\n", a1, v2);
v3 = sub_251AB(a1, 0LL, v2);
if ( v3 )
{
if ( g_debug_fp )
fprintf(g_debug_fp, "Set attr(%lux) of file %s failed\n", v2, a1);
return v3;
}
else
{
return 0LL;
}
}
}
// 2379A8: using guessed type FILE *g_debug_fp;
// 2529F: using guessed type __int64 var_10;
//----- (00000000000253D9) ----------------------------------------------------
__int64 __fastcall sub_253D9(char *a1)
{
char *ptr; // [rsp+10h] [rbp-20h] BYREF
char *v3; // [rsp+18h] [rbp-18h] BYREF
struct dirent64 *v4; // [rsp+20h] [rbp-10h]
DIR *dirp; // [rsp+28h] [rbp-8h]
sub_2529F(a1);
dirp = opendir(a1);
if ( !dirp )
return 0LL;
while ( 1 )
{
v4 = readdir64(dirp);
if ( !v4 )
break;
if ( v4->d_type == 4 )
{
if ( strcmp(v4->d_name, ".") && strcmp(v4->d_name, "..") )
{
ptr = 0LL;
asprintf(&ptr, "%s/%s", a1, v4->d_name);
if ( ptr )
{
sub_253D9(ptr);
free(ptr);
}
}
}
else
{
v3 = 0LL;
asprintf(&v3, "%s/%s", a1, v4->d_name);
if ( v3 )
{
sub_2529F(v3);
free(v3);
}
}
}
closedir(dirp);
return 0LL;
}
//----- (0000000000025530) ----------------------------------------------------
void __fastcall sub_25530(char *a1)
{
int *v1; // rax
int *v2; // rax
char *ptr; // [rsp+18h] [rbp-8h] BYREF
sub_253D9(a1);
if ( chmod(a1, 0x1A4u) && g_debug_fp )
{
v1 = __errno_location();
fprintf(g_debug_fp, "chmod '%s' failed(%d)", a1, (unsigned int)*v1);
}
ptr = 0LL;
asprintf(&ptr, "%s.--", a1);
if ( ptr )
{
if ( (unsigned int)sub_24FFF(a1, ptr) )
{
if ( g_debug_fp )
{
v2 = __errno_location();
fprintf(g_debug_fp, "rename '%s' to '%s' failed(%d)", a1, ptr, (unsigned int)*v2);
}
}
free(ptr);
}
}
// 2379A8: using guessed type FILE *g_debug_fp;
//----- (0000000000025626) ----------------------------------------------------
char *__fastcall sub_25626(const char *a1, int a2)
{
int v3; // [rsp+10h] [rbp-10h]
int i; // [rsp+14h] [rbp-Ch]
char *v5; // [rsp+18h] [rbp-8h]
v5 = (char *)a1;
if ( a2 )
{
v5 = strdup(a1);
if ( !v5 )
exit(12);
}
v3 = strlen(a1);
for ( i = 0; i < v3; ++i )
v5[i] -= 99;
return v5;
}
//----- (00000000000256B0) ----------------------------------------------------
__int64 __fastcall sub_256B0(__int64 a1)
{
__int64 result; // rax
int i; // [rsp+1Ch] [rbp-14h]
for ( i = 0; ; ++i )
{
result = *(_QWORD *)(8LL * i + a1);
if ( !result )
break;
*(_QWORD *)(8LL * i + a1) = sub_25626(*(const char **)(8LL * i + a1), 1);
}
return result;
}
//----- (0000000000025729) ----------------------------------------------------
unsigned int *sub_25729()
{
unsigned int *result; // rax
result = (unsigned int *)g_keyword_decrypted;
if ( !g_keyword_decrypted )
{
sub_256B0((__int64)&plain_keyword_download);
sub_256B0((__int64)&plain_keyword_infect_script);
sub_256B0((__int64)&plain_keyword_exec_decode);
sub_256B0((__int64)&qnap_qpkg_dot_folder);
sub_256B0((__int64)&plain_keyword_download_except);
sub_256B0((__int64)&g_system_file);
result = &g_keyword_decrypted;
g_keyword_decrypted = 1;
}
return result;
}
// 237040: using guessed type void *plain_keyword_download;
// 237060: using guessed type void *plain_keyword_infect_script;
// 237080: using guessed type void *plain_keyword_exec_decode;
// 2370A0: using guessed type void *plain_keyword_download_except;
// 2370C0: using guessed type void *qnap_qpkg_dot_folder;
// 237120: using guessed type void *g_system_file;
// 237990: using guessed type unsigned int g_keyword_decrypted;
//----- (00000000000257A5) ----------------------------------------------------
unsigned int *sub_257A5()
{
unsigned int *result; // rax
result = (unsigned int *)g_strings_decrypted;
if ( !g_strings_decrypted )
{
sub_25626(g_app_name, 0);
sub_25626(found_malware_msg_1, 0);
sub_25626(found_malware_msg_2, 0);
sub_25626(found_malware_msg_3, 0);
sub_25626(qpkg_conf, 0);
sub_25626(cmd_mount_flash_config, 0);
sub_25626(cmd_unmount_flash_config, 0);
sub_25626(flash_config_mount_path, 0);
sub_25626(cmd_check_flash_config_mount, 0);
sub_25626(autorun_sh, 0);
sub_25626(runonce, 0);
sub_25626(g_debug_file, 0);
sub_25626(quarantine_dir, 0);
sub_25626(g_internal_log_file, 0);
sub_25626(update_pkg_dir, 0);
sub_25626(qts_cust_bin, 0);
sub_25626(qts_cust_sh, 0);
g_strings_decrypted = 1;
return sub_25729();
}
return result;
}
// 237994: using guessed type unsigned int g_strings_decrypted;
//----- (0000000000025928) ----------------------------------------------------
_BOOL8 __fastcall sub_25928(char a1)
{
return !a1 || strchr(" \t\\;\r\n/()<>", a1);
}
//----- (000000000002596B) ----------------------------------------------------
__int64 __fastcall sub_2596B(const char *a1, __int64 a2)
{
char *j; // rax
int v3; // ebx
char *s; // [rsp+10h] [rbp-30h]
char *v6; // [rsp+18h] [rbp-28h]
char *haystack; // [rsp+20h] [rbp-20h]
int v8; // [rsp+28h] [rbp-18h]
int i; // [rsp+2Ch] [rbp-14h]
v8 = 4;
for ( i = 0; *(_QWORD *)(8LL * i + a2); ++i )
{
if ( (v8 & g_match_type) == 0 )
{
s = *(char **)(8LL * i + a2);
for ( j = strstr(a1, s); ; j = strstr(haystack, s) )
{
v6 = j;
if ( !j )
break;
haystack = &j[strlen(s)];
if ( (v6 == a1 || sub_25928(*(v6 - 1))) && sub_25928(*haystack) )
{
g_match_type |= v8;
if ( g_debug_fp )
fprintf(g_debug_fp, "%s:%d:match(%x)(%s, %s)\n", "match_special_keyword", 432LL, g_match_type, a1, s);
if ( g_match_keyword_count <= 1023 )
{
v3 = g_match_keyword_count;
g_match_keyword_list[v3] = strdup(*(const char **)(8LL * i + a2));
++g_match_keyword_count;
}
break;
}
}
}
v8 *= 2;
}
return g_match_type;
}
// 237988: using guessed type unsigned int g_match_type;
// 23798C: using guessed type int g_match_keyword_count;
// 2379A8: using guessed type FILE *g_debug_fp;
// 237A80: using guessed type _QWORD g_match_keyword_list[1024];
//----- (0000000000025B57) ----------------------------------------------------
__int64 __fastcall sub_25B57(const char *a1, __int64 a2, __int64 a3, unsigned int a4)
{
char *j; // rax
int v5; // ebx
char *s; // [rsp+20h] [rbp-30h]
char *v10; // [rsp+28h] [rbp-28h]
char *haystack; // [rsp+30h] [rbp-20h]
int i; // [rsp+3Ch] [rbp-14h]
int v13; // [rsp+3Ch] [rbp-14h]
if ( a3 )
{
for ( i = 0; *(_QWORD *)(8LL * i + a2); ++i )
;
}
v13 = 0;
LABEL_23:
if ( !*(_QWORD *)(8LL * v13 + a2) )
return 0LL;
s = *(char **)(8LL * v13 + a2);
for ( j = strstr(a1, s); ; j = strstr(haystack, s) )
{
v10 = j;
if ( !j )
{
++v13;
goto LABEL_23;
}
if ( g_debug_fp )
fprintf(g_debug_fp, "mstr=%s", j);
haystack = &v10[strlen(s)];
if ( (v10 == a1 || sub_25928(*(v10 - 1)))
&& sub_25928(*haystack)
&& (!a3 || !*(_QWORD *)(8LL * v13 + a3) || !strstr(haystack, *(const char **)(8LL * v13 + a3))) )
{
break;
}
}
if ( g_debug_fp )
fprintf(g_debug_fp, "%s:%d:found keyword(%s,%s)\n", "match_keyword_or", 467LL, a1, s);
if ( g_match_keyword_count <= 1023 )
{
v5 = g_match_keyword_count;
g_match_keyword_list[v5] = strdup(s);
++g_match_keyword_count;
}
return a4;
}
// 23798C: using guessed type int g_match_keyword_count;
// 2379A8: using guessed type FILE *g_debug_fp;
// 237A80: using guessed type _QWORD g_match_keyword_list[1024];
//----- (0000000000025DA3) ----------------------------------------------------
__int64 __fastcall sub_25DA3(const char *a1)
{
unsigned int v2; // [rsp+1Ch] [rbp-4h]
v2 = 0;
if ( (g_match_type & 4) == 0 )
{
sub_2596B(a1, (__int64)&plain_keyword_exec_decode);
if ( (g_match_type & 4) != 0 )
return 4LL;
}
if ( (g_match_type & 1) == 0 )
v2 = sub_25B57(a1, (__int64)&plain_keyword_download, (__int64)&plain_keyword_download_except, 1u);
if ( (g_match_type & 2) == 0 )
v2 |= sub_25B57(a1, (__int64)&plain_keyword_infect_script, 0LL, 2u);
return v2;
}
// 237040: using guessed type void *plain_keyword_download;
// 237060: using guessed type void *plain_keyword_infect_script;
// 237080: using guessed type void *plain_keyword_exec_decode;
// 2370A0: using guessed type void *plain_keyword_download_except;
// 237988: using guessed type unsigned int g_match_type;
//----- (0000000000025E5A) ----------------------------------------------------
char *__fastcall sub_25E5A(const char *a1)
{
char *result; // rax
result = strchr(a1, 35);
if ( result )
*result = 0;
return result;
}
//----- (0000000000025E8B) ----------------------------------------------------
int *sub_25E8B()
{
int *result; // rax
int i; // [rsp+Ch] [rbp-4h]
for ( i = 0; i < g_match_keyword_count; ++i )
free((void *)g_match_keyword_list[i]);
result = &g_match_keyword_count;
g_match_keyword_count = 0;
return result;
}
// 23798C: using guessed type int g_match_keyword_count;
// 237A80: using guessed type _QWORD g_match_keyword_list[1024];
//----- (0000000000025ED6) ----------------------------------------------------
__int64 __fastcall sub_25ED6(const char *a1)
{
int v2; // eax
char v3; // [rsp+10h] [rbp-1030h] BYREF
int v4; // [rsp+1010h] [rbp-30h]
int v5; // [rsp+1014h] [rbp-2Ch]
int n[2]; // [rsp+1018h] [rbp-28h]
char *s; // [rsp+1020h] [rbp-20h]
unsigned int v8; // [rsp+102Ch] [rbp-14h]
FILE *stream; // [rsp+1030h] [rbp-10h]
int i; // [rsp+1038h] [rbp-8h]
unsigned int v11; // [rsp+103Ch] [rbp-4h]
sub_25729();
g_match_type = 0;
sub_25E8B();
if ( !a1 )
return 0LL;
v11 = 0;
stream = fopen64(a1, "r");
if ( stream )
{
s = &v3;
*(_QWORD *)n = 4096LL;
while ( fgets(s, n[0], stream) )
{
v2 = strlen(s);
v5 = v2 + 1;
if ( v2 == -1 )
{
if ( g_debug_fp )
fprintf(g_debug_fp, "%s could be a binary file\n", a1);
break;
}
if ( (unsigned __int64)v5 >= *(_QWORD *)n && g_debug_fp )
fprintf(g_debug_fp, "%s could have a long line\n", a1);
sub_25E5A(s);
if ( *s )
{
if ( strcmp(s, "\n") )
{
v4 = sub_25DA3(s);
g_match_type |= v4;
if ( (g_match_type & 4) != 0 || (g_match_type & 3) == 3 )
{
v11 = 1;
if ( g_debug_fp )
fprintf(g_debug_fp, "%s infected by %x\n", a1, g_match_type);
for ( i = 0; i < g_match_keyword_count; ++i )
{
if ( g_debug_fp )
fprintf(g_debug_fp, "\t%s\n", (const char *)g_match_keyword_list[i]);
}
break;
}
}
}
}
fclose(stream);
return v11;
}
else
{
v8 = *__errno_location();
if ( g_debug_fp )
{
fprintf(g_debug_fp, "%s:%d:open %s failed(%d)\n", "is_malware_script", 517LL, a1, v8);
fflush(g_debug_fp);
}
*__errno_location() = v8;
return 0LL;
}
}
// 237988: using guessed type unsigned int g_match_type;
// 23798C: using guessed type int g_match_keyword_count;
// 2379A8: using guessed type FILE *g_debug_fp;
// 237A80: using guessed type _QWORD g_match_keyword_list[1024];
//----- (00000000000261BD) ----------------------------------------------------
__int64 __fastcall sub_261BD(const char *a1)
{
int i; // [rsp+1Ch] [rbp-4h]
for ( i = 0; *(&qnap_qpkg_dot_folder + i); ++i )
{
if ( !strcmp(a1, (const char *)*(&qnap_qpkg_dot_folder + i)) )
return 1LL;
}
return 0LL;
}
// 2370C0: using guessed type void *qnap_qpkg_dot_folder;
//----- (000000000002621E) ----------------------------------------------------
void __fastcall sub_2621E(const char *a1, char *a2)
{
char *v2; // [rsp+18h] [rbp-A8h] BYREF
struct stat64 stat_buf; // [rsp+20h] [rbp-A0h] BYREF
char *ptr; // [rsp+B0h] [rbp-10h] BYREF
char *v5; // [rsp+B8h] [rbp-8h]
ptr = 0LL;
asprintf(&ptr, "%s/%s", a1, quarantine_dir);
if ( ptr )
{
if ( sub_2D9E0(ptr, &stat_buf) )
mkdir(ptr, 0x180u);
free(ptr);
v5 = strrchr(a2, 47);
if ( v5 )
{
++v5;
v2 = 0LL;
asprintf(&v2, "%s/%s/%s", a1, quarantine_dir, v5);
if ( v2 )
{
sub_253D9(a2);
sub_24FFF(a2, v2);
found_special_malware = 1;
free(v2);
}
}
}
}
// 237998: using guessed type unsigned int found_special_malware;
//----- (0000000000026362) ----------------------------------------------------
char *__fastcall sub_26362(char *a1, signed int a2)
{
*a1 = 0;
Get_Private_Profile_String(
(__int64)"SHARE_DEF",
(__int64)"defVolMP",
"/share/CACHEDEV1_DATA",
a1,
a2,
(__int64)"/etc/config/def_share.info");
return a1;
}
//----- (00000000000263AC) ----------------------------------------------------
void __fastcall sub_263AC(char *a1)
{
char v1[256]; // [rsp+10h] [rbp-100h] BYREF
sub_26362(v1, 256);
if ( v1[0] )
sub_2621E(v1, a1);
}
//----- (00000000000263F8) ----------------------------------------------------
void __fastcall sub_263F8(__int64 a1, int a2)
{
int v2; // eax
int v3; // eax
int v4; // eax
int v5; // eax
char *s1[3]; // [rsp+10h] [rbp-40h]
void *ptr; // [rsp+28h] [rbp-28h]
void *v8; // [rsp+30h] [rbp-20h]
int v9; // [rsp+3Ch] [rbp-14h]
int v10; // [rsp+40h] [rbp-10h]
int j; // [rsp+44h] [rbp-Ch]
int i; // [rsp+48h] [rbp-8h]
int v13; // [rsp+4Ch] [rbp-4h]
v13 = 0;
v8 = malloc(4LL * a2);
for ( i = 0; i < a2; ++i )
{
if ( g_debug_fp )
{
fprintf(
g_debug_fp,
"%s:%d:[%s][%s][%s][%s]\n",
"_check_qpkg",
654LL,
(const char *)(11268LL * i + a1),
(const char *)(11268LL * i + a1 + 771),
(const char *)(11268LL * i + a1 + 1289),
(const char *)(11268LL * i + a1 + 5988));
fflush(g_debug_fp);
}
if ( !strcasecmp((const char *)(11268LL * i + a1 + 771), "TRUE") )
{
s1[0] = (char *)(11268LL * i + a1 + 1289);
s1[1] = (char *)(11268LL * i + a1 + 5988);
for ( j = 0; j <= 1; ++j )
{
if ( strcmp(s1[j], "null") )
{
if ( g_debug_fp )
{
fprintf(g_debug_fp, "%s:%d:%s,%s\n", "_check_qpkg", 661LL, (const char *)(11268LL * i + a1), s1[j]);
fflush(g_debug_fp);
}
if ( (unsigned int)sub_25ED6(s1[j]) )
{
if ( g_debug_fp )
{
fprintf(g_debug_fp, "%s,%s is infected\n", (const char *)(11268LL * i + a1), s1[j]);
fflush(g_debug_fp);
}
sub_25530(s1[j]);
Set_Private_Profile_String(11268LL * i + a1, (__int64)"Enable", (__int64)"FALSE", (__int64)qpkg_conf);
if ( v8 )
*((_DWORD *)v8 + v13++) = i;
}
break;
}
}
}
}
if ( v13 > 0 )
{
v10 = 3 * (v13 + 1);
for ( i = 0; i < v13; ++i )
{
v2 = strlen((const char *)(11268LL * *((int *)v8 + i) + a1));
v10 += v2;
}
ptr = malloc(v10);
if ( ptr )
{
v9 = 0;
v3 = snprintf((char *)ptr, v10, "(%s", (const char *)(11268LL * *(int *)v8 + a1));
v9 += v3;
for ( i = 1; i < v13 && v10 > v9; ++i )
{
v4 = snprintf((char *)ptr + v9, v10 - v9, ",%s", (const char *)(11268LL * *((int *)v8 + i) + a1));
v9 += v4;
}
if ( v10 > v9 )
{
v5 = snprintf((char *)ptr + v9, v10 - v9, "%c", 41LL);
v9 += v5;
}
sub_24F33(1LL, 0LL);
free(ptr);
}
}
if ( v8 )
free(v8);
}
// 2379A8: using guessed type FILE *g_debug_fp;
//----- (00000000000268B4) ----------------------------------------------------
void sub_268B4()
{
void *ptr; // [rsp+0h] [rbp-10h] BYREF
int All_QPKG_Info; // [rsp+Ch] [rbp-4h]
ptr = 0LL;
All_QPKG_Info = Get_All_QPKG_Info(&ptr);
if ( ptr && All_QPKG_Info > 0 )
{
sub_263F8((__int64)ptr, All_QPKG_Info);
free(ptr);
}
ptr = 0LL;
All_QPKG_Info = Get_All_QFIX_Info(&ptr);
if ( ptr )
{
if ( All_QPKG_Info > 0 )
{
sub_263F8((__int64)ptr, All_QPKG_Info);
free(ptr);
}
}
}
//----- (0000000000026944) ----------------------------------------------------
void sub_26944()
{
size_t v0; // rax
char *v1; // [rsp+0h] [rbp-30h] BYREF
__int64 v2; // [rsp+8h] [rbp-28h] BYREF
char *ptr; // [rsp+10h] [rbp-20h] BYREF
struct dirent64 *v4; // [rsp+18h] [rbp-18h]
DIR *dirp; // [rsp+20h] [rbp-10h]
int v6; // [rsp+2Ch] [rbp-4h]
v6 = 0;
dirp = opendir(update_pkg_dir);
if ( g_debug_fp )
{
fprintf(g_debug_fp, "checking %s\n", update_pkg_dir);
fflush(g_debug_fp);
}
if ( dirp )
{
while ( 1 )
{
v4 = readdir64(dirp);
if ( !v4 )
break;
if ( v4->d_type == 8 )
{
if ( g_debug_fp )
{
fprintf(g_debug_fp, "checking entry %s\n", v4->d_name);
fflush(g_debug_fp);
}
v0 = strlen(v4->d_name);
if ( !strcmp((const char *)&v4->d_off + v0 + 6, ".qfix") )
{
ptr = 0LL;
asprintf(&ptr, "%s/%s", update_pkg_dir, v4->d_name);
if ( ptr )
{
if ( g_debug_fp )
{
fprintf(g_debug_fp, "checking file %s\n", ptr);
fflush(g_debug_fp);
}
v2 = 0LL;
if ( !(unsigned int)sub_251AB(ptr, (__int64)&v2, 0LL) )
{
if ( g_debug_fp )
{
fprintf(g_debug_fp, "%s attr %lx\n", ptr, v2);
fflush(g_debug_fp);
}
if ( (v2 & 0x10) != 0 || (v2 & 0x20) != 0 )
{
sub_25530(ptr);
v6 = 1;
}
}
free(ptr);
}
}
}
}
closedir(dirp);
if ( !sub_24DA9(qts_cust_sh) )
{
v1 = 0LL;
asprintf(&v1, "%s/%s", update_pkg_dir, qts_cust_bin);
if ( g_debug_fp )
{
fprintf(g_debug_fp, "checking %s\n", v1);
fflush(g_debug_fp);
}
if ( v1 )
{
if ( sub_24DA9(v1) )
{
sub_25530(v1);
v6 = 1;
}
free(v1);
}
}
if ( v6 )
sub_24F33(32LL, 0LL);
}
}
// 2379A8: using guessed type FILE *g_debug_fp;
//----- (0000000000026C76) ----------------------------------------------------
__int64 __fastcall sub_26C76(char *a1)
{
char *s2[6]; // [rsp+10h] [rbp-40h]
int i; // [rsp+44h] [rbp-Ch]
char *s1; // [rsp+48h] [rbp-8h]
s2[0] = "bash";
s2[1] = "sh";
s2[2] = "php";
s2[3] = "perl";
s2[4] = "python";
s2[5] = 0LL;
s1 = strrchr(a1, 47);
if ( s1 )
++s1;
else
s1 = a1;
for ( i = 0; s2[i]; ++i )
{
if ( !strcmp(s1, s2[i]) )
return 1LL;
}
return 0LL;
}
//----- (0000000000026D33) ----------------------------------------------------
__int64 __fastcall sub_26D33(char *a1)
{
char buf[32]; // [rsp+10h] [rbp-C0h] BYREF
struct stat64 stat_buf; // [rsp+30h] [rbp-A0h] BYREF
int v4; // [rsp+C0h] [rbp-10h]
int v5; // [rsp+C4h] [rbp-Ch]
int fd; // [rsp+C8h] [rbp-8h]
int i; // [rsp+CCh] [rbp-4h]
if ( sub_2D9E0(a1, &stat_buf) )
return 0LL;
if ( (stat_buf.st_mode & 0xF000) != 0x8000 )
return 0LL;
fd = open64(a1, 0);
if ( fd == -1 )
return 0LL;
v5 = read(fd, buf, 0x18uLL);
close(fd);
for ( i = 0; *((_DWORD *)&file_type_infos + 4 * i) != 99; ++i )
{
v4 = strlen(*((const char **)&file_type_infos + 2 * i + 1));
if ( v4 <= v5 && !memcmp(buf, *((const void **)&file_type_infos + 2 * i + 1), v5) )
return 0LL;
}
return 1LL;
}
//----- (0000000000026E75) ----------------------------------------------------
__int64 __fastcall sub_26E75(const char *a1)
{
char *v2; // [rsp+18h] [rbp-48h] BYREF
char *save_ptr; // [rsp+20h] [rbp-40h] BYREF
char *v4; // [rsp+28h] [rbp-38h]
char *delim; // [rsp+30h] [rbp-30h]
char *v6; // [rsp+38h] [rbp-28h]
char *j; // [rsp+40h] [rbp-20h]
int v8; // [rsp+4Ch] [rbp-14h]
int v9; // [rsp+50h] [rbp-10h]
unsigned int i; // [rsp+54h] [rbp-Ch]
char *v11; // [rsp+58h] [rbp-8h]
v6 = strdup(a1);
if ( !v6 )
return 0LL;
delim = "|;";
v4 = "\t <>";
v11 = strtok_r(v6, "|;", &save_ptr);
for ( i = 0; v11; v11 = strtok_r(0LL, delim, &save_ptr) )
{
v9 = 0;
v8 = 0;
for ( j = strtok_r(v11, v4, &v2); j; j = strtok_r(0LL, v4, &v2) )
{
if ( ++v9 > 2 )
break;
if ( v9 != 2 || v8 )
{
if ( v9 == 1 && (unsigned int)sub_26C76(j) )
{
v8 = 1;
}
else
{
if ( !(unsigned int)sub_26D33(j) )
break;
if ( (unsigned int)sub_25ED6(j) )
{
sub_25530(j);
i = 1;
goto LABEL_16;
}
}
}
}
}
LABEL_16:
free(v6);
return i;
}
//----- (0000000000026FE8) ----------------------------------------------------
FILE *sub_26FE8()
{
FILE *result; // rax
void *ptr; // [rsp+8h] [rbp-1038h] BYREF
int v2[1024]; // [rsp+10h] [rbp-1030h]
size_t n; // [rsp+1010h] [rbp-30h] BYREF
char *s; // [rsp+1018h] [rbp-28h] BYREF
int v5; // [rsp+1024h] [rbp-1Ch]
char *v6; // [rsp+1028h] [rbp-18h]
FILE *stream; // [rsp+1030h] [rbp-10h]
int v8; // [rsp+1038h] [rbp-8h]
int v9; // [rsp+103Ch] [rbp-4h]
result = fopen64("/etc/config/crontab", "r");
stream = result;
if ( result )
{
s = 0LL;
n = 0LL;
v9 = 0;
v8 = 0;
while ( getline(&s, &n, stream) > 0 )
{
++v9;
v6 = strchr(s, 35);
if ( v6 )
*v6 = 0;
ptr = 0LL;
v5 = sscanf(s, "%*[^ ] %*[^ ] %*[^ ] %*[^ ] %*[^ ] %m[^\r]", &ptr);
if ( v5 == 1 )
{
if ( (unsigned int)sub_26E75((const char *)ptr) )
{
found_special_malware = 1;
if ( v8 <= 1023 )
v2[v8++] = v9;
}
free(ptr);
}
}
if ( s )
free(s);
result = (FILE *)notified_special_malware;
if ( !notified_special_malware )
{
result = (FILE *)found_special_malware;
if ( found_special_malware )
{
notified_special_malware = 1;
return (FILE *)sub_24F33(2LL, 0LL);
}
}
}
return result;
}
// 237998: using guessed type unsigned int found_special_malware;
// 23799C: using guessed type unsigned int notified_special_malware;
// 26FE8: using guessed type int var_1030[1024];
//----- (000000000002714C) ----------------------------------------------------
_BOOL8 sub_2714C()
{
return system(cmd_check_flash_config_mount) == 0;
}
//----- (0000000000027169) ----------------------------------------------------
int sub_27169()
{
return system(cmd_mount_flash_config);
}
//----- (000000000002717E) ----------------------------------------------------
int sub_2717E()
{
return system(cmd_unmount_flash_config);
}
//----- (0000000000027193) ----------------------------------------------------
int sub_27193()
{
int result; // eax
char *ptr; // [rsp+0h] [rbp-10h] BYREF
int v2; // [rsp+8h] [rbp-8h]
int v3; // [rsp+Ch] [rbp-4h]
if ( g_debug_fp )
{
fprintf(g_debug_fp, "%s:%d\n", "check_autorun", 951LL);
fflush(g_debug_fp);
}
v3 = 0;
v2 = 0;
if ( !sub_2714C() )
{
sub_27169();
v2 = 1;
}
if ( g_debug_fp )
{
fprintf(g_debug_fp, "%s:%d\n", "check_autorun", 959LL);
fflush(g_debug_fp);
}
ptr = 0LL;
asprintf(&ptr, "%s/%s", flash_config_mount_path, autorun_sh);
if ( g_debug_fp )
{
fprintf(g_debug_fp, "%s:%d:%s\n", "check_autorun", 963LL, ptr);
fflush(g_debug_fp);
}
if ( ptr )
{
if ( (unsigned int)sub_25ED6(ptr) )
{
if ( g_debug_fp )
{
fprintf(g_debug_fp, "%s:%d\n", "check_autorun", 967LL);
fflush(g_debug_fp);
}
v3 = 1;
Enable_Autorun(0LL);
sub_25530(ptr);
}
if ( g_debug_fp )
{
fprintf(g_debug_fp, "%s:%d\n", "check_autorun", 972LL);
fflush(g_debug_fp);
}
free(ptr);
if ( g_debug_fp )
{
fprintf(g_debug_fp, "%s:%d\n", "check_autorun", 974LL);
fflush(g_debug_fp);
}
}
if ( v2 )
sub_2717E();
if ( g_debug_fp )
{
fprintf(g_debug_fp, "%s:%d\n", "check_autorun", 979LL);
fflush(g_debug_fp);
}
if ( v3 )
sub_24F33(4LL, 0LL);
result = (int)g_debug_fp;
if ( g_debug_fp )
{
fprintf(g_debug_fp, "%s:%d\n", "check_autorun", 988LL);
return fflush(g_debug_fp);
}
return result;
}
// 9BA0: using guessed type __int64 __fastcall Enable_Autorun(_QWORD);
// 2379A8: using guessed type FILE *g_debug_fp;
//----- (00000000000274C6) ----------------------------------------------------
__int64 __fastcall sub_274C6(const char *a1)
{
int v2; // [rsp+1Ch] [rbp-14h]
char *s1; // [rsp+20h] [rbp-10h]
int v4; // [rsp+28h] [rbp-8h]
int i; // [rsp+2Ch] [rbp-4h]
v4 = strlen(a1);
for ( i = 0; *(&g_system_file + i); ++i )
{
s1 = (char *)*(&g_system_file + i);
v2 = strlen(s1);
if ( v2 <= v4 && !strcmp(s1, &a1[v4 - v2]) )
return 1LL;
}
return 0LL;
}
// 237120: using guessed type void *g_system_file;
//----- (0000000000027563) ----------------------------------------------------
__int64 __fastcall sub_27563(const char *a1, unsigned int a2, unsigned int a3)
{
char *ptr; // [rsp+18h] [rbp-28h] BYREF
char *v6; // [rsp+20h] [rbp-20h] BYREF
struct dirent64 *v7; // [rsp+28h] [rbp-18h]
DIR *dirp; // [rsp+30h] [rbp-10h]
unsigned int v9; // [rsp+3Ch] [rbp-4h]
v9 = 0;
dirp = opendir(a1);
if ( dirp )
{
while ( 1 )
{
v7 = readdir64(dirp);
if ( !v7 )
break;
if ( a2 && v7->d_type == 4 )
{
if ( strcmp(v7->d_name, ".") )
{
if ( strcmp(v7->d_name, "..") )
{
ptr = 0LL;
asprintf(&ptr, "%s/%s", a1, v7->d_name);
if ( ptr )
{
if ( (unsigned int)sub_27563(ptr, a2, a3) )
v9 = 1;
free(ptr);
}
}
}
}
else
{
v6 = 0LL;
asprintf(&v6, "%s/%s", a1, v7->d_name);
if ( v6 )
{
if ( a3 && (unsigned int)sub_274C6(v6) )
{
free(v6);
}
else
{
if ( (unsigned int)sub_26D33(v6) && (unsigned int)sub_25ED6(v6) )
{
sub_263AC(v6);
found_special_malware = 1;
v9 = 1;
}
free(v6);
}
}
}
}
closedir(dirp);
}
return v9;
}
// 237998: using guessed type unsigned int found_special_malware;
//----- (000000000002772E) ----------------------------------------------------
__int64 __fastcall sub_2772E(const char *a1)
{
char *v2; // [rsp+10h] [rbp-30h] BYREF
char *v3; // [rsp+18h] [rbp-28h] BYREF
char *ptr; // [rsp+20h] [rbp-20h] BYREF
struct dirent64 *v5; // [rsp+28h] [rbp-18h]
DIR *dirp; // [rsp+30h] [rbp-10h]
unsigned int v7; // [rsp+3Ch] [rbp-4h]
ptr = 0LL;
asprintf(&ptr, "%s/.qpkg", a1);
if ( !ptr )
return 0LL;
v7 = 0;
dirp = opendir(ptr);
if ( dirp )
{
while ( 1 )
{
v5 = readdir64(dirp);
if ( !v5 )
break;
if ( v5->d_type == 8 )
{
found_special_malware = 1;
v7 = 1;
v3 = 0LL;
asprintf(&v3, "%s/%s", ptr, v5->d_name);
if ( v3 )
{
sub_2621E(a1, v3);
free(v3);
}
}
else if ( v5->d_name[0] == 46 )
{
if ( strcmp(v5->d_name, ".") )
{
if ( strcmp(v5->d_name, "..") )
{
v2 = 0LL;
asprintf(&v2, "%s/%s", ptr, v5->d_name);
if ( v2 )
{
if ( (unsigned int)sub_261BD(v5->d_name) )
{
if ( (unsigned int)sub_27563(v2, 1u, 0) )
v7 = 1;
}
else
{
sub_2621E(a1, v2);
found_special_malware = 1;
v7 = 1;
}
free(v2);
}
}
}
}
}
closedir(dirp);
}
free(ptr);
return v7;
}
// 237998: using guessed type unsigned int found_special_malware;
//----- (000000000002793C) ----------------------------------------------------
__int64 __fastcall sub_2793C(const char *a1)
{
char *ptr; // [rsp+18h] [rbp-28h] BYREF
char *v3; // [rsp+20h] [rbp-20h] BYREF
struct dirent64 *v4; // [rsp+28h] [rbp-18h]
DIR *dirp; // [rsp+30h] [rbp-10h]
unsigned int v6; // [rsp+3Ch] [rbp-4h]
v6 = 0;
dirp = opendir(a1);
if ( dirp )
{
while ( 1 )
{
v4 = readdir64(dirp);
if ( !v4 )
break;
if ( v4->d_type == 4 )
{
if ( v4->d_name[0] == 46 )
{
if ( strcmp(v4->d_name, ".") )
{
if ( strcmp(v4->d_name, "..") )
{
if ( strcmp(".qpkg", v4->d_name) )
{
if ( strcmp("[email protected]", v4->d_name) )
{
if ( strcmp("[email protected]", v4->d_name) )
{
if ( strcmp(quarantine_dir, v4->d_name) )
{
ptr = 0LL;
asprintf(&ptr, "%s/%s", a1, v4->d_name);
if ( ptr )
{
if ( (unsigned int)sub_27563(ptr, 0, 1u) )
v6 = 1;
free(ptr);
}
}
}
}
}
}
}
}
}
else
{
v3 = 0LL;
asprintf(&v3, "%s/%s", a1, v4->d_name);
if ( v3 )
{
if ( (unsigned int)sub_26D33(v3) && (unsigned int)sub_25ED6(v3) )
{
v6 = 1;
found_special_malware = 1;
sub_25530(v3);
}
free(v3);
}
}
}
closedir(dirp);
}
return v6;
}
// 237998: using guessed type unsigned int found_special_malware;
//----- (0000000000027B6B) ----------------------------------------------------
__int64 sub_27B6B()
{
__int64 result; // rax
char v1[264]; // [rsp+0h] [rbp-110h] BYREF
__int64 v2; // [rsp+108h] [rbp-8h]
v2 = 0LL;
sub_26362(v1, 256);
result = (unsigned __int8)v1[0];
if ( v1[0] )
{
if ( (unsigned int)sub_2793C(v1) )
v2 |= 0x40uLL;
if ( (unsigned int)sub_2772E(v1) )
v2 |= 8uLL;
if ( (unsigned int)sub_25ED6(runonce) )
{
found_special_malware = 1;
sub_25530(runonce);
v2 = 16LL;
}
result = notified_special_malware;
if ( !notified_special_malware )
{
result = found_special_malware;
if ( found_special_malware )
{
notified_special_malware = 1;
return sub_24F33(v2, 0LL);
}
}
}
return result;
}
// 237998: using guessed type unsigned int found_special_malware;
// 23799C: using guessed type unsigned int notified_special_malware;
//----- (0000000000027C42) ----------------------------------------------------
__int64 sub_27C42()
{
char buf[140]; // [rsp+0h] [rbp-90h] BYREF
unsigned int v2; // [rsp+8Ch] [rbp-4h]
v2 = readlink("/etc/config", buf, 0x7FuLL);
if ( (v2 & 0x80000000) != 0 )
return 0LL;
if ( v2 <= 0x7F )
{
buf[v2] = 0;
if ( !strcmp(buf, "/mnt/HDA_ROOT/.config") )
return 1LL;
}
return 0LL;
}
// 27C42: using guessed type char buf[140];
//----- (0000000000027CB5) ----------------------------------------------------
FILE **check_for_startup()
{
sub_257A5();
init_debugger();
if ( (unsigned int)sub_27C42() )
{
sub_27193();
sub_268B4();
sub_26944();
sub_27B6B();
sub_26FE8();
}
return finish_debugger();
}
//----- (0000000000027D25) ----------------------------------------------------
__int64 NAS_Send_LCD_MSG()
{
return 0LL;
}
// 27D25: using guessed type __int64 NAS_Send_LCD_MSG();
//----- (0000000000027D36) ----------------------------------------------------
__int64 __fastcall SendErrMsgToLcd(int a1, unsigned int a2)
{
__int64 s; // [rsp+10h] [rbp-20h] BYREF
int v4; // [rsp+18h] [rbp-18h]
unsigned int v5; // [rsp+1Ch] [rbp-14h]
int v6; // [rsp+28h] [rbp-8h]
int msqid; // [rsp+2Ch] [rbp-4h]
if ( a2 >= 2 )
return 0xFFFFFFFFLL;
msqid = msgget(1456, 1974);
if ( msqid >= 0 )
{
msgctl(msqid, 0, 0LL);
return 0LL;
}
else
{
memset(&s, 0, 0x18uLL);
msqid = msgget(1456, 950);
if ( msqid < 0 )
perror("SendErrMsgToLcd - msgget");
s = 1LL;
v4 = a1;
v5 = a2;
v6 = msgsnd(msqid, &s, 0x10uLL, 2048);
if ( v6 < 0 )
perror("SendErrMsgToLcd - msgsnd");
return (unsigned int)v6;
}
}
//----- (0000000000027E11) ----------------------------------------------------
__int64 __fastcall SendEnterStateToLcd(int a1)
{
__int64 s; // [rsp+10h] [rbp-20h] BYREF
int v3; // [rsp+18h] [rbp-18h]
int v4; // [rsp+1Ch] [rbp-14h]
int v5; // [rsp+28h] [rbp-8h]
int msqid; // [rsp+2Ch] [rbp-4h]
memset(&s, 0, 0x18uLL);
msqid = msgget(1456, 950);
if ( msqid < 0 )
perror("SendEnterStateToLcd - msgget");
s = 2LL;
v3 = a1;
v4 = 0;
v5 = msgsnd(msqid, &s, 0x10uLL, 2048);
if ( v5 < 0 )
perror("SendEnterStateToLcd - msgsnd");
return (unsigned int)v5;
}
//----- (0000000000027E9D) ----------------------------------------------------
__int64 __fastcall SendNotificationToLcd(int a1)
{
__int64 s; // [rsp+10h] [rbp-20h] BYREF
int v3; // [rsp+18h] [rbp-18h]
int v4; // [rsp+1Ch] [rbp-14h]
int v5; // [rsp+28h] [rbp-8h]
int msqid; // [rsp+2Ch] [rbp-4h]
memset(&s, 0, 0x18uLL);
msqid = msgget(1456, 950);
if ( msqid < 0 )
perror("SendNotifyToLcd - msgget");
s = 3LL;
v3 = a1;
v4 = 0;
v5 = msgsnd(msqid, &s, 0x10uLL, 2048);
if ( v5 < 0 )
perror("SendNotifyToLcd - msgsnd");
return (unsigned int)v5;
}
//----- (0000000000027F29) ----------------------------------------------------
__int64 __fastcall SendHalExtentErrMsgToLcd(int a1, int a2, unsigned int a3)
{
__int64 msgp; // [rsp+10h] [rbp-20h] BYREF
int v6; // [rsp+18h] [rbp-18h]
unsigned int v7; // [rsp+1Ch] [rbp-14h]
int v8; // [rsp+20h] [rbp-10h]
int v9; // [rsp+28h] [rbp-8h]
int msqid; // [rsp+2Ch] [rbp-4h]
if ( a3 >= 2 )
return 0xFFFFFFFFLL;
msqid = msgget(1456, 950);
if ( msqid < 0 )
perror("SendHalExtentErrMsgToLcd - msgget");
msgp = 4LL;
v6 = a1;
v8 = a2;
v7 = a3;
v9 = msgsnd(msqid, &msgp, 0x10uLL, 2048);
if ( v9 < 0 )
perror("SendHalExtentErrMsgToLcd - msgsnd");
return (unsigned int)v9;
}
//----- (0000000000027FBD) ----------------------------------------------------
__int64 __fastcall SendHalExtentNoticeToLcd(int a1, int a2)
{
__int64 msgp; // [rsp+10h] [rbp-20h] BYREF
int v4; // [rsp+18h] [rbp-18h]
int v5; // [rsp+1Ch] [rbp-14h]
int v6; // [rsp+20h] [rbp-10h]
int v7; // [rsp+28h] [rbp-8h]
int msqid; // [rsp+2Ch] [rbp-4h]
msqid = msgget(1456, 950);
if ( msqid < 0 )
perror("SendHalExtentNoticeToLcd - msgget");
msgp = 5LL;
v4 = a1;
v6 = a2;
v5 = 0;
v7 = msgsnd(msqid, &msgp, 0x10uLL, 2048);
if ( v7 < 0 )
perror("SendHalExtentNoticeToLcd - msgsnd");
return (unsigned int)v7;
}
//----- (000000000002803C) ----------------------------------------------------
__int64 __fastcall SendEVToLogEngine(int a1, const char *a2, const char *a3, const char *a4, const char *a5)
{
__int64 msgp[655]; // [rsp+30h] [rbp-1480h] BYREF
int msqid; // [rsp+14ACh] [rbp-4h]
memset(msgp, 0, sizeof(msgp));
msqid = msgget(1002, 950);
msgp[0] = 1LL;
HIDWORD(msgp[1]) = a1;
snprintf((char *)&msgp[9], 0x41uLL, "%s", a2);
snprintf((char *)&msgp[17] + 1, 0x41uLL, "%s", a3);
snprintf((char *)&msgp[25] + 2, 0x41uLL, "%s", a4);
BYTE4(msgp[289]) = 0;
snprintf((char *)&msgp[33] + 3, 0x801uLL, "%s", a5);
return (unsigned int)msgsnd(msqid, msgp, dword_2371B0, 2048);
}
// 2371B0: using guessed type int dword_2371B0;
//----- (0000000000028190) ----------------------------------------------------
__int64 SendEVToLogEngineEx(int a1, const char *a2, const char *a3, const char *a4, const char *a5, ...)
{
gcc_va_list arg; // [rsp+38h] [rbp-1548h] BYREF
__int64 msgp[655]; // [rsp+50h] [rbp-1530h] BYREF
int msqid; // [rsp+14CCh] [rbp-B4h]
va_start(arg, a5);
memset(msgp, 0, sizeof(msgp));
msqid = msgget(1002, 950);
msgp[0] = 1LL;
HIDWORD(msgp[1]) = a1;
snprintf((char *)&msgp[9], 0x41uLL, "%s", a2);
snprintf((char *)&msgp[17] + 1, 0x41uLL, "%s", a3);
snprintf((char *)&msgp[25] + 2, 0x41uLL, "%s", a4);
BYTE4(msgp[289]) = 0;
vsnprintf((char *)&msgp[33] + 3, 0x800uLL, a5, arg);
return (unsigned int)msgsnd(msqid, msgp, dword_2371B0, 2048);
}
// 2371B0: using guessed type int dword_2371B0;
//----- (0000000000028346) ----------------------------------------------------
__int64 __fastcall SendConnToLogEngine(
int a1,
const char *a2,
const char *a3,
const char *a4,
int a5,
int a6,
const char *a7)
{
__int64 msgp[656]; // [rsp+30h] [rbp-1490h] BYREF
int msqid; // [rsp+14B4h] [rbp-Ch]
char *v14; // [rsp+14B8h] [rbp-8h]
memset(msgp, 0, 0x1478uLL);
v14 = 0LL;
msqid = msgget(1002, 950);
msgp[0] = 2LL;
HIDWORD(msgp[404]) = a1;
snprintf((char *)&msgp[412], 0x41uLL, "%s", a2);
snprintf((char *)&msgp[420] + 1, 0x41uLL, "%s", a3);
snprintf((char *)&msgp[428] + 2, 0x41uLL, "%s", a4);
v14 = getenv("HTTP_CLIENT_ID");
if ( v14 )
snprintf((char *)&msgp[598] + 4, 0x41uLL, "%s", v14);
v14 = getenv("HTTP_CLIENT_APP");
if ( v14 )
snprintf((char *)&msgp[606] + 5, 0x81uLL, "%s", v14);
v14 = getenv("HTTP_CLIENT_AGENT");
if ( v14 )
snprintf((char *)&msgp[622] + 6, 0x100uLL, "%s", v14);
HIDWORD(msgp[564]) = a5;
LODWORD(msgp[565]) = a6;
snprintf((char *)&msgp[436] + 3, 0x401uLL, "%s", a7);
return (unsigned int)msgsnd(msqid, msgp, dword_2371B0, 2048);
}
// 2371B0: using guessed type int dword_2371B0;
//----- (000000000002857B) ----------------------------------------------------
__int64 SendConnToLogEngineEx(
int a1,
const char *a2,
const char *a3,
const char *a4,
int a5,
int a6,
char *format,
...)
{
gcc_va_list arg; // [rsp+38h] [rbp-1558h] BYREF
__int64 msgp[656]; // [rsp+50h] [rbp-1540h] BYREF
int msqid; // [rsp+14D4h] [rbp-BCh]
char *v15; // [rsp+14D8h] [rbp-B8h]
memset(msgp, 0, 0x1478uLL);
v15 = 0LL;
msqid = msgget(1002, 950);
msgp[0] = 2LL;
HIDWORD(msgp[404]) = a1;
snprintf((char *)&msgp[412], 0x41uLL, "%s", a2);
snprintf((char *)&msgp[420] + 1, 0x41uLL, "%s", a3);
snprintf((char *)&msgp[428] + 2, 0x41uLL, "%s", a4);
v15 = getenv("HTTP_CLIENT_ID");
if ( v15 )
snprintf((char *)&msgp[598] + 4, 0x41uLL, "%s", v15);
v15 = getenv("HTTP_CLIENT_APP");
if ( v15 )
snprintf((char *)&msgp[606] + 5, 0x81uLL, "%s", v15);
v15 = getenv("HTTP_CLIENT_AGENT");
if ( v15 )
snprintf((char *)&msgp[622] + 6, 0x100uLL, "%s", v15);
HIDWORD(msgp[564]) = a5;
LODWORD(msgp[565]) = a6;
va_start(arg, format);
vsnprintf((char *)&msgp[436] + 3, 0x400uLL, format, arg);
return (unsigned int)msgsnd(msqid, msgp, dword_2371B0, 2048);
}
// 2371B0: using guessed type int dword_2371B0;
//----- (0000000000028827) ----------------------------------------------------
__int64 SendConnToLogEngineEx2(
int a1,
const char *a2,
const char *a3,
const char *a4,
const char *a5,
int a6,
int a7,
char *format,
...)
{
gcc_va_list arg; // [rsp+38h] [rbp-1558h] BYREF
__int64 msgp[656]; // [rsp+50h] [rbp-1540h] BYREF
int msqid; // [rsp+14D4h] [rbp-BCh]
char *v16; // [rsp+14D8h] [rbp-B8h]
memset(msgp, 0, 0x1478uLL);
v16 = 0LL;
msqid = msgget(1002, 950);
msgp[0] = 2LL;
HIDWORD(msgp[404]) = a1;
snprintf((char *)&msgp[412], 0x41uLL, "%s", a2);
snprintf((char *)&msgp[565] + 4, 0x101uLL, "%s", a3);
snprintf((char *)&msgp[420] + 1, 0x41uLL, "%s", a4);
snprintf((char *)&msgp[428] + 2, 0x41uLL, "%s", a5);
v16 = getenv("HTTP_CLIENT_ID");
if ( v16 )
snprintf((char *)&msgp[598] + 4, 0x41uLL, "%s", v16);
v16 = getenv("HTTP_CLIENT_APP");
if ( v16 )
snprintf((char *)&msgp[606] + 5, 0x81uLL, "%s", v16);
v16 = getenv("HTTP_CLIENT_AGENT");
if ( v16 )
snprintf((char *)&msgp[622] + 6, 0x100uLL, "%s", v16);
HIDWORD(msgp[564]) = a6;
LODWORD(msgp[565]) = a7;
va_start(arg, format);
vsnprintf((char *)&msgp[436] + 3, 0x400uLL, format, arg);
return (unsigned int)msgsnd(msqid, msgp, dword_2371B0, 2048);
}
// 2371B0: using guessed type int dword_2371B0;
//----- (0000000000028B01) ----------------------------------------------------
__int64 SendConnToLogEngineEx3(
int a1,
const char *a2,
const char *a3,
const char *a4,
const char *a5,
int a6,
int a7,
char *format,
int a9,
...)
{
__int64 msgp[655]; // [rsp+30h] [rbp-1550h] BYREF
gcc_va_list arg; // [rsp+14A8h] [rbp-D8h] BYREF
int msqid; // [rsp+14C4h] [rbp-BCh]
char *v17; // [rsp+14C8h] [rbp-B8h]
memset(msgp, 0, sizeof(msgp));
v17 = 0LL;
msqid = msgget(1002, 950);
msgp[0] = 2LL;
HIDWORD(msgp[404]) = a1;
snprintf((char *)&msgp[412], 0x41uLL, "%s", a2);
snprintf((char *)&msgp[565] + 4, 0x101uLL, "%s", a3);
snprintf((char *)&msgp[420] + 1, 0x41uLL, "%s", a4);
snprintf((char *)&msgp[428] + 2, 0x41uLL, "%s", a5);
v17 = getenv("HTTP_CLIENT_ID");
if ( v17 )
snprintf((char *)&msgp[598] + 4, 0x41uLL, "%s", v17);
v17 = getenv("HTTP_CLIENT_APP");
if ( v17 )
snprintf((char *)&msgp[606] + 5, 0x81uLL, "%s", v17);
v17 = getenv("HTTP_CLIENT_AGENT");
if ( v17 )
snprintf((char *)&msgp[622] + 6, 0x100uLL, "%s", v17);
HIDWORD(msgp[564]) = a6;
LODWORD(msgp[565]) = a7;
LODWORD(msgp[598]) = a9;
va_start(arg, a9);
vsnprintf((char *)&msgp[436] + 3, 0x400uLL, format, arg);
return (unsigned int)msgsnd(msqid, msgp, dword_2371B0, 2048);
}
// 2371B0: using guessed type int dword_2371B0;
//----- (0000000000028DE4) ----------------------------------------------------
__int64 SendConnToLogEngineEx4(
int a1,
const char *a2,
const char *a3,
const char *a4,
const char *a5,
int a6,
int a7,
int a8,
const char *a9,
const char *a10,
const char *a11,
char *format,
...)
{
const char *v12; // rax
const char *v13; // rax
const char *v14; // rax
__int64 msgp[655]; // [rsp+30h] [rbp-1550h] BYREF
gcc_va_list arg; // [rsp+14A8h] [rbp-D8h] BYREF
int msqid; // [rsp+14C4h] [rbp-BCh]
char *v23; // [rsp+14C8h] [rbp-B8h]
memset(msgp, 0, sizeof(msgp));
v23 = 0LL;
msqid = msgget(1002, 950);
msgp[0] = 2LL;
HIDWORD(msgp[404]) = a1;
HIDWORD(msgp[564]) = a6;
LODWORD(msgp[565]) = a7;
LODWORD(msgp[598]) = a8;
snprintf((char *)&msgp[420] + 1, 0x41uLL, "%s", a4);
snprintf((char *)&msgp[565] + 4, 0x101uLL, "%s", a3);
snprintf((char *)&msgp[412], 0x41uLL, "%s", a2);
snprintf((char *)&msgp[428] + 2, 0x41uLL, "%s", a5);
if ( a9 || (v23 = getenv("HTTP_CLIENT_ID")) != 0LL )
{
if ( a9 )
v12 = a9;
else
v12 = v23;
snprintf((char *)&msgp[598] + 4, 0x41uLL, "%s", v12);
}
if ( a10 || (v23 = getenv("HTTP_CLIENT_APP")) != 0LL )
{
if ( a10 )
v13 = a10;
else
v13 = v23;
snprintf((char *)&msgp[606] + 5, 0x81uLL, "%s", v13);
}
if ( a11 || (v23 = getenv("HTTP_CLIENT_AGENT")) != 0LL )
{
if ( a11 )
v14 = a11;
else
v14 = v23;
snprintf((char *)&msgp[622] + 6, 0x100uLL, "%s", v14);
}
va_start(arg, format);
vsnprintf((char *)&msgp[436] + 3, 0x400uLL, format, arg);
return (unsigned int)msgsnd(msqid, msgp, dword_2371B0, 2048);
}
// 2371B0: using guessed type int dword_2371B0;
//----- (0000000000029103) ----------------------------------------------------
__int64 __fastcall SendNoticeToLogEngine_V2(
int a1,
unsigned int a2,
unsigned int a3,
const char *a4,
int a5,
const char *a6,
int a7,
int a8,
int a9,
const char *a10,
const char *a11,
const char *a12,
const char *a13,
int a14,
const char *a15,
const char *a16,
const char *a17,
const char *a18,
const char *a19)
{
__int64 msgp[891]; // [rsp+20h] [rbp-1BE0h] BYREF
int msqid; // [rsp+1BFCh] [rbp-4h]
memset(msgp, 0, 0x1BD0uLL);
msqid = msgget(10121, 950);
msgp[0] = 3LL;
HIDWORD(msgp[1]) = a1;
msgp[2] = __PAIR64__(a3, a2);
snprintf((char *)&msgp[3], 0x401uLL, "%s", a4);
HIDWORD(msgp[131]) = a5;
snprintf((char *)&msgp[679] + 5, 0x81uLL, "%s", a6);
LODWORD(msgp[696]) = a7;
if ( a13 )
snprintf((char *)&msgp[414] + 4, 0x41uLL, "%s", a13);
else
WORD2(msgp[414]) = 48;
LODWORD(msgp[423]) = a14;
snprintf((char *)&msgp[423] + 4, 0x801uLL, "%s", a15);
snprintf((char *)&msgp[134], 0x41uLL, "%s", a10);
snprintf((char *)&msgp[142] + 1, 0x41uLL, "%s", a11);
snprintf((char *)&msgp[150] + 2, 0x41uLL, "%s", a12);
snprintf((char *)&msgp[158] + 3, 0x801uLL, "%s", a16);
HIDWORD(msgp[696]) = a8;
LODWORD(msgp[697]) = a9;
snprintf((char *)&msgp[697] + 4, 0x101uLL, "%s", a17);
snprintf((char *)&msgp[729] + 5, 0x401uLL, "%s", a18);
snprintf((char *)&msgp[857] + 6, 0x101uLL, "%s", a19);
return (unsigned int)msgsnd(msqid, msgp, 0x1BC8uLL, 2048);
}
//----- (00000000000293D7) ----------------------------------------------------
__int64 __fastcall SendNoticeToLogEngine(
int a1,
unsigned int a2,
unsigned int a3,
const char *a4,
int a5,
const char *a6,
int a7,
int a8,
int a9,
const char *a10,
const char *a11,
const char *a12,
const char *a13,
int a14,
const char *a15,
const char *a16)
{
return SendNoticeToLogEngine_V2(
a1,
a2,
a3,
a4,
a5,
a6,
a7,
a8,
a9,
a10,
a11,
a12,
a13,
a14,
a15,
a16,
byte_2FA8E,
byte_2FA8E,
byte_2FA8E);
}
//----- (0000000000029466) ----------------------------------------------------
__int64 SendNoticeToLogEngineEx(
int a1,
unsigned int a2,
unsigned int a3,
const char *a4,
int a5,
const char *a6,
int a7,
int a8,
int a9,
const char *a10,
const char *a11,
const char *a12,
const char *a13,
int a14,
const char *a15,
char *format,
...)
{
gcc_va_list arg; // [rsp+28h] [rbp-1CA8h] BYREF
__int64 msgp[891]; // [rsp+40h] [rbp-1C90h] BYREF
int msqid; // [rsp+1C1Ch] [rbp-B4h]
memset(msgp, 0, 0x1BD0uLL);
msqid = msgget(10121, 950);
msgp[0] = 3LL;
HIDWORD(msgp[1]) = a1;
msgp[2] = __PAIR64__(a3, a2);
snprintf((char *)&msgp[3], 0x401uLL, "%s", a4);
HIDWORD(msgp[131]) = a5;
snprintf((char *)&msgp[679] + 5, 0x81uLL, "%s", a6);
LODWORD(msgp[696]) = a7;
if ( a13 )
snprintf((char *)&msgp[414] + 4, 0x41uLL, "%s", a13);
else
WORD2(msgp[414]) = 48;
LODWORD(msgp[423]) = a14;
snprintf((char *)&msgp[423] + 4, 0x801uLL, "%s", a15);
snprintf((char *)&msgp[134], 0x41uLL, "%s", a10);
snprintf((char *)&msgp[142] + 1, 0x41uLL, "%s", a11);
snprintf((char *)&msgp[150] + 2, 0x41uLL, "%s", a12);
HIDWORD(msgp[696]) = a8;
LODWORD(msgp[697]) = a9;
BYTE4(msgp[697]) = 0;
BYTE5(msgp[729]) = 0;
BYTE6(msgp[857]) = 0;
va_start(arg, format);
vsnprintf((char *)&msgp[158] + 3, 0x800uLL, format, arg);
return (unsigned int)msgsnd(msqid, msgp, 0x1BC8uLL, 2048);
}
//----- (0000000000029735) ----------------------------------------------------
__int64 __fastcall SendEVMsgidToLogEngine(
int a1,
const char *a2,
const char *a3,
const char *a4,
const char *a5,
const char *a6)
{
__int64 msgp[655]; // [rsp+30h] [rbp-1480h] BYREF
int msqid; // [rsp+14ACh] [rbp-4h]
memset(msgp, 0, sizeof(msgp));
msqid = msgget(1002, 950);
msgp[0] = 1LL;
HIDWORD(msgp[1]) = a1;
snprintf((char *)&msgp[9], 0x41uLL, "%s", a2);
snprintf((char *)&msgp[17] + 1, 0x41uLL, "%s", a3);
snprintf((char *)&msgp[25] + 2, 0x41uLL, "%s", a4);
snprintf((char *)&msgp[289] + 4, 0x41uLL, "%s", a5);
snprintf((char *)&msgp[33] + 3, 0x801uLL, "%s", a6);
return (unsigned int)msgsnd(msqid, msgp, dword_2371B0, 2048);
}
// 2371B0: using guessed type int dword_2371B0;
//----- (00000000000298B3) ----------------------------------------------------
__int64 SendEVMsgidToLogEngineEx(
int a1,
const char *a2,
const char *a3,
const char *a4,
const char *a5,
const char *a6,
...)
{
gcc_va_list arg; // [rsp+38h] [rbp-1548h] BYREF
__int64 msgp[655]; // [rsp+50h] [rbp-1530h] BYREF
int msqid; // [rsp+14CCh] [rbp-B4h]
va_start(arg, a6);
memset(msgp, 0, sizeof(msgp));
msqid = msgget(1002, 950);
msgp[0] = 1LL;
HIDWORD(msgp[1]) = a1;
snprintf((char *)&msgp[9], 0x41uLL, "%s", a2);
snprintf((char *)&msgp[17] + 1, 0x41uLL, "%s", a3);
snprintf((char *)&msgp[25] + 2, 0x41uLL, "%s", a4);
snprintf((char *)&msgp[289] + 4, 0x41uLL, "%s", a5);
vsnprintf((char *)&msgp[33] + 3, 0x800uLL, a6, arg);
return (unsigned int)msgsnd(msqid, msgp, dword_2371B0, 2048);
}
// 2371B0: using guessed type int dword_2371B0;
//----- (0000000000029A8C) ----------------------------------------------------
__int64 SendEventToQSyslogd()
{
return 0LL;
}
// 29A8C: using guessed type __int64 SendEventToQSyslogd();
//----- (0000000000029AAE) ----------------------------------------------------
__int64 SendConnToQSyslogd()
{
return 0LL;
}
// 29AAE: using guessed type __int64 SendConnToQSyslogd();
//----- (0000000000029AD0) ----------------------------------------------------
char ***__fastcall set_proc_title_init(int a1, _QWORD *a2)
{
const char *v2; // rbx
const char *v3; // rax
char ***result; // rax
char **v5; // [rsp+18h] [rbp-28h]
int i; // [rsp+2Ch] [rbp-14h]
int j; // [rsp+2Ch] [rbp-14h]
for ( i = 0; environ[i]; ++i )
;
if ( i )
v2 = environ[i - 1];
else
v2 = (const char *)a2[a1 - 1];
v3 = &v2[strlen(v2)];
qword_2379B0 = (__int64)a2;
maxlen = (size_t)&v3[-*a2];
v5 = (char **)malloc(8LL * (unsigned int)(i + 1));
for ( j = 0; environ[j]; ++j )
v5[j] = strdup(environ[j]);
v5[j] = 0LL;
result = &environ;
environ = v5;
return result;
}
// 2379B0: using guessed type __int64 qword_2379B0;
//----- (0000000000029C5B) ----------------------------------------------------
__int64 set_proc_title(const char *a1, ...)
{
__int64 result; // rax
gcc_va_list arg; // [rsp+10h] [rbp-D0h] BYREF
size_t v3; // [rsp+28h] [rbp-B8h]
result = qword_2379B0;
if ( qword_2379B0 )
{
va_start(arg, a1);
vsnprintf(*(char **)qword_2379B0, maxlen, a1, arg);
v3 = strlen(*(const char **)qword_2379B0);
memset((void *)(v3 + *(_QWORD *)qword_2379B0), 0, maxlen - v3);
result = qword_2379B0 + 8;
*(_QWORD *)(qword_2379B0 + 8) = 0LL;
}
return result;
}
// 2379B0: using guessed type __int64 qword_2379B0;
//----- (0000000000029D78) ----------------------------------------------------
_BYTE *__fastcall sub_29D78(_BYTE *a1, _BYTE *a2)
{
_BYTE *v2; // rax
_BYTE *v3; // rdx
_BYTE *v4; // rax
_BYTE *v5; // rdx
_BYTE *v7; // rax
_BYTE *v8; // rdx
_BYTE *v10; // [rsp+0h] [rbp-20h]
_BYTE *v12; // [rsp+10h] [rbp-10h]
_BYTE *v13; // [rsp+18h] [rbp-8h]
while ( ((*__ctype_b_loc())[(char)*a2] & 0x2000) != 0 )
++a2;
while ( *a2 && ((*__ctype_b_loc())[(char)*a2] & 0x2000) == 0 )
{
if ( *a2 == 58 )
{
v13 = a2;
v12 = a1;
v2 = a1++;
v3 = a2;
v10 = a2 + 1;
*v2 = *v3;
while ( ((*__ctype_b_loc())[(char)*v10] & 0x800) != 0 )
{
v4 = a1++;
v5 = v10++;
*v4 = *v5;
}
if ( *v10 != 58 )
{
v10 = v13;
a1 = v12;
}
if ( !*v10 )
return 0LL;
a2 = v10 + 1;
break;
}
v7 = a1++;
v8 = a2++;
*v7 = *v8;
}
*a1 = 0;
return a2;
}
//----- (0000000000029EE1) ----------------------------------------------------
__int64 __fastcall sub_29EE1(const char *a1, __int64 a2)
{
sscanf(
a1,
"%llu %llu %lu %lu %lu %lu %lu %lu %llu %llu %lu %lu %lu %lu %lu %lu",
a2 + 16,
a2,
a2 + 32,
a2 + 48,
a2 + 128,
a2 + 120,
a2 + 72,
a2 + 64,
a2 + 24,
a2 + 8,
a2 + 40,
a2 + 56,
a2 + 160,
a2 + 88,
a2 + 152,
a2 + 80);
return 0LL;
}
//----- (0000000000029FDC) ----------------------------------------------------
__int64 __fastcall read_net_proc(const char *a1, __int64 a2)
{
size_t v3; // rax
char s1[16]; // [rsp+10h] [rbp-220h] BYREF
char s[512]; // [rsp+20h] [rbp-210h] BYREF
const char *v6; // [rsp+220h] [rbp-10h]
FILE *stream; // [rsp+228h] [rbp-8h]
stream = 0LL;
if ( !a1 )
return 0xFFFFFFFFLL;
stream = fopen64("/proc/net/dev", "r");
if ( !stream )
return 0xFFFFFFFFLL;
fgets(s, 512, stream);
fgets(s, 512, stream);
while ( fgets(s, 512, stream) )
{
v6 = sub_29D78(s1, s);
v3 = strlen(a1);
if ( !strncmp(s1, a1, v3) )
sub_29EE1(v6, a2);
}
fclose(stream);
return 0LL;
}
//----- (000000000002A0FD) ----------------------------------------------------
int ctor_001()
{
return regcomp(
&preg,
"(\\b|/)(ash|bash|csh|jsh|ksh|ksh93|pfcsh|pfksh|pfsh|pfsh|rbash|rksh93|sh|tcsh|zsh|busybox|php|python.*)$",
1);
}
//----- (000000000002A11B) ----------------------------------------------------
void dtor_001()
{
regfree(&preg);
}
//----- (000000000002A12D) ----------------------------------------------------
int *__fastcall qnap_auto_close_fd(int *a1)
{
int *result; // rax
if ( a1 )
{
result = (int *)(unsigned int)*a1;
if ( (int)result >= 0 )
{
close(*a1);
result = a1;
*a1 = -1;
}
}
return result;
}
//----- (000000000002A165) ----------------------------------------------------
void *__fastcall qnap_auto_free_char(void **a1)
{
void *result; // rax
if ( a1 )
{
result = *a1;
if ( *a1 )
{
free(*a1);
result = a1;
*a1 = 0LL;
}
}
return result;
}
//----- (000000000002A1A2) ----------------------------------------------------
FILE *__fastcall qnap_auto_close_file(FILE **a1)
{
FILE *result; // rax
if ( a1 )
{
result = *a1;
if ( *a1 )
{
fclose(*a1);
result = (FILE *)a1;
*a1 = 0LL;
}
}
return result;
}
//----- (000000000002A1DF) ----------------------------------------------------
_QWORD *__fastcall qnap_auto_close_popen_file(_QWORD *a1)
{
_QWORD *result; // rax
if ( a1 )
{
result = (_QWORD *)*a1;
if ( *a1 )
{
qnap_pclose(*a1);
result = a1;
*a1 = 0LL;
}
}
return result;
}
// A180: using guessed type __int64 __fastcall qnap_pclose(_QWORD);
//----- (000000000002A21C) ----------------------------------------------------
void *__fastcall sub_2A21C(void **a1)
{
void *result; // rax
if ( a1 )
{
result = *a1;
if ( *a1 )
{
free(*a1);
result = a1;
*a1 = 0LL;
}
}
return result;
}
//----- (000000000002A259) ----------------------------------------------------
__int64 __fastcall qnap_mktmpname(char *a1)
{
int fd; // [rsp+1Ch] [rbp-4h]
if ( !a1 )
return 0xFFFFFFFFLL;
fd = mkstemp64(a1);
if ( fd < 0 )
return 0xFFFFFFFFLL;
close(fd);
return 0LL;
}
//----- (000000000002A2A0) ----------------------------------------------------
size_t __fastcall erase_char(const char *a1)
{
size_t result; // rax
char *v2; // rax
const char *v3; // rdx
int v4; // [rsp+1Ch] [rbp-14h]
const char *j; // [rsp+20h] [rbp-10h]
const char *v6; // [rsp+20h] [rbp-10h]
const char *i; // [rsp+28h] [rbp-8h]
v4 = 0;
result = strlen(a1);
if ( (_DWORD)result )
{
for ( i = a1; *i == 32 || *i == 9 || *i == 13 || *i == 10; ++i )
++v4;
if ( v4 < (int)result )
{
for ( j = &a1[(int)result - 1]; *j == 32 || *j == 9 || *j == 13 || *j == 10; --j )
;
*((_BYTE *)j + 1) = 0;
v6 = a1;
while ( *i )
{
v2 = (char *)v6++;
v3 = i++;
*v2 = *v3;
}
result = (size_t)v6;
*v6 = 0;
}
else
{
result = (size_t)a1;
*a1 = 0;
}
}
return result;
}
//----- (000000000002A3B4) ----------------------------------------------------
const char *__fastcall stripe_white_space_tail(const char *a1)
{
const char *i; // [rsp+18h] [rbp-8h]
if ( *a1 )
{
for ( i = &a1[strlen(a1) - 1]; *i == 32 || *i == 9; --i )
;
*((_BYTE *)i + 1) = 0;
}
return a1;
}
//----- (000000000002A414) ----------------------------------------------------
_BOOL8 __fastcall string_ended_with_EOL(const char *a1)
{
return a1[strlen(a1) - 1] == 10;
}
//----- (000000000002A44C) ----------------------------------------------------
__int64 __fastcall strip_EOL(const char *a1)
{
if ( a1[strlen(a1) - 1] != 10 )
return 0LL;
a1[strlen(a1) - 1] = 0;
if ( a1[strlen(a1) - 1] == 13 )
a1[strlen(a1) - 1] = 0;
return 1LL;
}
//----- (000000000002A4D6) ----------------------------------------------------
char *__fastcall combine_string(const char *a1, const char *a2)
{
int v2; // ebx
int v3; // eax
char *dest; // [rsp+10h] [rbp-20h]
v2 = strlen(a1);
v3 = strlen(a2);
dest = (char *)malloc(v2 + v3 + 1);
if ( dest )
{
strcpy(dest, a1);
strcat(dest, a2);
}
return dest;
}
//----- (000000000002A552) ----------------------------------------------------
char *__fastcall skip_to_EOL(FILE *a1)
{
char *result; // rax
char s[1024]; // [rsp+10h] [rbp-400h] BYREF
for ( result = fgets(s, 1024, a1); result; result = fgets(s, 1024, a1) )
{
result = (char *)string_ended_with_EOL(s);
if ( (_DWORD)result )
break;
}
return result;
}
//----- (000000000002A59B) ----------------------------------------------------
_BYTE *__fastcall skip_white_space(_BYTE *a1)
{
while ( *a1 == 32 || *a1 == 9 )
++a1;
return a1;
}
//----- (000000000002A5CE) ----------------------------------------------------
__int64 __fastcall get_one_line_of_string(FILE *a1)
{
void **addr; // rax
char *v2; // rax
const char *v4; // rax
const char *v5; // rax
char *v6; // rbx
const char *v7; // rbx
const char *v8; // rsi
void **v9; // rax
const char **v10; // rax
char *v11; // rax
char *v12; // [rsp+18h] [rbp-18h]
if ( *(_QWORD *)__tls_get_addr(&stru_2355D0) )
{
addr = (void **)__tls_get_addr(&stru_2355D0);
free(*addr);
*(_QWORD *)__tls_get_addr(&stru_2355D0) = 0LL;
}
v2 = (char *)__tls_get_addr(&qword_2355E0);
if ( !fgets(v2, 4096, a1) )
return 0LL;
v4 = (const char *)__tls_get_addr(&qword_2355E0);
if ( (unsigned int)strip_EOL(v4) )
return __tls_get_addr(&qword_2355E0);
v5 = (const char *)__tls_get_addr(&qword_2355E0);
v6 = strdup(v5);
*(_QWORD *)__tls_get_addr(&stru_2355D0) = v6;
if ( *(_QWORD *)__tls_get_addr(&stru_2355D0) )
{
do
{
v11 = (char *)__tls_get_addr(&qword_2355E0);
if ( !fgets(v11, 4096, a1) )
break;
v7 = *(const char **)__tls_get_addr(&stru_2355D0);
v8 = (const char *)__tls_get_addr(&qword_2355E0);
v12 = combine_string(v7, v8);
if ( !v12 )
{
skip_to_EOL(a1);
return *(_QWORD *)__tls_get_addr(&stru_2355D0);
}
v9 = (void **)__tls_get_addr(&stru_2355D0);
free(*v9);
*(_QWORD *)__tls_get_addr(&stru_2355D0) = v12;
v10 = (const char **)__tls_get_addr(&stru_2355D0);
}
while ( !(unsigned int)strip_EOL(*v10) );
return *(_QWORD *)__tls_get_addr(&stru_2355D0);
}
else
{
skip_to_EOL(a1);
return __tls_get_addr(&qword_2355E0);
}
}
// A280: using guessed type __int64 __fastcall __tls_get_addr(_QWORD);
// 2355D0: using guessed type tls_index_local stru_2355D0;
// 2355E0: using guessed type __int64 qword_2355E0;
//----- (000000000002A7EF) ----------------------------------------------------
__int64 __fastcall get_uid_by_name(const char *a1)
{
struct passwd *v2; // [rsp+18h] [rbp-8h]
v2 = getpwnam(a1);
if ( v2 )
return v2->pw_uid;
else
return 0xFFFFFFFFLL;
}
//----- (000000000002A82A) ----------------------------------------------------
__int64 __fastcall get_uid_by_name_from_file(const char *a1, const char *a2)
{
struct passwd *v3; // [rsp+18h] [rbp-18h]
FILE *stream; // [rsp+20h] [rbp-10h]
unsigned int pw_uid; // [rsp+2Ch] [rbp-4h]
pw_uid = -1;
stream = fopen64(a2, "r");
if ( !stream )
return 0xFFFFFFFFLL;
while ( 1 )
{
v3 = fgetpwent(stream);
if ( !v3 )
break;
if ( !strcasecmp(a1, v3->pw_name) )
{
pw_uid = v3->pw_uid;
break;
}
}
fclose(stream);
return pw_uid;
}
//----- (000000000002A8BE) ----------------------------------------------------
__int64 __fastcall get_gid_by_name(const char *a1)
{
struct group *v2; // [rsp+18h] [rbp-8h]
v2 = getgrnam(a1);
if ( v2 )
return v2->gr_gid;
else
return 0xFFFFFFFFLL;
}
//----- (000000000002A8F9) ----------------------------------------------------
int __fastcall sub_2A8F9(int a1)
{
struct dirent64 *result; // [rsp+18h] [rbp-138h] BYREF
struct dirent64 entry; // [rsp+20h] [rbp-130h] BYREF
int fd; // [rsp+144h] [rbp-Ch]
DIR *dirp; // [rsp+148h] [rbp-8h]
dirp = opendir("/proc/self/fd");
memset(&entry, 0, sizeof(entry));
result = 0LL;
while ( !readdir64_r(dirp, &entry, &result) && result )
{
fd = atoi(entry.d_name);
if ( fd >= a1 )
close(fd);
}
return closedir(dirp);
}
//----- (000000000002A9A4) ----------------------------------------------------
__int64 __fastcall sub_2A9A4(unsigned int a1, int a2, int a3, const char *a4, unsigned __int8 a5, const char **a6)
{
FILE *v6; // rax
const char **v7; // rax
const char **v8; // rax
unsigned int v9; // ebx
int v10; // eax
int v11; // eax
int v12; // eax
char **gl_pathv; // rax
int fd; // [rsp+1Ch] [rbp-B4h]
glob64_t pglob; // [rsp+20h] [rbp-B0h] BYREF
int pipedes[2]; // [rsp+70h] [rbp-60h] BYREF
int stat_loc; // [rsp+84h] [rbp-4Ch] BYREF
FILE *stream; // [rsp+88h] [rbp-48h] BYREF
int v24; // [rsp+90h] [rbp-40h]
int v25; // [rsp+9Ch] [rbp-34h]
__pid_t pid; // [rsp+A0h] [rbp-30h]
unsigned int v27; // [rsp+A4h] [rbp-2Ch]
const char **v28; // [rsp+A8h] [rbp-28h]
const char **i; // [rsp+B0h] [rbp-20h]
unsigned __int8 v30; // [rsp+BFh] [rbp-11h]
fd = a1;
v27 = getpid();
if ( a4 )
v6 = fopen64(a4, "a+");
else
v6 = 0LL;
stream = v6;
v30 = 0;
v28 = 0LL;
for ( i = a6; i && *i; ++i )
{
if ( *i == (const char *)&dword_7C )
{
v28 = i;
}
else if ( *i == (_BYTE *)&qword_20 + 6 )
{
v30 = 1;
*i = 0LL;
break;
}
}
if ( v28 )
{
v7 = v28++;
*v7 = (_BYTE *)(&qword_20 + 6);
}
if ( v28 )
v8 = v28;
else
v8 = a6;
v28 = v8;
if ( v8 && *v28 )
{
pid = fork();
if ( pid >= 0 )
{
if ( !pid )
{
if ( v28 > a6 )
{
pipedes[0] = -1;
pipedes[1] = -1;
if ( pipe(pipedes) < 0 )
{
if ( stream )
{
fprintf(stream, "[ERROR] [%d] create pipe fail: %s\n", v27, *v28);
fflush(stream);
}
_exit(0);
}
sub_2A9A4(a1, (unsigned int)pipedes[1], (unsigned int)a3, a4, a5, a6);
fd = pipedes[0];
close(pipedes[1]);
}
if ( v28 > a6 && regexec(&preg, *v28, 0LL, 0LL, 0) != 1 )
{
if ( stream )
{
fprintf(stream, "[WARN] [%d] insecure exec pipeline %s\n", v27, *v28);
fflush(stream);
}
_exit(1);
}
v25 = open64("/dev/null", 2);
if ( fd < 0 )
{
v10 = 0;
if ( v25 >= 0 )
v10 = v25;
dup2(v10, 0);
}
else
{
dup2(fd, 0);
}
if ( a2 < 0 )
{
if ( v25 < 0 )
v11 = 1;
else
v11 = v25;
dup2(v11, 1);
}
else
{
dup2(a2, 1);
}
if ( a3 < 0 )
{
if ( v25 < 0 )
v12 = 2;
else
v12 = v25;
dup2(v12, 2);
}
else
{
dup2(a3, 2);
}
lseek64(0, 0LL, 0);
sub_2A8F9(3);
if ( v30 )
setsid();
memset(&pglob, 0, sizeof(pglob));
pglob.gl_closedir = (void (*)(void *))&closedir;
pglob.gl_readdir = (struct dirent64 *(*)(void *))&readdir64;
pglob.gl_opendir = (void *(*)(const char *))&opendir;
pglob.gl_lstat = (int (*)(const char *, struct stat64 *))sub_2D9F0;
pglob.gl_stat = (int (*)(const char *, struct stat64 *))sub_2D9F0;
if ( a5 )
{
for ( i = v28; i && *i; ++i )
glob64(*i, 3636, 0LL, &pglob);
}
if ( pglob.gl_pathv && *pglob.gl_pathv )
gl_pathv = pglob.gl_pathv;
else
gl_pathv = (char **)v28;
execvp(*v28, gl_pathv);
_exit(1);
}
stat_loc = 0;
waitpid(pid, &stat_loc, v30);
v24 = stat_loc;
v9 = (stat_loc & 0xFF00) >> 8;
}
else
{
v9 = -1;
}
}
else
{
if ( stream )
{
fprintf(stream, "[WARN] [%d] cannot execvp NULL command\n", v27);
fflush(stream);
}
v9 = -1;
}
qnap_auto_close_file(&stream);
return v9;
}
// 20: using guessed type __int64;
// 7C: using guessed type int;
//----- (000000000002AE7A) ----------------------------------------------------
__int64 __fastcall sub_2AE7A(unsigned int a1, int a2, int a3, const char *a4, unsigned __int8 a5, const char **a6)
{
const char **i; // [rsp+28h] [rbp-8h]
for ( i = a6; i && *i; ++i )
{
if ( **i != 124 || (*i)[1] )
{
if ( **i == 38 && !(*i)[1] )
*i = (_BYTE *)(&qword_20 + 6);
}
else
{
*i = (const char *)&dword_7C;
}
}
return sub_2A9A4(a1, a2, a3, a4, a5, a6);
}
// 20: using guessed type __int64 qword_20;
// 7C: using guessed type int dword_7C;
//----- (000000000002AF4F) ----------------------------------------------------
__int64 __fastcall sub_2AF4F(
const char *a1,
const char *a2,
const char *a3,
unsigned __int8 a4,
const char *a5,
__int64 *a6)
{
_QWORD *v6; // rax
unsigned int v7; // ebx
_QWORD *v8; // rax
__int64 v14; // [rsp+30h] [rbp-60h]
_QWORD *v15; // [rsp+38h] [rbp-58h]
__int64 v16; // [rsp+40h] [rbp-50h]
__int64 v17; // [rsp+48h] [rbp-48h]
_QWORD *v18; // [rsp+50h] [rbp-40h]
__int64 v19; // [rsp+58h] [rbp-38h]
int v20; // [rsp+60h] [rbp-30h] BYREF
int v21; // [rsp+64h] [rbp-2Ch] BYREF
const char **v22; // [rsp+68h] [rbp-28h] BYREF
_QWORD *v23; // [rsp+70h] [rbp-20h]
size_t nmemb; // [rsp+78h] [rbp-18h]
nmemb = 2LL;
v17 = *a6;
v18 = (_QWORD *)a6[1];
v19 = a6[2];
while ( 1 )
{
if ( (unsigned int)v17 >= 0x30 )
{
v6 = v18++;
}
else
{
v6 = (_QWORD *)((unsigned int)v17 + v19);
LODWORD(v17) = v17 + 8;
}
if ( !*v6 )
break;
++nmemb;
}
v22 = (const char **)calloc(nmemb, 8uLL);
if ( v22 )
{
v14 = *a6;
v15 = (_QWORD *)a6[1];
v16 = a6[2];
v23 = v22 + 1;
*v22 = a5;
while ( 1 )
{
if ( (unsigned int)v14 >= 0x30 )
{
v8 = v15++;
}
else
{
v8 = (_QWORD *)((unsigned int)v14 + v16);
LODWORD(v14) = v14 + 8;
}
*v23 = *v8;
if ( !*v23 )
break;
++v23;
}
v21 = open64(a1, 1090, 508LL);
v20 = open64(a2, 1090, 508LL);
v7 = sub_2AE7A(0xFFFFFFFF, v21, v20, a3, a4, v22);
qnap_auto_close_fd(&v20);
qnap_auto_close_fd(&v21);
}
else
{
v7 = -1;
}
sub_2A21C((void **)&v22);
return v7;
}
//----- (000000000002B11E) ----------------------------------------------------
__int64 qnap_exec(const char *a1, const char *a2, const char *a3, const char *a4, ...)
{
gcc_va_list va; // [rsp+20h] [rbp-D0h] BYREF
va_start(va, a4);
return (unsigned int)sub_2AF4F(a1, a2, a3, 0, a4, (__int64 *)va);
}
//----- (000000000002B1E8) ----------------------------------------------------
__int64 qnap_exec_glob(const char *a1, const char *a2, const char *a3, const char *a4, ...)
{
gcc_va_list va; // [rsp+20h] [rbp-D0h] BYREF
va_start(va, a4);
return (unsigned int)sub_2AF4F(a1, a2, a3, 1u, a4, (__int64 *)va);
}
//----- (000000000002B2B2) ----------------------------------------------------
__int64 __fastcall qnap_exec_v(const char *a1, const char *a2, const char *a3, const char *a4, _QWORD *a5)
{
unsigned int v5; // ebx
const char **v6; // rax
const char **v7; // rdx
const char **v10; // [rsp+8h] [rbp-68h]
int v13; // [rsp+38h] [rbp-38h] BYREF
int v14; // [rsp+3Ch] [rbp-34h] BYREF
const char **v15; // [rsp+40h] [rbp-30h] BYREF
const char **v16; // [rsp+48h] [rbp-28h]
_QWORD *i; // [rsp+50h] [rbp-20h]
size_t nmemb; // [rsp+58h] [rbp-18h]
nmemb = 2LL;
for ( i = a5; *i; ++i )
++nmemb;
v15 = (const char **)calloc(nmemb, 8uLL);
if ( v15 )
{
v16 = v15 + 1;
*v15 = a4;
v10 = (const char **)(a5 + 1);
do
{
v6 = v16++;
v7 = v10++;
*v6 = *v7;
}
while ( *v6 );
v14 = open64(a1, 1090, 508LL);
v13 = open64(a2, 1090, 508LL);
v5 = sub_2AE7A(0xFFFFFFFF, v14, v13, a3, 0, v15);
qnap_auto_close_fd(&v13);
qnap_auto_close_fd(&v14);
}
else
{
v5 = -1;
}
sub_2A21C((void **)&v15);
return v5;
}
//----- (000000000002B3FC) ----------------------------------------------------
__int64 __fastcall qnap_exec_v2(
const char *a1,
const char *a2,
const char *a3,
const char *a4,
int a5,
int a6,
const char *a7,
_QWORD *a8)
{
unsigned int v8; // ebx
const char **v9; // rax
const char **v10; // rdx
int v16; // [rsp+34h] [rbp-3Ch] BYREF
int v17; // [rsp+38h] [rbp-38h] BYREF
int v18; // [rsp+3Ch] [rbp-34h] BYREF
const char **v19; // [rsp+40h] [rbp-30h] BYREF
const char **v20; // [rsp+48h] [rbp-28h]
_QWORD *i; // [rsp+50h] [rbp-20h]
size_t nmemb; // [rsp+58h] [rbp-18h]
const char **v23; // [rsp+88h] [rbp+18h]
nmemb = 2LL;
for ( i = a8; *i; ++i )
++nmemb;
v19 = (const char **)calloc(nmemb, 8uLL);
if ( v19 )
{
v20 = v19 + 1;
*v19 = a7;
v23 = (const char **)(a8 + 1);
do
{
v9 = v20++;
v10 = v23++;
*v9 = *v10;
}
while ( *v9 );
v18 = open64(a1, 0);
v17 = open64(a2, a5, 508LL);
v16 = open64(a3, a6, 508LL);
v8 = sub_2AE7A(v18, v17, v16, a4, 0, v19);
qnap_auto_close_fd(&v16);
qnap_auto_close_fd(&v17);
qnap_auto_close_fd(&v18);
}
else
{
v8 = -1;
}
sub_2A21C((void **)&v19);
return v8;
}
//----- (000000000002B56D) ----------------------------------------------------
__int64 qnap_exec_pipe(const char *a1, const char *a2, const char *a3, ...)
{
__int64 *v3; // rax
__int64 v4; // kr00_8
unsigned int v5; // ebx
__int64 *v6; // rax
__int64 v7; // kr08_8
gcc_va_list va1; // [rsp+20h] [rbp-110h] BYREF
gcc_va_list va; // [rsp+38h] [rbp-F8h] BYREF
int v12; // [rsp+50h] [rbp-E0h] BYREF
int v13; // [rsp+54h] [rbp-DCh] BYREF
const char **v14; // [rsp+58h] [rbp-D8h] BYREF
__int64 *v15; // [rsp+60h] [rbp-D0h]
size_t nmemb; // [rsp+68h] [rbp-C8h]
va_start(va, a3);
for ( nmemb = 2LL; ; ++nmemb )
{
if ( va[0].gp_offset >= 0x30 )
{
v4 = va_arg(va, _QWORD);
v3 = &v4;
}
else
{
v3 = (__int64 *)((char *)va[0].reg_save_area + va[0].gp_offset);
va[0].gp_offset += 8;
}
if ( !*v3 )
break;
}
v14 = (const char **)calloc(nmemb, 8uLL);
if ( v14 )
{
va_start(va1, a3);
v15 = (__int64 *)(v14 + 1);
*v14 = a3;
while ( 1 )
{
if ( va1[0].gp_offset >= 0x30 )
{
v7 = va_arg(va1, _QWORD);
v6 = &v7;
}
else
{
v6 = (__int64 *)((char *)va[0].reg_save_area + va1[0].gp_offset);
va1[0].gp_offset += 8;
}
*v15 = *v6;
if ( !*v15 )
break;
++v15;
}
v13 = open64(a1, 1090, 508LL);
v12 = open64(a2, 1090, 508LL);
v5 = sub_2AE7A(0xFFFFFFFF, v13, v12, 0LL, 0, v14);
qnap_auto_close_fd(&v12);
qnap_auto_close_fd(&v13);
}
else
{
v5 = -1;
}
sub_2A21C((void **)&v14);
return v5;
}
//----- (000000000002B7F2) ----------------------------------------------------
__int64 __fastcall sub_2B7F2(unsigned __int8 a1, const char *a2, __int64 *a3)
{
_QWORD *v3; // rax
unsigned int v4; // ebx
_QWORD *v5; // rax
__int64 v8; // [rsp+28h] [rbp-58h]
_QWORD *v9; // [rsp+30h] [rbp-50h]
__int64 v10; // [rsp+38h] [rbp-48h]
__int64 v11; // [rsp+40h] [rbp-40h]
_QWORD *v12; // [rsp+48h] [rbp-38h]
__int64 v13; // [rsp+50h] [rbp-30h]
const char **v14; // [rsp+58h] [rbp-28h] BYREF
_QWORD *v15; // [rsp+60h] [rbp-20h]
size_t nmemb; // [rsp+68h] [rbp-18h]
nmemb = 2LL;
v11 = *a3;
v12 = (_QWORD *)a3[1];
v13 = a3[2];
while ( 1 )
{
if ( (unsigned int)v11 >= 0x30 )
{
v3 = v12++;
}
else
{
v3 = (_QWORD *)((unsigned int)v11 + v13);
LODWORD(v11) = v11 + 8;
}
if ( !*v3 )
break;
++nmemb;
}
v14 = (const char **)calloc(nmemb, 8uLL);
if ( v14 )
{
v8 = *a3;
v9 = (_QWORD *)a3[1];
v10 = a3[2];
v15 = v14 + 1;
*v14 = a2;
while ( 1 )
{
if ( (unsigned int)v8 >= 0x30 )
{
v5 = v9++;
}
else
{
v5 = (_QWORD *)((unsigned int)v8 + v10);
LODWORD(v8) = v8 + 8;
}
*v15 = *v5;
if ( !*v15 )
break;
++v15;
}
v4 = sub_2AE7A(0xFFFFFFFF, -1, -1, 0LL, a1, v14);
}
else
{
v4 = -1;
}
sub_2A21C((void **)&v14);
return v4;
}
//----- (000000000002B94F) ----------------------------------------------------
__int64 qnap_system(const char *a1, ...)
{
gcc_va_list va; // [rsp+10h] [rbp-D0h] BYREF
va_start(va, a1);
return (unsigned int)sub_2B7F2(0, a1, (__int64 *)va);
}
//----- (000000000002B9FE) ----------------------------------------------------
__int64 qnap_system_glob(const char *a1, ...)
{
gcc_va_list va; // [rsp+10h] [rbp-D0h] BYREF
va_start(va, a1);
return (unsigned int)sub_2B7F2(1u, a1, (__int64 *)va);
}
//----- (000000000002BAAD) ----------------------------------------------------
FILE *__fastcall sub_2BAAD(char *a1, const char *a2, const char *a3, unsigned __int8 a4, char a5, const char **a6)
{
FILE *v6; // rax
char *v7; // rax
FILE *v8; // rbx
int v9; // eax
void (__fastcall *v10)(unsigned int, int, int, const char *, unsigned __int8, const char **); // rax
int v11; // esi
int v12; // edi
char *s; // [rsp+28h] [rbp-58h]
int v19; // [rsp+3Ch] [rbp-44h]
int fds[2]; // [rsp+40h] [rbp-40h] BYREF
FILE *stream; // [rsp+48h] [rbp-38h] BYREF
__pid_t v22; // [rsp+50h] [rbp-30h]
unsigned int v23; // [rsp+54h] [rbp-2Ch]
FILE *v24; // [rsp+58h] [rbp-28h]
void *ptr; // [rsp+60h] [rbp-20h]
_BOOL4 v26; // [rsp+6Ch] [rbp-14h]
s = a1;
v23 = getpid();
if ( a3 )
v6 = fopen64(a3, "a+");
else
v6 = 0LL;
stream = v6;
fds[0] = -1;
fds[1] = -1;
v7 = strchr(a1, 43);
v26 = v7 != 0LL;
if ( v7 )
{
s = "r+";
if ( socketpair(1, 1, 0, fds) < 0 )
{
if ( stream )
{
fprintf(stream, "[ERROR] [%d] create socketpair fail: %s\n", v23, *a6);
fflush(stream);
}
v8 = 0LL;
goto LABEL_44;
}
goto LABEL_16;
}
if ( (*a1 == 114 || *a1 == 119) && !a1[1] && pipe(fds) >= 0 )
{
LABEL_16:
ptr = calloc(1uLL, 0x18uLL);
if ( ptr )
{
pthread_rwlock_rdlock(&rwlock);
v22 = vfork();
if ( v22 >= 0 )
{
if ( !v22 )
{
if ( a2 )
v9 = open64(a2, 1090, 508LL);
else
v9 = -1;
v19 = v9;
if ( a5 )
v10 = (void (__fastcall *)(unsigned int, int, int, const char *, unsigned __int8, const char **))sub_2A9A4;
else
v10 = (void (__fastcall *)(unsigned int, int, int, const char *, unsigned __int8, const char **))sub_2AE7A;
if ( *s == 114 || v26 )
v11 = fds[1];
else
v11 = -1;
if ( *s == 119 || v26 )
v12 = fds[0];
else
v12 = -1;
v10(v12, v11, v19, 0LL, a4, a6);
_exit(1);
}
v24 = 0LL;
if ( *s == 114 )
{
v24 = fdopen(fds[0], s);
close(fds[1]);
}
else
{
v24 = fdopen(fds[1], s);
close(fds[0]);
}
*((_QWORD *)ptr + 1) = v24;
*((_DWORD *)ptr + 4) = v22;
*(_QWORD *)ptr = qword_237A00;
qword_237A00 = (__int64)ptr;
pthread_rwlock_unlock(&rwlock);
v8 = v24;
}
else
{
if ( stream )
{
fprintf(stream, "[ERROR] [%d] vfork fail: %s\n", v23, *a6);
fflush(stream);
}
pthread_rwlock_unlock(&rwlock);
close(fds[0]);
close(fds[1]);
free(ptr);
v8 = 0LL;
}
}
else
{
if ( stream )
{
fprintf(stream, "[ERROR] [%d] calloc fail: %s\n", v23, *a6);
fflush(stream);
}
close(fds[0]);
close(fds[1]);
v8 = 0LL;
}
goto LABEL_44;
}
if ( stream )
{
fprintf(stream, "[ERROR] [%d] create pipe fail: %s\n", v23, *a6);
fflush(stream);
}
v8 = 0LL;
LABEL_44:
qnap_auto_close_file(&stream);
return v8;
}
// 237A00: using guessed type __int64 qword_237A00;
//----- (000000000002BE5E) ----------------------------------------------------
FILE *__fastcall sub_2BE5E(char *a1, unsigned __int8 a2, const char *a3, __int64 *a4)
{
_QWORD *v4; // rax
FILE *v5; // rbx
_QWORD *v6; // rax
_QWORD *v7; // rax
__int64 v11; // [rsp+28h] [rbp-58h]
_QWORD *v12; // [rsp+30h] [rbp-50h]
__int64 v13; // [rsp+38h] [rbp-48h]
__int64 v14; // [rsp+40h] [rbp-40h]
_QWORD *v15; // [rsp+48h] [rbp-38h]
__int64 v16; // [rsp+50h] [rbp-30h]
const char **v17; // [rsp+58h] [rbp-28h] BYREF
_QWORD *v18; // [rsp+60h] [rbp-20h]
size_t nmemb; // [rsp+68h] [rbp-18h]
nmemb = 3LL;
v14 = *a4;
v15 = (_QWORD *)a4[1];
v16 = a4[2];
while ( 1 )
{
if ( (unsigned int)v14 >= 0x30 )
{
v4 = v15++;
}
else
{
v4 = (_QWORD *)((unsigned int)v14 + v16);
LODWORD(v14) = v14 + 8;
}
if ( !*v4 )
break;
++nmemb;
}
v17 = (const char **)calloc(nmemb, 8uLL);
if ( v17 )
{
v11 = *a4;
v12 = (_QWORD *)a4[1];
v13 = a4[2];
v18 = v17 + 1;
*v17 = a3;
while ( 1 )
{
if ( (unsigned int)v11 >= 0x30 )
{
v6 = v12++;
}
else
{
v6 = (_QWORD *)((unsigned int)v11 + v13);
LODWORD(v11) = v11 + 8;
}
*v18 = *v6;
if ( !*v18 )
break;
++v18;
}
v7 = v18++;
*v7 = "&";
v5 = sub_2BAAD(a1, 0LL, 0LL, a2, 0, v17);
}
else
{
v5 = 0LL;
}
sub_2A21C((void **)&v17);
return v5;
}
//----- (000000000002BFD9) ----------------------------------------------------
FILE *qnap_popen(char *a1, const char *a2, ...)
{
gcc_va_list va; // [rsp+10h] [rbp-D0h] BYREF
va_start(va, a2);
return sub_2BE5E(a1, 0, a2, (__int64 *)va);
}
//----- (000000000002C091) ----------------------------------------------------
FILE *qnap_popen_glob(char *a1, const char *a2, ...)
{
gcc_va_list va; // [rsp+10h] [rbp-D0h] BYREF
va_start(va, a2);
return sub_2BE5E(a1, 1u, a2, (__int64 *)va);
}
//----- (000000000002C149) ----------------------------------------------------
FILE *__fastcall sub_2C149(char *a1, const char *a2, const char *a3, unsigned __int8 a4, const char *a5, __int64 *a6)
{
_QWORD *v6; // rax
FILE *v7; // rbx
_QWORD *v8; // rax
_QWORD *v9; // rax
__int64 v15; // [rsp+38h] [rbp-58h]
_QWORD *v16; // [rsp+40h] [rbp-50h]
__int64 v17; // [rsp+48h] [rbp-48h]
__int64 v18; // [rsp+50h] [rbp-40h]
_QWORD *v19; // [rsp+58h] [rbp-38h]
__int64 v20; // [rsp+60h] [rbp-30h]
const char **v21; // [rsp+68h] [rbp-28h] BYREF
_QWORD *v22; // [rsp+70h] [rbp-20h]
size_t nmemb; // [rsp+78h] [rbp-18h]
nmemb = 3LL;
v18 = *a6;
v19 = (_QWORD *)a6[1];
v20 = a6[2];
while ( 1 )
{
if ( (unsigned int)v18 >= 0x30 )
{
v6 = v19++;
}
else
{
v6 = (_QWORD *)((unsigned int)v18 + v20);
LODWORD(v18) = v18 + 8;
}
if ( !*v6 )
break;
++nmemb;
}
v21 = (const char **)calloc(nmemb, 8uLL);
if ( v21 )
{
v15 = *a6;
v16 = (_QWORD *)a6[1];
v17 = a6[2];
v22 = v21 + 1;
*v21 = a5;
while ( 1 )
{
if ( (unsigned int)v15 >= 0x30 )
{
v8 = v16++;
}
else
{
v8 = (_QWORD *)((unsigned int)v15 + v17);
LODWORD(v15) = v15 + 8;
}
*v22 = *v8;
if ( !*v22 )
break;
++v22;
}
v9 = v22++;
*v9 = "&";
v7 = sub_2BAAD(a1, a2, a3, a4, 0, v21);
}
else
{
v7 = 0LL;
}
sub_2A21C((void **)&v21);
return v7;
}
//----- (000000000002C2DD) ----------------------------------------------------
FILE *qnap_popen_log(char *a1, const char *a2, const char *a3, const char *a4, ...)
{
gcc_va_list va; // [rsp+20h] [rbp-D0h] BYREF
va_start(va, a4);
return sub_2C149(a1, a2, a3, 0, a4, (__int64 *)va);
}
//----- (000000000002C3A9) ----------------------------------------------------
FILE *qnap_popen_glob_log(char *a1, const char *a2, const char *a3, const char *a4, ...)
{
gcc_va_list va; // [rsp+20h] [rbp-D0h] BYREF
va_start(va, a4);
return sub_2C149(a1, a2, a3, 1u, a4, (__int64 *)va);
}
//----- (000000000002C475) ----------------------------------------------------
FILE *qnap_popen_pipe(const char *a1, ...)
{
__int64 *v1; // rax
__int64 v2; // kr00_8
FILE *v3; // rbx
__int64 *v4; // rax
__int64 v5; // kr08_8
__int64 *v6; // rax
gcc_va_list va1; // [rsp+18h] [rbp-108h] BYREF
gcc_va_list va; // [rsp+30h] [rbp-F0h] BYREF
const char **v10; // [rsp+48h] [rbp-D8h] BYREF
__int64 *v11; // [rsp+50h] [rbp-D0h]
size_t nmemb; // [rsp+58h] [rbp-C8h]
va_start(va, a1);
for ( nmemb = 3LL; ; ++nmemb )
{
if ( va[0].gp_offset >= 0x30 )
{
v2 = va_arg(va, _QWORD);
v1 = &v2;
}
else
{
v1 = (__int64 *)((char *)va[0].reg_save_area + va[0].gp_offset);
va[0].gp_offset += 8;
}
if ( !*v1 )
break;
}
v10 = (const char **)calloc(nmemb, 8uLL);
if ( v10 )
{
va_start(va1, a1);
v11 = (__int64 *)(v10 + 1);
*v10 = a1;
while ( 1 )
{
if ( va1[0].gp_offset >= 0x30 )
{
v5 = va_arg(va1, _QWORD);
v4 = &v5;
}
else
{
v4 = (__int64 *)((char *)va[0].reg_save_area + va1[0].gp_offset);
va1[0].gp_offset += 8;
}
*v11 = *v4;
if ( !*v11 )
break;
++v11;
}
v6 = v11++;
*v6 = (__int64)"&";
v3 = sub_2BAAD("r", 0LL, 0LL, 0, 0, v10);
}
else
{
v3 = 0LL;
}
sub_2A21C((void **)&v10);
return v3;
}
//----- (000000000002C6B0) ----------------------------------------------------
__int64 __fastcall qnap_pclose(FILE *a1)
{
int stat_loc; // [rsp+18h] [rbp-18h] BYREF
__pid_t v3; // [rsp+1Ch] [rbp-14h]
_QWORD *v4; // [rsp+20h] [rbp-10h]
void *ptr; // [rsp+28h] [rbp-8h]
if ( !a1 )
return 0xFFFFFFFFLL;
pthread_rwlock_wrlock(&rwlock);
v4 = 0LL;
for ( ptr = (void *)qword_237A00; ptr && *((FILE **)ptr + 1) != a1; ptr = *(void **)ptr )
v4 = ptr;
if ( ptr )
{
fclose(a1);
if ( v4 )
*v4 = *(_QWORD *)ptr;
else
qword_237A00 = *(_QWORD *)ptr;
pthread_rwlock_unlock(&rwlock);
do
v3 = waitpid(*((_DWORD *)ptr + 4), &stat_loc, 0);
while ( v3 == -1 && *__errno_location() == 4 );
free(ptr);
if ( v3 == -1 )
return 0xFFFFFFFFLL;
else
return (unsigned int)stat_loc;
}
else
{
pthread_rwlock_unlock(&rwlock);
return 0xFFFFFFFFLL;
}
}
// 237A00: using guessed type __int64 qword_237A00;
//----- (000000000002C7C0) ----------------------------------------------------
__int64 __fastcall qnap_pclose_pipe(__int64 a1)
{
return qnap_pclose(a1);
}
// A180: using guessed type __int64 __fastcall qnap_pclose(_QWORD);
//----- (000000000002C7DA) ----------------------------------------------------
__int64 __fastcall qnap_secure_exec(
int a1,
int a2,
int a3,
int a4,
int a5,
int a6,
const char **a7,
char a8,
char *file,
char *a10,
int oflag,
char *a12,
int a13,
const char *a14)
{
unsigned int v14; // ebx
int v16; // [rsp+4h] [rbp-1Ch] BYREF
int v17; // [rsp+8h] [rbp-18h] BYREF
int v18[5]; // [rsp+Ch] [rbp-14h] BYREF
v18[0] = -1;
if ( file )
v18[0] = open64(file, 0);
v17 = -1;
if ( a10 )
v17 = open64(a10, oflag, 508LL);
v16 = -1;
if ( a12 )
v16 = open64(a12, a13, 508LL);
v14 = sub_2A9A4(v18[0], v17, v16, a14, a8 != 0, a7);
qnap_auto_close_fd(&v16);
qnap_auto_close_fd(&v17);
qnap_auto_close_fd(v18);
return v14;
}
// 2C7DA: using guessed type int var_14[5];
//----- (000000000002C8C1) ----------------------------------------------------
FILE *__fastcall qnap_secure_popen(
char *a1,
__int64 a2,
__int64 a3,
__int64 a4,
__int64 a5,
__int64 a6,
char *a7,
char a8,
int a9,
int a10,
int a11,
const char *a12,
int a13,
const char *a14)
{
FILE *v14; // rbx
const char **v16; // [rsp+18h] [rbp-28h] BYREF
char *i; // [rsp+20h] [rbp-20h]
size_t nmemb; // [rsp+28h] [rbp-18h]
nmemb = 2LL;
for ( i = a7; i && *(_QWORD *)i; i += 8 )
++nmemb;
v16 = (const char **)calloc(nmemb, 8uLL);
if ( v16 )
{
for ( i = a7; i && *(_QWORD *)i; i += 8 )
*(const char **)((char *)v16 + i - a7) = *(const char **)i;
*(const char **)((char *)v16 + i - a7) = (_BYTE *)(&qword_20 + 6);
v14 = sub_2BAAD(a1, a12, a14, a8 != 0, 1, v16);
}
else
{
v14 = 0LL;
}
sub_2A21C((void **)&v16);
return v14;
}
// 20: using guessed type __int64 qword_20;
//----- (000000000002C9CF) ----------------------------------------------------
__int64 __fastcall sub_2C9CF(char a1)
{
int i; // [rsp+10h] [rbp-4h]
if ( a1 > 32 && a1 <= 46 || a1 > 58 && a1 <= 64 || a1 > 90 && a1 <= 96 || a1 > 122 && a1 != 127 )
{
for ( i = 0; i < 22; ++i )
{
if ( *((_BYTE *)&unk_2371C0 + 8 * i + 4) == a1 )
return *((unsigned int *)&unk_2371C0 + 2 * i);
}
}
return 0LL;
}
//----- (000000000002CA69) ----------------------------------------------------
__int64 __fastcall sub_2CA69(char *a1, char *a2)
{
int v5; // [rsp+18h] [rbp-8h]
int v6; // [rsp+1Ch] [rbp-4h]
while ( *a1 && *a2 )
{
v6 = sub_2C9CF(*a1);
v5 = sub_2C9CF(*a2);
if ( v6 <= 0 || v5 <= 0 )
{
if ( v6 > 0 && !v5 )
return 0xFFFFFFFFLL;
if ( !v6 && v5 > 0 )
return 1LL;
if ( *a1 == *a2 )
{
++a1;
++a2;
}
else if ( *a1 == 45 )
{
++a1;
}
else
{
if ( *a2 != 45 )
break;
++a2;
}
}
else
{
if ( v6 != v5 )
{
if ( v6 - v5 >= 0 )
return 1LL;
else
return 0xFFFFFFFFLL;
}
++a1;
++a2;
}
}
if ( *a1 && *a2 )
return 0LL;
if ( *a1 - *a2 >= 0 )
return 1LL;
return 0xFFFFFFFFLL;
}
//----- (000000000002CBC3) ----------------------------------------------------
char *__fastcall sub_2CBC3(const char *a1, char *a2, int a3)
{
char *result; // rax
snprintf(a2, a3, "%s/%s", "/etc/config/.qos_config/users", a1);
result = strchr(a2, 92);
if ( result )
*result = 43;
return result;
}
//----- (000000000002CC2F) ----------------------------------------------------
__int64 __fastcall sub_2CC2F(char *a1, char *a2)
{
char *endptr; // [rsp+0h] [rbp-30h] BYREF
char *nptr; // [rsp+8h] [rbp-28h] BYREF
__int64 v5; // [rsp+10h] [rbp-20h]
__int64 v6; // [rsp+18h] [rbp-18h]
char v7; // [rsp+26h] [rbp-Ah]
char v8; // [rsp+27h] [rbp-9h]
int v9; // [rsp+28h] [rbp-8h]
char v10; // [rsp+2Dh] [rbp-3h]
char v11; // [rsp+2Eh] [rbp-2h]
char v12; // [rsp+2Fh] [rbp-1h]
nptr = a1;
endptr = a2;
v12 = 0;
v11 = 0;
v10 = 0;
v9 = 0;
v8 = 0;
v7 = 0;
if ( !a1 && !endptr )
return 0LL;
if ( !nptr )
return 0xFFFFFFFFLL;
if ( !endptr )
return 1LL;
while ( 1 )
{
while ( 1 )
{
do
{
if ( !*nptr || !*endptr )
{
if ( *nptr )
return 1LL;
if ( *endptr )
return 0xFFFFFFFFLL;
return (unsigned int)v10;
}
v6 = 0LL;
v5 = 0LL;
v12 = *nptr;
v11 = *endptr;
if ( v12 <= 47 || v12 > 57 )
{
v8 = v12 > 96 && v12 <= 122 || v12 > 64 && v12 <= 90;
}
else
{
v8 = 2;
v6 = strtol(nptr, &nptr, 10);
}
if ( v11 <= 47 || v11 > 57 )
{
v7 = v11 > 96 && v11 <= 122 || v11 > 64 && v11 <= 90;
}
else
{
v7 = 2;
v5 = strtol(endptr, &endptr, 10);
}
++nptr;
++endptr;
}
while ( v12 == v11 );
if ( v8 != 2 || v7 != 2 )
break;
if ( v6 != v5 )
{
if ( v6 >= v5 )
return 1LL;
else
return 0xFFFFFFFFLL;
}
}
if ( v8 == 2 )
return 0xFFFFFFFFLL;
if ( v7 == 2 )
return 1LL;
if ( v8 != 1 && v7 != 1 )
{
if ( v12 - v11 <= 0 )
return 0xFFFFFFFFLL;
else
return 1LL;
}
if ( v8 != 1 )
return 1LL;
if ( v7 != 1 )
return 0xFFFFFFFFLL;
if ( v12 > 90 || v11 <= 96 )
{
if ( v12 > 96 && v11 <= 90 )
{
v12 -= 32;
v9 = 1;
}
}
else
{
v11 -= 32;
v9 = -1;
}
if ( v12 != v11 )
break;
if ( !v10 )
v10 = v9;
}
if ( v12 - v11 <= 0 )
return 0xFFFFFFFFLL;
else
return 1LL;
}
//----- (000000000002CEE9) ----------------------------------------------------
__int64 __fastcall sub_2CEE9(__int64 a1, char *a2, char *a3)
{
__int64 (__fastcall *v4)(_QWORD, char *, _QWORD, char *, _QWORD, int *); // rbx
unsigned int v5; // r12d
unsigned int v6; // eax
int v8; // [rsp+28h] [rbp-18h] BYREF
unsigned int v9; // [rsp+2Ch] [rbp-14h]
v9 = sub_2CA69(a2, a3);
if ( v9 )
return v9;
if ( !a1 )
return sub_2CC2F(a2, a3);
v8 = 0;
v4 = *(__int64 (__fastcall **)(_QWORD, char *, _QWORD, char *, _QWORD, int *))(a1 + 40);
v5 = strlen(a3);
v6 = strlen(a2);
return v4(*(_QWORD *)(a1 + 64), a2, v6, a3, v5, &v8);
}
//----- (000000000002CF9D) ----------------------------------------------------
__int64 __fastcall sub_2CF9D(__uid_t a1, char *a2, int a3)
{
char s[512]; // [rsp+10h] [rbp-330h] BYREF
__int16 v6; // [rsp+210h] [rbp-130h]
char v7[264]; // [rsp+220h] [rbp-120h] BYREF
FILE *stream; // [rsp+328h] [rbp-18h]
struct passwd *v9; // [rsp+330h] [rbp-10h]
int v10; // [rsp+33Ch] [rbp-4h]
memset(v7, 0, 257);
memset(s, 0, sizeof(s));
v6 = 0;
v9 = getpwuid(a1);
stream = 0LL;
v10 = -1;
if ( !v9 )
return 0xFFFFFFFFLL;
sub_2CBC3(v9->pw_name, v7, 257);
snprintf(s, 0x202uLL, "%s/config", v7);
stream = qnap_popen("r", "/sbin/getcfg", "common", "lang", "-d", "ENG", "-f", s, 0LL);
if ( !stream )
return 0xFFFFFFFFLL;
if ( fgets(a2, a3, stream) )
v10 = strlen(a2);
qnap_pclose(stream);
if ( v10 <= 0 )
return 0xFFFFFFFFLL;
a2[v10 - 1] = 0;
return 0LL;
}
// A180: using guessed type __int64 __fastcall qnap_pclose(_QWORD);
//----- (000000000002D13D) ----------------------------------------------------
void __fastcall sub_2D13D(__int64 a1)
{
if ( *(_QWORD *)(a1 + 16) )
{
if ( *(_QWORD *)(a1 + 64) && *(_QWORD *)(a1 + 56) )
(*(void (__fastcall **)(_QWORD))(a1 + 56))(*(_QWORD *)(a1 + 64));
dlclose(*(void **)(a1 + 16));
}
if ( *(_QWORD *)(a1 + 8) )
dlclose(*(void **)(a1 + 8));
if ( *(_QWORD *)a1 )
dlclose(*(void **)a1);
free((void *)a1);
}
//----- (000000000002D1DB) ----------------------------------------------------
__int64 __fastcall sub_2D1DB(const char *a1, char *a2, int a3)
{
char *v5; // [rsp+28h] [rbp-18h]
char *v6; // [rsp+28h] [rbp-18h]
const char *s; // [rsp+30h] [rbp-10h]
const char *haystack; // [rsp+38h] [rbp-8h]
haystack = getenv("HTTP_COOKIE");
if ( !haystack )
return 0xFFFFFFFFLL;
s = strstr(haystack, a1);
if ( !s )
return 0xFFFFFFFFLL;
v5 = strchr(s, 61);
if ( !v5 )
return 0xFFFFFFFFLL;
snprintf(a2, a3, "%s", v5 + 1);
v6 = strchr(a2, 59);
if ( v6 )
*v6 = 0;
return 0LL;
}
//----- (000000000002D2C3) ----------------------------------------------------
char *qnap_sort_get_locale_of_display_language()
{
__uid_t v0; // eax
char s2[8]; // [rsp+0h] [rbp-30h] BYREF
__int64 v3; // [rsp+8h] [rbp-28h]
__int64 v4; // [rsp+10h] [rbp-20h]
__int64 v5; // [rsp+18h] [rbp-18h]
unsigned int i; // [rsp+2Ch] [rbp-4h]
*(_QWORD *)s2 = 0LL;
v3 = 0LL;
v4 = 0LL;
v5 = 0LL;
i = 0;
if ( (unsigned int)sub_2D1DB("nas_lang=", s2, 32) )
{
v0 = getuid();
if ( (unsigned int)sub_2CF9D(v0, s2, 32) )
return off_237288;
}
for ( i = 0; i <= 0x16; ++i )
{
if ( !strcmp((&off_237280)[2 * (int)i], s2) )
return (&off_237280)[2 * (int)i + 1];
}
return off_237288;
}
// 237280: using guessed type char *off_237280;
// 237288: using guessed type char *off_237288;
//----- (000000000002D397) ----------------------------------------------------
void __fastcall qnap_sort_close(__int64 a1)
{
if ( a1 )
sub_2D13D(a1);
}
//----- (000000000002D3BA) ----------------------------------------------------
void *__fastcall qnap_sort_open(const char *a1)
{
__int64 v2; // rax
const char *v3; // [rsp+8h] [rbp-18h]
int v4; // [rsp+14h] [rbp-Ch] BYREF
void *v5; // [rsp+18h] [rbp-8h]
v3 = a1;
v4 = 0;
v5 = calloc(1uLL, 0x48uLL);
if ( !v5 )
return 0LL;
if ( !a1 )
v3 = "en_US";
*(_QWORD *)v5 = dlopen("/mnt/ext/opt/samba/lib/libicudata.so", 1);
if ( !*(_QWORD *)v5 )
goto LABEL_15;
*((_QWORD *)v5 + 1) = dlopen("/mnt/ext/opt/samba/lib/libicuuc.so", 1);
if ( !*((_QWORD *)v5 + 1) )
goto LABEL_15;
*((_QWORD *)v5 + 2) = dlopen("/mnt/ext/opt/samba/lib/libicui18n.so", 1);
if ( !*((_QWORD *)v5 + 2) )
goto LABEL_15;
*((_QWORD *)v5 + 3) = dlsym(*((void **)v5 + 2), "ucol_open_68");
if ( *((_QWORD *)v5 + 3)
&& (*((_QWORD *)v5 + 4) = dlsym(*((void **)v5 + 2), "ucol_setStrength_68")) != 0LL
&& (*((_QWORD *)v5 + 5) = dlsym(*((void **)v5 + 2), "ucol_strcollUTF8_68")) != 0LL
&& (*((_QWORD *)v5 + 6) = dlsym(*((void **)v5 + 2), "ucol_setAttribute_68")) != 0LL
&& (*((_QWORD *)v5 + 7) = dlsym(*((void **)v5 + 2), "ucol_close_68")) != 0LL
&& (v2 = (*((__int64 (__fastcall **)(const char *, int *))v5 + 3))(v3, &v4), (*((_QWORD *)v5 + 8) = v2) != 0LL) )
{
(*((void (__fastcall **)(_QWORD, _QWORD))v5 + 4))(*((_QWORD *)v5 + 8), 0LL);
(*((void (__fastcall **)(_QWORD, __int64, __int64, int *))v5 + 6))(*((_QWORD *)v5 + 8), 7LL, 17LL, &v4);
(*((void (__fastcall **)(_QWORD, __int64, __int64, int *))v5 + 6))(*((_QWORD *)v5 + 8), 4LL, 17LL, &v4);
(*((void (__fastcall **)(_QWORD, __int64, __int64, int *))v5 + 6))(*((_QWORD *)v5 + 8), 5LL, 2LL, &v4);
(*((void (__fastcall **)(_QWORD, __int64, __int64, int *))v5 + 6))(*((_QWORD *)v5 + 8), 1LL, 20LL, &v4);
return v5;
}
else
{
LABEL_15:
sub_2D13D((__int64)v5);
return 0LL;
}
}
//----- (000000000002D68B) ----------------------------------------------------
__int64 __fastcall qnap_sort_compare(__int64 a1, char *a2, char *a3, int a4)
{
unsigned int v6; // [rsp+2Ch] [rbp-4h]
v6 = sub_2CEE9(a1, a2, a3);
if ( a4 == 1 )
return -v6;
return v6;
}
//----- (000000000002D6D9) ----------------------------------------------------
__int64 __fastcall qnap_scandir(const char *a1, char **a2, unsigned int a3)
{
__int64 locale_of_display_language; // rax
__int64 dest; // [rsp+20h] [rbp-40h] BYREF
struct dirent64 **namelist; // [rsp+28h] [rbp-38h] BYREF
int v8; // [rsp+34h] [rbp-2Ch]
__int64 v9; // [rsp+38h] [rbp-28h]
int v10; // [rsp+44h] [rbp-1Ch]
char *v11; // [rsp+48h] [rbp-18h]
int v12; // [rsp+50h] [rbp-10h]
int j; // [rsp+54h] [rbp-Ch]
int i; // [rsp+58h] [rbp-8h]
int k; // [rsp+5Ch] [rbp-4h]
namelist = 0LL;
v11 = 0LL;
v10 = 0;
k = 0;
if ( !a1 || !a2 )
return 0xFFFFFFFFLL;
v10 = scandir64(a1, &namelist, 0LL, (int (*)(const struct dirent64 **, const struct dirent64 **))&alphasort64);
if ( v10 <= 0 )
return (unsigned int)v10;
v11 = (char *)calloc(v10, 0x100uLL);
if ( v11 )
{
v9 = 0LL;
dest = 0LL;
i = 0;
j = 0;
v8 = 8;
if ( v10 > 1 )
{
locale_of_display_language = qnap_sort_get_locale_of_display_language();
v9 = qnap_sort_open(locale_of_display_language);
for ( i = 0; v10 - 1 > i; ++i )
{
v12 = i;
for ( j = i + 1; j < v10; ++j )
{
if ( (int)qnap_sort_compare(v9, namelist[v12]->d_name, namelist[j]->d_name, a3) > 0 )
v12 = j;
}
if ( i != v12 )
{
memcpy(&dest, &namelist[i], v8);
memcpy(&namelist[i], &namelist[v12], v8);
memcpy(&namelist[v12], &dest, v8);
}
}
qnap_sort_close(v9);
}
for ( k = 0; k < v10; ++k )
snprintf(&v11[256 * (__int64)k], 0x100uLL, "%s", namelist[k]->d_name);
for ( k = 0; k < v10; ++k )
free(namelist[k]);
free(namelist);
*a2 = v11;
return (unsigned int)v10;
}
else
{
if ( v10 > 0 && namelist )
{
for ( k = 0; k < v10; ++k )
free(namelist[k]);
free(namelist);
}
*a2 = 0LL;
return 0xFFFFFFFFLL;
}
}
// A580: using guessed type __int64 __fastcall qnap_sort_compare(_QWORD, _QWORD, _QWORD, _QWORD);
// A7E0: using guessed type __int64 __fastcall qnap_sort_open(_QWORD);
// A8A0: using guessed type __int64 qnap_sort_get_locale_of_display_language(void);
// AD80: using guessed type __int64 __fastcall qnap_sort_close(_QWORD);
//----- (000000000002D9E0) ----------------------------------------------------
int __fastcall sub_2D9E0(char *filename, struct stat64 *stat_buf)
{
return __xstat64(1, filename, stat_buf);
}
//----- (000000000002D9F0) ----------------------------------------------------
int __fastcall sub_2D9F0(char *filename, struct stat64 *stat_buf)
{
return __lxstat64(1, filename, stat_buf);
}
//----- (000000000002DA00) ----------------------------------------------------
void (__fastcall *sub_2DA00())()
{
void (__fastcall **v0)(); // rbx
void (__fastcall *result)(); // rax
v0 = (void (__fastcall **)())&off_235008;
result = (void (__fastcall *)())off_235008;
if ( off_235008 != (__int64 (__fastcall *)())-1LL )
{
do
{
--v0;
result();
result = *v0;
}
while ( *v0 != (void (__fastcall *)())-1LL );
}
return result;
}
// 235008: using guessed type __int64 (__fastcall *off_235008)();
//----- (000000000002DA38) ----------------------------------------------------
void term_proc()
{
sub_AE30();
}
// nfuncs=944 queued=475 decompiled=475 lumina nreq=0 worse=0 better=0
// ALL OK, 475 function(s) have been successfully decompiled
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment