MiDriverLoadSucceeded
VOID __stdcall MiDriverLoadSucceeded(
_KLDR_DATA_TABLE_ENTRY *DataTableEntry,
_SECTION *Section,
_UNICODE_STRING *ImageFileName,
_UNICODE_STRING *PrefixedImageName,
_UNICODE_STRING *BaseName,
UINT8 InitialLoad,
UINT64 LoadFlags){
_CONTROL_AREA *v10;
_SEGMENT *Segment;
unsigned __int8 UChar2;
_FILE_OBJECT *v13;
WCHAR *Pool;
_UNICODE_STRING v15;
NTSTATUS v16;
UINT64 v17;
_UNICODE_STRING DestinationString;
_IMAGE_INFO_EX ExtendedInfo;
__int64 v20;
v20 = 0i64;
memset(&ExtendedInfo, 0, sizeof(ExtendedInfo));
if( InitialLoad == 1 )
{
DataTableEntry->Flags |= 0x41004000u;
v10 = MiSectionControlArea(Section);
Segment = v10->Segment;
LOBYTE(ExtendedInfo.ImageInfo.anonymous_0.Properties) = 3;
UChar2 = Segment->SegmentFlags.UChar2;
ExtendedInfo.ImageInfo.ImageSelector = 0;
LODWORD(ExtendedInfo.FileObject) = 0;
*(_QWORD *)&ExtendedInfo.ImageInfo.ImageSectionNumber = DataTableEntry->SizeOfImage;
ExtendedInfo.ImageInfo.ImageBase = DataTableEntry->DllBase;
ExtendedInfo.ImageInfo.anonymous_0.Properties = ExtendedInfo.ImageInfo.anonymous_0.Properties & 0xFFF80FFF | ((UChar2 & 0xF1 | ((UChar2 & 0xE) << 7) | 1) << 8);
v13 = MiReferenceControlAreaFile(v10);
PsCallImageNotifyRoutines(ImageFileName, 0i64, &ExtendedInfo, v13);
MiDereferenceControlAreaFile(v10, v13);
if( MiCacheImageSymbols(DataTableEntry->DllBase) )
{
DestinationString = 0i64;
Pool = (WCHAR *)MiAllocatePool(256i64, 0x100ui64, 0x6E4C6D4Dui64);
if( Pool )
{
if( PrefixedImageName->Length <= 0x16u
|| wcsnicmp(PrefixedImageName->Buffer, (const wchar_t *)L"\\SystemRoot", 0xBu) )
{
v16 = RtlStringCbPrintfW(Pool, 0x100ui64, (WCHAR *)L"%wZ");
}
else
{
v15 = *PrefixedImageName;
*(_QWORD *)&DestinationString.Length = *(_QWORD *)&PrefixedImageName->Length;
DestinationString.Buffer = (wchar_t *)(_mm_srli_si128((__m128i)v15, 8).m128i_u64[0] + 22);
DestinationString.Length -= 22;
RtlGetNtSystemRoot();
v16 = RtlStringCbPrintfW(Pool, 0x100ui64, (WCHAR *)L"%ws%wZ");
}
if( v16 >= 0 )
{
RtlInitUnicodeString(&DestinationString, Pool);
if( (unsigned int)DbgLoadImageSymbolsUnicode(&DestinationString, DataTableEntry->DllBase, v17) == 1 )
DataTableEntry->Flags |= 0x100000u;
}
ExFreePoolWithTag(Pool, 0);
}
}
}
if( !*(_QWORD *)&MiSectionControlArea((_SECTION *)DataTableEntry->SectionPointer)[1].gap8[8]
|| (DataTableEntry->Flags & 0x8000000) == 0 )
{
MiProtectSystemImage(DataTableEntry);
}
if( MiGetSystemRegionType((UINT64)DataTableEntry->DllBase) == 1 )
MiSessionUpdateImageCharges(DataTableEntry);
}Referenced by:
MiApplyHotPatchToLoadedDriver
MmLoadSystemImageEx