ReactOS 0.4.16-dev-1946-g52006dd
wdfloader.h
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS WdfLdr driver
3 * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
4 * PURPOSE: WdfLdr driver - library functions
5 * COPYRIGHT: Copyright 2019 Max Korostil <mrmks04@yandex.ru>
6 * Copyright 2021 Victor Perevertkin <victor.perevertkin@reactos.org>
7 * Copyright 2024 Justin Miller <justin.miller@reactos.org>
8 */
9
10#pragma once
11
12#include <fxldr.h>
13#include <aux_klib.h>
14#include <ntintsafe.h>
15#include <ntstrsafe.h>
16
17#define WDFLDR_TAG 'LfdW'
18
19/* PRINT macros based on the open source segments of KMDF for consistency */
20#define __PrintUnfiltered(...) \
21 DbgPrintEx(DPFLTR_DEFAULT_ID, DPFLTR_ERROR_LEVEL, __VA_ARGS__)
22
23#define DPRINT(_x_) \
24do { \
25 if (WdfLdrDiags.DiagFlags & DIAGFLAG_ENABLED) { \
26 DbgPrint("WdfLdr: %s - ", __FUNCTION__); \
27 __PrintUnfiltered _x_; \
28 } \
29} while (0)
30
31#define DPRINT_VERBOSE(_x_) \
32do { \
33 if (WdfLdrDiags.DiagFlags & DIAGFLAG_VERBOSE_LOGGING) { \
34 DbgPrint("WdfLdr: %s - ", __FUNCTION__); \
35 __PrintUnfiltered _x_; \
36 } \
37} while (0)
38
39#define DPRINT_ERROR(_x_) \
40do { \
41 if (WdfLdrDiags.DiagFlags & DIAGFLAG_LOG_ERRORS) { \
42 DbgPrint("WdfLdr: ERROR: %s - ", __FUNCTION__); \
43 __PrintUnfiltered _x_; \
44 } \
45} while (0)
46
47#define DPRINT_TRACE_ENTRY() \
48do { \
49 if (WdfLdrDiags.DiagFlags & DIAGFLAG_TRACE_FUNCTION_ENTRY) { \
50 DbgPrint("WdfLdr: ENTER: %s\n", __FUNCTION__); \
51 } \
52} while (0)
53
54#define DPRINT_TRACE_EXIT() \
55do { \
56 if (WdfLdrDiags.DiagFlags & DIAGFLAG_TRACE_FUNCTION_EXIT) { \
57 DbgPrint("WdfLdr: EXIT: %s\n", __FUNCTION__); \
58 } \
59} while (0)
60
61// Legacy compatibility - use do-while pattern for consistency
62#define __DBGPRINT(_x_) \
63do { \
64 if (WdfLdrDiags.DiagFlags & DIAGFLAG_ENABLED) { \
65 DbgPrint("Wdfldr: %s - ", __FUNCTION__); \
66 __PrintUnfiltered _x_; \
67 } \
68} while (0)
69
70typedef struct _WDF_LDR_GLOBALS {
75
76//
77// Diagnostics Flags
78//
79#define DIAGFLAG_ENABLED 0x00000001
80#define DIAGFLAG_VERBOSE_LOGGING 0x00000002
81#define DIAGFLAG_TRACE_FUNCTION_ENTRY 0x00000004
82#define DIAGFLAG_TRACE_FUNCTION_EXIT 0x00000008
83#define DIAGFLAG_LOG_ERRORS 0x00000010
84#define DIAGFLAG_LOG_WARNINGS 0x00000020
85
86//
87// Enhanced diagnostics structure similar to Windows 10
88//
89typedef struct _WDFLDR_DIAGS {
90 union {
92 struct {
101 };
103
106
107typedef struct _LIBRARY_MODULE {
127
128
129typedef
134 PWDF_CLASS_BIND_INFO ClassBindInfo);
135
136typedef
141 PWDF_CLASS_BIND_INFO ClassBindInfo);
142
143
148
154
155
156typedef struct _CLIENT_MODULE {
166
167
168typedef struct _CLASS_MODULE {
187
188
189typedef struct _CLASS_CLIENT_MODULE {
196
197// class.c
198
201 _In_ PWDF_CLASS_LIBRARY_INFO ClassLibInfo,
204
209
214
215VOID
218
222
225
228 _In_ PWDF_CLASS_BIND_INFO ClassBindInfo,
231
232VOID
234 _In_ PWDF_CLASS_BIND_INFO ClassBindInfo,
237
241 _In_ PWDF_CLASS_BIND_INFO ClassBindInfo,
243 _Out_ PCLASS_CLIENT_MODULE ClassClientModule);
244
249
250VOID
251NTAPI
254
255VOID
258
259VOID
262
263// common.c
264
265VOID
267
268VOID
270
274 _Out_ PVOID* ImageBase,
275 _Out_ PULONG ImageSize);
276
281
282VOID
286
287// library.c
288
291 _In_opt_ PWDF_LIBRARY_INFO LibraryInfo,
294
299
300VOID
303
308
309VOID
312
313VOID
316
317VOID
320
321VOID
324
328
329VOID
332
339 _Out_ PCLIENT_MODULE* OutClientModule);
340
345
349
350VOID
351NTAPI
354
356NTAPI
360
361// Version management functions
363NTAPI
366 _Out_ PLIBRARY_MODULE* Module);
367
369NTAPI
373
374// registry.c
375
378 _In_ PKEY_VALUE_PARTIAL_INFORMATION KeyValueInformation,
380
385
389
395
400 _In_ ULONG Tag,
401 _Out_ PKEY_VALUE_PARTIAL_INFORMATION* KeyValPartialInfo);
unsigned char BOOLEAN
unsigned int UINT32
PRTL_UNICODE_STRING_BUFFER Path
#define VOID
Definition: acefi.h:82
LONG NTSTATUS
Definition: precomp.h:26
static WCHAR ServiceName[]
Definition: browser.c:20
CLIPBOARD_GLOBALS Globals
Definition: clipbrd.c:13
LPWSTR Name
Definition: desk.c:124
#define NTSTATUS
Definition: precomp.h:19
ULONG ERESOURCE
Definition: env_spec_w32.h:594
@ ClassModule
Definition: ipstats.h:82
static DRIVER_DISPATCH ClassClose
Definition: kbdclass.c:19
static DRIVER_DISPATCH ClassCreate
Definition: kbdclass.c:18
PLIBRARY_MODULE LibModule
Definition: library.c:59
_In_ PCUNICODE_STRING ServicePath
Definition: library.c:55
_In_ PCUNICODE_STRING _Out_ PLIBRARY_MODULE * OutLibraryModule
Definition: library.c:57
static const char * ImageName
Definition: image.c:34
_Must_inspect_result_ _Out_ PNDIS_STATUS _In_ NDIS_HANDLE _In_ ULONG _Out_ PNDIS_STRING _Out_ PNDIS_HANDLE KeyHandle
Definition: ndis.h:4715
#define _Inout_
Definition: no_sal2.h:162
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
#define _In_opt_
Definition: no_sal2.h:212
@ Service
Definition: ntsecapi.h:292
long LONG
Definition: pedump.c:60
PWDF_CLASS_BIND_INFO ClientClassBindInfo
Definition: wdfloader.h:194
LIST_ENTRY ClassLinkage
Definition: wdfloader.h:191
LIST_ENTRY ClientLinkage
Definition: wdfloader.h:190
PCLASS_MODULE Class
Definition: wdfloader.h:193
PCLIENT_MODULE Client
Definition: wdfloader.h:192
WDF_CLASS_VERSION Version
Definition: wdfloader.h:174
LONG ClassRefCount
Definition: wdfloader.h:177
BOOLEAN ImplicitlyLoaded
Definition: wdfloader.h:183
PLIBRARY_MODULE Library
Definition: wdfloader.h:179
LIST_ENTRY LibraryLinkage
Definition: wdfloader.h:171
LONG ClientRefCount
Definition: wdfloader.h:178
UNICODE_STRING ImageName
Definition: wdfloader.h:182
PFILE_OBJECT ClassFileObject
Definition: wdfloader.h:175
PDRIVER_OBJECT ClassDriverObject
Definition: wdfloader.h:176
LIST_ENTRY ClientsListHead
Definition: wdfloader.h:170
BOOLEAN IsBootDriver
Definition: wdfloader.h:184
BOOLEAN ImageAlreadyLoaded
Definition: wdfloader.h:185
UNICODE_STRING Service
Definition: wdfloader.h:172
PVOID ImageAddress
Definition: wdfloader.h:180
PWDF_CLASS_LIBRARY_INFO ClassLibraryInfo
Definition: wdfloader.h:173
ERESOURCE ClientsListLock
Definition: wdfloader.h:169
ULONG ImageSize
Definition: wdfloader.h:181
PVOID ImageAddr
Definition: wdfloader.h:160
LIST_ENTRY LibListEntry
Definition: wdfloader.h:157
UNICODE_STRING ImageName
Definition: wdfloader.h:162
PWDF_BIND_INFO Info
Definition: wdfloader.h:163
ULONG ImageSize
Definition: wdfloader.h:161
LIST_ENTRY ClassListHead
Definition: wdfloader.h:164
PVOID ImageAddress
Definition: wdfloader.h:115
PKTHREAD LoaderThread
Definition: wdfloader.h:124
PDRIVER_OBJECT LibraryDriverObject
Definition: wdfloader.h:118
LONG ClientRefCount
Definition: wdfloader.h:110
UNICODE_STRING ServicePath
Definition: wdfloader.h:113
KEVENT LoaderEvent
Definition: wdfloader.h:123
LONG LibraryRefCount
Definition: wdfloader.h:108
BOOLEAN IsBootDriver
Definition: wdfloader.h:111
ERESOURCE ClientsListLock
Definition: wdfloader.h:121
PFILE_OBJECT LibraryFileObject
Definition: wdfloader.h:117
LIST_ENTRY LibraryListEntry
Definition: wdfloader.h:109
LIST_ENTRY ClassListHead
Definition: wdfloader.h:125
PWDF_LIBRARY_INFO LibraryInfo
Definition: wdfloader.h:119
BOOLEAN ImplicitlyLoaded
Definition: wdfloader.h:112
LIST_ENTRY ClientsListHead
Definition: wdfloader.h:120
UNICODE_STRING ImageName
Definition: wdfloader.h:114
WDF_VERSION Version
Definition: wdfloader.h:122
Definition: typedefs.h:120
struct _WDFLDR_DIAGS::@5232::@5234 DiagFlagsByName
UINT32 FunctionExits
Definition: wdfloader.h:96
UINT32 FunctionEntries
Definition: wdfloader.h:95
UINT32 Verbose
Definition: wdfloader.h:94
UINT32 Errors
Definition: wdfloader.h:97
UINT32 DbgPrintOn
Definition: wdfloader.h:93
UINT32 Reserved
Definition: wdfloader.h:99
UINT32 Warnings
Definition: wdfloader.h:98
UINT32 DiagFlags
Definition: wdfloader.h:91
ERESOURCE LoadedModulesListLock
Definition: wdfloader.h:72
LIST_ENTRY LoadedModulesList
Definition: wdfloader.h:73
OSVERSIONINFOEXW OsVersion
Definition: wdfloader.h:71
WDF_INTERFACE_HEADER Header
Definition: wdfloader.h:150
PWDF_CLASS_UNBIND ClassUnbind
Definition: wdfloader.h:152
PWDF_LDR_DIAGNOSTICS_VALUE_BY_NAME_AS_ULONG DiagnosticsValueByNameAsULONG
Definition: wdfloader.h:146
WDF_INTERFACE_HEADER Header
Definition: wdfloader.h:145
uint32_t * PULONG
Definition: typedefs.h:59
#define NTAPI
Definition: typedefs.h:36
uint32_t ULONG
Definition: typedefs.h:59
VOID LibraryUnload()
_Must_inspect_result_ _In_ WDFCHILDLIST _In_ PWDF_CHILD_LIST_ITERATOR _Out_ WDFDEVICE _Inout_opt_ PWDF_CHILD_RETRIEVE_INFO Info
Definition: wdfchildlist.h:690
_Must_inspect_result_ _In_ WDFDEVICE _In_ BOOLEAN _In_opt_ PVOID Tag
Definition: wdfdevice.h:4071
_Must_inspect_result_ _In_ PDRIVER_OBJECT _In_ PCUNICODE_STRING RegistryPath
Definition: wdfdriver.h:215
WDF_BIND_INFO BindInfo
NTSTATUS(NTAPI * PWDF_LDR_DIAGNOSTICS_VALUE_BY_NAME_AS_ULONG)(_In_ PUNICODE_STRING ValueName, _Out_ PULONG Value)
Definition: wdfldr.h:28
NTSTATUS FxLdrQueryData(_In_ HANDLE KeyHandle, _In_ PUNICODE_STRING ValueName, _In_ ULONG Tag, _Out_ PKEY_VALUE_PARTIAL_INFORMATION *KeyValPartialInfo)
Definition: registry.c:267
VOID ClassReleaseClientReference(_In_ PCLASS_MODULE ClassModule)
Definition: class.c:770
struct _CLIENT_MODULE CLIENT_MODULE
VOID FxLdrAcquireLoadedModuleLock(VOID)
Definition: common.c:13
NTSTATUS NTAPI DereferenceVersion(_In_ PWDF_BIND_INFO Info, _In_opt_ PWDF_COMPONENT_GLOBALS Globals)
Dereference a WDF library version.
Definition: wdfldr.c:630
NTSTATUS LibraryOpen(_Inout_ PLIBRARY_MODULE LibModule, _In_ PCUNICODE_STRING ObjectName)
Opens KMDF library's driver object by its name and fills some library structure data.
Definition: library.c:167
VOID ClassRemoveFromLibraryList(_In_ PCLASS_MODULE ClassModule)
Definition: class.c:692
struct _WDF_LOADER_INTERFACE_CLASS_BIND * PWDF_LOADER_INTERFACE_CLASS_BIND
NTSTATUS LibraryFindOrLoad(_In_ PCUNICODE_STRING ServicePath, _Out_ PLIBRARY_MODULE *LibModule)
Definition: library.c:206
VOID LibraryDereference(_In_ PLIBRARY_MODULE LibModule)
Definition: library.c:300
NTSTATUS GetImageName(_In_ PCUNICODE_STRING ServicePath, _In_ PUNICODE_STRING ImageName)
NTSTATUS LibraryCreate(_In_opt_ PWDF_LIBRARY_INFO LibraryInfo, _In_ PCUNICODE_STRING ServicePath, _Out_ PLIBRARY_MODULE *OutLibraryModule)
struct _CLASS_CLIENT_MODULE * PCLASS_CLIENT_MODULE
NTSTATUS BuildServicePath(_In_ PKEY_VALUE_PARTIAL_INFORMATION KeyValueInformation, _In_ PUNICODE_STRING ServicePath)
Definition: registry.c:338
struct _LIBRARY_MODULE * PLIBRARY_MODULE
struct _WDF_LOADER_INTERFACE_DIAGNOSTIC WDF_LOADER_INTERFACE_DIAGNOSTIC
VOID GetNameFromPath(_In_ PCUNICODE_STRING Path, _Out_ PUNICODE_STRING Name)
Definition: fxtelemetry.cpp:54
VOID LibraryReleaseClientLock(_In_ PLIBRARY_MODULE LibModule)
Definition: library.c:373
NTSTATUS GetVersionServicePath(_In_ PWDF_BIND_INFO BindInfo, _Out_ PUNICODE_STRING ServicePath)
Get service path from bind info and registry.
Definition: registry.c:141
PLIBRARY_MODULE FindLibraryByServicePathLocked(_In_ PCUNICODE_STRING ServicePath)
struct _WDF_LOADER_INTERFACE_DIAGNOSTIC * PWDF_LOADER_INTERFACE_DIAGNOSTIC
struct _CLASS_CLIENT_MODULE CLASS_CLIENT_MODULE
struct _WDF_LDR_GLOBALS * PWDF_LDR_GLOBALS
struct _WDFLDR_DIAGS WDFLDR_DIAGS
struct _CLASS_MODULE * PCLASS_MODULE
struct _WDFLDR_DIAGS * PWDFLDR_DIAGS
VOID LibraryClose(_Inout_ PLIBRARY_MODULE LibModule)
Dereferences KMDF library's device object.
Definition: library.c:195
struct _WDF_LOADER_INTERFACE_CLASS_BIND WDF_LOADER_INTERFACE_CLASS_BIND
PLIST_ENTRY LibraryUnloadClasses(_In_ PLIBRARY_MODULE LibModule)
Definition: class.c:636
PLIST_ENTRY LibraryAddToClassListLocked(_In_ PLIBRARY_MODULE LibModule, _In_ PCLASS_MODULE ClassModule)
Definition: class.c:673
NTSTATUS(NTAPI * PWDF_CLASS_BIND)(PWDF_BIND_INFO BindInfo, PWDF_COMPONENT_GLOBALS *Globals, PWDF_CLASS_BIND_INFO ClassBindInfo)
Definition: wdfloader.h:131
VOID FxLdrReleaseLoadedModuleLock(VOID)
Definition: common.c:20
PCLASS_CLIENT_MODULE ClassClientCreate()
Definition: class.c:137
NTSTATUS ReferenceClassVersion(_In_ PWDF_CLASS_BIND_INFO ClassBindInfo, _In_ PWDF_BIND_INFO BindInfo, _Out_ PCLASS_MODULE *ClassModule)
Definition: class.c:423
struct _CLIENT_MODULE * PCLIENT_MODULE
VOID(NTAPI * PWDF_CLASS_UNBIND)(PWDF_BIND_INFO BindInfo, PWDF_COMPONENT_GLOBALS Globals, PWDF_CLASS_BIND_INFO ClassBindInfo)
Definition: wdfloader.h:138
VOID NTAPI LibraryReleaseReference(_In_ PLIBRARY_MODULE LibModule)
Release a reference to a library module.
Definition: library.c:280
PCLASS_MODULE FindClassByServiceNameLocked(_In_ PUNICODE_STRING Path, _Out_ PLIBRARY_MODULE *LibModule)
Definition: class.c:585
struct _CLASS_MODULE CLASS_MODULE
BOOLEAN LibraryUnlinkClient(_In_ PLIBRARY_MODULE LibModule, _In_ PWDF_BIND_INFO BindInfo)
Definition: library.c:475
BOOLEAN ServiceCheckBootStart(_In_ PUNICODE_STRING Service)
Definition: registry.c:194
VOID LibraryReference(_In_ PLIBRARY_MODULE LibModule)
Definition: library.c:267
VOID LibraryFree(_In_ PLIBRARY_MODULE LibModule)
Definition: library.c:13
NTSTATUS LibraryLinkInClient(_In_ PLIBRARY_MODULE LibModule, _In_ PUNICODE_STRING ServicePath, _In_ PWDF_BIND_INFO BindInfo, _In_ PVOID Context, _Out_ PCLIENT_MODULE *OutClientModule)
Create client module and add it to library client list.
Definition: library.c:404
NTSTATUS ClassOpen(_Inout_ PCLASS_MODULE ClassModule, _In_ PUNICODE_STRING ObjectName)
Definition: class.c:29
struct _WDF_LDR_GLOBALS WDF_LDR_GLOBALS
WDFLDR_DIAGS WdfLdrDiags
Definition: wdfldr.c:27
struct _LIBRARY_MODULE LIBRARY_MODULE
NTSTATUS FxLdrQueryUlong(_In_ HANDLE KeyHandle, _In_ PUNICODE_STRING ValueName, _Out_ PULONG Value)
Definition: registry.c:231
NTSTATUS NTAPI FindModuleByClientService(_In_ PUNICODE_STRING RegistryPath, _Out_ PLIBRARY_MODULE *Library)
VOID NTAPI ClassAddReference(_In_ PCLASS_MODULE ClassModule)
Definition: class.c:761
NTSTATUS GetImageInfo(_In_ PCUNICODE_STRING ImageName, _Out_ PVOID *ImageBase, _Out_ PULONG ImageSize)
Definition: common.c:182
VOID DereferenceClassVersion(_In_ PWDF_CLASS_BIND_INFO ClassBindInfo, _In_ PWDF_BIND_INFO BindInfo, _In_ PWDF_COMPONENT_GLOBALS Globals)
Definition: class.c:790
WDF_LDR_GLOBALS WdfLdrGlobals
Definition: wdfldr.c:28
BOOLEAN LibraryAcquireClientLock(_In_ PLIBRARY_MODULE LibModule)
Definition: library.c:365
NTSTATUS NTAPI ReferenceVersion(_In_ PWDF_BIND_INFO Info, _Out_ PLIBRARY_MODULE *Module)
Reference a WDF library version.
Definition: wdfldr.c:576
NTSTATUS ClassLinkInClient(_In_ PCLASS_MODULE ClassModule, _In_ PWDF_CLASS_BIND_INFO ClassBindInfo, _In_ PWDF_BIND_INFO BindInfo, _Out_ PCLASS_CLIENT_MODULE ClassClientModule)
Definition: class.c:170
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING ValueName
Definition: wdfregistry.h:243
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
Definition: wdfregistry.h:413
_In_ PVOID _Out_opt_ PULONG_PTR _Outptr_opt_ PCUNICODE_STRING * ObjectName
Definition: cmfuncs.h:64
* PFILE_OBJECT
Definition: iotypes.h:1998