16#define KSE_MAX_SHIMS_PER_DRIVER 10
91 ListEntry = ListEntry->
Flink)
99 return ProviderEntry->
Shim;
122 for (
n = 0;
n < *NumberOfShims;
n++)
124 if (Shims[
n] ==
Shim)
130 DPRINT1(
"KSE: Too many shims, ignoring %wZ\n",
Name);
134 Shims[(*NumberOfShims)++] =
Shim;
147 Current = (
PWCHAR)((
ULONG_PTR)KeyValueInformation + KeyValueInformation->DataOffset);
150 while (Current < End && *Current)
156 ShimName.
Buffer = Current;
171 WCHAR KeyNameBuffer[256];
175 ULONG KeyValueSize = 0x800;
179 RtlInitEmptyUnicodeString(&
KeyName, KeyNameBuffer,
sizeof(KeyNameBuffer));
196 if (!KeyValueInformation)
254 DPRINT(
"KSE: No Shim found for %wZ\n", &LdrEntry->BaseDllName);
258 for (
n = 0;
n < NumberOfShims;
n++)
260 for (HookCollection = Shims[
n]->HookCollectionsArray;
362KseShimDatabaseBootInitialize(
370 DPRINT1(
"KSE: Unable to load the driver database (0x%08lx)\n",
Status);
376KsepMatchInitMachineInfo(
VOID)
416 DPRINT(
"KSE: Not initializing (verifier or safe boot)\n");
420 LoaderExtension = LoaderBlock->Extension;
421 if (!LoaderExtension ||
425 DPRINT(
"KSE: Not initializing (invalid DB)\n");
435 Status = KseShimDatabaseBootInitialize(LoaderExtension);
438 Status = KsepMatchInitMachineInfo();
447 else if (BootPhase == 1)
458 DPRINT1(
"KseInitialize(BootPhase %ld) => %08lx\n", BootPhase,
Status);
491 DPRINT1(
"KSE: Unable to register empty shim or shim without guid\n");
497 DPRINT1(
"KSE: Unable to register shim 0x%08x before engine is initialized\n",
Shim->ShimGuid->Data1);
520 ListEntry = ListEntry->
Flink)
525 DPRINT1(
"KSE: GUID already registered\n");
544 DPRINT1(
"KSE: Registered shim %S\n",
Shim->ShimName);
586 switch (HookCollection->Type)
599 if (!HookCollection->ExportDriverName)
602 *
ModuleName = HookCollection->ExportDriverName;
606 ListEntry = ListEntry->
Flink)
671 PUCHAR DllBase = LdrEntry->DllBase;
685 DPRINT1(
"KSE: Exporting module for collection type %lu not found\n", HookCollection->Type);
701 if (!ImportDescriptor)
704 for (; ImportDescriptor->
Name && ImportDescriptor->
FirstThunk; ImportDescriptor++)
706 if (ImportDescriptor->
Name >= LdrEntry->SizeOfImage ||
716 for (; FirstThunk->
u1.
Function; FirstThunk++, OriginalThunk = OriginalThunk ? OriginalThunk + 1 :
NULL)
722 OriginalThunk->u1.AddressOfData < LdrEntry->SizeOfImage)
759 for (HookCollection =
Shim->HookCollectionsArray;
786 DPRINT(
"KSE: No Shim found for %wZ\n", &LdrEntry->BaseDllName);
790 for (
n = 0;
n < NumberOfShims;
n++)
792 DPRINT1(
"KSE: Applying shim %S (0x%08lx) to %wZ\n",
793 Shims[
n]->ShimName, Shims[
n]->ShimGuid->Data1, &LdrEntry->BaseDllName);
797 if (Shims[
n]->ShimmedDriverTargetedNotification)
803 LdrEntry->SizeOfImage,
ACPI_BUFFER *RetBuffer ACPI_BUFFER *RetBuffer char ACPI_WALK_RESOURCE_CALLBACK void *Context ACPI_BUFFER *RetBuffer UINT16 ACPI_RESOURCE **ResourcePtr ACPI_GENERIC_ADDRESS *Reg UINT32 *ReturnValue UINT8 UINT8 *Slp_TypB ACPI_PHYSICAL_ADDRESS PhysicalAddress64 UINT32 UINT32 *TimeElapsed UINT32 ACPI_STATUS const char UINT32 ACPI_STATUS const char UINT32 const char const char * ModuleName
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
#define STATUS_NOT_SUPPORTED
#define STATUS_OBJECT_TYPE_MISMATCH
_In_ D3DDDI_VIDEO_PRESENT_TARGET_ID _In_ ULONG _In_ ULONG Flags
#define NT_SUCCESS(StatCode)
#define RTL_CONSTANT_STRING(s)
#define RtlImageDirectoryEntryToData
_ACRTIMP int __cdecl strcmp(const char *, const char *)
NTSTATUS NTAPI MmIsVerifierEnabled(OUT PULONG VerifierFlags)
#define InterlockedExchangePointer(Target, Value)
#define InsertTailList(ListHead, Entry)
#define ExAllocatePoolWithTag(hernya, size, tag)
NTSTATUS RtlAppendUnicodeToString(IN PUNICODE_STRING Str1, IN PWSTR Str2)
#define InitializeListHead(ListHead)
_Must_inspect_result_ _In_ PFSRTL_PER_STREAM_CONTEXT Ptr
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
#define EXCEPTION_EXECUTE_HANDLER
NTSTATUS NTAPI IoSetCompletionRoutineEx(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PIO_COMPLETION_ROUTINE CompletionRoutine, IN PVOID Context, IN BOOLEAN InvokeOnSuccess, IN BOOLEAN InvokeOnError, IN BOOLEAN InvokeOnCancel)
NTSTATUS NTAPI KseInitialize(_In_ ULONG BootPhase, _In_ PLOADER_PARAMETER_BLOCK LoaderBlock)
static VOID KsepHookImports(_In_ PLDR_DATA_TABLE_ENTRY LdrEntry, _In_ PKSE_HOOK_COLLECTION HookCollection)
static PKSE_DRIVER_IO_CALLBACKS NTAPI KseGetIoCallbacks(_In_ PDRIVER_OBJECT DriverObject)
static NTSTATUS NTAPI KsepGetShimCallbacksForDriver(_In_ PLDR_DATA_TABLE_ENTRY LdrEntry, _Out_ PKSE_DRIVER_IO_CALLBACKS pIoCallbacks)
struct _KSE_PROVIDER KSE_PROVIDER
PKSE_SHIM NTAPI KsepFindShim(_In_ PCUNICODE_STRING Name)
static KSE_ENGINE KseEngine
static VOID NTAPI KsepMultiSzToShims(_In_ PKEY_VALUE_FULL_INFORMATION KeyValueInformation, _Inout_ PKSE_SHIM *Shims, _Inout_ PULONG NumberOfShims)
struct _KSE_ENGINE * PKSE_ENGINE
VOID NTAPI KsepAddShimByName(_In_ PCUNICODE_STRING Name, _Inout_ PKSE_SHIM *Shims, _Inout_ PULONG NumberOfShims)
static PLDR_DATA_TABLE_ENTRY KsepFindExportingModule(_In_ PKSE_HOOK_COLLECTION HookCollection, _Out_ PCWSTR *ModuleName)
NTSTATUS NTAPI KseDriverLoadImage(_In_ PLDR_DATA_TABLE_ENTRY LdrEntry)
static NTSTATUS NTAPI KsepGetShimsForDriver(_In_ PLDR_DATA_TABLE_ENTRY LdrEntry, _Out_ PKSE_SHIM *Shims, _Out_ PULONG NumberOfShims)
static NTSTATUS NTAPI KsepGetShimsFromRegistry(_In_ PLDR_DATA_TABLE_ENTRY LdrEntry, _Inout_ PKSE_SHIM *Shims, _Inout_ PULONG NumberOfShims)
@ KSE_DISABLE_DEVICE_SHIMS
@ KSE_DISABLE_DRIVER_SHIMS
static VOID KsepApplyShimToDriver(_In_ PKSE_SHIM Shim, _In_ PLDR_DATA_TABLE_ENTRY LdrEntry)
struct _KSE_ENGINE KSE_ENGINE
static BOOLEAN KsepIsImportFromModule(_In_ PCSTR ImportName, _In_ PCWSTR ModuleName)
@ KSE_STATE_UNINITIALIZED
static NTSTATUS NTAPI KseSetCompletionHook(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp, _In_ PIO_COMPLETION_ROUTINE CompletionRoutine, _In_ PVOID Context)
NTSTATUS NTAPI KseRegisterShimEx(_In_ PKSE_SHIM Shim, _In_ PVOID Ignored, _In_ ULONG Flags, _In_opt_ PVOID DriverObject)
enum _KSE_DISABLE_FLAGS KSE_DISABLE_FLAGS
struct _KSE_PROVIDER * PKSE_PROVIDER
NTSTATUS NTAPI KseShimDriverIoCallbacks(_In_ PDRIVER_OBJECT DriverObject)
#define KSE_MAX_SHIMS_PER_DRIVER
static NTSTATUS KsepWriteImportEntry(_In_ PIMAGE_THUNK_DATA Thunk, _In_ PVOID NewFunction)
enum _KSE_ENGINE_STATE KSE_ENGINE_STATE
NTSTATUS NTAPI KseUnregisterShim(_In_ PKSE_SHIM Shim, _In_ PVOID Unknown1, _In_ PVOID Unknown2)
@ KSE_FLAGS_GROUPPOLICY_OK
@ KSE_FLAGS_DEV_SHIMS_ACTIVE
@ KSE_FLAGS_DRV_SHIMS_ACTIVE
enum _KSE_ENGINE_FLAGS KSE_ENGINE_FLAGS
NTSTATUS NTAPI KseRegisterShim(_In_ PKSE_SHIM Shim, _In_ PVOID Ignored, _In_ ULONG Flags)
PVOID NTAPI KsepPoolAllocateNonPaged(_In_ SIZE_T NumberOfBytes)
#define KseCollectionDriverExport
NTSTATUS NTAPI KseIgnoreFreePoolTagInitialize(VOID)
#define KseHookCallbackDriverInit
#define KseCollectionHalExport
VOID NTAPI KseDbGetShimsForDriver(_In_ PLDR_DATA_TABLE_ENTRY LdrEntry, _Inout_ PKSE_SHIM *Shims, _Inout_ PULONG NumberOfShims)
#define KseHookCallbackAddDevice
NTSTATUS NTAPI KseDbInitialize(_In_ PVOID DatabaseImage, _In_ ULONG DatabaseSize)
_In_ PIRP _In_ PIO_COMPLETION_ROUTINE _In_ PVOID Context
#define KseHookCallbackDriverUnload
_In_ PIRP _In_ PIO_COMPLETION_ROUTINE CompletionRoutine
#define KseCollectionInvalid
#define KseHookCallbackDriverStartIo
#define KseCollectionCallback
#define KseHookCallbackMajorFunction
NTSTATUS NTAPI KseDriverScopeInitialize(VOID)
#define KseCollectionNtExport
#define KseHookIRPCallback
VOID NTAPI MmProbeAndLockPages(IN PMDL Mdl, IN KPROCESSOR_MODE AccessMode, IN LOCK_OPERATION Operation)
VOID NTAPI MmUnlockPages(IN PMDL Mdl)
PVOID NTAPI MmMapLockedPagesSpecifyCache(IN PMDL Mdl, IN KPROCESSOR_MODE AccessMode, IN MEMORY_CACHING_TYPE CacheType, IN PVOID BaseAddress, IN ULONG BugCheckOnFailure, IN ULONG Priority)
VOID NTAPI MmUnmapLockedPages(IN PVOID BaseAddress, IN PMDL Mdl)
#define ExFreePoolWithTag(_P, _T)
#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 ZwClose(_In_ HANDLE Handle)
WCHAR NTAPI RtlUpcaseUnicodeChar(_In_ WCHAR Source)
@ KeyValueFullInformation
NTSYSAPI NTSTATUS NTAPI RtlAppendUnicodeStringToString(PUNICODE_STRING Destination, PUNICODE_STRING Source)
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
NTSYSAPI BOOLEAN NTAPI RtlEqualUnicodeString(PUNICODE_STRING String1, PUNICODE_STRING String2, BOOLEAN CaseInSensitive)
#define UNREFERENCED_PARAMETER(P)
_In_ ULONG _In_ ULONG _In_ ULONG Length
#define IMAGE_SNAP_BY_ORDINAL(Ordinal)
PIMAGE_THUNK_DATA32 PIMAGE_THUNK_DATA
#define IoGetDrvObjExtension(DriverObject)
PVOID NTAPI KiPcToFileHeader(IN PVOID Pc, OUT PLDR_DATA_TABLE_ENTRY *LdrEntry, IN BOOLEAN DriversOnly, OUT PBOOLEAN InKernel)
PVOID NTAPI RtlFindExportedRoutineByName(_In_ PVOID ImageBase, _In_ PCSTR ExportName)
Finds the address of a given named exported routine in a loaded image. Note that this function does n...
#define IMAGE_DIRECTORY_ENTRY_IMPORT
struct _IMAGE_IMPORT_BY_NAME * PIMAGE_IMPORT_BY_NAME
LIST_ENTRY PsLoadedModuleList
#define IsEqualGUID(rguid1, rguid2)
#define OBJ_KERNEL_HANDLE
#define OBJ_CASE_INSENSITIVE
#define _SEH2_GetExceptionCode()
#define _SEH2_EXCEPT(...)
union _IMAGE_THUNK_DATA32::@2584 u1
PKSE_GET_IO_CALLBACKS KseGetIoCallbacksRoutine
PKSE_SET_COMPLETION_HOOK KseSetCompletionHookRoutine
PDRIVER_UNLOAD DriverUnload
PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION+1]
PDRIVER_ADD_DEVICE AddDevice
PDRIVER_STARTIO DriverStartIo
PDRIVER_INITIALIZE DriverInit
KSE_DISABLE_FLAGS DisableFlags
KSE_CALLBACK_ROUTINES KseCallbackRoutines
LIST_ENTRY ShimmedDriversListHead
LIST_ENTRY ProvidersListHead
PKSE_HOOK_DRIVER_TARGETED ShimmedDriverTargetedNotification
UNICODE_STRING BaseDllName
struct _LIST_ENTRY * Flink
#define TAG_KSE_CALLBACKS
#define FIELD_OFFSET(t, f)
#define RtlZeroMemory(Destination, Length)
#define CONTAINING_RECORD(address, type, field)
#define STATUS_INVALID_PARAMETER
#define STATUS_UNSUCCESSFUL
#define STATUS_OBJECT_NAME_COLLISION
#define STATUS_INSUFFICIENT_RESOURCES
_In_ PDEVICE_OBJECT DeviceObject
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
_Must_inspect_result_ _In_ WDFDEVICE _In_ PCUNICODE_STRING KeyName
_In_ WDFDEVICE _In_ PVOID _In_opt_ PMDL Mdl
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING ValueName
IO_COMPLETION_ROUTINE * PIO_COMPLETION_ROUTINE
_Must_inspect_result_ typedef _In_ PHYSICAL_ADDRESS _Inout_ PLARGE_INTEGER NumberOfBytes
#define IRP_MJ_MAXIMUM_FUNCTION
#define ObReferenceObject