84 if (pNewClassModule ==
NULL)
87 if (ClassLibInfo !=
NULL)
91 pNewClassModule->
Version.
Major = ClassLibInfo->Version.Major;
92 pNewClassModule->
Version.
Minor = ClassLibInfo->Version.Minor;
93 pNewClassModule->
Version.
Build = ClassLibInfo->Version.Build;
123 return pNewClassModule;
142 if (pNewClassClientModule !=
NULL)
148 return pNewClassClientModule;
180 ClassClientModule->ClientClassBindInfo = ClassBindInfo;
184 if (pClienInfo !=
NULL)
186 ClassClientModule->Client = pClienInfo;
192 if (pClienInfo !=
NULL)
243 classNameLength =
wcslen(ClassBindInfo->ClassName);
270 __DBGPRINT((
"ZwOpenKey failed for class versions, status 0x%08X\n",
status));
277 __DBGPRINT((
"RtlIntegerToUnicodeString failed for class version, status 0x%08X\n",
status));
290 __DBGPRINT((
"ZwOpenKey failed for class version, status 0x%08X\n",
status));
297 __DBGPRINT((
"RtlIntegerToUnicodeString failed for bind version, status 0x%08X\n",
status));
315 if (classVersionHandle)
317 if (classVersionsHandle)
343 classNameLength =
wcslen(ClassBindInfo->ClassName);
345 (
sizeof(
L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\") +
357 L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\%ws%02d%02d",
358 ClassBindInfo->ClassName,
359 ClassBindInfo->Version.Major,
388 __DBGPRINT((
"ERROR: GetClassRegistryHandle failed with status 0x%x\n",
status));
410 __DBGPRINT((
"ERROR: GetDefaultClassServiceName failed, status 0x%x\n",
status));
450 pLibModule = pBindInfo->
Module;
453 if (pLibModule == pBindInfo->
Module)
479 __DBGPRINT((
"class %S bound to library %p,client bound to library %p, status 0x%x\n",
480 ClassBindInfo->ClassName,
492 ClassBindInfo->ClassModule = pClassModule;
503 status = ZwLoadDriver(&driverServiceName);
529 ClassBindInfo->ClassModule = pClassModule;
561 __DBGPRINT((
"calling ClassLibraryDeinitialize (%p)\n",
562 ClassModule->ClassLibraryInfo->ClassLibraryDeinitialize));
564 ClassModule->ClassLibraryInfo->ClassLibraryDeinitialize();
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",
604 libEntry = libEntry->
Flink)
610 classEntry = classEntry->
Flink)
648 return classListHead;
662 __DBGPRINT((
"Unload class library %wZ (%p)\n", &pClassModule->
Service, pClassModule));
669 return classListHead;
784 __DBGPRINT((
"Dereference module %wZ still has %d references\n",
798 pClassModule = ClassBindInfo->ClassModule;
809 ClassBindInfo->ClassModule =
NULL;
#define InterlockedIncrement
#define InterlockedDecrement
static WCHAR ServiceName[]
#define DECLARE_UNICODE_STRING_SIZE(_var, _size)
_Acquires_exclusive_lock_ Resource _Acquires_shared_lock_ Resource _Inout_ PERESOURCE Resource
DRIVER_UNLOAD ClassUnload
CLIPBOARD_GLOBALS Globals
#define NT_SUCCESS(StatCode)
static const GLubyte versionString[]
static void cleanup(void)
#define RemoveEntryList(Entry)
#define InsertTailList(ListHead, Entry)
#define InsertHeadList(ListHead, Entry)
#define ExAllocatePoolWithTag(hernya, size, tag)
#define IsListEmpty(ListHead)
NTSTATUS ExInitializeResourceLite(PULONG res)
#define ExAcquireResourceExclusiveLite(res, wait)
#define ExDeleteResourceLite(res)
#define RemoveHeadList(ListHead)
#define InitializeListHead(ListHead)
MxDeviceObject deviceObject
VOID GetNameFromPath(_In_ PCUNICODE_STRING Path, _Out_ PUNICODE_STRING Name)
_Must_inspect_result_ NTSTATUS GetImageName(_In_ PFX_DRIVER_GLOBALS DriverGlobals, _Out_ PUNICODE_STRING ImageName)
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define OBJ_KERNEL_HANDLE
#define OBJ_CASE_INSENSITIVE
#define InterlockedExchangeAdd
static DRIVER_DISPATCH ClassClose
static DRIVER_DISPATCH ClassCreate
#define KeLeaveCriticalRegion()
#define KeEnterCriticalRegion()
VOID LibraryReleaseClientLock(_In_ PLIBRARY_MODULE LibModule)
PLIBRARY_MODULE LibModule
_In_ PCUNICODE_STRING ServicePath
BOOLEAN LibraryAcquireClientLock(_In_ PLIBRARY_MODULE LibModule)
#define ExFreePoolWithTag(_P, _T)
FORCEINLINE PVOID ExAllocatePoolZero(ULONG PoolType, SIZE_T NumberOfBytes, ULONG Tag)
#define InitializeObjectAttributes(p, n, a, r, s)
_Must_inspect_result_ _Out_ PNDIS_STATUS _In_ NDIS_HANDLE _In_ ULONG _Out_ PNDIS_STRING _Out_ PNDIS_HANDLE KeyHandle
NTSYSAPI NTSTATUS NTAPI ZwUnloadDriver(_In_ PUNICODE_STRING DriverServiceName)
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
NTSYSAPI VOID NTAPI RtlCopyUnicodeString(PUNICODE_STRING DestinationString, PUNICODE_STRING SourceString)
NTSYSAPI BOOLEAN NTAPI RtlEqualUnicodeString(PUNICODE_STRING String1, PUNICODE_STRING String2, BOOLEAN CaseInSensitive)
NTSYSAPI NTSTATUS NTAPI RtlIntegerToUnicodeString(ULONG Value, ULONG Base, PUNICODE_STRING String)
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
#define UNREFERENCED_PARAMETER(P)
VOID FASTCALL ExReleaseResourceLite(IN PERESOURCE Resource)
NTSTATUS NTAPI IoGetDeviceObjectPointer(IN PUNICODE_STRING ObjectName, IN ACCESS_MASK DesiredAccess, OUT PFILE_OBJECT *FileObject, OUT PDEVICE_OBJECT *DeviceObject)
#define STATUS_IMAGE_ALREADY_LOADED
#define STATUS_REVISION_MISMATCH
NTSTRSAFEVAPI RtlUnicodeStringPrintf(_In_ PUNICODE_STRING DestinationString, _In_ NTSTRSAFE_PCWSTR pszFormat,...)
VOID ClassCleanupAndFree(_In_ PCLASS_MODULE ClassModule)
VOID ClassReleaseClientReference(_In_ PCLASS_MODULE ClassModule)
VOID ClassUnlinkClient(_In_ PCLASS_MODULE ClassModule, _In_ PWDF_CLASS_BIND_INFO ClassBindInfo)
VOID ClassRemoveFromLibraryList(_In_ PCLASS_MODULE ClassModule)
NTSTATUS GetClassRegistryHandle(_In_ PWDF_CLASS_BIND_INFO ClassBindInfo, _In_ PWDF_BIND_INFO BindInfo, _Out_ PHANDLE KeyHandle)
PCLASS_MODULE FindClassByServiceNameLocked(_In_ PUNICODE_STRING ServicePath, _Out_ PLIBRARY_MODULE *LibModule)
PCLIENT_MODULE LibraryFindClientLocked(_In_ PLIBRARY_MODULE LibModule, _In_ PWDF_BIND_INFO BindInfo)
VOID ClassReleaseClientLock(_In_ PERESOURCE Resource)
VOID ClassAcquireClientLock(_In_ PERESOURCE Resource)
PLIST_ENTRY LibraryUnloadClasses(_In_ PLIBRARY_MODULE LibModule)
PLIST_ENTRY LibraryAddToClassListLocked(_In_ PLIBRARY_MODULE LibModule, _In_ PCLASS_MODULE ClassModule)
PCLASS_CLIENT_MODULE ClassClientCreate()
NTSTATUS ReferenceClassVersion(_In_ PWDF_CLASS_BIND_INFO ClassBindInfo, _In_ PWDF_BIND_INFO BindInfo, _Out_ PCLASS_MODULE *ClassModule)
NTSTATUS GetDefaultClassServiceName(_In_ PWDF_CLASS_BIND_INFO ClassBindInfo, _In_ PWDF_BIND_INFO BindInfo, _Out_ PUNICODE_STRING ServiceName)
NTSTATUS GetClassServicePath(_In_ PWDF_CLASS_BIND_INFO ClassBindInfo, _In_ PWDF_BIND_INFO BindInfo, _Out_ PUNICODE_STRING ServicePath)
NTSTATUS ClassOpen(_Inout_ PCLASS_MODULE ClassModule, _In_ PUNICODE_STRING ObjectName)
VOID NTAPI ClassAddReference(_In_ PCLASS_MODULE ClassModule)
VOID DereferenceClassVersion(_In_ PWDF_CLASS_BIND_INFO ClassBindInfo, _In_ PWDF_BIND_INFO BindInfo, _In_ PWDF_COMPONENT_GLOBALS Globals)
NTSTATUS ClassLinkInClient(_In_ PCLASS_MODULE ClassModule, _In_ PWDF_CLASS_BIND_INFO ClassBindInfo, _In_ PWDF_BIND_INFO BindInfo, _Out_ PCLASS_CLIENT_MODULE ClassClientModule)
VOID FxLdrAcquireLoadedModuleLock(VOID)
VOID FxLdrReleaseLoadedModuleLock(VOID)
NTSTATUS GetImageInfo(_In_ PCUNICODE_STRING ImageName, _Out_ PVOID *ImageBase, _Out_ PULONG ImageSize)
NTSTATUS FxLdrQueryData(_In_ HANDLE KeyHandle, _In_ PUNICODE_STRING ValueName, _In_ ULONG Tag, _Out_ PKEY_VALUE_PARTIAL_INFORMATION *KeyValPartialInfo)
NTSTATUS BuildServicePath(_In_ PKEY_VALUE_PARTIAL_INFORMATION KeyValueInformation, _In_ PUNICODE_STRING ServicePath)
BOOLEAN ServiceCheckBootStart(_In_ PUNICODE_STRING Service)
WDF_CLASS_VERSION Version
LIST_ENTRY LibraryLinkage
LIST_ENTRY ClientsListHead
PWDF_CLASS_LIBRARY_INFO ClassLibraryInfo
ERESOURCE ClientsListLock
UNICODE_STRING ServicePath
LIST_ENTRY ClientsListHead
struct _LIST_ENTRY * Flink
PFN_CLASS_LIBRARY_UNBIND_CLIENT ClassLibraryUnbindClient
PFN_CLASS_LIBRARY_DEINIT ClassLibraryDeinitialize
LIST_ENTRY LoadedModulesList
#define RTL_CONSTANT_STRING(s)
#define CONTAINING_RECORD(address, type, field)
#define STATUS_DRIVER_INTERNAL_ERROR
#define STATUS_OBJECT_PATH_NOT_FOUND
#define STATUS_INVALID_DEVICE_STATE
#define STATUS_INSUFFICIENT_RESOURCES
#define STATUS_OBJECT_NAME_NOT_FOUND
WDF_LDR_GLOBALS WdfLdrGlobals
#define DPRINT_VERBOSE(_x_)
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING ValueName
_In_ PVOID _Out_opt_ PULONG_PTR _Outptr_opt_ PCUNICODE_STRING * ObjectName
#define ObDereferenceObject