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