VirtualBox

source: vbox/trunk/src/VBox/Devices/USB/VUSBSnifferVmx.cpp@ 77807

Last change on this file since 77807 was 76553, checked in by vboxsync, 6 years ago

scm --update-copyright-year

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 7.2 KB
Line 
1/* $Id: VUSBSnifferVmx.cpp 76553 2019-01-01 01:45:53Z vboxsync $ */
2/** @file
3 * Virtual USB Sniffer facility - VMX USBIO format.
4 */
5
6/*
7 * Copyright (C) 2016-2019 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 */
17
18
19/*********************************************************************************************************************************
20* Header Files *
21*********************************************************************************************************************************/
22#define LOG_GROUP LOG_GROUP_DRV_VUSB
23#include <VBox/log.h>
24#include <iprt/mem.h>
25#include <iprt/buildconfig.h>
26#include <iprt/string.h>
27#include <iprt/system.h>
28#include <iprt/time.h>
29
30#include "VUSBSnifferInternal.h"
31
32
33/*********************************************************************************************************************************
34* Defined Constants And Macros *
35*********************************************************************************************************************************/
36
37
38/*********************************************************************************************************************************
39* Structures and Typedefs *
40*********************************************************************************************************************************/
41
42/**
43 * The internal VUSB sniffer state.
44 */
45typedef struct VUSBSNIFFERFMTINT
46{
47 /** Stream handle. */
48 PVUSBSNIFFERSTRM pStrm;
49} VUSBSNIFFERFMTINT;
50
51
52/*********************************************************************************************************************************
53* Static Variables *
54*********************************************************************************************************************************/
55
56/**
57 * Supported file extensions.
58 */
59static const char *s_apszFileExts[] =
60{
61 "vmx",
62 "vmware",
63 "usbio",
64 NULL
65};
66
67
68/**
69 * Month strings.
70 */
71static const char *s_apszMonths[] =
72{
73 "Jan",
74 "Feb",
75 "Mar",
76 "Apr",
77 "May",
78 "Jun",
79 "Jul",
80 "Aug",
81 "Sep",
82 "Oct",
83 "Nov",
84 "Dec"
85};
86
87
88/*********************************************************************************************************************************
89* Internal Functions *
90*********************************************************************************************************************************/
91
92
93static int vusbSnifferFmtVmxLogData(PVUSBSNIFFERFMTINT pThis, PRTTIME pTime, uint8_t *pbBuf, size_t cbBuf)
94{
95 int rc;
96 char szLineBuf[256];
97 size_t off = 0;
98
99 do
100 {
101 size_t cch = RTStrPrintf(&szLineBuf[0], sizeof(szLineBuf),
102 "%s %02u %02u:%02u:%02u.%3.*u: vmx| USBIO: %03zx: %16.*Rhxs\n",
103 s_apszMonths[pTime->u8Month - 1], pTime->u8MonthDay,
104 pTime->u8Hour, pTime->u8Minute, pTime->u8Second, 3, pTime->u32Nanosecond,
105 off, RT_MIN(cbBuf - off, 16), pbBuf);
106 rc = pThis->pStrm->pfnWrite(pThis->pStrm, &szLineBuf[0], cch);
107 off += RT_MIN(cbBuf, 16);
108 pbBuf += RT_MIN(cbBuf, 16);
109 } while (RT_SUCCESS(rc) && off < cbBuf);
110
111 return rc;
112}
113
114/** @interface_method_impl{VUSBSNIFFERFMT,pfnInit} */
115static DECLCALLBACK(int) vusbSnifferFmtVmxInit(PVUSBSNIFFERFMTINT pThis, PVUSBSNIFFERSTRM pStrm)
116{
117 pThis->pStrm = pStrm;
118 return VINF_SUCCESS;
119}
120
121
122/** @interface_method_impl{VUSBSNIFFERFMT,pfnDestroy} */
123static DECLCALLBACK(void) vusbSnifferFmtVmxDestroy(PVUSBSNIFFERFMTINT pThis)
124{
125 NOREF(pThis);
126}
127
128
129/** @interface_method_impl{VUSBSNIFFERFMT,pfnRecordEvent} */
130static DECLCALLBACK(int) vusbSnifferFmtVmxRecordEvent(PVUSBSNIFFERFMTINT pThis, PVUSBURB pUrb, VUSBSNIFFEREVENT enmEvent)
131{
132 RTTIMESPEC TimeNow;
133 RTTIME Time;
134 char szLineBuf[256];
135 const char *pszEvt = enmEvent == VUSBSNIFFEREVENT_SUBMIT ? "Down" : "Up";
136 uint8_t cIsocPkts = pUrb->enmType == VUSBXFERTYPE_ISOC ? pUrb->cIsocPkts : 0;
137
138 if (pUrb->enmType == VUSBXFERTYPE_MSG)
139 return VINF_SUCCESS;
140
141 RT_ZERO(szLineBuf);
142
143 RTTimeNow(&TimeNow);
144 RTTimeExplode(&Time, &TimeNow);
145
146 size_t cch = RTStrPrintf(&szLineBuf[0], sizeof(szLineBuf),
147 "%s %02u %02u:%02u:%02u.%3.*u: vmx| USBIO: %s dev=%u endpt=%x datalen=%u numPackets=%u status=%u 0\n",
148 s_apszMonths[Time.u8Month - 1], Time.u8MonthDay, Time.u8Hour, Time.u8Minute, Time.u8Second, 3, Time.u32Nanosecond,
149 pszEvt, pUrb->DstAddress, pUrb->EndPt | (pUrb->enmDir == VUSBDIRECTION_IN ? 0x80 : 0x00),
150 pUrb->cbData, cIsocPkts, pUrb->enmStatus);
151 int rc = pThis->pStrm->pfnWrite(pThis->pStrm, &szLineBuf[0], cch);
152 if (RT_SUCCESS(rc))
153 {
154 /* Log the data in the appropriate stage. */
155 if ( pUrb->enmType == VUSBXFERTYPE_CTRL
156 || pUrb->enmType == VUSBXFERTYPE_MSG)
157 {
158 if (enmEvent == VUSBSNIFFEREVENT_SUBMIT)
159 rc = vusbSnifferFmtVmxLogData(pThis, &Time, &pUrb->abData[0], sizeof(VUSBSETUP));
160 else if (enmEvent == VUSBSNIFFEREVENT_COMPLETE)
161 {
162 rc = vusbSnifferFmtVmxLogData(pThis, &Time, &pUrb->abData[0], sizeof(VUSBSETUP));
163 if ( RT_SUCCESS(rc)
164 && pUrb->cbData > sizeof(VUSBSETUP))
165 rc = vusbSnifferFmtVmxLogData(pThis, &Time, &pUrb->abData[sizeof(VUSBSETUP)], pUrb->cbData - sizeof(VUSBSETUP));
166 }
167 }
168 else
169 {
170 if ( enmEvent == VUSBSNIFFEREVENT_SUBMIT
171 && pUrb->enmDir == VUSBDIRECTION_OUT)
172 rc = vusbSnifferFmtVmxLogData(pThis, &Time, &pUrb->abData[0], pUrb->cbData);
173 else if ( enmEvent == VUSBSNIFFEREVENT_COMPLETE
174 && pUrb->enmDir == VUSBDIRECTION_IN)
175 rc = vusbSnifferFmtVmxLogData(pThis, &Time, &pUrb->abData[0], pUrb->cbData);
176 }
177 }
178
179 return rc;
180}
181
182/**
183 * VUSB sniffer format writer.
184 */
185const VUSBSNIFFERFMT g_VUsbSnifferFmtVmx =
186{
187 /** szName */
188 "VMX",
189 /** pszDesc */
190 "VMX log format writer supported by vusb-analyzer: http://vusb-analyzer.sourceforge.net",
191 /** papszFileExts */
192 &s_apszFileExts[0],
193 /** cbFmt */
194 sizeof(VUSBSNIFFERFMTINT),
195 /** pfnInit */
196 vusbSnifferFmtVmxInit,
197 /** pfnDestroy */
198 vusbSnifferFmtVmxDestroy,
199 /** pfnRecordEvent */
200 vusbSnifferFmtVmxRecordEvent
201};
202
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette