ReactOS 0.4.17-dev-1164-g974a446
ksedb.c File Reference
#include <ntoskrnl.h>
#include <appcompat/sdbtypes.h>
#include <appcompat/sdbtagid.h>
#include <debug.h>
Include dependency graph for ksedb.c:

Go to the source code of this file.

Macros

#define WINAPI   NTAPI
 
#define NDEBUG
 
#define SDB_HEADER_SIZE   12
 
#define SDB_HEADER_MAGIC   'fbds'
 

Typedefs

typedef int BOOL
 

Functions

TAG WINAPI SdbGetTagFromTagID (PDB pdb, TAGID tagid)
 
TAGID WINAPI SdbGetFirstChild (PDB pdb, TAGID parent)
 
TAGID WINAPI SdbGetNextChild (PDB pdb, TAGID parent, TAGID prev_child)
 
TAGID WINAPI SdbFindFirstTag (PDB pdb, TAGID parent, TAG tag)
 
TAGID WINAPI SdbFindNextTag (PDB pdb, TAGID parent, TAGID prev_child)
 
DWORD WINAPI SdbReadDWORDTag (PDB pdb, TAGID tagid, DWORD ret)
 
LPWSTR WINAPI SdbGetStringTagPtr (PDB pdb, TAGID tagid)
 
BOOL __cdecl ShimDbgPrint (_In_ ULONG Level, _In_ PCSTR FunctionName, _In_z_ _Printf_format_string_ PCSTR Format,...)
 
BOOL WINAPI SdbpCheckTagIDType (_In_ PDB pdb, _In_ TAGID tagid, _In_ WORD type)
 
BOOL WINAPI SdbIsNullGUID (_In_ CONST GUID *Guid)
 
NTSTATUS NTAPI KseDbInitialize (_In_ PVOID DatabaseImage, _In_ ULONG DatabaseSize)
 
static BOOLEAN KsepDbStringEquals (_In_ TAGID Parent, _In_ TAG Tag, _In_ PCUNICODE_STRING String)
 
static BOOLEAN KsepDbMatchingFileMatches (_In_ TAGID MatchingFile, _In_ PLDR_DATA_TABLE_ENTRY LdrEntry)
 
VOID NTAPI KseDbGetShimsForDriver (_In_ PLDR_DATA_TABLE_ENTRY LdrEntry, _Inout_ PKSE_SHIM *Shims, _Inout_ PULONG NumberOfShims)
 

Variables

static DB KseDriverDatabase
 
static TAGID KseDatabaseRoot
 
ULONG g_ShimDebugLevel = 1
 

Macro Definition Documentation

◆ NDEBUG

#define NDEBUG

Definition at line 22 of file ksedb.c.

◆ SDB_HEADER_MAGIC

#define SDB_HEADER_MAGIC   'fbds'

Definition at line 37 of file ksedb.c.

◆ SDB_HEADER_SIZE

#define SDB_HEADER_SIZE   12

Definition at line 36 of file ksedb.c.

◆ WINAPI

#define WINAPI   NTAPI

Definition at line 13 of file ksedb.c.

Typedef Documentation

◆ BOOL

typedef int BOOL

Definition at line 11 of file ksedb.c.

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().

◆ KsepDbMatchingFileMatches()

static BOOLEAN KsepDbMatchingFileMatches ( _In_ TAGID  MatchingFile,
_In_ PLDR_DATA_TABLE_ENTRY  LdrEntry 
)
static

Definition at line 147 of file ksedb.c.

