ReactOS 0.4.16-dev-1946-g52006dd
class.c
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 - class 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#include "wdfloader.h"
11
12VOID
15{
18}
19
20VOID
23{
26}
27
32{
35
36 if (!ObjectName)
37 return STATUS_SUCCESS;
38
40
41 if (NT_SUCCESS(status))
42 ClassModule->ClassDriverObject = deviceObject->DriverObject;
43
44 return status;
45}
46
47VOID
50{
51 if (ClassModule->ClassFileObject != NULL)
52 {
53 ObDereferenceObject(ClassModule->ClassFileObject);
54 ClassModule->ClassFileObject = NULL;
55 }
56}
57
58VOID
61{
63
64 if (ClassModule->Service.Buffer != NULL)
66
67 if (ClassModule->ImageName.Buffer != NULL)
68 ExFreePoolWithTag(ClassModule->ImageName.Buffer, WDFLDR_TAG);
69
70 ExDeleteResourceLite(&ClassModule->ClientsListLock);
72}
73
76 _In_ PWDF_CLASS_LIBRARY_INFO ClassLibInfo,
79{
80 PCLASS_MODULE pNewClassModule;
82
83 pNewClassModule = ExAllocatePoolZero(NonPagedPool, sizeof(*pNewClassModule), WDFLDR_TAG);
84 if (pNewClassModule == NULL)
85 return NULL;
86
87 if (ClassLibInfo != NULL)
88 {
89 pNewClassModule->ImplicitlyLoaded = TRUE;
90 pNewClassModule->ClassLibraryInfo = ClassLibInfo;
91 pNewClassModule->Version.Major = ClassLibInfo->Version.Major;
92 pNewClassModule->Version.Minor = ClassLibInfo->Version.Minor;
93 pNewClassModule->Version.Build = ClassLibInfo->Version.Build;
94 }
95
96 pNewClassModule->ClassRefCount = 1;
97 pNewClassModule->Library = LibModule;
99 InitializeListHead(&pNewClassModule->ClientsListHead);
100 InitializeListHead(&pNewClassModule->LibraryLinkage);
101
102 pNewClassModule->Service.Buffer = ExAllocatePoolZero(PagedPool, ServiceName->MaximumLength, WDFLDR_TAG);
103 if (pNewClassModule->Service.Buffer == NULL)
104 {
105 goto clean;
106 }
107 pNewClassModule->Service.MaximumLength = ServiceName->MaximumLength;
108 RtlCopyUnicodeString(&pNewClassModule->Service, ServiceName);
109 status = GetImageName(ServiceName, &pNewClassModule->ImageName);
110
111 if (!NT_SUCCESS(status))
112 {
113 goto clean;
114 }
115
116 pNewClassModule->IsBootDriver = ServiceCheckBootStart(&pNewClassModule->Service);
117 status = GetImageInfo(&pNewClassModule->ImageName,
118 &pNewClassModule->ImageAddress,
119 &pNewClassModule->ImageSize);
120
121 if (NT_SUCCESS(status))
122 {
123 return pNewClassModule;
124 }
125 else
126 {
127 __DBGPRINT(("GetImageBase failed\n"));
128 }
129
130clean:
131 ClassCleanupAndFree(pNewClassModule);
132
133 return NULL;
134}
135
138{
139 PCLASS_CLIENT_MODULE pNewClassClientModule;
140
141 pNewClassClientModule = ExAllocatePoolZero(NonPagedPool, sizeof(*pNewClassClientModule), WDFLDR_TAG);
142 if (pNewClassClientModule != NULL)
143 {
144 InitializeListHead(&pNewClassClientModule->ClassLinkage);
145 InitializeListHead(&pNewClassClientModule->ClientLinkage);
146 }
147
148 return pNewClassClientModule;
149}
150
155{
156 PCLIENT_MODULE pFoundClient;
158
160 {
161 pFoundClient = CONTAINING_RECORD(entry, CLIENT_MODULE, LibListEntry);
162 if (pFoundClient->Info == BindInfo)
163 return pFoundClient;
164 }
165
166 return NULL;
167}
168
172 _In_ PWDF_CLASS_BIND_INFO ClassBindInfo,
174 _Out_ PCLASS_CLIENT_MODULE ClassClientModule)
175{
176 PCLIENT_MODULE pClienInfo;
178
179 ClassClientModule->Class = ClassModule;
180 ClassClientModule->ClientClassBindInfo = ClassBindInfo;
182 pClienInfo = LibraryFindClientLocked(ClassModule->Library, BindInfo);
183
184 if (pClienInfo != NULL)
185 {
186 ClassClientModule->Client = pClienInfo;
187 InsertTailList(&pClienInfo->ClassListHead, &ClassClientModule->ClassLinkage);
188 }
189
191
192 if (pClienInfo != NULL)
193 {
194 ClassAcquireClientLock(&ClassModule->ClientsListLock);
195 InsertTailList(&ClassModule->ClientsListHead, &ClassClientModule->ClientLinkage);
196 ClassReleaseClientLock(&ClassModule->ClientsListLock);
198 }
199 else
200 {
202 __DBGPRINT(("ERROR: Could not locate client from Info %p, status 0x%x\n", BindInfo, status));
203 }
204
205 return status;
206}
207
210 _In_ PWDF_CLASS_BIND_INFO ClassBindInfo,
213{
214 UNICODE_STRING classVersions;
215 OBJECT_ATTRIBUTES objectAttributes;
216 HANDLE rootHandle = NULL;
217 HANDLE classVersionsHandle = NULL;
218 HANDLE classVersionHandle = NULL;
220 SIZE_T classNameLength;
222 UNICODE_STRING objectName = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Wdf\\Kmdf");
224
225 classVersions.Length = 0;
226 classVersions.Buffer = NULL;
227 *KeyHandle = NULL;
228
229 /* Open root registry key */
230 InitializeObjectAttributes(&objectAttributes,
231 &objectName,
233 NULL,
234 NULL);
235
236 status = ZwOpenKey(&rootHandle, KEY_QUERY_VALUE, &objectAttributes);
237 if (!NT_SUCCESS(status))
238 {
239 __DBGPRINT(("ZwOpenKey failed for root key, status 0x%08X\n", status));
240 goto cleanup;
241 }
242
243 classNameLength = wcslen(ClassBindInfo->ClassName);
244 bufferSize = (classNameLength * sizeof(WCHAR)) + sizeof(L"\\Versions");
245
247 if (classVersions.Buffer == NULL)
248 {
250 goto cleanup;
251 }
252
253 classVersions.MaximumLength = (USHORT)bufferSize;
254 status = RtlUnicodeStringPrintf(&classVersions, L"%s\\Versions", ClassBindInfo->ClassName);
255 if (!NT_SUCCESS(status))
256 {
257 __DBGPRINT(("RtlUnicodeStringPrintf failed, status 0x%08X\n", status));
258 goto cleanup;
259 }
260
261 InitializeObjectAttributes(&objectAttributes,
262 &classVersions,
264 rootHandle,
265 NULL);
266
267 status = ZwOpenKey(&classVersionsHandle, KEY_QUERY_VALUE, &objectAttributes);
268 if (!NT_SUCCESS(status))
269 {
270 __DBGPRINT(("ZwOpenKey failed for class versions, status 0x%08X\n", status));
271 goto cleanup;
272 }
273
274 status = RtlIntegerToUnicodeString(ClassBindInfo->Version.Major, 10, &versionString);
275 if (!NT_SUCCESS(status))
276 {
277 __DBGPRINT(("RtlIntegerToUnicodeString failed for class version, status 0x%08X\n", status));
278 goto cleanup;
279 }
280
281 InitializeObjectAttributes(&objectAttributes,
284 classVersionsHandle,
285 NULL);
286
287 status = ZwOpenKey(&classVersionHandle, KEY_QUERY_VALUE, &objectAttributes);
288 if (!NT_SUCCESS(status))
289 {
290 __DBGPRINT(("ZwOpenKey failed for class version, status 0x%08X\n", status));
291 goto cleanup;
292 }
293
295 if (!NT_SUCCESS(status))
296 {
297 __DBGPRINT(("RtlIntegerToUnicodeString failed for bind version, status 0x%08X\n", status));
298 goto cleanup;
299 }
300
301 InitializeObjectAttributes(&objectAttributes,
304 classVersionHandle,
305 NULL);
306
307 status = ZwOpenKey(KeyHandle, KEY_QUERY_VALUE, &objectAttributes);
308 if (!NT_SUCCESS(status))
309 {
310 __DBGPRINT(("ZwOpenKey failed for bind version, status 0x%08X\n", status));
311 goto cleanup;
312 }
313
314cleanup:
315 if (classVersionHandle)
316 ZwClose(classVersionHandle);
317 if (classVersionsHandle)
318 ZwClose(classVersionsHandle);
319 if (rootHandle)
320 ZwClose(rootHandle);
321
322 if (classVersions.Buffer)
323 {
324 ExFreePoolWithTag(classVersions.Buffer, WDFLDR_TAG);
325 }
326
327 return status;
328}
329
332 _In_ PWDF_CLASS_BIND_INFO ClassBindInfo,
335{
336 SIZE_T classNameLength;
339
340 /*
341 * version numbers are 2 digits each (4 chars)
342 */
343 classNameLength = wcslen(ClassBindInfo->ClassName);
344 bufferSize = (classNameLength * sizeof(WCHAR)) +
345 (sizeof(L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\") +
346 (4 * sizeof(WCHAR)) + sizeof(UNICODE_NULL));
347
349 if (ServiceName->Buffer == NULL)
350 {
352 }
353
354 ServiceName->MaximumLength = (USHORT)bufferSize;
357 L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\%ws%02d%02d",
358 ClassBindInfo->ClassName,
359 ClassBindInfo->Version.Major,
361
362 if (!NT_SUCCESS(status))
363 {
365 }
366
367 return status;
368}
369
372 _In_ PWDF_CLASS_BIND_INFO ClassBindInfo,
375{
378 PKEY_VALUE_PARTIAL_INFORMATION pKeyValPartial = NULL;
380
381 ServicePath->Length = 0;
383
384 status = GetClassRegistryHandle(ClassBindInfo, BindInfo, &Handle);
385
386 if (!NT_SUCCESS(status))
387 {
388 __DBGPRINT(("ERROR: GetClassRegistryHandle failed with status 0x%x\n", status));
389 }
390 else
391 {
392 status = FxLdrQueryData(Handle, &ValueName, WDFLDR_TAG, &pKeyValPartial);
393
394 if (!NT_SUCCESS(status))
395 {
396 __DBGPRINT(("ERROR: QueryData failed with status 0x%x\n", status));
397 }
398 else
399 {
400 status = BuildServicePath(pKeyValPartial, ServicePath);
401 }
402 }
403
404 if (!NT_SUCCESS(status))
405 {
407
408 if (!NT_SUCCESS(status))
409 {
410 __DBGPRINT(("ERROR: GetDefaultClassServiceName failed, status 0x%x\n", status));
411 }
412 }
413
414 if (Handle)
416 if (pKeyValPartial)
417 ExFreePoolWithTag(pKeyValPartial, WDFLDR_TAG);
418
419 return status;
420}
421
424 _In_ PWDF_CLASS_BIND_INFO ClassBindInfo,
427{
428 PWDF_BIND_INFO pBindInfo;
429 PCLASS_MODULE pClassModule;
430 UNICODE_STRING driverServiceName;
431 PLIBRARY_MODULE pLibModule;
432 BOOLEAN created;
434
435 *ClassModule = NULL;
436 pBindInfo = BindInfo;
437 created = FALSE;
438 status = GetClassServicePath(ClassBindInfo, BindInfo, &driverServiceName);
439
440 if (!NT_SUCCESS(status))
441 {
442 RtlFreeUnicodeString(&driverServiceName);
443 return status;
444 }
446 pClassModule = FindClassByServiceNameLocked(&driverServiceName, &pLibModule);
447
448 if (!pLibModule)
449 {
450 pLibModule = pBindInfo->Module;
451 }
452
453 if (pLibModule == pBindInfo->Module)
454 {
455 if (pClassModule)
456 {
457 InterlockedExchangeAdd(&pClassModule->ClassRefCount, 1);
458 }
459 else
460 {
461 pClassModule = ClassCreate(NULL, pLibModule, &driverServiceName);
462
463 if (pClassModule)
464 {
465 InterlockedExchangeAdd(&pClassModule->ClassRefCount, 1);
466 LibraryAddToClassListLocked(pLibModule, pClassModule);
467 created = TRUE;
468 }
469 else
470 {
472 }
473 }
474 }
475 else
476 {
478
479 __DBGPRINT(("class %S bound to library %p,client bound to library %p, status 0x%x\n",
480 ClassBindInfo->ClassName,
481 pLibModule,
482 pBindInfo->Module,
483 status));
484 }
486
487 if (!created)
488 {
489 if (!NT_SUCCESS(status))
490 goto clean;
491
492 ClassBindInfo->ClassModule = pClassModule;
493 *ClassModule = pClassModule;
494 }
495
496 /* Class logic: Only call ZwLoadDriver if:
497 * 1. Class module was newly created, OR
498 * 2. Class module exists but has no ClassLibraryInfo
499 */
500 if (created || (pClassModule && !pClassModule->ClassLibraryInfo))
501 {
502
503 status = ZwLoadDriver(&driverServiceName);
504 if (!NT_SUCCESS(status))
505 {
506
510 {
511 /* Driver might already be loaded as boot driver - UCX*/
513 }
514 }
515 else if (pClassModule && !pClassModule->ClassLibraryInfo)
516 {
518 }
519 }
520 else
521 {
522 /* Class module exists and has ClassLibraryInfo - skip ZwLoadDriver */
524 }
525
526 /* Always set the class module regardless of ZwLoadDriver result (Again.. UCX) */
527 if (pClassModule && NT_SUCCESS(status))
528 {
529 ClassBindInfo->ClassModule = pClassModule;
530 *ClassModule = pClassModule;
531
532 InterlockedExchangeAdd(&pClassModule->ClientRefCount, 1);
533 goto exit_success;
534 }
535
536clean:
537 if (pClassModule && InterlockedExchangeAdd(&pClassModule->ClassRefCount, -1) == 1)
538 ClassCleanupAndFree(pClassModule);
539
540exit_success:
541
542 RtlFreeUnicodeString(&driverServiceName);
543
544 return status;
545}
546
547VOID
550 _In_ BOOLEAN RemoveFromList)
551{
552 PCLASS_MODULE pClassModule;
553 PWDF_CLASS_LIBRARY_INFO pClassLibInfo;
555
556 pClassModule = ClassModule;
557 pClassLibInfo = ClassModule->ClassLibraryInfo;
558
559 if (pClassLibInfo && pClassLibInfo->ClassLibraryDeinitialize)
560 {
561 __DBGPRINT(("calling ClassLibraryDeinitialize (%p)\n",
562 ClassModule->ClassLibraryInfo->ClassLibraryDeinitialize));
563
564 ClassModule->ClassLibraryInfo->ClassLibraryDeinitialize();
565 }
566
567 __DBGPRINT(("Unload class library %wZ\n", &ClassModule->Service));
568
570 status = ZwUnloadDriver(&ClassModule->Service);
571
572 if (!NT_SUCCESS(status))
573 {
574 __DBGPRINT(("unload of class %wZ returned 0x%x (this may not be a true error if someone else attempted to "
575 "stop the service first)\n",
576 &pClassModule->Service,
577 status));
578 }
579
580 if (RemoveFromList)
581 ClassRemoveFromLibraryList(pClassModule);
582}
583
588{
589 PLIST_ENTRY libEntry;
590 PLIBRARY_MODULE pLibModule;
591 PLIST_ENTRY classEntry;
592 PCLASS_MODULE pClassModule;
593 UNICODE_STRING needleName;
594
595 GetNameFromPath(ServicePath, &needleName);
596
598 {
599 goto end;
600 }
601
602 for (libEntry = WdfLdrGlobals.LoadedModulesList.Flink;
603 libEntry != &WdfLdrGlobals.LoadedModulesList;
604 libEntry = libEntry->Flink)
605 {
606 pLibModule = CONTAINING_RECORD(libEntry, LIBRARY_MODULE, LibraryListEntry);
607
608 for (classEntry = pLibModule->ClassListHead.Flink;
609 classEntry != &pLibModule->ClassListHead;
610 classEntry = classEntry->Flink)
611 {
612 UNICODE_STRING haystackName;
613 pClassModule = CONTAINING_RECORD(classEntry, CLASS_MODULE, LibraryLinkage);
614 GetNameFromPath(&pClassModule->Service, &haystackName);
615
616 if (RtlEqualUnicodeString(&needleName, &haystackName, TRUE))
617 {
618 if (LibModule != NULL)
619 {
620 *LibModule = pLibModule;
621 }
622
623 return pClassModule;
624 }
625 }
626 }
627
628end:
629 if (LibModule != NULL)
630 *LibModule = NULL;
631
632 return NULL;
633}
634
638{
639 PLIST_ENTRY classListHead;
641 PCLASS_MODULE pClassModule;
642 LIST_ENTRY removedList;
643
644 InitializeListHead(&removedList);
645 classListHead = &LibModule->ClassListHead;
646
647 if (IsListEmpty(classListHead))
648 return classListHead;
649
650 while (!IsListEmpty(classListHead))
651 {
652 entry = RemoveHeadList(classListHead);
653 InsertTailList(&removedList, entry);
654 }
655
656 while (!IsListEmpty(&removedList))
657 {
658 entry = RemoveHeadList(&removedList);
660 pClassModule = CONTAINING_RECORD(entry, CLASS_MODULE, LibraryLinkage);
661
662 __DBGPRINT(("Unload class library %wZ (%p)\n", &pClassModule->Service, pClassModule));
663
664 ClassUnload(pClassModule, 0);
665 if (InterlockedExchangeAdd(&pClassModule->ClassRefCount, -1) == 1)
666 ClassCleanupAndFree(pClassModule);
667 }
668
669 return classListHead;
670}
671
676{
678
679 if (!LibModule || !ClassModule)
680 return NULL;
681
682 result = &ClassModule->LibraryLinkage;
684
685 DPRINT_VERBOSE(("Added class %wZ to library %wZ\n",
686 &ClassModule->Service, &LibModule->ServicePath));
687
688 return result;
689}
690
691VOID
694{
695 PLIST_ENTRY libLinkEntry;
696 BOOLEAN removed;
697
699 libLinkEntry = &ClassModule->LibraryLinkage;
700
701 if (IsListEmpty(libLinkEntry))
702 {
703 removed = FALSE;
704 }
705 else
706 {
707 RemoveEntryList(libLinkEntry);
708 InitializeListHead(libLinkEntry);
709 removed = TRUE;
710 }
712
713 if (removed)
714 {
715 if (InterlockedExchangeAdd(&ClassModule->ClassRefCount, -1) == 1)
717 }
718}
719
720VOID
723 _In_ PWDF_CLASS_BIND_INFO ClassBindInfo)
724{
726 BOOLEAN isUnlinked;
728
729 client = NULL;
730 isUnlinked = FALSE;
731 ClassAcquireClientLock(&ClassModule->ClientsListLock);
732
733 for (entry = ClassModule->ClientsListHead.Flink;
734 entry != &ClassModule->ClientsListHead;
735 entry = entry->Flink)
736 {
738 if (CONTAINING_RECORD(entry, CLASS_CLIENT_MODULE, ClassLinkage)->ClientClassBindInfo == ClassBindInfo)
739 {
740 isUnlinked = TRUE;
741 break;
742 }
743 }
744
745 ClassReleaseClientLock(&ClassModule->ClientsListLock);
746
747 if (isUnlinked)
748 {
752 InitializeListHead(&client->ClientLinkage);
753 RemoveEntryList(&client->ClientLinkage);
756 }
757}
758
759VOID
760NTAPI
763{
764 InterlockedIncrement(&ClassModule->ClassRefCount);
765 DPRINT_VERBOSE(("Added reference to class %wZ, RefCount=%d\n",
766 &ClassModule->Service, ClassModule->ClassRefCount));
767}
768
769VOID
772{
773 int refs;
774
775 __DBGPRINT(("Dereference module %wZ\n", &ClassModule->Service));
776 refs = InterlockedDecrement(&ClassModule->ClientRefCount);
777
778 if (refs <= 0)
779 {
781 }
782 else
783 {
784 __DBGPRINT(("Dereference module %wZ still has %d references\n",
785 &ClassModule->Service, refs));
786 }
787}
788
789VOID
791 _In_ PWDF_CLASS_BIND_INFO ClassBindInfo,
794{
795 PCLASS_MODULE pClassModule;
796
798 pClassModule = ClassBindInfo->ClassModule;
799
800 if (pClassModule)
801 {
802 if (pClassModule->ClassLibraryInfo &&
804 {
805 pClassModule->ClassLibraryInfo->ClassLibraryUnbindClient(ClassBindInfo, &Globals);
806 }
807 ClassUnlinkClient(pClassModule, ClassBindInfo);
808 ClassReleaseClientReference(pClassModule);
809 ClassBindInfo->ClassModule = NULL;
810 }
811}
unsigned char BOOLEAN
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
LONG NTSTATUS
Definition: precomp.h:26
static WCHAR ServiceName[]
Definition: browser.c:20
#define DECLARE_UNICODE_STRING_SIZE(_var, _size)
Definition: reactos.c:2885
_Acquires_exclusive_lock_ Resource _Acquires_shared_lock_ Resource _Inout_ PERESOURCE Resource
Definition: cdprocs.h:843
DRIVER_UNLOAD ClassUnload
Definition: classp.h:1356
CLIPBOARD_GLOBALS Globals
Definition: clipbrd.c:13
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
static const GLubyte versionString[]
Definition: registry.c:37
static void cleanup(void)
Definition: main.c:1335
#define L(x)
Definition: resources.c:13
#define RemoveEntryList(Entry)
Definition: env_spec_w32.h:986
#define InsertTailList(ListHead, Entry)
#define InsertHeadList(ListHead, Entry)
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define IsListEmpty(ListHead)
Definition: env_spec_w32.h:954
NTSTATUS ExInitializeResourceLite(PULONG res)
Definition: env_spec_w32.h:641
#define ExAcquireResourceExclusiveLite(res, wait)
Definition: env_spec_w32.h:615
ERESOURCE * PERESOURCE
Definition: env_spec_w32.h:595
#define ExDeleteResourceLite(res)
Definition: env_spec_w32.h:647
#define RemoveHeadList(ListHead)
Definition: env_spec_w32.h:964
#define NonPagedPool
Definition: env_spec_w32.h:307
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
#define PagedPool
Definition: env_spec_w32.h:308
MxDeviceObject deviceObject
VOID GetNameFromPath(_In_ PCUNICODE_STRING Path, _Out_ PUNICODE_STRING Name)
Definition: fxtelemetry.cpp:54
_Must_inspect_result_ NTSTATUS GetImageName(_In_ PFX_DRIVER_GLOBALS DriverGlobals, _Out_ PUNICODE_STRING ImageName)
size_t bufferSize
ULONG Handle
Definition: gdb_input.c:15
GLuint GLuint end
Definition: gl.h:1545
GLuint64EXT * result
Definition: glext.h:11304
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define OBJ_KERNEL_HANDLE
Definition: winternl.h:231
#define OBJ_CASE_INSENSITIVE
Definition: winternl.h:228
#define InterlockedExchangeAdd
Definition: interlocked.h:196
@ ClassModule
Definition: ipstats.h:82
uint32_t entry
Definition: isohybrid.c:63
static DRIVER_DISPATCH ClassClose
Definition: kbdclass.c:19
static DRIVER_DISPATCH ClassCreate
Definition: kbdclass.c:18
#define KeLeaveCriticalRegion()
Definition: ke_x.h:119
#define KeEnterCriticalRegion()
Definition: ke_x.h:88
VOID LibraryReleaseClientLock(_In_ PLIBRARY_MODULE LibModule)
Definition: library.c:373
PLIBRARY_MODULE LibModule
Definition: library.c:59
_In_ PCUNICODE_STRING ServicePath
Definition: library.c:55
BOOLEAN LibraryAcquireClientLock(_In_ PLIBRARY_MODULE LibModule)
Definition: library.c:365
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
FORCEINLINE PVOID ExAllocatePoolZero(ULONG PoolType, SIZE_T NumberOfBytes, ULONG Tag)
Definition: precomp.h:45
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:106
_Must_inspect_result_ _Out_ PNDIS_STATUS _In_ NDIS_HANDLE _In_ ULONG _Out_ PNDIS_STRING _Out_ PNDIS_HANDLE KeyHandle
Definition: ndis.h:4715
NTSYSAPI NTSTATUS NTAPI ZwUnloadDriver(_In_ PUNICODE_STRING DriverServiceName)
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
#define _Inout_
Definition: no_sal2.h:162
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
NTSYSAPI VOID NTAPI RtlCopyUnicodeString(PUNICODE_STRING DestinationString, PUNICODE_STRING SourceString)
#define FILE_READ_DATA
Definition: nt_native.h:628
NTSYSAPI BOOLEAN NTAPI RtlEqualUnicodeString(PUNICODE_STRING String1, PUNICODE_STRING String2, BOOLEAN CaseInSensitive)
#define KEY_QUERY_VALUE
Definition: nt_native.h:1019
NTSYSAPI NTSTATUS NTAPI RtlIntegerToUnicodeString(ULONG Value, ULONG Base, PUNICODE_STRING String)
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
#define UNICODE_NULL
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
VOID FASTCALL ExReleaseResourceLite(IN PERESOURCE Resource)
Definition: resource.c:1822
NTSTATUS NTAPI IoGetDeviceObjectPointer(IN PUNICODE_STRING ObjectName, IN ACCESS_MASK DesiredAccess, OUT PFILE_OBJECT *FileObject, OUT PDEVICE_OBJECT *DeviceObject)
Definition: device.c:1435
PVOID *typedef PHANDLE
Definition: ntsecpkg.h:455
#define STATUS_IMAGE_ALREADY_LOADED
Definition: ntstatus.h:600
#define STATUS_REVISION_MISMATCH
Definition: ntstatus.h:419
NTSTRSAFEVAPI RtlUnicodeStringPrintf(_In_ PUNICODE_STRING DestinationString, _In_ NTSTRSAFE_PCWSTR pszFormat,...)
Definition: ntstrsafe.h:3241
unsigned short USHORT
Definition: pedump.c:61
VOID ClassCleanupAndFree(_In_ PCLASS_MODULE ClassModule)
Definition: class.c:59
VOID ClassReleaseClientReference(_In_ PCLASS_MODULE ClassModule)
Definition: class.c:770
VOID ClassUnlinkClient(_In_ PCLASS_MODULE ClassModule, _In_ PWDF_CLASS_BIND_INFO ClassBindInfo)
Definition: class.c:721
VOID ClassRemoveFromLibraryList(_In_ PCLASS_MODULE ClassModule)
Definition: class.c:692
NTSTATUS GetClassRegistryHandle(_In_ PWDF_CLASS_BIND_INFO ClassBindInfo, _In_ PWDF_BIND_INFO BindInfo, _Out_ PHANDLE KeyHandle)
Definition: class.c:209
PCLASS_MODULE FindClassByServiceNameLocked(_In_ PUNICODE_STRING ServicePath, _Out_ PLIBRARY_MODULE *LibModule)
Definition: class.c:585
PCLIENT_MODULE LibraryFindClientLocked(_In_ PLIBRARY_MODULE LibModule, _In_ PWDF_BIND_INFO BindInfo)
Definition: class.c:152
VOID ClassReleaseClientLock(_In_ PERESOURCE Resource)
Definition: class.c:21
VOID ClassAcquireClientLock(_In_ PERESOURCE Resource)
Definition: class.c:13
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
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
NTSTATUS GetDefaultClassServiceName(_In_ PWDF_CLASS_BIND_INFO ClassBindInfo, _In_ PWDF_BIND_INFO BindInfo, _Out_ PUNICODE_STRING ServiceName)
Definition: class.c:331
NTSTATUS GetClassServicePath(_In_ PWDF_CLASS_BIND_INFO ClassBindInfo, _In_ PWDF_BIND_INFO BindInfo, _Out_ PUNICODE_STRING ServicePath)
Definition: class.c:371
NTSTATUS ClassOpen(_Inout_ PCLASS_MODULE ClassModule, _In_ PUNICODE_STRING ObjectName)
Definition: class.c:29
VOID NTAPI ClassAddReference(_In_ PCLASS_MODULE ClassModule)
Definition: class.c:761
VOID DereferenceClassVersion(_In_ PWDF_CLASS_BIND_INFO ClassBindInfo, _In_ PWDF_BIND_INFO BindInfo, _In_ PWDF_COMPONENT_GLOBALS Globals)
Definition: class.c:790
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
VOID FxLdrAcquireLoadedModuleLock(VOID)
Definition: common.c:13
VOID FxLdrReleaseLoadedModuleLock(VOID)
Definition: common.c:20
NTSTATUS GetImageInfo(_In_ PCUNICODE_STRING ImageName, _Out_ PVOID *ImageBase, _Out_ PULONG ImageSize)
Definition: common.c:182
NTSTATUS FxLdrQueryData(_In_ HANDLE KeyHandle, _In_ PUNICODE_STRING ValueName, _In_ ULONG Tag, _Out_ PKEY_VALUE_PARTIAL_INFORMATION *KeyValPartialInfo)
Definition: registry.c:267
NTSTATUS BuildServicePath(_In_ PKEY_VALUE_PARTIAL_INFORMATION KeyValueInformation, _In_ PUNICODE_STRING ServicePath)
Definition: registry.c:338
BOOLEAN ServiceCheckBootStart(_In_ PUNICODE_STRING Service)
Definition: registry.c:194
static FILE * client
Definition: client.c:37
#define STATUS_SUCCESS
Definition: shellext.h:65
LIST_ENTRY ClassLinkage
Definition: wdfloader.h:191
LIST_ENTRY ClientLinkage
Definition: wdfloader.h:190
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
LIST_ENTRY ClientsListHead
Definition: wdfloader.h:170
BOOLEAN IsBootDriver
Definition: wdfloader.h:184
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
PWDF_BIND_INFO Info
Definition: wdfloader.h:163
LIST_ENTRY ClassListHead
Definition: wdfloader.h:164
UNICODE_STRING ServicePath
Definition: wdfloader.h:113
LIST_ENTRY ClassListHead
Definition: wdfloader.h:125
LIST_ENTRY ClientsListHead
Definition: wdfloader.h:120
Definition: typedefs.h:120
struct _LIST_ENTRY * Flink
Definition: typedefs.h:121
USHORT MaximumLength
Definition: env_spec_w32.h:370
PLIBRARY_MODULE Module
Definition: fxldr.h:136
WDF_VERSION Version
Definition: fxldr.h:133
PFN_CLASS_LIBRARY_UNBIND_CLIENT ClassLibraryUnbindClient
Definition: wdfldr.h:113
PFN_CLASS_LIBRARY_DEINIT ClassLibraryDeinitialize
Definition: wdfldr.h:111
LIST_ENTRY LoadedModulesList
Definition: wdfloader.h:73
WDF_MAJOR_VERSION Major
Definition: fxldr.h:122
Definition: ps.c:97
#define RTL_CONSTANT_STRING(s)
Definition: tunneltest.c:14
#define NTAPI
Definition: typedefs.h:36
ULONG_PTR SIZE_T
Definition: typedefs.h:80
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
#define STATUS_DRIVER_INTERNAL_ERROR
Definition: udferr_usr.h:177
#define STATUS_OBJECT_PATH_NOT_FOUND
Definition: udferr_usr.h:151
#define STATUS_INVALID_DEVICE_STATE
Definition: udferr_usr.h:178
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
#define STATUS_OBJECT_NAME_NOT_FOUND
Definition: udferr_usr.h:149
WDF_BIND_INFO BindInfo
WDF_LDR_GLOBALS WdfLdrGlobals
Definition: wdfldr.c:28
#define WDFLDR_TAG
Definition: wdfloader.h:17
#define __DBGPRINT(_x_)
Definition: wdfloader.h:62
#define DPRINT_VERBOSE(_x_)
Definition: wdfloader.h:31
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING ValueName
Definition: wdfregistry.h:243
_In_ PVOID _Out_opt_ PULONG_PTR _Outptr_opt_ PCUNICODE_STRING * ObjectName
Definition: cmfuncs.h:64
#define ObDereferenceObject
Definition: obfuncs.h:203
__wchar_t WCHAR
Definition: xmlstorage.h:180