VirtualBox

source: vbox/trunk/src/VBox/Main/MouseImpl.cpp@ 27059

Last change on this file since 27059 was 26982, checked in by vboxsync, 15 years ago

FE/BFE: VBoxBFE now uses MouseImpl from Main

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 18.1 KB
Line 
1/* $Id: MouseImpl.cpp 26982 2010-03-03 10:28:21Z vboxsync $ */
2/** @file
3 * VirtualBox COM class implementation
4 */
5
6/*
7 * Copyright (C) 2006-2008 Sun Microsystems, Inc.
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 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
18 * Clara, CA 95054 USA or visit http://www.sun.com if you need
19 * additional information or have any questions.
20 */
21
22#include "MouseImpl.h"
23#include "DisplayImpl.h"
24#include "VMMDev.h"
25
26#include "AutoCaller.h"
27#include "Logging.h"
28
29#include <VBox/pdmdrv.h>
30#include <iprt/asm.h>
31#include <VBox/VMMDev.h>
32
33/**
34 * Mouse driver instance data.
35 */
36typedef struct DRVMAINMOUSE
37{
38 /** Pointer to the mouse object. */
39 Mouse *pMouse;
40 /** Pointer to the driver instance structure. */
41 PPDMDRVINS pDrvIns;
42 /** Pointer to the mouse port interface of the driver/device above us. */
43 PPDMIMOUSEPORT pUpPort;
44 /** Our mouse connector interface. */
45 PDMIMOUSECONNECTOR IConnector;
46} DRVMAINMOUSE, *PDRVMAINMOUSE;
47
48
49// constructor / destructor
50/////////////////////////////////////////////////////////////////////////////
51
52DEFINE_EMPTY_CTOR_DTOR (Mouse)
53
54HRESULT Mouse::FinalConstruct()
55{
56 mpDrv = NULL;
57 uDevCaps = MOUSE_DEVCAP_RELATIVE;
58 fVMMDevCanAbs = false;
59 fVMMDevNeedsHostCursor = false;
60 mLastAbsX = 0x8000;
61 mLastAbsY = 0x8000;
62 mLastButtons = 0;
63 return S_OK;
64}
65
66void Mouse::FinalRelease()
67{
68 uninit();
69}
70
71// public methods only for internal purposes
72/////////////////////////////////////////////////////////////////////////////
73
74/**
75 * Initializes the mouse object.
76 *
77 * @returns COM result indicator
78 * @param parent handle of our parent object
79 */
80HRESULT Mouse::init (Console *parent)
81{
82 LogFlowThisFunc(("\n"));
83
84 ComAssertRet(parent, E_INVALIDARG);
85
86 /* Enclose the state transition NotReady->InInit->Ready */
87 AutoInitSpan autoInitSpan(this);
88 AssertReturn(autoInitSpan.isOk(), E_FAIL);
89
90 unconst(mParent) = parent;
91
92#ifdef RT_OS_L4
93 /* L4 console has no own mouse cursor */
94 uHostCaps = VMMDEV_MOUSE_HOST_CANNOT_HWPOINTER;
95#else
96 uHostCaps = 0;
97#endif
98
99 /* Confirm a successful initialization */
100 autoInitSpan.setSucceeded();
101
102 return S_OK;
103}
104
105/**
106 * Uninitializes the instance and sets the ready flag to FALSE.
107 * Called either from FinalRelease() or by the parent when it gets destroyed.
108 */
109void Mouse::uninit()
110{
111 LogFlowThisFunc(("\n"));
112
113 /* Enclose the state transition Ready->InUninit->NotReady */
114 AutoUninitSpan autoUninitSpan(this);
115 if (autoUninitSpan.uninitDone())
116 return;
117
118 if (mpDrv)
119 mpDrv->pMouse = NULL;
120 mpDrv = NULL;
121
122#ifdef VBOXBFE_WITHOUT_COM
123 mParent = NULL;
124#else
125 unconst(mParent).setNull();
126#endif
127}
128
129
130// IMouse properties
131/////////////////////////////////////////////////////////////////////////////
132
133int Mouse::getVMMDevMouseCaps(uint32_t *pfCaps)
134{
135 AssertPtrReturn(pfCaps, E_POINTER);
136 VMMDev *pVMMDev = mParent->getVMMDev();
137 ComAssertRet(pVMMDev, E_FAIL);
138 PPDMIVMMDEVPORT pVMMDevPort = pVMMDev->getVMMDevPort();
139 ComAssertRet(pVMMDevPort, E_FAIL);
140
141 int rc = pVMMDevPort->pfnQueryMouseCapabilities(pVMMDevPort, pfCaps);
142 return RT_SUCCESS(rc) ? S_OK : E_FAIL;
143}
144
145int Mouse::setVMMDevMouseCaps(uint32_t fCaps)
146{
147 VMMDev *pVMMDev = mParent->getVMMDev();
148 ComAssertRet(pVMMDev, E_FAIL);
149 PPDMIVMMDEVPORT pVMMDevPort = pVMMDev->getVMMDevPort();
150 ComAssertRet(pVMMDevPort, E_FAIL);
151
152 int rc = pVMMDevPort->pfnSetMouseCapabilities(pVMMDevPort, fCaps);
153 return RT_SUCCESS(rc) ? S_OK : E_FAIL;
154}
155
156/**
157 * Returns whether the current setup can accept absolute mouse
158 * events.
159 *
160 * @returns COM status code
161 * @param absoluteSupported address of result variable
162 */
163STDMETHODIMP Mouse::COMGETTER(AbsoluteSupported) (BOOL *absoluteSupported)
164{
165 if (!absoluteSupported)
166 return E_POINTER;
167
168 AutoCaller autoCaller(this);
169 if (FAILED(autoCaller.rc())) return autoCaller.rc();
170
171 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
172
173 CHECK_CONSOLE_DRV (mpDrv);
174
175 if (uDevCaps & MOUSE_DEVCAP_ABSOLUTE)
176 *absoluteSupported = TRUE;
177 else
178 *absoluteSupported = fVMMDevCanAbs;
179
180 return S_OK;
181}
182
183/**
184 * Returns whether the current setup can accept relative mouse
185 * events.
186 *
187 * @returns COM status code
188 * @param relativeSupported address of result variable
189 */
190STDMETHODIMP Mouse::COMGETTER(RelativeSupported) (BOOL *relativeSupported)
191{
192 if (!relativeSupported)
193 return E_POINTER;
194
195 AutoCaller autoCaller(this);
196 if (FAILED(autoCaller.rc())) return autoCaller.rc();
197
198 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
199
200 CHECK_CONSOLE_DRV (mpDrv);
201
202 if (uDevCaps & MOUSE_DEVCAP_RELATIVE)
203 *relativeSupported = TRUE;
204
205 return S_OK;
206}
207
208/**
209 * Returns whether the guest can currently draw the mouse cursor itself.
210 *
211 * @returns COM status code
212 * @param pfNeedsHostCursor address of result variable
213 */
214STDMETHODIMP Mouse::COMGETTER(NeedsHostCursor) (BOOL *pfNeedsHostCursor)
215{
216 if (!pfNeedsHostCursor)
217 return E_POINTER;
218
219 AutoCaller autoCaller(this);
220 if (FAILED(autoCaller.rc())) return autoCaller.rc();
221
222 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
223
224 CHECK_CONSOLE_DRV (mpDrv);
225
226 *pfNeedsHostCursor = fVMMDevNeedsHostCursor;
227 return S_OK;
228}
229
230// IMouse methods
231/////////////////////////////////////////////////////////////////////////////
232
233static uint32_t mouseButtonsToPDM(LONG buttonState)
234{
235 uint32_t fButtons = 0;
236 if (buttonState & MouseButtonState_LeftButton)
237 fButtons |= PDMIMOUSEPORT_BUTTON_LEFT;
238 if (buttonState & MouseButtonState_RightButton)
239 fButtons |= PDMIMOUSEPORT_BUTTON_RIGHT;
240 if (buttonState & MouseButtonState_MiddleButton)
241 fButtons |= PDMIMOUSEPORT_BUTTON_MIDDLE;
242 if (buttonState & MouseButtonState_XButton1)
243 fButtons |= PDMIMOUSEPORT_BUTTON_X1;
244 if (buttonState & MouseButtonState_XButton2)
245 fButtons |= PDMIMOUSEPORT_BUTTON_X2;
246 return fButtons;
247}
248
249
250/**
251 * Send a relative event to the mouse device.
252 *
253 * @returns COM status code
254 */
255int Mouse::reportRelEventToMouseDev(int32_t dx, int32_t dy, int32_t dz,
256 int32_t dw, uint32_t fButtons)
257{
258 if (dx || dy || dz || dw || fButtons != mLastButtons)
259 {
260 PPDMIMOUSEPORT pUpPort = mpDrv->pUpPort;
261 int vrc = pUpPort->pfnPutEvent(pUpPort, dx, dy, dz, dw, fButtons);
262
263 if (RT_FAILURE(vrc))
264 setError(VBOX_E_IPRT_ERROR,
265 tr("Could not send the mouse event to the virtual mouse (%Rrc)"),
266 vrc);
267 AssertRCReturn(vrc, VBOX_E_IPRT_ERROR);
268 }
269 return S_OK;
270}
271
272
273/**
274 * Send an absolute position event to the mouse device.
275 *
276 * @returns COM status code
277 */
278int Mouse::reportAbsEventToMouseDev(uint32_t mouseXAbs, uint32_t mouseYAbs,
279 int32_t dz, int32_t dw, uint32_t fButtons)
280{
281 if ( mouseXAbs != mLastAbsX
282 || mouseYAbs != mLastAbsY
283 || dz
284 || dw
285 || fButtons != mLastButtons)
286 {
287 int vrc = mpDrv->pUpPort->pfnPutEventAbs(mpDrv->pUpPort, mouseXAbs,
288 mouseYAbs, dz, dw, fButtons);
289 if (RT_FAILURE(vrc))
290 setError(VBOX_E_IPRT_ERROR,
291 tr("Could not send the mouse event to the virtual mouse (%Rrc)"),
292 vrc);
293 AssertRCReturn(vrc, VBOX_E_IPRT_ERROR);
294 }
295 return S_OK;
296}
297
298
299/**
300 * Send an absolute position event to the VMM device.
301 *
302 * @returns COM status code
303 */
304int Mouse::reportAbsEventToVMMDev(uint32_t mouseXAbs, uint32_t mouseYAbs)
305{
306 VMMDev *pVMMDev = mParent->getVMMDev();
307 ComAssertRet(pVMMDev, E_FAIL);
308 PPDMIVMMDEVPORT pVMMDevPort = pVMMDev->getVMMDevPort();
309 ComAssertRet(pVMMDevPort, E_FAIL);
310
311 if (mouseXAbs != mLastAbsX || mouseYAbs != mLastAbsY)
312 {
313 int vrc = pVMMDevPort->pfnSetAbsoluteMouse(pVMMDevPort,
314 mouseXAbs, mouseYAbs);
315 if (RT_FAILURE(vrc))
316 setError(VBOX_E_IPRT_ERROR,
317 tr("Could not send the mouse event to the virtual mouse (%Rrc)"),
318 vrc);
319 AssertRCReturn(vrc, VBOX_E_IPRT_ERROR);
320 }
321 return S_OK;
322}
323
324/**
325 * Send a mouse event.
326 *
327 * @returns COM status code
328 * @param dx X movement
329 * @param dy Y movement
330 * @param dz Z movement
331 * @param buttonState The mouse button state
332 */
333STDMETHODIMP Mouse::PutMouseEvent(LONG dx, LONG dy, LONG dz, LONG dw, LONG buttonState)
334{
335 HRESULT rc = S_OK;
336
337 AutoCaller autoCaller(this);
338 if (FAILED(autoCaller.rc())) return autoCaller.rc();
339
340 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
341
342 CHECK_CONSOLE_DRV (mpDrv);
343
344 LogRel3(("%s: dx=%d, dy=%d, dz=%d, dw=%d\n", __PRETTY_FUNCTION__,
345 dx, dy, dz, dw));
346 if (!(uDevCaps & MOUSE_DEVCAP_ABSOLUTE))
347 {
348 /*
349 * This method being called implies that the host no
350 * longer wants to use absolute coordinates. If the VMM
351 * device isn't aware of that yet, tell it.
352 */
353 uint32_t mouseCaps;
354 rc = getVMMDevMouseCaps(&mouseCaps);
355 ComAssertComRCRet(rc, rc);
356
357 if (mouseCaps & VMMDEV_MOUSE_HOST_CAN_ABSOLUTE)
358 setVMMDevMouseCaps(uHostCaps);
359 }
360
361 uint32_t fButtons = mouseButtonsToPDM(buttonState);
362 rc = reportRelEventToMouseDev(dx, dy, dz, dw, fButtons);
363 if (SUCCEEDED(rc))
364 mLastButtons = fButtons;
365
366 return rc;
367}
368
369/**
370 * Convert an X value in screen co-ordinates to a value from 0 to 0xffff
371 *
372 * @returns COM status value
373 */
374int Mouse::convertDisplayWidth(LONG x, uint32_t *pcX)
375{
376 AssertPtrReturn(pcX, E_POINTER);
377 Display *pDisplay = mParent->getDisplay();
378 ComAssertRet(pDisplay, E_FAIL);
379
380 ULONG displayWidth;
381 int rc = pDisplay->COMGETTER(Width)(&displayWidth);
382 ComAssertComRCRet(rc, rc);
383
384 *pcX = displayWidth ? (x * 0xFFFF) / displayWidth: 0;
385 return S_OK;
386}
387
388/**
389 * Convert a Y value in screen co-ordinates to a value from 0 to 0xffff
390 *
391 * @returns COM status value
392 */
393int Mouse::convertDisplayHeight(LONG y, uint32_t *pcY)
394{
395 AssertPtrReturn(pcY, E_POINTER);
396 Display *pDisplay = mParent->getDisplay();
397 ComAssertRet(pDisplay, E_FAIL);
398
399 ULONG displayHeight;
400 int rc = pDisplay->COMGETTER(Height)(&displayHeight);
401 ComAssertComRCRet(rc, rc);
402
403 *pcY = displayHeight ? (y * 0xFFFF) / displayHeight: 0;
404 return S_OK;
405}
406
407
408/**
409 * Send an absolute mouse event to the VM. This only works
410 * when the required guest support has been installed.
411 *
412 * @returns COM status code
413 * @param x X position (pixel)
414 * @param y Y position (pixel)
415 * @param dz Z movement
416 * @param buttonState The mouse button state
417 */
418STDMETHODIMP Mouse::PutMouseEventAbsolute(LONG x, LONG y, LONG dz, LONG dw,
419 LONG buttonState)
420{
421 AutoCaller autoCaller(this);
422 if (FAILED(autoCaller.rc())) return autoCaller.rc();
423
424 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
425
426 LogRel3(("%s: x=%d, y=%d, dz=%d, dw=%d, buttonState=0x%x\n",
427 __PRETTY_FUNCTION__, x, y, dz, dw, buttonState));
428
429 CHECK_CONSOLE_DRV(mpDrv);
430
431 uint32_t mouseXAbs;
432 HRESULT rc = convertDisplayWidth(x, &mouseXAbs);
433 ComAssertComRCRet(rc, rc);
434 /**
435 * @todo multi-monitor Windows guests expect this to be unbounded.
436 * Fix for the rest.
437 */
438 /* if (mouseXAbs > 0xffff)
439 mouseXAbs = mLastAbsX; */
440
441 uint32_t mouseYAbs;
442 rc = convertDisplayHeight(y, &mouseYAbs);
443 ComAssertComRCRet(rc, rc);
444 /* if (mouseYAbs > 0xffff)
445 mouseYAbs = mLastAbsY; */
446
447 uint32_t fButtons = mouseButtonsToPDM(buttonState);
448
449 /* Older guest additions rely on a small phony movement event on the
450 * PS/2 device to notice absolute events. */
451 bool fNeedsJiggle = false;
452
453 if (uDevCaps & MOUSE_DEVCAP_ABSOLUTE)
454 rc = reportAbsEventToMouseDev(mouseXAbs, mouseYAbs, dz, dw, fButtons);
455 else
456 {
457 uint32_t mouseCaps;
458 rc = getVMMDevMouseCaps(&mouseCaps);
459 ComAssertComRCRet(rc, rc);
460
461 /*
462 * This method being called implies that the host wants
463 * to use absolute coordinates. If the VMM device isn't
464 * aware of that yet, tell it.
465 */
466 if (!(mouseCaps & VMMDEV_MOUSE_HOST_CAN_ABSOLUTE))
467 setVMMDevMouseCaps(uHostCaps | VMMDEV_MOUSE_HOST_CAN_ABSOLUTE);
468
469 /*
470 * Send the absolute mouse position to the VMM device.
471 */
472 rc = reportAbsEventToVMMDev(mouseXAbs, mouseYAbs);
473 fNeedsJiggle = !(mouseCaps & VMMDEV_MOUSE_GUEST_USES_VMMDEV);
474 }
475 ComAssertComRCRet(rc, rc);
476
477 mLastAbsX = mouseXAbs;
478 mLastAbsY = mouseYAbs;
479
480 if (!(uDevCaps & MOUSE_DEVCAP_ABSOLUTE))
481 {
482 /* We may need to send a relative event for button information or to
483 * wake the guest up to the changed absolute co-ordinates.
484 * If the event is a pure wake up one, we make sure it contains some
485 * (possibly phony) event data to make sure it isn't just discarded on
486 * the way. */
487 if (fNeedsJiggle || fButtons != mLastButtons || dz || dw)
488 {
489 rc = reportRelEventToMouseDev(fNeedsJiggle ? 1 : 0, 0, dz, dw,
490 fButtons);
491 ComAssertComRCRet(rc, rc);
492 }
493 }
494 mLastButtons = fButtons;
495 return rc;
496}
497
498// private methods
499/////////////////////////////////////////////////////////////////////////////
500
501
502void Mouse::sendMouseCapsCallback(void)
503{
504 bool fAbsSupported = uDevCaps & MOUSE_DEVCAP_ABSOLUTE
505 ? true : fVMMDevCanAbs;
506 mParent->onMouseCapabilityChange(fAbsSupported, uDevCaps & MOUSE_DEVCAP_RELATIVE, fVMMDevNeedsHostCursor);
507}
508
509
510/**
511 * @interface_method_impl{PDMIMOUSECONNECTOR,pfnReportModes}
512 */
513DECLCALLBACK(void) Mouse::mouseReportModes(PPDMIMOUSECONNECTOR pInterface, bool fRel, bool fAbs)
514{
515 PDRVMAINMOUSE pDrv = RT_FROM_MEMBER(pInterface, DRVMAINMOUSE, IConnector);
516 if (fRel)
517 pDrv->pMouse->uDevCaps |= MOUSE_DEVCAP_RELATIVE;
518 else
519 pDrv->pMouse->uDevCaps &= ~MOUSE_DEVCAP_RELATIVE;
520 if (fAbs)
521 pDrv->pMouse->uDevCaps |= MOUSE_DEVCAP_ABSOLUTE;
522 else
523 pDrv->pMouse->uDevCaps &= ~MOUSE_DEVCAP_ABSOLUTE;
524
525 pDrv->pMouse->sendMouseCapsCallback();
526}
527
528
529/**
530 * @interface_method_impl{PDMIBASE,pfnQueryInterface}
531 */
532DECLCALLBACK(void *) Mouse::drvQueryInterface(PPDMIBASE pInterface, const char *pszIID)
533{
534 PPDMDRVINS pDrvIns = PDMIBASE_2_PDMDRV(pInterface);
535 PDRVMAINMOUSE pDrv = PDMINS_2_DATA(pDrvIns, PDRVMAINMOUSE);
536
537 PDMIBASE_RETURN_INTERFACE(pszIID, PDMIBASE, &pDrvIns->IBase);
538 PDMIBASE_RETURN_INTERFACE(pszIID, PDMIMOUSECONNECTOR, &pDrv->IConnector);
539 return NULL;
540}
541
542
543/**
544 * Destruct a mouse driver instance.
545 *
546 * @returns VBox status.
547 * @param pDrvIns The driver instance data.
548 */
549DECLCALLBACK(void) Mouse::drvDestruct(PPDMDRVINS pDrvIns)
550{
551 PDRVMAINMOUSE pData = PDMINS_2_DATA(pDrvIns, PDRVMAINMOUSE);
552 LogFlow(("Mouse::drvDestruct: iInstance=%d\n", pDrvIns->iInstance));
553 PDMDRV_CHECK_VERSIONS_RETURN_VOID(pDrvIns);
554
555 if (pData->pMouse)
556 {
557 AutoWriteLock mouseLock(pData->pMouse COMMA_LOCKVAL_SRC_POS);
558 pData->pMouse->mpDrv = NULL;
559 }
560}
561
562
563/**
564 * Construct a mouse driver instance.
565 *
566 * @copydoc FNPDMDRVCONSTRUCT
567 */
568DECLCALLBACK(int) Mouse::drvConstruct(PPDMDRVINS pDrvIns, PCFGMNODE pCfg, uint32_t fFlags)
569{
570 PDRVMAINMOUSE pData = PDMINS_2_DATA(pDrvIns, PDRVMAINMOUSE);
571 LogFlow(("drvMainMouse_Construct: iInstance=%d\n", pDrvIns->iInstance));
572 PDMDRV_CHECK_VERSIONS_RETURN(pDrvIns);
573
574 /*
575 * Validate configuration.
576 */
577 if (!CFGMR3AreValuesValid(pCfg, "Object\0"))
578 return VERR_PDM_DRVINS_UNKNOWN_CFG_VALUES;
579 AssertMsgReturn(PDMDrvHlpNoAttach(pDrvIns) == VERR_PDM_NO_ATTACHED_DRIVER,
580 ("Configuration error: Not possible to attach anything to this driver!\n"),
581 VERR_PDM_DRVINS_NO_ATTACH);
582
583 /*
584 * IBase.
585 */
586 pDrvIns->IBase.pfnQueryInterface = Mouse::drvQueryInterface;
587
588 pData->IConnector.pfnReportModes = Mouse::mouseReportModes;
589
590 /*
591 * Get the IMousePort interface of the above driver/device.
592 */
593 pData->pUpPort = (PPDMIMOUSEPORT)pDrvIns->pUpBase->pfnQueryInterface(pDrvIns->pUpBase, PDMIMOUSEPORT_IID);
594 if (!pData->pUpPort)
595 {
596 AssertMsgFailed(("Configuration error: No mouse port interface above!\n"));
597 return VERR_PDM_MISSING_INTERFACE_ABOVE;
598 }
599
600 /*
601 * Get the Mouse object pointer and update the mpDrv member.
602 */
603 void *pv;
604 int rc = CFGMR3QueryPtr(pCfg, "Object", &pv);
605 if (RT_FAILURE(rc))
606 {
607 AssertMsgFailed(("Configuration error: No/bad \"Object\" value! rc=%Rrc\n", rc));
608 return rc;
609 }
610 pData->pMouse = (Mouse *)pv; /** @todo Check this cast! */
611 pData->pMouse->mpDrv = pData;
612
613 return VINF_SUCCESS;
614}
615
616
617/**
618 * Main mouse driver registration record.
619 */
620const PDMDRVREG Mouse::DrvReg =
621{
622 /* u32Version */
623 PDM_DRVREG_VERSION,
624 /* szName */
625 "MainMouse",
626 /* szRCMod */
627 "",
628 /* szR0Mod */
629 "",
630 /* pszDescription */
631 "Main mouse driver (Main as in the API).",
632 /* fFlags */
633 PDM_DRVREG_FLAGS_HOST_BITS_DEFAULT,
634 /* fClass. */
635 PDM_DRVREG_CLASS_MOUSE,
636 /* cMaxInstances */
637 ~0,
638 /* cbInstance */
639 sizeof(DRVMAINMOUSE),
640 /* pfnConstruct */
641 Mouse::drvConstruct,
642 /* pfnDestruct */
643 Mouse::drvDestruct,
644 /* pfnRelocate */
645 NULL,
646 /* pfnIOCtl */
647 NULL,
648 /* pfnPowerOn */
649 NULL,
650 /* pfnReset */
651 NULL,
652 /* pfnSuspend */
653 NULL,
654 /* pfnResume */
655 NULL,
656 /* pfnAttach */
657 NULL,
658 /* pfnDetach */
659 NULL,
660 /* pfnPowerOff */
661 NULL,
662 /* pfnSoftReset */
663 NULL,
664 /* u32EndVersion */
665 PDM_DRVREG_VERSION
666};
667/* vi: set tabstop=4 shiftwidth=4 expandtab: */
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