MiCreateSessionDriverProtos
NTSTATUS __stdcall MiCreateSessionDriverProtos(
_CONTROL_AREA *ControlArea,
VOID *DriverBaseAddress,
_MI_SYSTEM_IMAGE_PRIVATE_FIXUP *Fixup){
_SEGMENT *Segment;
char *v6;
char *v8;
_SUBSECTION *v9;
UINT32 i;
__int64 PtesInSubsection;
__int16 v12;
_RTL_BALANCED_NODE *v13;
_RTL_BALANCED_NODE *AllocatedProtos;
_MI_SYSTEM_IMAGE_PRIVATE_FIXUP *v15;
_MI_SYSTEM_SPACE_IMAGE SystemImageInfo[20];
v15 = Fixup;
memset(SystemImageInfo, 0i64, sizeof(SystemImageInfo));
Segment = ControlArea->Segment;
AllocatedProtos = 0i64;
if( (Segment->SegmentFlags.Short0 & 0x800) != 0 )
return 1;
v6 = (char *)((_BYTE *)DriverBaseAddress - (_BYTE *)Segment->ExtendInfo);
if( MiMapImageInSystemSpace(ControlArea, 3ui64, SystemImageInfo) < 0 )
return 0;
v8 = *(char **)SystemImageInfo;
v9 = (_SUBSECTION *)&ControlArea[1];
for( i = 0; ; i += PtesInSubsection )
{
if( !v9 )
{
MiUnmapImageInSystemSpace(SystemImageInfo);
Segment->SegmentFlags.Short0 |= 0x800u;
return 1;
}
PtesInSubsection = v9->PtesInSubsection;
v12 = (unsigned __int16)v9->u.SubsectionFlags._bf_0 >> 1;
if( (v12 & 4) == 0 && ((MiFlags & 0x8000) != 0 || (MiFlags & 0x10000) == 0 || (v12 & 2) == 0) )
break;
LABEL_12:
v9 = v9->NextSubsection;
v8 += 4096 * PtesInSubsection;
}
if( MiAllocatePerSessionProtos(v9, v8, i, (UINT64)v6, &AllocatedProtos) >= 0 )
{
v13 = AllocatedProtos;
*(_DWORD *)&AllocatedProtos[2]._bf_0 = 0;
v13->Children[0] = (_RTL_BALANCED_NODE *)DriverBaseAddress;
v9->GlobalPerSessionHead.Root = v13;
if( v15 )
RtlClearBits(*((PRTL_BITMAP *)v15 + 5), i, v9->PtesInSubsection);
goto LABEL_12;
}
MiUnmapImageInSystemSpace(SystemImageInfo);
MiDeleteSessionDriverProtos(ControlArea);
return 0;
}Referenced by:
MiAddPrivateFixupEntryForSystemImage
MmLoadSystemImageEx