150{
151 static const UNICODE_STRING Self = RTL_CONSTANT_STRING(L"*");
152 PIMAGE_NT_HEADERS NtHeaders;
153 TAGID Attribute;
154 TAG Tag;
155
156 /* Only the driver itself can be checked here */
158 !KsepDbStringEquals(MatchingFile, TAG_NAME, &LdrEntry->BaseDllName))
159 {
160 return FALSE;
161 }
162
163 NtHeaders = RtlImageNtHeader(LdrEntry->DllBase);
164 if (!NtHeaders)
165 return FALSE;
166
168 Attribute != TAGID_NULL;
169 Attribute = SdbGetNextChild(&KseDriverDatabase, MatchingFile, Attribute))
170 {
172 switch (Tag)
173 {
174 case TAG_NAME:
175 break;
176
177 case TAG_LINK_DATE:
178 if (SdbReadDWORDTag(&KseDriverDatabase, Attribute, 0) != NtHeaders->FileHeader.TimeDateStamp)
179 return FALSE;
180 break;
181
182 case TAG_CHECKSUM:
183 if (SdbReadDWORDTag(&KseDriverDatabase, Attribute, 0) != NtHeaders->OptionalHeader.CheckSum)
184 return FALSE;
185 break;
186
187 default:
188 /* Do not shim a driver based on attributes that were not checked */
189 DPRINT1("KSE: Unsupported matching attribute 0x%x for %wZ\n", Tag, &LdrEntry->BaseDllName);
190 return FALSE;
191 }
192 }
193
194 return TRUE;
195}
#define FALSE
Definition: types.h:117
#define RTL_CONSTANT_STRING(s)
Definition: combase.c:35
#define RtlImageNtHeader
Definition: compat.h:806
#define L(x)
Definition: resources.c:13
TAG WINAPI SdbGetTagFromTagID(PDB pdb, TAGID tagid)
Definition: sdbread.c:93
TAGID WINAPI SdbGetFirstChild(PDB pdb, TAGID parent)
Definition: sdbread.c:142
TAGID WINAPI SdbGetNextChild(PDB pdb, TAGID parent, TAGID prev_child)
Definition: sdbread.c:171
DWORD WINAPI SdbReadDWORDTag(PDB pdb, TAGID tagid, DWORD ret)
Definition: sdbread.c:305
#define TAG_CHECKSUM
Definition: apphelp.c:47
#define TAG_LINK_DATE
Definition: apphelp.c:56
IMAGE_OPTIONAL_HEADER32 OptionalHeader
Definition: ntddk_ex.h:184
IMAGE_FILE_HEADER FileHeader
Definition: ntddk_ex.h:183
Definition: fs_rec.h:143
_Must_inspect_result_ _In_ UCXENDPOINT _In_ PVOID Tag
Definition: ucxendpoint.h:325

Referenced by KseDbGetShimsForDriver().

◆ KsepDbStringEquals()

static BOOLEAN KsepDbStringEquals ( _In_ TAGID  Parent,
_In_ TAG  Tag,
_In_ PCUNICODE_STRING  String 
)
static

Definition at line 129 of file ksedb.c.

133{
135 PWSTR Ptr;
136
138 if (!Ptr)
139 return FALSE;
140
143}
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn UINT32 *TableIdx UINT32 ACPI_TABLE_HEADER *OutTableHeader ACPI_TABLE_HEADER **OutTable ACPI_HANDLE UINT32 ACPI_WALK_CALLBACK ACPI_WALK_CALLBACK void void **ReturnValue UINT32 ACPI_BUFFER *RetPathPtr ACPI_OBJECT_HANDLER void *Data ACPI_OBJECT_HANDLER void **Data ACPI_STRING ACPI_OBJECT_LIST ACPI_BUFFER *ReturnObjectBuffer ACPI_DEVICE_INFO **ReturnBuffer ACPI_HANDLE Parent
Definition: acpixf.h:732
_Must_inspect_result_ _In_ PFSRTL_PER_STREAM_CONTEXT Ptr
Definition: fsrtlfuncs.h:898
NTSYSAPI BOOLEAN NTAPI RtlEqualUnicodeString(PUNICODE_STRING String1, PUNICODE_STRING String2, BOOLEAN CaseInSensitive)
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFSTRING String
Definition: wdfdevice.h:2439
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
Definition: wdfregistry.h:413

Referenced by KseDbGetShimsForDriver(), and KsepDbMatchingFileMatches().

◆ SdbFindFirstTag()

TAGID WINAPI SdbFindFirstTag ( PDB  pdb,
TAGID  parent,
TAG  tag 
)

Searches shim database for a tag within specified domain.

Parameters
[in]pdbHandle to the shim database.
[in]parentTAGID of parent.
[in]tagTAG to be located.
Returns
Success: TAGID of first matching tag, Failure: TAGID_NULL.

Definition at line 208 of file sdbread.c.

209{
210 TAGID iter;
211
212 iter = SdbGetFirstChild(pdb, parent);
213 while (iter != TAGID_NULL)
214 {
215 if (SdbGetTagFromTagID(pdb, iter) == tag)
216 return iter;
217 iter = SdbGetNextChild(pdb, parent, iter);
218 }
219 return TAGID_NULL;
220}
static PDB pdb
Definition: db.cpp:173
r parent
Definition: btrfs.c:3010
TAG WINAPI SdbGetTagFromTagID(PDB pdb, TAGID tagid)
Definition: sdbread.c:93
TAGID WINAPI SdbGetFirstChild(PDB pdb, TAGID parent)
Definition: sdbread.c:142
TAGID WINAPI SdbGetNextChild(PDB pdb, TAGID parent, TAGID prev_child)
Definition: sdbread.c:171
Definition: ecma_167.h:138

