CmpQueryNameString
NTSTATUS __stdcall CmpQueryNameString(PVOID FileHandle, UNICODE_STRING *NameStr){
NTSTATUS result;
NTSTATUS v4;
UINT64 i;
VOID **PoolWithTag;
_UNICODE_STRING *v7;
NTSTATUS v8;
UINT64 Length;
wchar_t *StringRoutine;
NTSTATUS appended;
unsigned __int16 v12;
wchar_t *Buffer;
UINT64 ReturnLength;
VOID *Object;
LODWORD(ReturnLength) = 0;
Object = 0i64;
result = ObReferenceObjectByHandle(
FileHandle,
1ui64,
(_OBJECT_TYPE *)**(&CmpDummyThreadEvent + 344),
0,
&Object,
0i64);
v4 = result;
if( result >= 0 )
{
for( i = 272i64; ; i = (unsigned int)ReturnLength )
{
PoolWithTag = ExAllocatePoolWithTag(1ui64, i, 1649626435i64);
v7 = (_UNICODE_STRING *)PoolWithTag;
if( !PoolWithTag )
break;
v8 = ObQueryNameStringMode(Object, (_OBJECT_NAME_INFORMATION *)PoolWithTag, (unsigned int)i, &ReturnLength, 0);
v4 = v8;
if( v8 >= 0 )
{
NameStr->Length = 0;
Length = v7->Length;
NameStr->MaximumLength = v7->Length;
StringRoutine = (wchar_t *)ExpAllocateStringRoutine(Length);
NameStr->Buffer = StringRoutine;
if( StringRoutine )
{
appended = RtlAppendUnicodeStringToString(NameStr, v7);
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( v7 )
ExFreePoolWithTag(v7, 0);
break;
}
if( v8 != -2147483643 || (unsigned int)ReturnLength <= (unsigned int)i )
goto LABEL_9;
ExFreePoolWithTag(v7, 0);
}
HalPutDmaAdapter((PADAPTER_OBJECT)Object);
return v4;
}
return result;
}Referenced by:
CmKtmNotification
CmpAddRemoveRMLogContainer
CmpInitCmRM
CmpStartRMLog
CmpTraceHiveMountBaseFileMounted
CmpTraceHiveRestoreStart