15DEFINE_GUID(GUID_WDF_LOADER_INTERFACE_DIAGNOSTIC, 0x55905BA4, 0x1DD2, 0x45D3, 0xAB, 0xEA, 0xF7, 0xA8, 0x70, 0x11, 0xD6, 0x9F);
16DEFINE_GUID(GUID_WDF_LOADER_INTERFACE_CLASS_BIND, 0xFA4838CB, 0x1D08, 0x41E1, 0x8B, 0xA8, 0x71, 0x9C, 0xF8, 0x44, 0xEA, 0x74);
63 __DBGPRINT((
"ERROR: Invalid Input Parameter\n"));
161 DPRINT((
"Initialized WdfLdr - OS Version %d.%d.%d\n",
175 DPRINT((
"WDF Loader initialization completed successfully\n"));
227 if (LoaderInterface ==
NULL)
233 if (LoaderInterface->InterfaceType ==
NULL)
239 if (
IsEqualGUID(LoaderInterface->InterfaceType, &GUID_WDF_LOADER_INTERFACE_STANDARD))
243 DPRINT_ERROR((
"Interface size too small: %u, expected: %u\n",
258 else if (
IsEqualGUID(LoaderInterface->InterfaceType, &GUID_WDF_LOADER_INTERFACE_DIAGNOSTIC))
262 DPRINT_ERROR((
"Diagnostic interface size too small: %u, expected: %u\n",
275 else if (
IsEqualGUID(LoaderInterface->InterfaceType, &GUID_WDF_LOADER_INTERFACE_CLASS_BIND))
279 DPRINT_ERROR((
"Class bind interface size too small: %u, expected: %u\n",
324 if (pLibModule !=
NULL)
332 pLibModule->
Version = LibraryInfo->Version;
340 __DBGPRINT((
"ERROR: GetImageInfo(%wZ) failed with status 0x%x\n",
359 __DBGPRINT((
"WdfRegisterLibrary: LibraryCreate(%wZ) failed, status %X\n",
371 __DBGPRINT((
"ERROR: LibraryOpen(%wZ) failed with status %x\n", LibraryDeviceName,
status));
379 __DBGPRINT((
"ERROR: WdfRegisterLibrary: LibraryCommission failed status 0x%X\n",
status));
431 DPRINT_ERROR((
"Invalid parameters: ComponentGlobals=%p, BindInfo=%p\n",
437 *ComponentGlobals =
NULL;
467 DPRINT_ERROR((
"Library not properly initialized - LibraryInfo is NULL\n"));
474 DPRINT_ERROR((
"Library missing LibraryRegisterClient function pointer\n"));
479 DPRINT_VERBOSE((
"Calling LibraryRegisterClient at %p for library %wZ\n",
485 clientModule->
Globals = *ComponentGlobals;
488 DPRINT((
"Successfully bound client %wZ to library %wZ\n",
499 if (libraryServicePath.
Buffer)
548 DPRINT_ERROR((
"LibraryUnregisterClient failed with status 0x%x\n", unregisterStatus));
585 if (!
Info || !Module)
603 Info->Module = *Module;
604 DPRINT_VERBOSE((
"Referenced version for library %wZ\n", &libraryServicePath));
612 if (libraryServicePath.
Buffer)
646 pLibModule =
Info->Module;
655 DPRINT_ERROR((
"LibraryUnregisterClient failed with status 0x%x\n", unregisterStatus));
726 DPRINT_VERBOSE((
"No library found for class module %wZ, status 0x%x\n",
738 DPRINT((
"Using default WDF library %wZ for class module %wZ\n",
762 __DBGPRINT((
"Class Library (%p)\n", pClassModule));
776 status = fnClassLibInit();
779 __DBGPRINT((
"ERROR: WdfRegisterClassLibrary: ClassLibraryInitialize failed, status 0x%x\n",
status));
806 if (pClassClientModule ==
NULL)
808 DPRINT_ERROR((
"Could not create class client struct\n"));
827 pClassClientModule =
NULL;
838 if (pClassModule !=
NULL)
840 if (pClassClientModule !=
NULL)
#define InterlockedIncrement
NTSTATUS NTAPI AuxKlibInitialize(VOID)
CLIPBOARD_GLOBALS Globals
#define NT_SUCCESS(StatCode)
NTSTATUS NTAPI RtlGetVersion(IN OUT PRTL_OSVERSIONINFOW lpVersionInformation)
static const WCHAR Cleanup[]
DRIVER_INITIALIZE DriverEntry
#define IsListEmpty(ListHead)
NTSTATUS ExInitializeResourceLite(PULONG res)
#define KeGetCurrentIrql()
#define ExDeleteResourceLite(res)
#define RemoveHeadList(ListHead)
#define InitializeListHead(ListHead)
struct _CLIENT_INFO CLIENT_INFO
struct _WDF_LOADER_INTERFACE * PWDF_LOADER_INTERFACE
#define OBJ_KERNEL_HANDLE
#define OBJ_CASE_INSENSITIVE
static DRIVER_DISPATCH ClassClose
static DRIVER_DISPATCH ClassCreate
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.
NTSTATUS LibraryFindOrLoad(_In_ PCUNICODE_STRING ServicePath, _Out_ PLIBRARY_MODULE *LibModule)
VOID LibraryDereference(_In_ PLIBRARY_MODULE LibModule)
_In_ PCUNICODE_STRING ServicePath
VOID LibraryClose(_Inout_ PLIBRARY_MODULE LibModule)
Dereferences KMDF library's device object.
VOID NTAPI LibraryReleaseReference(_In_ PLIBRARY_MODULE LibModule)
Release a reference to a library module.
BOOLEAN LibraryUnlinkClient(_In_ PLIBRARY_MODULE LibModule, _In_ PWDF_BIND_INFO BindInfo)
VOID LibraryReference(_In_ PLIBRARY_MODULE LibModule)
VOID LibraryFree(_In_ PLIBRARY_MODULE LibModule)
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.
#define ExFreePoolWithTag(_P, _T)
#define InitializeObjectAttributes(p, n, a, r, s)
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
_Out_ _Inout_ POEM_STRING _In_ PCUNICODE_STRING SourceString
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
#define UNREFERENCED_PARAMETER(P)
#define STATUS_NOINTERFACE
#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8)
#define IsEqualGUID(rguid1, rguid2)
VOID ClassRemoveFromLibraryList(_In_ PCLASS_MODULE ClassModule)
PCLASS_MODULE FindClassByServiceNameLocked(_In_ PUNICODE_STRING ServicePath, _Out_ PLIBRARY_MODULE *LibModule)
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 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 GetVersionServicePath(_In_ PWDF_BIND_INFO BindInfo, _Out_ PUNICODE_STRING ServicePath)
Get service path from bind info and registry.
NTSTATUS FxLdrQueryUlong(_In_ HANDLE KeyHandle, _In_ PUNICODE_STRING ValueName, _Out_ PULONG Value)
PWDF_CLASS_LIBRARY_INFO ClassLibraryInfo
PUNICODE_STRING RegistryPath
UNICODE_STRING ServicePath
PWDF_LIBRARY_INFO LibraryInfo
struct _LIST_ENTRY * Flink
PFN_CLASS_LIBRARY_INIT ClassLibraryInitialize
PFN_CLASS_LIBRARY_BIND_CLIENT ClassLibraryBindClient
ERESOURCE LoadedModulesListLock
LIST_ENTRY LoadedModulesList
OSVERSIONINFOEXW OsVersion
PFNLIBRARYCOMMISSION LibraryCommission
PFNLIBRARYREGISTERCLIENT LibraryRegisterClient
PFNLIBRARYUNREGISTERCLIENT LibraryUnregisterClient
PWDF_CLASS_BIND ClassBind
PWDF_CLASS_UNBIND ClassUnbind
PWDF_LDR_DIAGNOSTICS_VALUE_BY_NAME_AS_ULONG DiagnosticsValueByNameAsULONG
PWDF_REGISTER_LIBRARY RegisterLibrary
PWDF_VERSION_UNBIND VersionUnbind
PWDF_LDR_DIAGNOSTICS_VALUE_BY_NAME_AS_ULONG DiagnosticsValueByNameAsULONG
PWDF_VERSION_BIND VersionBind
#define RTL_CONSTANT_STRING(s)
#define RtlZeroMemory(Destination, Length)
#define CONTAINING_RECORD(address, type, field)
#define STATUS_INVALID_PARAMETER
#define STATUS_INVALID_DEVICE_STATE
#define STATUS_INSUFFICIENT_RESOURCES
_Must_inspect_result_ _In_ WDFCHILDLIST _In_ PWDF_CHILD_LIST_ITERATOR _Out_ WDFDEVICE _Inout_opt_ PWDF_CHILD_RETRIEVE_INFO Info
_Must_inspect_result_ _In_ PDRIVER_OBJECT _In_ PCUNICODE_STRING RegistryPath
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
NTSTATUS NTAPI DereferenceVersion(_In_ PWDF_BIND_INFO Info, _In_opt_ PWDF_COMPONENT_GLOBALS Globals)
Dereference a WDF library version.
NTSTATUS NTAPI WdfVersionBind(_In_ PDRIVER_OBJECT DriverObject, _In_ PUNICODE_STRING ServicePath, _Inout_ PWDF_BIND_INFO BindInfo, _Out_ PWDF_COMPONENT_GLOBALS *ComponentGlobals)
Bind client driver with framework.
NTSTATUS NTAPI WdfRegisterClassLibrary(_In_ PWDF_CLASS_LIBRARY_INFO ClassLibInfo, _In_ PUNICODE_STRING SourceString, _In_ PUNICODE_STRING ObjectName)
Register class extension library (e.g., UCX)
VOID NTAPI WdfVersionUnbindClass(_In_ PWDF_BIND_INFO BindInfo, _In_ PWDF_COMPONENT_GLOBALS Globals, _In_ PWDF_CLASS_BIND_INFO ClassBindInfo)
NTSTATUS NTAPI DllInitialize(_In_ PUNICODE_STRING RegistryPath)
NTSTATUS NTAPI WdfRegisterLibrary(_In_ PWDF_LIBRARY_INFO LibraryInfo, _In_ PUNICODE_STRING ServicePath, _In_ PCUNICODE_STRING LibraryDeviceName)
Register wdf01000 library.
NTSTATUS NTAPI WdfVersionBindClass(_In_ PWDF_BIND_INFO BindInfo, _Inout_ PWDF_COMPONENT_GLOBALS *ClientGlobals, _In_ PWDF_CLASS_BIND_INFO ClassBindInfo)
NTSTATUS NTAPI WdfVersionUnbind(_In_ PUNICODE_STRING RegistryPath, _In_ PWDF_BIND_INFO BindInfo, _In_ PWDF_COMPONENT_GLOBALS ComponentGlobals)
Unbind client driver from framework.
NTSTATUS NTAPI WdfLdrQueryInterface(_In_ PWDF_INTERFACE_HEADER LoaderInterface)
BOOLEAN gAlreadyInitialized
NTSTATUS NTAPI WdfLdrDiagnosticsValueByNameAsULONG(_In_ PUNICODE_STRING ValueName, _Out_ PULONG Value)
Retrieves an ULONG value from KMDF diagnostics registry key.
VOID NTAPI WdfLdrUnload(_In_ PDRIVER_OBJECT DriverObject)
WDF_LDR_GLOBALS WdfLdrGlobals
NTSTATUS NTAPI ReferenceVersion(_In_ PWDF_BIND_INFO Info, _Out_ PLIBRARY_MODULE *Module)
Reference a WDF library version.
NTSTATUS(NTAPI * PFN_CLASS_LIBRARY_INIT)(VOID)
#define DIAGFLAG_LOG_WARNINGS
struct _WDF_LOADER_INTERFACE_CLASS_BIND * PWDF_LOADER_INTERFACE_CLASS_BIND
#define DIAGFLAG_TRACE_FUNCTION_ENTRY
#define DIAGFLAG_TRACE_FUNCTION_EXIT
NTSTATUS LibraryCreate(_In_opt_ PWDF_LIBRARY_INFO LibraryInfo, _In_ PCUNICODE_STRING ServicePath, _Out_ PLIBRARY_MODULE *OutLibraryModule)
#define DIAGFLAG_VERBOSE_LOGGING
PLIBRARY_MODULE FindLibraryByServicePathLocked(_In_ PCUNICODE_STRING ServicePath)
struct _WDF_LOADER_INTERFACE_DIAGNOSTIC * PWDF_LOADER_INTERFACE_DIAGNOSTIC
#define DPRINT_TRACE_ENTRY()
#define DIAGFLAG_LOG_ERRORS
#define DPRINT_TRACE_EXIT()
#define DPRINT_ERROR(_x_)
NTSTATUS NTAPI FindModuleByClientService(_In_ PUNICODE_STRING RegistryPath, _Out_ PLIBRARY_MODULE *Library)
#define DPRINT_VERBOSE(_x_)
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING ValueName
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
_In_ PVOID _Out_opt_ PULONG_PTR _Outptr_opt_ PCUNICODE_STRING * ObjectName