CmpQueryNameString
NTSTATUS __stdcall CmpQueryNameString(PVOID FileHandle, UNICODE_STRING *NameStr){
NTSTATUS result;
NTSTATUS v4;
UINT64 i;
OBJECT_NAME_INFORMATION *PoolWithTag;
UNICODE_STRING *p_Name;
int v8;
UINT64 Length;
wchar_t *StringRoutine;
NTSTATUS appended;
unsigned __int16 v12;
wchar_t *Buffer;
UINT64 ReturnLength;
PADAPTER_OBJECT DmaAdapter;
LODWORD(ReturnLength) = 0;
DmaAdapter = 0i64;
result = ObReferenceObjectByHandle(FileHandle, 1u, *(POBJECT_TYPE *)CmIoFileObjectType, 0, (PVOID *)&DmaAdapter, 0i64);
v4 = result;
if( result >= 0 )
{
for( i = 272i64; ; i = (unsigned int)ReturnLength )
{
PoolWithTag = (OBJECT_NAME_INFORMATION *)ExAllocatePoolWithTag(PagedPool, i, 0x62534D43ui64);
p_Name = &PoolWithTag->Name;
if( !PoolWithTag )
break;
v8 = ObQueryNameStringMode(DmaAdapter, PoolWithTag, (unsigned int)i, &ReturnLength, 0);
v4 = v8;
if( v8 >= 0 )
{
NameStr->Length = 0;
Length = p_Name->Length;
NameStr->MaximumLength = p_Name->Length;
StringRoutine = (wchar_t *)ExpAllocateStringRoutine(Length);
NameStr->Buffer = StringRoutine;
if( StringRoutine )
{
appended = RtlAppendUnicodeStringToString(NameStr, p_Name);
v12 = NameStr->Length;
v4 = appended;
if( NameStr->Length )
{
Buffer = NameStr->Buffer;
do
{
if( Buffer[((unsigned __int64)v12 >> 1) - 1] )
break;
v12 -= 2;
NameStr->Length = v12;
}
while( v12 );
}
}
else
{
v4 = -1073741801;
}
LABEL_9:
if( p_Name )
ExFreePoolWithTag(p_Name, 0);
break;
}
if( v8 != -2147483643 || (unsigned int)ReturnLength <= (unsigned int)i )
goto LABEL_9;
ExFreePoolWithTag(p_Name, 0);
}
HalPutDmaAdapter(DmaAdapter);
return v4;
}
return result;
}Referenced by:
CmKtmNotification
CmpAddRemoveRMLogContainer
CmpInitCmRM
CmpStartRMLog
CmpTraceHiveMountBaseFileMounted
CmpTraceHiveRestoreStart