VirtualBox

source: vbox/trunk/src/VBox/HostDrivers/VBoxUSB/win/dev/VBoxUsbDev.h@ 69500

Last change on this file since 69500 was 69500, checked in by vboxsync, 8 years ago

*: scm --update-copyright-year

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 6.6 KB
Line 
1/* $Id: VBoxUsbDev.h 69500 2017-10-28 15:14:05Z vboxsync $ */
2/** @file
3 * VBoxUsbDev.h - USB device.
4 */
5
6/*
7 * Copyright (C) 2011-2017 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 * The contents of this file may alternatively be used under the terms
18 * of the Common Development and Distribution License Version 1.0
19 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
20 * VirtualBox OSE distribution, in which case the provisions of the
21 * CDDL are applicable instead of those of the GPL.
22 *
23 * You may elect to license modified versions of this file under the
24 * terms and conditions of either the GPL or the CDDL or both.
25 */
26
27#ifndef ___VBoxUsbDev_h___
28#define ___VBoxUsbDev_h___
29
30#include "VBoxUsbCmn.h"
31#include <VBox/cdefs.h>
32#include <iprt/assert.h>
33
34typedef struct VBOXUSB_GLOBALS
35{
36 PDRIVER_OBJECT pDrvObj;
37 UNICODE_STRING RegPath;
38 VBOXUSBRT_IDC RtIdc;
39} VBOXUSB_GLOBALS, *PVBOXUSB_GLOBALS;
40
41extern VBOXUSB_GLOBALS g_VBoxUsbGlobals;
42
43/* pnp state decls */
44typedef enum
45{
46 ENMVBOXUSB_PNPSTATE_UNKNOWN = 0,
47 ENMVBOXUSB_PNPSTATE_START_PENDING,
48 ENMVBOXUSB_PNPSTATE_STARTED,
49 ENMVBOXUSB_PNPSTATE_STOP_PENDING,
50 ENMVBOXUSB_PNPSTATE_STOPPED,
51 ENMVBOXUSB_PNPSTATE_SURPRISE_REMOVED,
52 ENMVBOXUSB_PNPSTATE_REMOVE_PENDING,
53 ENMVBOXUSB_PNPSTATE_REMOVED,
54 ENMVBOXUSB_PNPSTATE_FORSEDWORD = 0x8fffffff
55} ENMVBOXUSB_PNPSTATE;
56AssertCompile(sizeof (ENMVBOXUSB_PNPSTATE) == sizeof (uint32_t));
57
58#ifdef VBOX_STRICT
59DECLHIDDEN(VOID) vboxUsbPnPStateGbgChange(ENMVBOXUSB_PNPSTATE enmOld, ENMVBOXUSB_PNPSTATE enmNew);
60# define VBOXUSB_PNP_GBG_STATE_CHANGE(_old, _new) vboxUsbPnPStateGbgChange((_old), (_new))
61#else
62# define VBOXUSB_PNP_GBG_STATE_CHANGE(_old, _new) do { } while (0)
63#endif
64
65
66typedef struct VBOXUSB_PNPSTATE
67{
68 /* Current state */
69 volatile ENMVBOXUSB_PNPSTATE Curr;
70 /* Previous state, used to restore state info on cancell stop device */
71 ENMVBOXUSB_PNPSTATE Prev;
72} VBOXUSB_PNPSTATE, *PVBOXUSB_PNPSTATE;
73
74typedef struct VBOXUSBDEV_DDISTATE
75{
76 /* Lock */
77 KSPIN_LOCK Lock;
78 VBOXDRVTOOL_REF Ref;
79 VBOXUSB_PNPSTATE PnPState;
80 VBOXUSB_PWRSTATE PwrState;
81 /* current dev caps */
82 DEVICE_CAPABILITIES DevCaps;
83} VBOXUSBDEV_DDISTATE, *PVBOXUSBDEV_DDISTATE;
84
85typedef struct VBOXUSBDEV_EXT
86{
87 PDEVICE_OBJECT pFDO;
88 PDEVICE_OBJECT pPDO;
89 PDEVICE_OBJECT pLowerDO;
90
91 VBOXUSBDEV_DDISTATE DdiState;
92
93 uint32_t cHandles;
94
95 VBOXUSB_RT Rt;
96
97} VBOXUSBDEV_EXT, *PVBOXUSBDEV_EXT;
98
99/* pnp state api */
100DECLINLINE(ENMVBOXUSB_PNPSTATE) vboxUsbPnPStateGet(PVBOXUSBDEV_EXT pDevExt)
101{
102 return (ENMVBOXUSB_PNPSTATE)ASMAtomicUoReadU32((volatile uint32_t*)&pDevExt->DdiState.PnPState.Curr);
103}
104
105DECLINLINE(ENMVBOXUSB_PNPSTATE) vboxUsbPnPStateSet(PVBOXUSBDEV_EXT pDevExt, ENMVBOXUSB_PNPSTATE enmState)
106{
107 KIRQL Irql;
108 ENMVBOXUSB_PNPSTATE enmOldState;
109 KeAcquireSpinLock(&pDevExt->DdiState.Lock, &Irql);
110 pDevExt->DdiState.PnPState.Prev = (ENMVBOXUSB_PNPSTATE)ASMAtomicUoReadU32((volatile uint32_t*)&pDevExt->DdiState.PnPState.Curr);
111 ASMAtomicWriteU32((volatile uint32_t*)&pDevExt->DdiState.PnPState.Curr, (uint32_t)enmState);
112 pDevExt->DdiState.PnPState.Curr = enmState;
113 enmOldState = pDevExt->DdiState.PnPState.Prev;
114 KeReleaseSpinLock(&pDevExt->DdiState.Lock, Irql);
115 VBOXUSB_PNP_GBG_STATE_CHANGE(enmOldState, enmState);
116 return enmState;
117}
118
119DECLINLINE(ENMVBOXUSB_PNPSTATE) vboxUsbPnPStateRestore(PVBOXUSBDEV_EXT pDevExt)
120{
121 ENMVBOXUSB_PNPSTATE enmNewState, enmOldState;
122 KIRQL Irql;
123 KeAcquireSpinLock(&pDevExt->DdiState.Lock, &Irql);
124 enmOldState = pDevExt->DdiState.PnPState.Curr;
125 enmNewState = pDevExt->DdiState.PnPState.Prev;
126 ASMAtomicWriteU32((volatile uint32_t*)&pDevExt->DdiState.PnPState.Curr, (uint32_t)pDevExt->DdiState.PnPState.Prev);
127 KeReleaseSpinLock(&pDevExt->DdiState.Lock, Irql);
128 VBOXUSB_PNP_GBG_STATE_CHANGE(enmOldState, enmNewState);
129 Assert(enmNewState == ENMVBOXUSB_PNPSTATE_STARTED);
130 Assert(enmOldState == ENMVBOXUSB_PNPSTATE_STOP_PENDING
131 || enmOldState == ENMVBOXUSB_PNPSTATE_REMOVE_PENDING);
132 return enmNewState;
133}
134
135DECLINLINE(VOID) vboxUsbPnPStateInit(PVBOXUSBDEV_EXT pDevExt)
136{
137 pDevExt->DdiState.PnPState.Curr = pDevExt->DdiState.PnPState.Prev = ENMVBOXUSB_PNPSTATE_START_PENDING;
138}
139
140DECLINLINE(VOID) vboxUsbDdiStateInit(PVBOXUSBDEV_EXT pDevExt)
141{
142 KeInitializeSpinLock(&pDevExt->DdiState.Lock);
143 VBoxDrvToolRefInit(&pDevExt->DdiState.Ref);
144 vboxUsbPwrStateInit(pDevExt);
145 vboxUsbPnPStateInit(pDevExt);
146}
147
148DECLINLINE(bool) vboxUsbDdiStateRetainIfStarted(PVBOXUSBDEV_EXT pDevExt)
149{
150 KIRQL oldIrql;
151 bool bRetained = true;
152 KeAcquireSpinLock(&pDevExt->DdiState.Lock, &oldIrql);
153 if (vboxUsbPnPStateGet(pDevExt) == ENMVBOXUSB_PNPSTATE_STARTED)
154 {
155 VBoxDrvToolRefRetain(&pDevExt->DdiState.Ref);
156 }
157 else
158 {
159 bRetained = false;
160 }
161 KeReleaseSpinLock(&pDevExt->DdiState.Lock, oldIrql);
162 return bRetained;
163}
164
165/* if device is removed - does nothing and returns zero,
166 * otherwise increments a ref counter and returns the current pnp state
167 * NOTE: never returns ENMVBOXUSB_PNPSTATE_REMOVED
168 * */
169DECLINLINE(ENMVBOXUSB_PNPSTATE) vboxUsbDdiStateRetainIfNotRemoved(PVBOXUSBDEV_EXT pDevExt)
170{
171 KIRQL oldIrql;
172 ENMVBOXUSB_PNPSTATE enmState;
173 KeAcquireSpinLock(&pDevExt->DdiState.Lock, &oldIrql);
174 enmState = vboxUsbPnPStateGet(pDevExt);
175 if (enmState != ENMVBOXUSB_PNPSTATE_REMOVED)
176 {
177 VBoxDrvToolRefRetain(&pDevExt->DdiState.Ref);
178 }
179 KeReleaseSpinLock(&pDevExt->DdiState.Lock, oldIrql);
180 return enmState != ENMVBOXUSB_PNPSTATE_REMOVED ? enmState : (ENMVBOXUSB_PNPSTATE)0;
181}
182
183DECLINLINE(uint32_t) vboxUsbDdiStateRetain(PVBOXUSBDEV_EXT pDevExt)
184{
185 return VBoxDrvToolRefRetain(&pDevExt->DdiState.Ref);
186}
187
188DECLINLINE(uint32_t) vboxUsbDdiStateRelease(PVBOXUSBDEV_EXT pDevExt)
189{
190 return VBoxDrvToolRefRelease(&pDevExt->DdiState.Ref);
191}
192
193DECLINLINE(VOID) vboxUsbDdiStateReleaseAndWaitCompleted(PVBOXUSBDEV_EXT pDevExt)
194{
195 VBoxDrvToolRefRelease(&pDevExt->DdiState.Ref);
196 VBoxDrvToolRefWaitEqual(&pDevExt->DdiState.Ref, 1);
197}
198
199DECLINLINE(VOID) vboxUsbDdiStateReleaseAndWaitRemoved(PVBOXUSBDEV_EXT pDevExt)
200{
201 VBoxDrvToolRefRelease(&pDevExt->DdiState.Ref);
202 VBoxDrvToolRefWaitEqual(&pDevExt->DdiState.Ref, 0);
203}
204
205#endif /* #ifndef ___VBoxUsbDev_h___ */
Note: See TracBrowser for help on using the repository browser.

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