MiGenerateSystemImageNames

NTSTATUS __stdcall MiGenerateSystemImageNames(
        _UNICODE_STRING *ImageFileName,
        _UNICODE_STRING *NamePrefix,
        _UNICODE_STRING *LoadedBaseName,
        _UNICODE_STRING *BaseName,
        _UNICODE_STRING *BaseDirectory,
        _UNICODE_STRING *PrefixedImageName){
  wchar_t *Buffer; 
  unsigned __int64 Length; 
  wchar_t *v11; 
  wchar_t *v12; 
  wchar_t *i; 
  unsigned __int16 v15; 
  unsigned __int16 v16; 
  unsigned __int16 v17; 
  unsigned __int16 v18; 
  wchar_t *Pool; 

  Buffer = ImageFileName->Buffer;
  Length = ImageFileName->Length;
  if( *Buffer == 92 )
  {
    v11 = &Buffer[Length >> 1];
    v12 = v11;
    for( i = v11 - 1; ; --i )
    {
      if( *i == 92 )
      {
        BaseName->Length = 2 * (v11 - v12);
        goto LABEL_7;
      }
      v12 = i;
      if( i == Buffer )
        break;
    }
    return -1073741585;
  }
  else
  {
    BaseName->Length = Length;
    v12 = ImageFileName->Buffer;
LABEL_7:
    BaseName->Buffer = v12;
    BaseName->MaximumLength = BaseName->Length;
    *BaseDirectory = *ImageFileName;
    BaseDirectory->Length -= BaseName->Length;
    BaseDirectory->MaximumLength = BaseDirectory->Length;
    *PrefixedImageName = *ImageFileName;
    if( NamePrefix )
    {
      v15 = BaseDirectory->Length;
      PrefixedImageName->MaximumLength = BaseDirectory->Length;
      v16 = v15 + NamePrefix->Length;
      if( v16 < v15 )
        return -1073741670;
      v17 = v15 + NamePrefix->Length;
      PrefixedImageName->MaximumLength = v16;
      v18 = v16 + BaseName->Length;
      if( v18 < v17 )
        return -1073741670;
      PrefixedImageName->MaximumLength = v18;
      Pool = (wchar_t *)MiAllocatePool(256i64, v18, 0x644C6D4Dui64);
      PrefixedImageName->Buffer = Pool;
      if( !Pool )
        return -1073741670;
      PrefixedImageName->Length = 0;
      RtlAppendUnicodeStringToString(PrefixedImageName, BaseDirectory);
      RtlAppendUnicodeStringToString(PrefixedImageName, NamePrefix);
      RtlAppendUnicodeStringToString(PrefixedImageName, BaseName);
      BaseName->Buffer = &PrefixedImageName->Buffer[(unsigned __int64)BaseDirectory->Length >> 1];
      BaseName->Length += NamePrefix->Length;
      BaseName->MaximumLength += NamePrefix->Length;
    }
    if( LoadedBaseName )
      *BaseName = *LoadedBaseName;
    return 0;
  }
}

Referenced by:

MiApplyHotPatchToLoadedDriver
MmLoadSystemImageEx