1 /*++
2
3 Copyright (c) Microsoft Corporation
4
5 Module Name:
6
7 FxDeviceKM.hpp
8
9 Abstract:
10
11 This is the definition of the FxDevice object KM specific
12
13 Author:
14
15
16
17 Environment:
18
19 Kernel mode only
20
21 Revision History:
22
23 --*/
24
25 #ifndef _FXDEVICEKM_H_
26 #define _FXDEVICEKM_H_
27
28 __inline
29 FxWdmDeviceExtension*
_GetFxWdmExtension(__in MdDeviceObject DeviceObject)30 FxDevice::_GetFxWdmExtension(
31 __in MdDeviceObject DeviceObject
32 )
33 {
34 //
35 // DeviceObject->DeviceExtension points to our FxDevice allocation. We
36 // get the underlying DeviceExtension allocated as part of the
37 // PDEVICE_OBJECT by adding the sizeof(DEVICE_OBJECT) to get the start
38 // of the DeviceExtension. This is documented behavior on how the
39 // DeviceExtension can be found.
40 //
41 return (FxWdmDeviceExtension*) WDF_PTR_ADD_OFFSET(DeviceObject,
42 sizeof(*DeviceObject));
43 }
44
45 __inline
46 MdRemoveLock
GetRemoveLock(VOID)47 FxDevice::GetRemoveLock(
48 VOID
49 )
50 {
51 return &FxDevice::_GetFxWdmExtension(
52 GetDeviceObject())->IoRemoveLock;
53 }
54
55 __inline
56 BOOLEAN
IsRemoveLockEnabledForIo(VOID)57 FxDevice::IsRemoveLockEnabledForIo(
58 VOID
59 )
60 {
61 if (m_DeviceObject.GetObject() != NULL) {
62 return (_GetFxWdmExtension(m_DeviceObject.GetObject())->RemoveLockOptionFlags &
63 WDF_REMOVE_LOCK_OPTION_ACQUIRE_FOR_IO) ? TRUE : FALSE;
64 }
65 else {
66 return FALSE;
67 }
68 }
69
70 __inline
71 FxDevice*
GetFxDevice(__in MdDeviceObject DeviceObject)72 FxDevice::GetFxDevice(
73 __in MdDeviceObject DeviceObject
74 )
75 {
76 MxDeviceObject deviceObject((MdDeviceObject)DeviceObject);
77
78 //
79 // DeviceExtension points to the start of the first context assigned to
80 // WDFDEVICE. We walk backwards from the context to the FxDevice*.
81 //
82 return (FxDevice*) CONTAINING_RECORD(deviceObject.GetDeviceExtension(),
83 FxContextHeader,
84 Context)->Object;
85 }
86
87 __inline
88 VOID
DetachDevice(VOID)89 FxDevice::DetachDevice(
90 VOID
91 )
92 {
93 if (m_AttachedDevice.GetObject() != NULL) {
94 Mx::MxDetachDevice(m_AttachedDevice.GetObject());
95 m_AttachedDevice.SetObject(NULL);
96 }
97 }
98
99 __inline
100 VOID
InvalidateDeviceState(VOID)101 FxDevice::InvalidateDeviceState(
102 VOID
103 )
104 {
105 PDEVICE_OBJECT pdo;
106
107 //
108 // If the PDO is not yet reported to pnp, do not call the API. In this
109 // case, the PDO will soon be reported and started and the state that
110 // was just set will be queried for automatically by pnp as a part of
111 // start.
112 //
113 pdo = GetSafePhysicalDevice();
114
115 if (pdo != NULL) {
116 IoInvalidateDeviceState(pdo);
117 }
118 }
119
120 VOID
121 __inline
DeleteSymbolicLink(VOID)122 FxDevice::DeleteSymbolicLink(
123 VOID
124 )
125 {
126 if (m_SymbolicLinkName.Buffer != NULL) {
127 //
128 // Must be at PASSIVE_LEVEL for this call
129 //
130 if (m_SymbolicLinkName.Length) {
131 Mx::MxDeleteSymbolicLink(&m_SymbolicLinkName);
132 }
133
134 FxPoolFree(m_SymbolicLinkName.Buffer);
135 RtlZeroMemory(&m_SymbolicLinkName, sizeof(m_SymbolicLinkName));
136 }
137 }
138
139 __inline
140 NTSTATUS
_OpenDeviceRegistryKey(_In_ MdDeviceObject DeviceObject,_In_ ULONG DevInstKeyType,_In_ ACCESS_MASK DesiredAccess,_Out_ PHANDLE DevInstRegKey)141 FxDevice::_OpenDeviceRegistryKey(
142 _In_ MdDeviceObject DeviceObject,
143 _In_ ULONG DevInstKeyType,
144 _In_ ACCESS_MASK DesiredAccess,
145 _Out_ PHANDLE DevInstRegKey
146 )
147 {
148 return IoOpenDeviceRegistryKey(DeviceObject,
149 DevInstKeyType,
150 DesiredAccess,
151 DevInstRegKey);
152 }
153
154 __inline
155 NTSTATUS
_GetDeviceProperty(_In_ MdDeviceObject DeviceObject,_In_ DEVICE_REGISTRY_PROPERTY DeviceProperty,_In_ ULONG BufferLength,_Out_opt_ PVOID PropertyBuffer,_Out_ PULONG ResultLength)156 FxDevice::_GetDeviceProperty(
157 _In_ MdDeviceObject DeviceObject,
158 _In_ DEVICE_REGISTRY_PROPERTY DeviceProperty,
159 _In_ ULONG BufferLength,
160 _Out_opt_ PVOID PropertyBuffer,
161 _Out_ PULONG ResultLength
162 )
163 {
164 return IoGetDeviceProperty(DeviceObject,
165 DeviceProperty,
166 BufferLength,
167 PropertyBuffer,
168 ResultLength);
169 }
170
171 #endif //_FXDEVICEKM_H_
172