ReactOS 0.4.17-dev-1164-g974a446
kse.h File Reference

Go to the source code of this file.

Classes

struct  _KSE_HOOK
 
struct  _KSE_HOOK_COLLECTION
 
struct  _KSE_DRIVER_IO_CALLBACKS
 
struct  _KSE_CALLBACK_ROUTINES
 
struct  _KSE_SHIM
 

Macros

#define KseHookFunction   0
 
#define KseHookIRPCallback   1
 
#define KseHookInvalid   2
 
#define KseHookCallbackDriverInit   1
 
#define KseHookCallbackDriverStartIo   2
 
#define KseHookCallbackDriverUnload   3
 
#define KseHookCallbackAddDevice   4
 
#define KseHookCallbackMajorFunction   100
 
#define KseCollectionNtExport   0
 
#define KseCollectionHalExport   1
 
#define KseCollectionDriverExport   2
 
#define KseCollectionCallback   3
 
#define KseCollectionInvalid   4
 

Typedefs

typedef struct _KSE_HOOK KSE_HOOK
 
typedef struct _KSE_HOOK * PKSE_HOOK
 
typedef struct _KSE_HOOK_COLLECTION KSE_HOOK_COLLECTION
 
typedef struct _KSE_HOOK_COLLECTION * PKSE_HOOK_COLLECTION
 
typedef VOID(NTAPI * PKSE_HOOK_DRIVER_TARGETED) (_In_ PUNICODE_STRING BaseName, _In_ PVOID BaseAddress, _In_ ULONG SizeOfImage, _In_ ULONG TimeDateStamp, _In_ ULONG CheckSum)
 
typedef VOID(NTAPI * PKSE_HOOK_DRIVER_UNTARGETED) (_In_ PVOID BaseAddress)
 
typedef struct _KSE_DRIVER_IO_CALLBACKS KSE_DRIVER_IO_CALLBACKS
 
typedef struct _KSE_DRIVER_IO_CALLBACKS * PKSE_DRIVER_IO_CALLBACKS
 
typedef KSE_GET_IO_CALLBACKS * PKSE_GET_IO_CALLBACKS
 
typedef _In_ PIRP Irp
 
typedef _In_ PIRP _In_ PIO_COMPLETION_ROUTINE CompletionRoutine = CompletionRoutine
 
typedef _In_ PIRP _In_ PIO_COMPLETION_ROUTINE _In_ PVOID Context
 
typedef KSE_SET_COMPLETION_HOOK * PKSE_SET_COMPLETION_HOOK
 
typedef struct _KSE_CALLBACK_ROUTINES KSE_CALLBACK_ROUTINES
 
typedef struct _KSE_CALLBACK_ROUTINES * PKSE_CALLBACK_ROUTINES
 
typedef struct _KSE_SHIM * PKSE_SHIM
 
typedef struct _KSE_SHIM KSE_SHIM
 

Functions

typedef PKSE_DRIVER_IO_CALLBACKS (NTAPI KSE_GET_IO_CALLBACKS)(_In_ PDRIVER_OBJECT DriverObject)
 
