+///////////////////////////////////////////////////////////////////
+// function: pack_array
+///////////////////////////////////////////////////////////////////
+// info:
+// Pack array param to buffer
+// params:
+// char *to - destination buffer
+// va_list *args - array size and array (pointer)
+// uint32_t element_size - size of array element
+// return:
+// char * - destination pointer end after pack
+static char *pack_array(char *to, va_list *args, uint32_t element_size)
+{
+ uint32_t d;
+ uint64_t p;
+
+ // get array elements count
+ d = va_arg(*args, uint32_t);
+ // get array pointer
+ p = (unsigned long)(uintptr_t)va_arg(*args, uint64_t);
+
+ // pack original pointer
+ memcpy(to, &p, sizeof(p));
+ to += sizeof(p);
+ // pack array elements count
+ memcpy(to, &d, sizeof(d));
+ to += sizeof(d);
+
+ // pack array elements
+ element_size *= d;
+ memcpy(to, (void *)(long)p, element_size);
+ to += element_size;
+
+ return to;
+}
+