function packet_add_tlv(&$pkt, $tlv)
{
    $pkt .= tlv_pack($tlv);
}
 function stdapi_sys_process_get_processes($req, &$pkt)
 {
     my_print("doing get_processes");
     $list = array();
     if (is_windows()) {
         # This command produces a line like:
         #  "tasklist.exe","2264","Console","0","4,556 K","Running","EGYPT-B3E55BF3C\Administrator","0:00:00","OleMainThreadWndName"
         $output = my_cmd("tasklist /v /fo csv /nh");
         $lines = explode("\n", trim($output));
         foreach ($lines as $line) {
             $line = trim($line);
             #
             # Ghetto CSV parsing
             #
             $pieces = preg_split('/","/', $line);
             # Strip off the initial quote on the first and last elements
             $pieces[0] = substr($pieces[0], 1, strlen($pieces[0]));
             $cnt = count($pieces) - 1;
             $pieces[$cnt] = substr($pieces[$cnt], 1, strlen($pieces[$cnt]));
             $proc_info = array($pieces[1], $pieces[6], $pieces[0]);
             array_push($list, $proc_info);
         }
     } else {
         # This command produces a line like:
         #    1553 root     /sbin/getty -8 38400 tty1
         $output = my_cmd("ps ax -w -o pid,user,cmd --no-header 2>/dev/null");
         $lines = explode("\n", trim($output));
         foreach ($lines as $line) {
             array_push($list, preg_split("/\\s+/", trim($line)));
         }
     }
     foreach ($list as $proc) {
         $grp = "";
         $grp .= tlv_pack(create_tlv(TLV_TYPE_PID, $proc[0]));
         $grp .= tlv_pack(create_tlv(TLV_TYPE_USER_NAME, $proc[1]));
         $grp .= tlv_pack(create_tlv(TLV_TYPE_PROCESS_NAME, $proc[2]));
         # Strip the pid and the user name off the front; the rest will be the
         # full command line
         array_shift($proc);
         array_shift($proc);
         $grp .= tlv_pack(create_tlv(TLV_TYPE_PROCESS_PATH, join($proc, " ")));
         packet_add_tlv($pkt, create_tlv(TLV_TYPE_PROCESS_GROUP, $grp));
     }
     return ERROR_SUCCESS;
 }