ReactOS 0.4.17-dev-1164-g974a446
driverscope.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS Kernel
3 * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
4 * PURPOSE: KSE 'DriverScope' shim implementation
5 * COPYRIGHT: Copyright 2020 Hervé Poussineau <hpoussin@reactos.org>
6 */
7
8#include <ntoskrnl.h>
9#include <initguid.h>
10
11//#define NDEBUG
12#include <debug.h>
13
14// https://github.com/repnz/etw-providers-docs/blob/master/Manifests-Win10-17134/Microsoft-Windows-Kernel-ShimEngine.xml
15// https://github.com/microsoft/Windows-driver-samples/tree/master/general/tracing/evntdrv
16
17extern KSE_SHIM KmDsShim;
18
19#define KSEP_DEBUG_EVENTS 0x0001
20#define KSEP_DEBUG_MESSAGES 0x0002
21#define KSEP_DEBUG_GENERAL 0x0100
22#define KSEP_DEBUG_PNP 0x0200
23#define KSEP_DEBUG_POWER 0x0400
24#define KSEP_DEBUG_IRP 0x0800
25#define KSEP_DEBUG_POOL 0x1000
26#define KSEP_DEBUG_UNLOAD 0x2000
28
29static NTSTATUS NTAPI
33{
34 PDRIVER_INITIALIZE OriginalFunction;
36
38 Status = OriginalFunction(DriverObject, RegistryPath);
39
41 {
42 DPRINT1("[DriverScopeGeneral] DriverObject=%p [%wZ] RegistryPath=%wZ Status=0x%08x\n",
44 }
45 return Status;
46}
47
48static VOID NTAPI
52{
54 PDRIVER_STARTIO OriginalFunction;
55
56 OriginalFunction = KmDsShim.KseCallbackRoutines->KseGetIoCallbacksRoutine(DriverObject)->DriverStartIo;
58 {
59 DPRINT1("[DriverScopeGeneral] DriverObject=%p [%wZ] Fdo=%p Irp=%p\n",
61 }
62 OriginalFunction(DeviceObject, Irp);
63}
64
65static VOID NTAPI
68{
69 PDRIVER_UNLOAD OriginalFunction;
70
71 OriginalFunction = KmDsShim.KseCallbackRoutines->KseGetIoCallbacksRoutine(DriverObject)->DriverUnload;
73 {
74 DPRINT1("[DriverScopeGeneral] DriverObject=%p [%wZ]\n",
75 DriverObject, &DriverObject->DriverName);
76 }
77 OriginalFunction(DriverObject);
78}
79
80static NTSTATUS NTAPI
84{
85 PDRIVER_ADD_DEVICE OriginalFunction;
87
89 Status = OriginalFunction(DriverObject, PhysicalDeviceObject);
90
92 {
93 DPRINT1("[DriverScopeGeneral] DriverObject=%p [%wZ] Pdo=%p Status=0x%08x\n",
95 }
96 return Status;
97}
98
99static NTSTATUS NTAPI
102 _In_ ULONG DeviceExtensionSize,
108{
111
113 Status = OriginalFunction(DriverObject, DeviceExtensionSize, DeviceName, DeviceType, DeviceCharacteristics, Exclusive, DeviceObject);
115 {
116 DPRINT1("[DriverScopeGeneral] DriverObject=%p [%wZ] Fdo=%p DeviceType=%d DeviceCharacteristics=0x%x Exclusive=%d Status=0x%08x\n",
118 }
119 return Status;
120}
121
122static NTSTATUS NTAPI
129 _Out_ PIRP *Irp)
130{
134
138 {
139 DPRINT1("[DriverScopePower] DriverObject=%p Fdo=%p Irp=%p MinorCode=0x%02x PowerState=%u Status=0x%08x\n",
141 }
142 return Status;
143}
144
145static PVOID NTAPI
149 _In_ ULONG Tag)
150{
151 PVOID p;
152 PVOID (NTAPI *OriginalFunction)(POOL_TYPE, SIZE_T, ULONG);
153
155
156 p = OriginalFunction(PoolType, NumberOfBytes, Tag);
158 {
159 DPRINT1("[DriverScopePool] ExAllocatePool: Address=%p Caller=%p Type=%d Size=%u Tag=0x%08x\n",
161 }
162 return p;
163}
164
165static VOID NTAPI
167 _In_ PVOID p,
168 _In_ ULONG Tag)
169{
170 VOID (NTAPI *OriginalFunction)(PVOID, ULONG);
171
173
175 {
176 DPRINT1("[DriverScopePool] ExFreePool: Address=%p Caller=%p Tag=0x%08x\n",
177 p, _ReturnAddress(), Tag);
178 }
179
180 OriginalFunction(p, Tag);
181}
182
183static PVOID NTAPI
187{
188 PVOID p;
189 PVOID (NTAPI *OriginalFunction)(POOL_TYPE, SIZE_T);
190
192
193 p = OriginalFunction(PoolType, NumberOfBytes);
195 {
196 DPRINT1("[DriverScopePool] ExAllocatePool: Address=%p Caller=%p Type=%d Size=%u Tag=0x%08x\n",
198 }
199
200 return p;
201}
202
203static VOID NTAPI
205 _In_ PVOID p)
206{
207 VOID (NTAPI *OriginalFunction)(PVOID);
208
210
212 {
213 DPRINT1("[DriverScopePool] ExFreePool: Address=%p Caller=%p Tag=0x%08x\n",
214 p, _ReturnAddress(), 0);
215 }
216
217 OriginalFunction(p);
218}
219
220static NTSTATUS NTAPI
223 _In_ PIRP Irp,
225{
228 NTSTATUS Status = Irp->IoStatus.Status;
229
231 {
232 DPRINT1("[DriverScopeIrps] DriverObject=%p [%wZ] Fdo=%p Irp=%p MajorCode=0x%02x Status=0x%08x\n",
234 }
235
236 return STATUS_SUCCESS;
237}
238
239static NTSTATUS NTAPI
242 _In_ PIRP Irp)
243{
245 PDRIVER_DISPATCH OriginalFunction;
248
251 Status = OriginalFunction(DeviceObject, Irp);
252
254 {
255 if (Status == STATUS_PENDING)
256 {
257 DPRINT1("[DriverScopeIrps] DriverObject=%p [%wZ] Fdo=%p Irp=%p\n",
258 DriverObject, &DriverObject->DriverName, DeviceObject, Irp);
259 }
260 else
261 {
262 DPRINT1("[DriverScopeIrps] DriverObject=%p [%wZ] Fdo=%p Irp=%p MajorCode=0x%02x Status=0x%08x\n",
264 }
265 }
266 return Status;
267}
268
269static NTSTATUS NTAPI
272 _In_ PIRP Irp,
274{
276 NTSTATUS Status = Irp->IoStatus.Status;
277
279 {
280 DPRINT1("[DriverScopePnp] DriverObject=%p [%wZ] Fdo=%p Irp=%p Status=0x%08x\n",
282 }
283
284 return STATUS_SUCCESS;
285}
286
287static NTSTATUS NTAPI
290 _In_ PIRP Irp)
291{
293 PDRIVER_DISPATCH OriginalFunction;
297
300 Status = OriginalFunction(DeviceObject, Irp);
301
303 {
304 if (Status == STATUS_PENDING)
305 {
306 DPRINT1("[DriverScopePnp] DriverObject=%p [%wZ] Fdo=%p Irp=%p\n",
307 DriverObject, &DriverObject->DriverName, DeviceObject, Irp);
308 }
309 else
310 {
311 DPRINT1("[DriverScopePnp] DriverObject=%p [%wZ] Fdo=%p Irp=%p MinorCode=0x%02x Status=0x%08x\n",
313 }
314 }
315
316 return Status;
317}
318
320 { KseHookFunction, { "IoCreateDevice" }, (PVOID)(ULONG_PTR)ShimIoCreateDevice },
321 { KseHookFunction, { "PoRequestPowerIrp" }, (PVOID)(ULONG_PTR)ShimPoRequestPowerIrp },
322 { KseHookFunction, { "ExAllocatePoolWithTag" }, (PVOID)(ULONG_PTR)ShimExAllocatePoolWithTag },
323 { KseHookFunction, { "ExFreePoolWithTag" }, (PVOID)(ULONG_PTR)ShimExFreePoolWithTag },
324 { KseHookFunction, { "ExAllocatePool" }, (PVOID)(ULONG_PTR)ShimExAllocatePool },
325 { KseHookFunction, { "ExFreePool" }, (PVOID)(ULONG_PTR)ShimExFreePool },
326 { KseHookInvalid },
327};
338 { KseHookInvalid },
339};
344};
345
346DEFINE_GUID(KmDsShimGuid, 0xbc04ab45, 0xea7e, 0x4a11, 0xa7, 0xbb, 0x97, 0x76, 0x15, 0xf4, 0xca, 0xae);
347
348KSE_SHIM KmDsShim = { sizeof(KSE_SHIM), &KmDsShimGuid, L"DriverScope", NULL, NULL, NULL, KmDsShimCollections };
349
350CODE_SEG("INIT")
352NTAPI
354{
356
358 if (NT_SUCCESS(Status))
359 DPRINT("KSE: driver scope shim registered.\n");
360
361 return Status;
362}
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
#define CODE_SEG(...)
#define VOID
Definition: acefi.h:82
unsigned char BOOLEAN
Definition: actypes.h:127
LONG NTSTATUS
Definition: precomp.h:26
#define DPRINT1
Definition: precomp.h:8
PDEVICE_OBJECT PhysicalDeviceObject
Definition: btrfs_drv.h:1157
#define IRP_MJ_PNP
Definition: cdrw_usr.h:52
#define NULL
Definition: types.h:112
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define NTSTATUS
Definition: precomp.h:19
#define DEVICE_TYPE
Definition: guid.c:10
#define L(x)
Definition: resources.c:13
#define KSEP_DEBUG_GENERAL
Definition: driverscope.c:21
static NTSTATUS NTAPI ShimIrpComplete(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp, _In_ PVOID Context)
Definition: driverscope.c:221
#define KSEP_DEBUG_IRP
Definition: driverscope.c:24
static VOID NTAPI ShimDriverUnload(_In_ PDRIVER_OBJECT DriverObject)
Definition: driverscope.c:66
static VOID NTAPI ShimDriverStartIo(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp)
Definition: driverscope.c:49
static VOID NTAPI ShimExFreePool(_In_ PVOID p)
Definition: driverscope.c:204
#define KSEP_DEBUG_PNP
Definition: driverscope.c:22
static NTSTATUS NTAPI ShimIrpPnpComplete(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp, _In_ PVOID Context)
Definition: driverscope.c:270
#define KSEP_DEBUG_POWER
Definition: driverscope.c:23
static PVOID NTAPI ShimExAllocatePoolWithTag(_In_ POOL_TYPE PoolType, _In_ SIZE_T NumberOfBytes, _In_ ULONG Tag)
Definition: driverscope.c:146
static NTSTATUS NTAPI ShimDriverAddDevice(_In_ PDRIVER_OBJECT DriverObject, _In_ PDEVICE_OBJECT PhysicalDeviceObject)
Definition: driverscope.c:81
static NTSTATUS NTAPI ShimPoRequestPowerIrp(_In_ PDEVICE_OBJECT DeviceObject, _In_ UCHAR MinorFunction, _In_ POWER_STATE PowerState, _In_ PREQUEST_POWER_COMPLETE CompletionFunction, _In_ PVOID Context, _Out_ PIRP *Irp)
Definition: driverscope.c:123
static NTSTATUS NTAPI ShimDriverInit(_In_ PDRIVER_OBJECT DriverObject, _In_ PUNICODE_STRING RegistryPath)
Definition: driverscope.c:30
static VOID NTAPI ShimExFreePoolWithTag(_In_ PVOID p, _In_ ULONG Tag)
Definition: driverscope.c:166
KSE_SHIM KmDsShim
Definition: driverscope.c:348
static ULONG KsepDebugFlags
Definition: driverscope.c:27
static KSE_HOOK_COLLECTION KmDsShimCollections[]
Definition: driverscope.c:340
#define KSEP_DEBUG_POOL
Definition: driverscope.c:25
static KSE_HOOK KmDsShimHooksNT[]
Definition: driverscope.c:319
NTSTATUS NTAPI KseDriverScopeInitialize(VOID)
Definition: driverscope.c:353
static NTSTATUS NTAPI ShimIoCreateDevice(_In_ PDRIVER_OBJECT DriverObject, _In_ ULONG DeviceExtensionSize, _In_ PUNICODE_STRING DeviceName, _In_ DEVICE_TYPE DeviceType, _In_ ULONG DeviceCharacteristics, _In_ BOOLEAN Exclusive, _Out_ PDEVICE_OBJECT *DeviceObject)
Definition: driverscope.c:100
static PVOID NTAPI ShimExAllocatePool(_In_ POOL_TYPE PoolType, _In_ SIZE_T NumberOfBytes)
Definition: driverscope.c:184
static NTSTATUS NTAPI ShimIrp(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp)
Definition: driverscope.c:240
static KSE_HOOK KmDsShimHooksCB[]
Definition: driverscope.c:328
static NTSTATUS NTAPI ShimIrpPnp(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp)
Definition: driverscope.c:288
UNICODE_STRING * PUNICODE_STRING
Definition: env_spec_w32.h:373
struct _DEVICE_OBJECT * PDEVICE_OBJECT
__in PWDFDEVICE_INIT __in BOOLEAN Exclusive
Status
Definition: gdiplustypes.h:24
GLfloat GLfloat p
Definition: glext.h:8902
#define _ReturnAddress()
Definition: intrin_arm.h:35
_In_ PIRP Irp
Definition: kse.h:79
#define KseHookCallbackDriverInit
Definition: kse.h:15
#define KseHookCallbackAddDevice
Definition: kse.h:18
_In_ PIRP _In_ PIO_COMPLETION_ROUTINE _In_ PVOID Context
Definition: kse.h:81
#define KseHookCallbackDriverUnload
Definition: kse.h:17
#define KseCollectionInvalid
Definition: kse.h:38
#define KseHookCallbackDriverStartIo
Definition: kse.h:16
#define KseCollectionCallback
Definition: kse.h:37
#define KseHookCallbackMajorFunction
Definition: kse.h:19
#define KseHookInvalid
Definition: kse.h:13
#define KseCollectionNtExport
Definition: kse.h:34
struct _KSE_SHIM KSE_SHIM
#define KseHookFunction
Definition: kse.h:11
NTSTATUS NTAPI KseRegisterShim(_In_ PKSE_SHIM Shim, _In_ PVOID Ignored, _In_ ULONG Flags)
Definition: kse.c:464
#define KseHookIRPCallback
Definition: kse.h:12
#define PCHAR
Definition: match.c:90
DeviceType
Definition: mmdrv.h:42
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
union _POWER_STATE POWER_STATE
#define BOOLEAN
Definition: pedump.c:73
#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8)
Definition: guiddef.h:68
#define IRP_MJ_CLOSE
Definition: rdpdr.c:45
#define IRP_MJ_DEVICE_CONTROL
Definition: rdpdr.c:52
#define IRP_MJ_CREATE
Definition: rdpdr.c:44
#define STATUS_SUCCESS
Definition: shellext.h:65
#define DPRINT
Definition: sndvol32.h:73
PKSE_GET_IO_CALLBACKS KseGetIoCallbacksRoutine
Definition: kse.h:87
PKSE_SET_COMPLETION_HOOK KseSetCompletionHookRoutine
Definition: kse.h:88
PKSE_HOOK HookArray
Definition: kse.h:44
Definition: kse.h:22
PVOID OriginalFunction
Definition: kse.h:30
Definition: kse.h:92
PKSE_HOOK_COLLECTION HookCollectionsArray
Definition: kse.h:99
PKSE_CALLBACK_ROUTINES KseCallbackRoutines
Definition: kse.h:96
#define STATUS_PENDING
Definition: telnetd.h:14
unsigned char UCHAR
Definition: typedefs.h:53
INT POOL_TYPE
Definition: typedefs.h:78
#define NTAPI
Definition: typedefs.h:36
void * PVOID
Definition: typedefs.h:50
ULONG_PTR SIZE_T
Definition: typedefs.h:80
uint32_t ULONG_PTR
Definition: typedefs.h:65
uint32_t ULONG
Definition: typedefs.h:59
_Must_inspect_result_ _In_ UCXENDPOINT _In_ PVOID Tag
Definition: ucxendpoint.h:325
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2061
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ _Strict_type_match_ POOL_TYPE PoolType
Definition: wdfdevice.h:3821
_In_ UCHAR MajorFunction
Definition: wdfdevice.h:1703
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_ WDF_DEVICE_POWER_STATE PowerState
Definition: wdfdevice.h:3040
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_opt_ PCUNICODE_STRING DeviceName
Definition: wdfdevice.h:3281
_In_ UCHAR _In_ UCHAR MinorFunction
Definition: wdfdevice.h:1705
_In_ WDFDEVICE _In_ ULONG DeviceCharacteristics
Definition: wdfdevice.h:2781
_Must_inspect_result_ _In_ PDRIVER_OBJECT _In_ PCUNICODE_STRING RegistryPath
Definition: wdfdriver.h:215
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
Definition: wdfdriver.h:213
struct _DRIVER_OBJECT * PDRIVER_OBJECT
DRIVER_STARTIO * PDRIVER_STARTIO
Definition: iotypes.h:2260
DRIVER_UNLOAD * PDRIVER_UNLOAD
Definition: iotypes.h:2268
DRIVER_ADD_DEVICE * PDRIVER_ADD_DEVICE
Definition: iotypes.h:2231
DRIVER_DISPATCH * PDRIVER_DISPATCH
Definition: iotypes.h:2277
#define IRP_MJ_POWER
_Must_inspect_result_ typedef _In_ PHYSICAL_ADDRESS _Inout_ PLARGE_INTEGER NumberOfBytes
Definition: iotypes.h:1036
DRIVER_INITIALIZE * PDRIVER_INITIALIZE
Definition: iotypes.h:2250
_In_ UCHAR _In_ POWER_STATE _In_opt_ PREQUEST_POWER_COMPLETE CompletionFunction
Definition: pofuncs.h:44
REQUEST_POWER_COMPLETE * PREQUEST_POWER_COMPLETE
Definition: potypes.h:472