Referenced by KseDbGetShimsForDriver(), KseDbInitialize(), KsepDbStringEquals(), and SdbGetDatabaseID().

◆ SdbFindNextTag()

TAGID WINAPI SdbFindNextTag ( PDB  pdb,
TAGID  parent,
TAGID  prev_child 
)

Searches shim database for a next tag which matches prev_child within parent's domain.

Parameters
[in]pdbHandle to the shim database.
[in]parentTAGID of parent.
[in]prev_childTAGID of previous match.
Returns
Success: TAGID of next match, Failure: TAGID_NULL.

Definition at line 231 of file sdbread.c.

232{
233 TAG tag;
234 TAGID iter;
235
236 tag = SdbGetTagFromTagID(pdb, prev_child);
237 iter = SdbGetNextChild(pdb, parent, prev_child);
238
239 while (iter != TAGID_NULL)
240 {
241 if (SdbGetTagFromTagID(pdb, iter) == tag)
242 return iter;
243 iter = SdbGetNextChild(pdb, parent, iter);
244 }
245 return TAGID_NULL;
246}

Referenced by KseDbGetShimsForDriver().

◆ SdbGetFirstChild()

TAGID WINAPI SdbGetFirstChild ( PDB  pdb,
TAGID  parent 
)

Searches shim database for a child of specified parent tag.

Parameters
[in]pdbHandle to the shim database.
[in]parentTAGID of parent.
Returns
Success: TAGID of child tag, Failure: TAGID_NULL.

Definition at line 142 of file sdbread.c.

143{
144 /* if we are at beginning of database */
145 if (parent == TAGID_ROOT)
146 {
147 /* header only database: no tags */
148 if (pdb->size <= _TAGID_ROOT)
149 return TAGID_NULL;
150 /* return *real* root tagid */
151 else return _TAGID_ROOT;
152 }
153
154 /* only list tag can have children */
156 return TAGID_NULL;
157
158 /* first child is sizeof(TAG) + sizeof(DWORD) bytes after beginning of list */
159 return parent + sizeof(TAG) + sizeof(DWORD);
160}
#define TAG(x)
Definition: ObTypes.cpp:194
#define _TAGID_ROOT
Definition: db.cpp:40
unsigned long DWORD
Definition: ntddk_ex.h:95
#define TAG_TYPE_LIST
Definition: apphelp.c:42
#define TAG_TYPE_MASK
Definition: shimdbg.c:106

Referenced by KsepDbMatchingFileMatches(), and SdbFindFirstTag().

◆ SdbGetNextChild()

TAGID WINAPI SdbGetNextChild ( PDB  pdb,
TAGID  parent,
TAGID  prev_child 
)

Searches shim database for next child of specified parent tag.

Parameters
[in]pdbHandle to the shim database.
[in]parentTAGID of parent.
[in]prev_childTAGID of previous child.
Returns
Success: TAGID of next child tag, Failure: TAGID_NULL.

Definition at line 171 of file sdbread.c.

172{
173 TAGID next_child;
174 DWORD prev_child_size, parent_size;
175
176 prev_child_size = SdbpGetTagSize(pdb, prev_child);
177 if (prev_child_size == 0)
178 return TAGID_NULL;
179
180 /* Bound check */
181 next_child = prev_child + prev_child_size;
182 if (next_child >= pdb->size)
183 return TAGID_NULL;
184
185 if (parent == TAGID_ROOT)
186 return next_child;
187
188 parent_size = SdbpGetTagSize(pdb, parent);
189 if (parent_size == 0)
190 return TAGID_NULL;
191
192 /* Specified parent has no more children */
193 if (next_child >= parent + parent_size)
194 return TAGID_NULL;
195
196 return next_child;
197}
static DWORD WINAPI SdbpGetTagSize(PDB pdb, TAGID tagid)
Definition: sdbread.c:30

Referenced by KsepDbMatchingFileMatches(), SdbFindFirstTag(), and SdbFindNextTag().

◆ SdbGetStringTagPtr()

LPWSTR WINAPI SdbGetStringTagPtr ( PDB  pdb,
TAGID  tagid 
)

Searches shim database for string associated with specified tagid.

Parameters
[in]pdbHandle to the shim database.
[in]tagidTAGID of string or stringref associated with the string.
Returns
the LPWSTR associated with specified tagid, or NULL on failure.

Definition at line 375 of file sdbread.c.

376{
377 return SdbpGetString(pdb, tagid, NULL);
378}
#define NULL
Definition: types.h:112
LPWSTR WINAPI SdbpGetString(PDB pdb, TAGID tagid, PDWORD size)
Definition: sdbread.c:47

