kvm-guest-drivers-windows
314 строк · 5.8 Кб
1#include "speed-test.h"
2
3#ifndef linux
4
5#include "device.h"
6#include "assert.h"
7
8
9#pragma warning(default:4201)
10
11static ULONG write_buffer_size = 4096;
12static BOOL write_send_auto = FALSE;
13
14BOOL
15GetInfoTest(
16__in CDevice *pDev
17)
18{
19PVOID buf = NULL;
20PVIRTIO_PORT_INFO inf = NULL;
21size_t len;
22
23if (!pDev) return FALSE;
24
25len = sizeof(VIRTIO_PORT_INFO);
26buf = GlobalAlloc(0, len);
27if (!buf) return FALSE;
28if (!pDev->GetInfo(buf, &len))
29{
30GlobalFree(buf);
31buf = GlobalAlloc(0, len);
32if (!buf) return FALSE;
33if (!pDev->GetInfo(buf, &len))
34{
35GlobalFree(buf);
36return FALSE;
37}
38}
39
40inf = (PVIRTIO_PORT_INFO)buf;
41printf("Id = %d\n", inf->Id);
42printf("OutVqFull = %d\n", inf->OutVqFull);
43printf("HostConnected = %d\n", inf->HostConnected);
44printf("GuestConnected = %d\n", inf->GuestConnected);
45if (len > sizeof(VIRTIO_PORT_INFO) && inf->Name[0])
46{
47printf("Id = %s\n", inf->Name);
48}
49GlobalFree(buf);
50return TRUE;
51}
52
53BOOL
54WriteTest(
55__in CDevice *pDev,
56__in BOOLEAN ovrl
57)
58{
59PUCHAR buf = NULL;
60BOOLEAN res = TRUE;
61int i;
62size_t size = write_buffer_size;
63
64if (!pDev) return FALSE;
65
66printf("%s.\n", __FUNCTION__);
67
68
69buf = (PUCHAR)GlobalAlloc(0, size);
70
71if( buf == NULL )
72{
73printf("%s: Could not allocate %zd "
74"bytes buf\n", __FUNCTION__, size);
75
76return FALSE;
77}
78
79for(i = 0 ;i < (int)size; i++)
80{
81if (!write_send_auto)
82{
83int ch = getchar();
84
85buf[i] = (char)ch;
86if (ch == '\n') break;
87}
88else
89{
90buf[i] = 'a' + i % 20;
91if (i == (size - 1))
92{
93buf[i] = '\n';
94}
95}
96}
97size = i;
98res = ovrl ? pDev->WriteEx(buf, &size) : pDev->Write(buf, &size);
99
100if (!res)
101{
102printf ("%s: WriteFile failed: "
103"Error %d\n", __FUNCTION__, GetLastError());
104}
105else
106{
107printf ("%s: WriteFile OK: "
108"snd %zd bytes\n\n", __FUNCTION__, size);
109if (!write_send_auto) {
110printf("%s\n", buf);
111}
112}
113
114GlobalFree(buf);
115
116return res;
117}
118
119BOOL
120WriteTestCycl(
121__in CDevice *pDev,
122__in BOOLEAN ovrl
123)
124{
125int ch;
126for (;;)
127{
128if(!WriteTest(pDev, ovrl)) return FALSE;
129ch = getchar();
130if(ch == EOF) break;
131putchar(ch);
132}
133return TRUE;
134}
135
136BOOL
137ReadTest(
138__in CDevice *pDev,
139__in BOOLEAN ovrl
140)
141{
142PUCHAR buf = NULL;
143BOOLEAN res = TRUE;
144
145size_t size = 4096;
146
147if (!pDev) return FALSE;
148
149printf("%s.\n", __FUNCTION__);
150
151
152buf = (PUCHAR)GlobalAlloc(0, size);
153
154if( buf == NULL )
155{
156printf("%s: Could not allocate %zd "
157"bytes buf\n", __FUNCTION__, size);
158
159return FALSE;
160}
161
162res = ovrl ? pDev->ReadEx(buf, &size) : pDev->Read(buf, &size);
163
164if (!res)
165{
166printf ("%s: ReadFile failed: "
167"Error %d\n", __FUNCTION__, GetLastError());
168}
169else
170{
171printf ("%s: ReadFile OK: "
172"rcv %zd bytes\n\n", __FUNCTION__, size);
173printf ("%s\n", buf);
174}
175
176GlobalFree(buf);
177
178return res;
179}
180
181BOOL
182ReadTestCycl(
183__in CDevice *pDev,
184__in BOOLEAN ovrl
185)
186{
187int ch;
188for (;;)
189{
190if(!ReadTest(pDev, ovrl)) return FALSE;
191if(_kbhit())
192{
193ch = getchar();
194if(ch == EOF) break;
195putchar(ch);
196}
197}
198return TRUE;
199}
200
201ULONG
202_cdecl
203wmain(
204__in ULONG argc,
205__in_ecount(argc) PWCHAR argv[]
206)
207{
208int ch;
209CDevice *m_pDev;
210BOOLEAN stoptest = FALSE;
211BOOLEAN ovrl = TRUE;
212UINT ifIndex = 0;
213int speedTest = 0;
214
215if(argc == 2)
216{
217if (_wcsicmp(L"-sp", argv[1]) == 0) {
218speedTest = 1;
219}
220else if (_wcsicmp(L"-n", argv[1]) == 0) {
221ovrl = FALSE;
222}
223}
224
225if (speedTest)
226{
227speed_test(true);
228return 0;
229}
230
231if (ovrl)
232{
233printf("Running in non-blocking mode.\n");
234}
235else
236{
237printf("Running in blocking mode.\n");
238}
239
240m_pDev = new CDevice;
241if (!m_pDev)
242{
243return 1;
244}
245while (!m_pDev->Init(ovrl, ifIndex))
246{
247ifIndex++;
248if (ifIndex >= 4)
249{
250delete m_pDev;
251return 2;
252}
253}
254
255while (!stoptest)
256{
257ch = getchar();
258while(getchar()!='\n');
259switch (ch)
260{
261case 'i':
262case 'I':
263GetInfoTest(m_pDev);
264break;
265case '+':
266write_buffer_size = write_buffer_size * 2;
267printf("write_buffer_size = %d\n", write_buffer_size);
268break;
269case '-':
270if (write_buffer_size > 16) {
271write_buffer_size = write_buffer_size / 2;
272}
273printf("write_buffer_size = %d\n", write_buffer_size);
274break;
275case '!':
276write_send_auto = !write_send_auto;
277printf("write_send_auto = %d\n", write_send_auto);
278break;
279case 'r':
280case 'R':
281ReadTest(m_pDev, ovrl);
282break;
283case 'f':
284case 'F':
285ReadTestCycl(m_pDev, ovrl);
286break;
287case 'w':
288case 'W':
289WriteTest(m_pDev, ovrl);
290break;
291case 's':
292case 'S':
293WriteTestCycl(m_pDev, ovrl);
294break;
295case 'q':
296case 'Q':
297stoptest = TRUE;
298break;
299}
300}
301
302delete m_pDev;
303return 0;
304}
305
306#else
307
308int main()
309{
310speed_test(false);
311return 0;
312}
313
314#endif
315