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