@@ -681,6 +681,27 @@ void npdm_save(npdm_t *npdm, hactool_ctx_t *tool_ctx) {
681681 fclose (f_json );
682682}
683683
684+ static cJSON * kac_create_obj (const char * type , cJSON * val ) {
685+ cJSON * tempobj = NULL ;
686+
687+ tempobj = cJSON_CreateObject ();
688+ cJSON_AddStringToObject (tempobj , "type" , type );
689+ cJSON_AddItemToObject (tempobj , "value" , val );
690+ return tempobj ;
691+ }
692+
693+ void cJSON_AddU16ToKacArray (cJSON * obj , const char * name , uint16_t val ) {
694+ char buf [0x20 ] = {0 };
695+ snprintf (buf , sizeof (buf ), "0x%04" PRIx16 , val );
696+ cJSON_AddItemToArray (obj , kac_create_obj (name , cJSON_CreateString (buf )));
697+ }
698+
699+ void cJSON_AddU32ToKacArray (cJSON * obj , const char * name , uint32_t val ) {
700+ char buf [0x20 ] = {0 };
701+ snprintf (buf , sizeof (buf ), "0x%08" PRIx32 , val );
702+ cJSON_AddItemToArray (obj , kac_create_obj (name , cJSON_CreateString (buf )));
703+ }
704+
684705void cJSON_AddU8ToObject (cJSON * obj , const char * name , uint8_t val ) {
685706 char buf [0x20 ] = {0 };
686707 snprintf (buf , sizeof (buf ), "0x%02" PRIx8 , val );
@@ -695,7 +716,7 @@ void cJSON_AddU16ToObject(cJSON *obj, const char *name, uint16_t val) {
695716
696717void cJSON_AddU32ToObject (cJSON * obj , const char * name , uint32_t val ) {
697718 char buf [0x20 ] = {0 };
698- snprintf (buf , sizeof (buf ), "0x%08" PRIx16 , val );
719+ snprintf (buf , sizeof (buf ), "0x%08" PRIx32 , val );
699720 cJSON_AddStringToObject (obj , name , buf );
700721}
701722
@@ -705,28 +726,50 @@ void cJSON_AddU64ToObject(cJSON *obj, const char *name, uint64_t val) {
705726 cJSON_AddStringToObject (obj , name , buf );
706727}
707728
708- static cJSON * sac_get_json (char * sac , uint32_t sac_size ) {
709- cJSON * sac_json = cJSON_CreateObject ();
729+ static cJSON * sac_access_get_json (char * sac , uint32_t sac_size ) {
730+ cJSON * sac_json = cJSON_CreateArray ();
731+ char service [9 ] = {0 };
732+ uint32_t ofs = 0 ;
733+ uint32_t service_len ;
734+ char ctrl ;
735+ while (ofs < sac_size ) {
736+ ctrl = sac [ofs ++ ];
737+ service_len = (ctrl & 0x7 ) + 1 ;
738+ if (!(ctrl & 0x80 )) {
739+ memset (service , 0 , sizeof (service ));
740+ memcpy (service , & sac [ofs ], service_len );
741+ cJSON_AddItemToArray (sac_json , cJSON_CreateString (service ));
742+ }
743+ ofs += service_len ;
744+ }
745+
746+ return sac_json ;
747+ }
748+
749+ static cJSON * sac_host_get_json (char * sac , uint32_t sac_size ) {
750+ cJSON * sac_json = cJSON_CreateArray ();
710751 char service [9 ] = {0 };
711752 uint32_t ofs = 0 ;
712753 uint32_t service_len ;
713754 char ctrl ;
714755 while (ofs < sac_size ) {
715- memset (service , 0 , sizeof (service ));
716756 ctrl = sac [ofs ++ ];
717757 service_len = (ctrl & 0x7 ) + 1 ;
718- memcpy (service , & sac [ofs ], service_len );
719- cJSON_AddBoolToObject (sac_json , service , (ctrl & 0x80 ) != 0 );
758+ if (ctrl & 0x80 ) {
759+ memset (service , 0 , sizeof (service ));
760+ memcpy (service , & sac [ofs ], service_len );
761+ cJSON_AddItemToArray (sac_json , cJSON_CreateString (service ));
762+ }
720763 ofs += service_len ;
721764 }
722-
765+
723766 return sac_json ;
724767}
725768
726769cJSON * kac_get_json (const uint32_t * descriptors , uint32_t num_descriptors ) {
727- cJSON * kac_json = cJSON_CreateObject ();
770+ cJSON * kac_json = cJSON_CreateArray ();
771+ cJSON * syscall_memory = NULL ;
728772 cJSON * temp = NULL ;
729- bool first_syscall = false;
730773 unsigned int syscall_base ;
731774 for (uint32_t i = 0 ; i < num_descriptors ; i ++ ) {
732775 uint32_t desc = descriptors [i ];
@@ -749,15 +792,15 @@ cJSON *kac_get_json(const uint32_t *descriptors, uint32_t num_descriptors) {
749792 cJSON_AddNumberToObject (temp , "lowest_cpu_id" , desc & 0xFF );
750793 desc >>= 8 ;
751794 cJSON_AddNumberToObject (temp , "highest_cpu_id" , desc & 0xFF );
752- cJSON_AddItemToObject (kac_json , "kernel_flags" , temp );
795+ cJSON_AddItemToArray (kac_json , kac_create_obj ( "kernel_flags" , temp ) );
753796 break ;
754797 case 4 : /* Syscall mask. */
755- temp = cJSON_GetObjectItemCaseSensitive (kac_json , "syscalls" );
756- if (temp == NULL ) {
757- first_syscall = true;
798+ if (syscall_memory == NULL ) {
758799 temp = cJSON_CreateObject ();
759- } else {
760- first_syscall = false;
800+ cJSON_AddItemToArray (kac_json , kac_create_obj ("syscalls" , temp ));
801+ syscall_memory = temp ;
802+ } else {
803+ temp = syscall_memory ;
761804 }
762805 syscall_base = (desc >> 24 ) * 0x18 ;
763806 for (unsigned int sc = 0 ; sc < 0x18 && syscall_base + sc < 0x80 ; sc ++ ) {
@@ -766,13 +809,9 @@ cJSON *kac_get_json(const uint32_t *descriptors, uint32_t num_descriptors) {
766809 }
767810 desc >>= 1 ;
768811 }
769- if (first_syscall ) {
770- cJSON_AddItemToObject (kac_json , "syscalls" , temp );
771- }
772812 break ;
773813 case 6 : /* Map IO/Normal. */
774814 temp = cJSON_CreateObject ();
775-
776815 cJSON_AddU32ToObject (temp , "address" , (desc & 0xFFFFFF ) << 12 );
777816 cJSON_AddBoolToObject (temp , "is_ro" , (desc >> 24 ) & 1 );
778817 if (i == num_descriptors - 1 ) {
@@ -787,10 +826,10 @@ cJSON *kac_get_json(const uint32_t *descriptors, uint32_t num_descriptors) {
787826 desc >>= 7 ;
788827 cJSON_AddU32ToObject (temp , "size" , (desc & 0xFFFFFF ) << 12 );
789828 cJSON_AddBoolToObject (temp , "is_io" , ((desc >> 24 ) & 1 ) == 0 );
790- cJSON_AddItemToObject (kac_json , "map" , temp );
829+ cJSON_AddItemToArray (kac_json , kac_create_obj ( "map" , temp ) );
791830 break ;
792- case 7 : /* Map Normal Page. */
793- cJSON_AddU32ToObject (kac_json , "map_page" , desc << 12 );
831+ case 7 : /* Map Normal Page. */
832+ cJSON_AddU32ToKacArray (kac_json , "map_page" , desc << 12 );
794833 break ;
795834 case 11 : /* IRQ Pair. */
796835 temp = cJSON_CreateArray ();
@@ -805,22 +844,22 @@ cJSON *kac_get_json(const uint32_t *descriptors, uint32_t num_descriptors) {
805844 } else {
806845 cJSON_AddItemToArray (temp , cJSON_CreateNumber (desc & 0x3FF ));
807846 }
808- cJSON_AddItemToObject (kac_json , "irq_pair" , temp );
847+ cJSON_AddItemToArray (kac_json , kac_create_obj ( "irq_pair" , temp ) );
809848 break ;
810849 case 13 : /* App Type. */
811- cJSON_AddNumberToObject (kac_json , "application_type" , desc & 7 );
850+ cJSON_AddItemToArray (kac_json , kac_create_obj ( "application_type" , cJSON_CreateNumber ( desc & 7 )) );
812851 break ;
813852 case 14 : /* Kernel Release Version. */
814- cJSON_AddU16ToObject (kac_json , "min_kernel_version" , desc & 0xFFFF );
853+ cJSON_AddU16ToKacArray (kac_json , "min_kernel_version" , desc & 0xFFFF );
815854 break ;
816855 case 15 : /* Handle Table Size. */
817- cJSON_AddNumberToObject (kac_json , "handle_table_size" , desc );
856+ cJSON_AddItemToArray (kac_json , kac_create_obj ( "handle_table_size" , cJSON_CreateNumber ( desc )) );
818857 break ;
819858 case 16 : /* Debug Flags. */
820859 temp = cJSON_CreateObject ();
821860 cJSON_AddBoolToObject (temp , "allow_debug" , (desc >> 0 ) & 1 );
822861 cJSON_AddBoolToObject (temp , "force_debug" , (desc >> 1 ) & 1 );
823- cJSON_AddItemToObject (kac_json , "debug_flags" , temp );
862+ cJSON_AddItemToArray (kac_json , kac_create_obj ( "debug_flags" , temp ) );
824863
825864 // kac.has_debug_flags = 1;
826865 // kac.allow_debug = desc & 1;
@@ -862,8 +901,10 @@ char *npdm_get_json(npdm_t *npdm) {
862901 cJSON_AddItemToObject (npdm_json , "filesystem_access" , fac_json );
863902
864903 /* Add SAC. */
865- cJSON * sac_json = sac_get_json ((char * )aci0 + aci0 -> sac_offset , aci0 -> sac_size );
866- cJSON_AddItemToObject (npdm_json , "service_access" , sac_json );
904+ cJSON * sac_access_json = sac_access_get_json ((char * )aci0 + aci0 -> sac_offset , aci0 -> sac_size );
905+ cJSON * sac_host_json = sac_host_get_json ((char * )aci0 + aci0 -> sac_offset , aci0 -> sac_size );
906+ cJSON_AddItemToObject (npdm_json , "service_access" , sac_access_json );
907+ cJSON_AddItemToObject (npdm_json , "service_host" , sac_host_json );
867908
868909 /* Add KAC. */
869910 cJSON * kac_json = kac_get_json ((uint32_t * )((char * )aci0 + aci0 -> kac_offset ), aci0 -> kac_size / sizeof (uint32_t ));
@@ -873,4 +914,4 @@ char *npdm_get_json(npdm_t *npdm) {
873914
874915 cJSON_Delete (npdm_json );
875916 return output_str ;
876- }
917+ }
0 commit comments