typedef NTSTATUS (NTAPI KSE_SET_COMPLETION_HOOK)(_In_ PDEVICE_OBJECT DeviceObject
 
NTSTATUS NTAPI KseRegisterShim (_In_ PKSE_SHIM Shim, _In_ PVOID Ignored, _In_ ULONG Flags)
 
NTSTATUS NTAPI KseRegisterShimEx (_In_ PKSE_SHIM Shim, _In_ PVOID Ignored, _In_ ULONG Flags, _In_opt_ PVOID DriverObject)
 
NTSTATUS NTAPI KseUnregisterShim (_In_ PKSE_SHIM Shim, _In_ PVOID Unknown1, _In_ PVOID Unknown2)
 
NTSTATUS NTAPI KseInitialize (_In_ ULONG BootPhase, _In_ PLOADER_PARAMETER_BLOCK LoaderBlock)
 
NTSTATUS NTAPI KseShimDriverIoCallbacks (_In_ PDRIVER_OBJECT DriverObject)
 
NTSTATUS NTAPI KseDriverLoadImage (_In_ PLDR_DATA_TABLE_ENTRY LdrEntry)
 
PKSE_SHIM NTAPI KsepFindShim (_In_ PCUNICODE_STRING Name)
 
VOID NTAPI KsepAddShimByName (_In_ PCUNICODE_STRING Name, _Inout_ PKSE_SHIM *Shims, _Inout_ PULONG NumberOfShims)
 
NTSTATUS NTAPI KseDbInitialize (_In_ PVOID DatabaseImage, _In_ ULONG DatabaseSize)
 
VOID NTAPI KseDbGetShimsForDriver (_In_ PLDR_DATA_TABLE_ENTRY LdrEntry, _Inout_ PKSE_SHIM *Shims, _Inout_ PULONG NumberOfShims)
 
NTSTATUS NTAPI KseDriverScopeInitialize (VOID)
 
NTSTATUS NTAPI KseIgnoreFreePoolTagInitialize (VOID)
 

Macro Definition Documentation

◆ KseCollectionCallback

#define KseCollectionCallback   3

Definition at line 37 of file kse.h.

◆ KseCollectionDriverExport

#define KseCollectionDriverExport   2

Definition at line 36 of file kse.h.

◆ KseCollectionHalExport

#define KseCollectionHalExport   1

Definition at line 35 of file kse.h.

◆ KseCollectionInvalid

#define KseCollectionInvalid   4

Definition at line 38 of file kse.h.

◆ KseCollectionNtExport

#define KseCollectionNtExport   0

Definition at line 34 of file kse.h.

◆ KseHookCallbackAddDevice

#define KseHookCallbackAddDevice   4

Definition at line 18 of file kse.h.

◆ KseHookCallbackDriverInit

#define KseHookCallbackDriverInit   1

Definition at line 15 of file kse.h.

◆ KseHookCallbackDriverStartIo

#define KseHookCallbackDriverStartIo   2

Definition at line 16 of file kse.h.

◆ KseHookCallbackDriverUnload

#define KseHookCallbackDriverUnload   3

Definition at line 17 of file kse.h.

◆ KseHookCallbackMajorFunction

#define KseHookCallbackMajorFunction   100

Definition at line 19 of file kse.h.

◆ KseHookFunction

#define KseHookFunction   0

Definition at line 11 of file kse.h.

◆ KseHookInvalid

#define KseHookInvalid   2

Definition at line 13 of file kse.h.

◆ KseHookIRPCallback

#define KseHookIRPCallback   1

Definition at line 12 of file kse.h.

Typedef Documentation

◆ CompletionRoutine

Definition at line 80 of file kse.h.

◆ Context

Initial value:
{
Globals WdfDriverGlobals
Definition: classlib.cpp:132
_In_ PIRP _In_ PIO_COMPLETION_ROUTINE _In_ PVOID Context
Definition: kse.h:81
#define WdfFunctions
Definition: wdf.h:66
_Must_inspect_result_ _In_ WDFDMAENABLER _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFDMATRANSACTION * DmaTransaction
@ WdfDmaTransactionExecuteTableIndex
Definition: wdffuncenum.h:126

Definition at line 81 of file kse.h.

◆ Irp

Initial value:
{
return ((PFN_WDFDEVICEWDMDISPATCHPREPROCESSEDIRP) WdfFunctions[WdfDeviceWdmDispatchPreprocessedIrpTableIndex])(WdfDriverGlobals, Device, Irp)
_Must_inspect_result_ _In_ PUCXHUB_DEVICE_CREATE_INFO _Out_ UCXUSBDEVICE * Device
Definition: hubucx.h:258
_In_ PIRP Irp
Definition: kse.h:79
@ WdfDeviceWdmDispatchPreprocessedIrpTableIndex
Definition: wdffuncenum.h:59

Definition at line 79 of file kse.h.

◆ KSE_CALLBACK_ROUTINES

◆ KSE_DRIVER_IO_CALLBACKS

◆ KSE_HOOK

◆ KSE_HOOK_COLLECTION

◆ KSE_SHIM

◆ PKSE_CALLBACK_ROUTINES

◆ PKSE_DRIVER_IO_CALLBACKS

◆ PKSE_GET_IO_CALLBACKS

typedef KSE_GET_IO_CALLBACKS* PKSE_GET_IO_CALLBACKS

Definition at line 74 of file kse.h.

◆ PKSE_HOOK

◆ PKSE_HOOK_COLLECTION

◆ PKSE_HOOK_DRIVER_TARGETED

typedef VOID(NTAPI * PKSE_HOOK_DRIVER_TARGETED) (_In_ PUNICODE_STRING BaseName, _In_ PVOID BaseAddress, _In_ ULONG SizeOfImage, _In_ ULONG TimeDateStamp, _In_ ULONG CheckSum)

Definition at line 48 of file kse.h.

◆ PKSE_HOOK_DRIVER_UNTARGETED

typedef VOID(NTAPI * PKSE_HOOK_DRIVER_UNTARGETED) (_In_ PVOID BaseAddress)

Definition at line 56 of file kse.h.

◆ PKSE_SET_COMPLETION_HOOK

typedef KSE_SET_COMPLETION_HOOK* PKSE_SET_COMPLETION_HOOK

Definition at line 82 of file kse.h.

◆ PKSE_SHIM

Function Documentation

◆ KseDbGetShimsForDriver()

VOID NTAPI KseDbGetShimsForDriver ( _In_ PLDR_DATA_TABLE_ENTRY  LdrEntry,
_Inout_ PKSE_SHIM *  Shims,
_Inout_ PULONG  NumberOfShims 
)

Definition at line 199 of file ksedb.c.

203{
205 UNICODE_STRING ShimName;
206 PWSTR Name;
207 BOOLEAN Match;
208
210 return;
211
215 {
216 if (!KsepDbStringEquals(Driver, TAG_NAME, &LdrEntry->BaseDllName))
217 continue;
218
219 Match = TRUE;
221 MatchingFile != TAGID_NULL && Match;
223 {
224 Match = KsepDbMatchingFileMatches(MatchingFile, LdrEntry);
225 }
226
227 if (!Match)
228 {
229 DPRINT1("KSE: %wZ is in the driver database, but does not match\n", &LdrEntry->BaseDllName);
230 continue;
231 }
232
236 {
238 if (!Name)
239 continue;
240
241 RtlInitUnicodeString(&ShimName, Name);
242 KsepAddShimByName(&ShimName, Shims, NumberOfShims);
243 }
244 }
245}
unsigned char BOOLEAN
Definition: actypes.h:127
DWORD TAGID
#define DPRINT1
Definition: precomp.h:8
#define TAGID_NULL
Definition: db.cpp:38
#define TAG_MATCHING_FILE
Definition: db.cpp:88
LPWSTR Name
Definition: desk.c:124
#define TRUE
Definition: types.h:120
VOID NTAPI KsepAddShimByName(_In_ PCUNICODE_STRING Name, _Inout_ PKSE_SHIM *Shims, _Inout_ PULONG NumberOfShims)
Definition: kse.c:107
static BOOLEAN KsepDbStringEquals(_In_ TAGID Parent, _In_ TAG Tag, _In_ PCUNICODE_STRING String)
Definition: ksedb.c:129
TAGID WINAPI SdbFindFirstTag(PDB pdb, TAGID parent, TAG tag)
Definition: sdbread.c:208
static DB KseDriverDatabase
Definition: ksedb.c:39
static TAGID KseDatabaseRoot
Definition: ksedb.c:40
static BOOLEAN KsepDbMatchingFileMatches(_In_ TAGID MatchingFile, _In_ PLDR_DATA_TABLE_ENTRY LdrEntry)
Definition: ksedb.c:147
TAGID WINAPI SdbFindNextTag(PDB pdb, TAGID parent, TAGID prev_child)
Definition: sdbread.c:231
LPWSTR WINAPI SdbGetStringTagPtr(PDB pdb, TAGID tagid)
Definition: sdbread.c:375
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define TAG_KSHIM_REF
Definition: sdbtagid.h:192
#define TAG_KDRIVER
Definition: sdbtagid.h:190
uint16_t * PWSTR
Definition: typedefs.h:56
#define TAG_NAME
Definition: vfat.h:553
_Must_inspect_result_ _In_ WDFDRIVER Driver
Definition: wdfcontrol.h:83

Referenced by KsepGetShimsForDriver().

◆ KseDbInitialize()

NTSTATUS NTAPI KseDbInitialize ( _In_ PVOID  DatabaseImage,
_In_ ULONG  DatabaseSize 
)

Definition at line 92 of file ksedb.c.

95{
96 PULONG Header = DatabaseImage;
98
99 if (!DatabaseImage || DatabaseSize <= SDB_HEADER_SIZE || Header[2] != SDB_HEADER_MAGIC)
101
102 /* The loader block is freed after boot, so keep a copy */
104 if (!Data)
106 RtlCopyMemory(Data, DatabaseImage, DatabaseSize);
107
110 KseDriverDatabase.size = DatabaseSize;
114
117 {
121 }
122
123 DPRINT1("KSE: Loaded driver database version %lu.%lu (%lu bytes)\n",
125 return STATUS_SUCCESS;
126}
Definition: Header.h:9
#define TAG_STRINGTABLE
Definition: db.cpp:94
#define TAGID_ROOT
Definition: db.cpp:39
#define TAG_DATABASE
Definition: db.cpp:85
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define PagedPool
Definition: env_spec_w32.h:308
#define SDB_HEADER_MAGIC
Definition: ksedb.c:37
#define SDB_HEADER_SIZE
Definition: ksedb.c:36
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
#define STATUS_INVALID_IMAGE_FORMAT
Definition: ntstatus.h:453
#define STATUS_SUCCESS
Definition: shellext.h:65
DWORD major
Definition: sdbtypes.h:30
BYTE * data
Definition: sdbtypes.h:27
TAGID stringtable
Definition: sdbtypes.h:28
DWORD minor
Definition: sdbtypes.h:31
DWORD size
Definition: sdbtypes.h:26
#define TAG_KSE_DATABASE
Definition: tag.h:130
uint32_t * PULONG
Definition: typedefs.h:59
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
unsigned char * PUCHAR
Definition: typedefs.h:53
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158

Referenced by CODE_SEG().

◆ KseDriverLoadImage()

NTSTATUS NTAPI KseDriverLoadImage ( _In_ PLDR_DATA_TABLE_ENTRY  LdrEntry)

Definition at line 773 of file kse.c.

775{
777 ULONG NumberOfShims, n;
779
781 return STATUS_SUCCESS;
782
783 Status = KsepGetShimsForDriver(LdrEntry, Shims, &NumberOfShims);
784 if (!NT_SUCCESS(Status))
785 {
786 DPRINT("KSE: No Shim found for %wZ\n", &LdrEntry->BaseDllName);
787 return STATUS_SUCCESS;
788 }
789
790 for (n = 0; n < NumberOfShims; n++)
791 {
792 DPRINT1("KSE: Applying shim %S (0x%08lx) to %wZ\n",
793 Shims[n]->ShimName, Shims[n]->ShimGuid->Data1, &LdrEntry->BaseDllName);
794
795 KsepApplyShimToDriver(Shims[n], LdrEntry);
796
797 if (Shims[n]->ShimmedDriverTargetedNotification)
798 {
799 PIMAGE_NT_HEADERS NtHeaders = RtlImageNtHeader(LdrEntry->DllBase);
800
801 Shims[n]->ShimmedDriverTargetedNotification(&LdrEntry->BaseDllName,
802 LdrEntry->DllBase,
803 LdrEntry->SizeOfImage,
804 NtHeaders ? NtHeaders->FileHeader.TimeDateStamp : 0,
805 LdrEntry->CheckSum);
806 }
807 }
808
809 return STATUS_SUCCESS;
810}
LONG NTSTATUS
Definition: precomp.h:26
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define RtlImageNtHeader
Definition: compat.h:806
Status
Definition: gdiplustypes.h:24
GLdouble n
Definition: glext.h:7729
static KSE_ENGINE KseEngine
Definition: kse.c:66
static NTSTATUS NTAPI KsepGetShimsForDriver(_In_ PLDR_DATA_TABLE_ENTRY LdrEntry, _Out_ PKSE_SHIM *Shims, _Out_ PULONG NumberOfShims)
Definition: kse.c:223
static VOID KsepApplyShimToDriver(_In_ PKSE_SHIM Shim, _In_ PLDR_DATA_TABLE_ENTRY LdrEntry)
Definition: kse.c:753
@ KSE_STATE_INITIALIZED
Definition: kse.c:38
#define KSE_MAX_SHIMS_PER_DRIVER
Definition: kse.c:16
#define DPRINT
Definition: sndvol32.h:73
IMAGE_FILE_HEADER FileHeader
Definition: ntddk_ex.h:183
KSE_ENGINE_STATE State
Definition: kse.c:56
Definition: kse.h:92
PKSE_HOOK_DRIVER_TARGETED ShimmedDriverTargetedNotification
Definition: kse.h:97
uint32_t ULONG
Definition: typedefs.h:59

Referenced by IopInitializeBuiltinDriver(), and MmLoadSystemImage().

◆ KseDriverScopeInitialize()

NTSTATUS NTAPI KseDriverScopeInitialize ( VOID  )

Definition at line 353 of file driverscope.c.

354{
356
358 if (NT_SUCCESS(Status))
359 DPRINT("KSE: driver scope shim registered.\n");
360
361 return Status;
362}
#define NULL
Definition: types.h:112
KSE_SHIM KmDsShim
Definition: driverscope.c:348
NTSTATUS NTAPI KseRegisterShim(_In_ PKSE_SHIM Shim, _In_ PVOID Ignored, _In_ ULONG Flags)
Definition: kse.c:464

Referenced by KseInitialize().

◆ KseIgnoreFreePoolTagInitialize()

NTSTATUS NTAPI KseIgnoreFreePoolTagInitialize ( VOID  )

Definition at line 59 of file ignorepooltag.c.

60{
62
64 if (!NT_SUCCESS(Status))
65 DPRINT1("KSE: Unable to register IgnoreFreePoolTag shim (0x%lx)\n", Status);
66
67 return Status;
68}
KSE_SHIM KseIgnoreFreePoolTagShim
Definition: ignorepooltag.c:54

Referenced by KseInitialize().

◆ KseInitialize()

NTSTATUS NTAPI KseInitialize ( _In_ ULONG  BootPhase,
_In_ PLOADER_PARAMETER_BLOCK  LoaderBlock 
)

Definition at line 403 of file kse.c.

406{
407 PLOADER_PARAMETER_EXTENSION LoaderExtension;
409 ULONG Flags;
410
411 if (BootPhase == 0)
412 {
413 if (InitSafeBootMode != 0 || /* Safe Boot enabled */
414 NT_SUCCESS(MmIsVerifierEnabled(&Flags))) /* Driver Verifier enabled */
415 {
416 DPRINT("KSE: Not initializing (verifier or safe boot)\n");
417 return STATUS_SUCCESS;
418 }
419
420 LoaderExtension = LoaderBlock->Extension;
421 if (!LoaderExtension || /* No loader extension */
422 LoaderExtension->Size < FIELD_OFFSET(LOADER_PARAMETER_EXTENSION, NetworkLoaderBlock) || /* Too small loader extension */
423 !LoaderExtension->DrvDBImage) /* No driver database */
424 {
425 DPRINT("KSE: Not initializing (invalid DB)\n");
426 return STATUS_SUCCESS;
427 }
428
429 /* Temp mark us as initialized, so providers can be registered */
435 Status = KseShimDatabaseBootInitialize(LoaderExtension);
436 if (NT_SUCCESS(Status))
437 {
438 Status = KsepMatchInitMachineInfo();
439 if (NT_SUCCESS(Status))
440 {
442 }
443 }
444 /* We are not done yet! */
446 }
447 else if (BootPhase == 1)
448 {
449 /* Phase 0 bailed out */
451 return STATUS_SUCCESS;
452
453 /* Done initializing, so register the remainder of the shims */
456 }
457
458 DPRINT1("KseInitialize(BootPhase %ld) => %08lx\n", BootPhase, Status);
459 return Status;
460}
_In_ D3DDDI_VIDEO_PRESENT_TARGET_ID _In_ ULONG _In_ ULONG Flags
Definition: dispmprt.h:245
PULONG InitSafeBootMode
Definition: init.c:75
NTSTATUS NTAPI MmIsVerifierEnabled(OUT PULONG VerifierFlags)
Definition: drvmgmt.c:233
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
static PKSE_DRIVER_IO_CALLBACKS NTAPI KseGetIoCallbacks(_In_ PDRIVER_OBJECT DriverObject)
Definition: kse.c:384
@ KSE_STATE_INITIALIZING
Definition: kse.c:37
static NTSTATUS NTAPI KseSetCompletionHook(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp, _In_ PIO_COMPLETION_ROUTINE CompletionRoutine, _In_ PVOID Context)
Definition: kse.c:391
NTSTATUS NTAPI KseIgnoreFreePoolTagInitialize(VOID)
Definition: ignorepooltag.c:59
NTSTATUS NTAPI KseDriverScopeInitialize(VOID)
Definition: driverscope.c:353
PKSE_GET_IO_CALLBACKS KseGetIoCallbacksRoutine
Definition: kse.h:87
PKSE_SET_COMPLETION_HOOK KseSetCompletionHookRoutine
Definition: kse.h:88
KSE_CALLBACK_ROUTINES KseCallbackRoutines
Definition: kse.c:60
LIST_ENTRY ShimmedDriversListHead
Definition: kse.c:59
LIST_ENTRY ProvidersListHead
Definition: kse.c:58
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255

Referenced by IoInitSystem().

◆ KsepAddShimByName()

VOID NTAPI KsepAddShimByName ( _In_ PCUNICODE_STRING  Name,
_Inout_ PKSE_SHIM *  Shims,
_Inout_ PULONG  NumberOfShims 
)

Definition at line 107 of file kse.c.

111{
113 ULONG n;
114
116 if (!Shim)
117 {
118 DPRINT1("KSE: Shim %wZ not found\n", Name);
119 return;
120 }
121
122 for (n = 0; n < *NumberOfShims; n++)
123 {
124 if (Shims[n] == Shim)
125 return;
126 }
127
128 if (*NumberOfShims >= KSE_MAX_SHIMS_PER_DRIVER)
129 {
130 DPRINT1("KSE: Too many shims, ignoring %wZ\n", Name);
131 return;
132 }
133
134 Shims[(*NumberOfShims)++] = Shim;
135}
PKSE_SHIM NTAPI KsepFindShim(_In_ PCUNICODE_STRING Name)
Definition: kse.c:82
Definition: xml2sdb.h:89

Referenced by KseDbGetShimsForDriver(), and KsepMultiSzToShims().

◆ KsepFindShim()

PKSE_SHIM NTAPI KsepFindShim ( _In_ PCUNICODE_STRING  Name)

Definition at line 82 of file kse.c.

84{
85 PKSE_PROVIDER ProviderEntry;
86 PLIST_ENTRY ListEntry;
87 UNICODE_STRING ShimName;
88
89 for (ListEntry = KseEngine.ProvidersListHead.Flink;
90 ListEntry != &KseEngine.ProvidersListHead;
91 ListEntry = ListEntry->Flink)
92 {
93 ProviderEntry = CONTAINING_RECORD(ListEntry, KSE_PROVIDER, ProviderList);
94 if (!ProviderEntry->Shim->ShimName)
95 continue;
96
97 RtlInitUnicodeString(&ShimName, ProviderEntry->Shim->ShimName);
98 if (RtlEqualUnicodeString(&ShimName, Name, TRUE))
99 return ProviderEntry->Shim;
100 }
101
102 return NULL;
103}
NTSYSAPI BOOLEAN NTAPI RtlEqualUnicodeString(PUNICODE_STRING String1, PUNICODE_STRING String2, BOOLEAN CaseInSensitive)
PKSE_SHIM Shim
Definition: kse.c:22
PWCHAR ShimName
Definition: kse.h:95
Definition: typedefs.h:120
struct _LIST_ENTRY * Flink
Definition: typedefs.h:121
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260

Referenced by KsepAddShimByName().

◆ KseRegisterShim()

NTSTATUS NTAPI KseRegisterShim ( _In_ PKSE_SHIM  Shim,
_In_ PVOID  Ignored,
_In_ ULONG  Flags 
)

Definition at line 464 of file kse.c.

468{
469 return KseRegisterShimEx(Shim, Ignored, Flags, NULL);
470}
NTSTATUS NTAPI KseRegisterShimEx(_In_ PKSE_SHIM Shim, _In_ PVOID Ignored, _In_ ULONG Flags, _In_opt_ PVOID DriverObject)
Definition: kse.c:474

Referenced by KseDriverScopeInitialize(), and KseIgnoreFreePoolTagInitialize().

◆ KseRegisterShimEx()

NTSTATUS NTAPI KseRegisterShimEx ( _In_ PKSE_SHIM  Shim,
_In_ PVOID  Ignored,
_In_ ULONG  Flags,
_In_opt_ PVOID  DriverObject 
)

Definition at line 474 of file kse.c.

479{
480 PKSE_PROVIDER ProviderEntry;
481 PLIST_ENTRY ListEntry;
482 PLDR_DATA_TABLE_ENTRY DataTableEntry;
483 PKSE_HOOK_COLLECTION HookCollection;
484 PKSE_HOOK Hook;
485 BOOLEAN InKernel;
486
487 UNREFERENCED_PARAMETER(Ignored);
488
489 if (!Shim || !Shim->ShimGuid)
490 {
491 DPRINT1("KSE: Unable to register empty shim or shim without guid\n");
493 }
494
496 {
497 DPRINT1("KSE: Unable to register shim 0x%08x before engine is initialized\n", Shim->ShimGuid->Data1);
498 return STATUS_UNSUCCESSFUL;
499 }
500
501 /* Search the loaded module associated to caller */
502 if (!KiPcToFileHeader(_ReturnAddress(), &DataTableEntry, FALSE, &InKernel))
503 return STATUS_NOT_FOUND;
504
505 /* Check if all shim functions belong to caller */
506 for (HookCollection = Shim->HookCollectionsArray; HookCollection->Type != KseCollectionInvalid; HookCollection++)
507 {
508 for (Hook = HookCollection->HookArray; Hook->Type != KseHookInvalid; Hook++)
509 {
510 if (Hook->HookFunction < DataTableEntry->DllBase)
511 return STATUS_UNSUCCESSFUL;
512 if ((ULONG_PTR)Hook->HookFunction - (ULONG_PTR)DataTableEntry->DllBase >= DataTableEntry->SizeOfImage)
513 return STATUS_UNSUCCESSFUL;
514 }
515 }
516
517 /* Search if shim is already loaded */
518 for (ListEntry = KseEngine.ProvidersListHead.Flink;
519 ListEntry != &KseEngine.ProvidersListHead;
520 ListEntry = ListEntry->Flink)
521 {
522 ProviderEntry = CONTAINING_RECORD(ListEntry, KSE_PROVIDER, ProviderList);
523 if (IsEqualGUID(ProviderEntry->Shim->ShimGuid, Shim->ShimGuid))
524 {
525 DPRINT1("KSE: GUID already registered\n");
527 }
528 }
529
530 /* Allocate a new entry for this shim */
531 ProviderEntry = ExAllocatePoolWithTag(PagedPool, sizeof(*ProviderEntry), TAG_KSE_PROVIDER);
532 if (!ProviderEntry)
533 return STATUS_NO_MEMORY;
534
535 ProviderEntry->Shim = Shim;
537
538 /* Now, update the shim */
539 Shim->KseCallbackRoutines = &KseEngine.KseCallbackRoutines;
540
541 if (DriverObject)
543
544 DPRINT1("KSE: Registered shim %S\n", Shim->ShimName);
545
546 return STATUS_SUCCESS;
547}
#define STATUS_NO_MEMORY
Definition: d3dkmdt.h:51
#define FALSE
Definition: types.h:117
#define InsertTailList(ListHead, Entry)
#define _ReturnAddress()
Definition: intrin_arm.h:35
#define KseCollectionInvalid
Definition: kse.h:38
#define KseHookInvalid
Definition: kse.h:13
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
PVOID NTAPI KiPcToFileHeader(IN PVOID Pc, OUT PLDR_DATA_TABLE_ENTRY *LdrEntry, IN BOOLEAN DriversOnly, OUT PBOOLEAN InKernel)
Definition: bug.c:44
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define STATUS_NOT_FOUND
Definition: shellext.h:72
PKSE_HOOK HookArray
Definition: kse.h:44
Definition: kse.h:22
ULONG Type
Definition: kse.h:23
PVOID HookFunction
Definition: kse.h:29
LIST_ENTRY ProviderList
Definition: kse.c:21
const GUID * ShimGuid
Definition: kse.h:94
Definition: btrfs_drv.h:1876
ULONG SizeOfImage
Definition: ldrtypes.h:147
PVOID DllBase
Definition: btrfs_drv.h:1880
#define TAG_KSE_PROVIDER
Definition: tag.h:131
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
#define STATUS_OBJECT_NAME_COLLISION
Definition: udferr_usr.h:150
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
Definition: wdfdriver.h:213
#define ObReferenceObject
Definition: obfuncs.h:204

Referenced by KseRegisterShim().

◆ KseShimDriverIoCallbacks()

NTSTATUS NTAPI KseShimDriverIoCallbacks ( _In_ PDRIVER_OBJECT  DriverObject)

Definition at line 301 of file kse.c.

303{
304 KSE_DRIVER_IO_CALLBACKS IoCallbacks;
305 PKSE_DRIVER_IO_CALLBACKS KseCallbacks;
306 PLDR_DATA_TABLE_ENTRY LdrEntry;
307 BOOLEAN InKernel;
308 ULONG i;
310 DPRINT("KseShimDriverIoCallbacks(%wZ)\n", &DriverObject->DriverName);
311
313 return STATUS_SUCCESS;
314
315 if (!KiPcToFileHeader(DriverObject->DriverStart, &LdrEntry, FALSE, &InKernel))
316 return STATUS_NOT_FOUND;
317
318 Status = KsepGetShimCallbacksForDriver(LdrEntry, &IoCallbacks);
319 if (!NT_SUCCESS(Status))
320 return Status;
321
322 KseCallbacks = KsepPoolAllocateNonPaged(sizeof(*KseCallbacks));
323 if (!KseCallbacks)
324 return STATUS_NO_MEMORY;
325
326 RtlZeroMemory(KseCallbacks, sizeof(*KseCallbacks));
327 if (DriverObject->DriverInit && IoCallbacks.DriverInit)
328 {
329 KseCallbacks->DriverInit = DriverObject->DriverInit;
330 DriverObject->DriverInit = IoCallbacks.DriverInit;
331 }
332 if (DriverObject->DriverStartIo && IoCallbacks.DriverStartIo)
333 {
334 KseCallbacks->DriverStartIo = DriverObject->DriverStartIo;
335 DriverObject->DriverStartIo = IoCallbacks.DriverStartIo;
336 }
337 if (DriverObject->DriverUnload && IoCallbacks.DriverUnload)
338 {
339 KseCallbacks->DriverUnload = DriverObject->DriverUnload;
340 DriverObject->DriverUnload = IoCallbacks.DriverUnload;
341 }
342 if (DriverObject->DriverExtension->AddDevice && IoCallbacks.AddDevice)
343 {
344 KseCallbacks->AddDevice = DriverObject->DriverExtension->AddDevice;
345 DriverObject->DriverExtension->AddDevice = IoCallbacks.AddDevice;
346 }
347
348 for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++)
349 {
350 if (DriverObject->MajorFunction[i] && IoCallbacks.MajorFunction[i])
351 {
352 KseCallbacks->MajorFunction[i] = DriverObject->MajorFunction[i];
353 DriverObject->MajorFunction[i] = IoCallbacks.MajorFunction[i];
354 }
355 }
356 IoGetDrvObjExtension(DriverObject)->KseCallbacks = KseCallbacks;
357
358 return STATUS_SUCCESS;
359}
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
Definition: glfuncs.h:248
static NTSTATUS NTAPI KsepGetShimCallbacksForDriver(_In_ PLDR_DATA_TABLE_ENTRY LdrEntry, _Out_ PKSE_DRIVER_IO_CALLBACKS pIoCallbacks)
Definition: kse.c:239
PVOID NTAPI KsepPoolAllocateNonPaged(_In_ SIZE_T NumberOfBytes)
Definition: kse.c:70
#define IoGetDrvObjExtension(DriverObject)
Definition: io.h:135
PDRIVER_UNLOAD DriverUnload
Definition: kse.h:65
PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION+1]
Definition: kse.h:67
PDRIVER_ADD_DEVICE AddDevice
Definition: kse.h:66
PDRIVER_STARTIO DriverStartIo
Definition: kse.h:64
PDRIVER_INITIALIZE DriverInit
Definition: kse.h:63
#define IRP_MJ_MAXIMUM_FUNCTION

Referenced by IoCreateDriver().

◆ KseUnregisterShim()

NTSTATUS NTAPI KseUnregisterShim ( _In_ PKSE_SHIM  Shim,
_In_ PVOID  Unknown1,
_In_ PVOID  Unknown2 
)

Definition at line 551 of file kse.c.

555{
558}
#define UNIMPLEMENTED
Definition: ntoskrnl.c:15
#define STATUS_NOT_SUPPORTED
Definition: d3dkmdt.h:48

◆ NTSTATUS()

typedef NTSTATUS ( NTAPI  KSE_SET_COMPLETION_HOOK)

◆ PKSE_DRIVER_IO_CALLBACKS()

typedef PKSE_DRIVER_IO_CALLBACKS ( NTAPI  KSE_GET_IO_CALLBACKS)