Referenced by KseDbGetShimsForDriver(), and KsepDbStringEquals().

◆ SdbGetTagFromTagID()

TAG WINAPI SdbGetTagFromTagID ( PDB  pdb,
TAGID  tagid 
)

Searches shim database for the tag associated with specified tagid.

Parameters
[in]pdbHandle to the shim database.
[in]tagidThe TAGID of the tag.
Returns
Success: The tag associated with specified tagid, Failure: TAG_NULL.

Definition at line 93 of file sdbread.c.

94{
95 TAG data;
96 if (!SdbpReadData(pdb, &data, tagid, sizeof(data)))
97 return TAG_NULL;
98 return data;
99}
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
#define TAG_NULL
Definition: apphelp.c:45
BOOL WINAPI SdbpReadData(PDB pdb, PVOID dest, DWORD offset, DWORD num)
Definition: sdbread.c:14

Referenced by KsepDbMatchingFileMatches(), SdbFindFirstTag(), SdbFindNextTag(), SdbGetFirstChild(), SdbGetTagDataSize(), SdbpCheckTagIDType(), SdbpGetString(), and SdbpGetTagSize().

◆ SdbIsNullGUID()

BOOL WINAPI SdbIsNullGUID ( _In_ CONST GUID *  Guid)

Definition at line 81 of file ksedb.c.

83{
84 static const GUID NullGuid = { 0 };
85 return IsEqualGUID(Guid, &NullGuid);
86}
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
_Must_inspect_result_ _In_ WDFOBJECT _In_ CONST GUID * Guid
Definition: wdfobject.h:762

◆ SdbpCheckTagIDType()

BOOL WINAPI SdbpCheckTagIDType ( _In_ PDB  pdb,
_In_ TAGID  tagid,
_In_ WORD  type 
)

Definition at line 68 of file ksedb.c.

72{
73 TAG tag = SdbGetTagFromTagID(pdb, tagid);
74 if (tag == TAG_NULL)
75 return FALSE;
76 return (tag & TAG_TYPE_MASK) == type;
77}
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545

◆ SdbReadDWORDTag()

DWORD WINAPI SdbReadDWORDTag ( PDB  pdb,
TAGID  tagid,
DWORD  ret 
)

Reads DWORD value at specified tagid.

Parameters
[in]pdbHandle to the shim database.
[in]tagidTAGID of DWORD value.
[in]retDefault return value in case function fails.
Returns
Success: DWORD value at specified tagid, otherwise ret.

Definition at line 305 of file sdbread.c.

306{
308 SdbpReadData(pdb, &ret, tagid + 2, sizeof(DWORD));
309 return ret;
310}
return ret
Definition: mutex.c:147
BOOL WINAPI SdbpCheckTagIDType(PDB pdb, TAGID tagid, WORD type)
Definition: sdbapi.c:261
#define TAG_TYPE_DWORD
Definition: shimdbg.c:107

Referenced by KsepDbMatchingFileMatches().

◆ ShimDbgPrint()

BOOL __cdecl ShimDbgPrint ( _In_ ULONG  Level,
_In_ PCSTR  FunctionName,
_In_z_ _Printf_format_string_ PCSTR  Format,
  ... 
)

Definition at line 49 of file ksedb.c.

54{
55 va_list ap;
56
58
59 DbgPrint("KSE: [%s] ", FunctionName);
62 va_end(ap);
63 return TRUE;
64}
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 * FunctionName
Definition: acpixf.h:1279
NTSYSAPI ULONG NTAPI vDbgPrintEx(_In_ ULONG ComponentId, _In_ ULONG Level, _In_z_ PCCH Format, _In_ va_list ap)
#define DPFLTR_ERROR_LEVEL
Definition: main.cpp:32
_In_ ULONG _In_ UCHAR Level
Definition: dispmprt.h:1329
#define va_end(v)
Definition: stdarg.h:28
#define va_start(v, l)
Definition: stdarg.h:26
char * va_list
Definition: vadefs.h:50
@ DPFLTR_DEFAULT_ID
Definition: dpfilter.h:129
#define DbgPrint
Definition: hal.h:12
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
void int int ULONGLONG int va_list * ap
Definition: winesup.h:36

Variable Documentation

◆ g_ShimDebugLevel

ULONG g_ShimDebugLevel = 1

Definition at line 45 of file ksedb.c.

◆ KseDatabaseRoot

TAGID KseDatabaseRoot
static

Definition at line 40 of file ksedb.c.

Referenced by KseDbGetShimsForDriver(), and KseDbInitialize().

◆ KseDriverDatabase

DB KseDriverDatabase
static