WmipTranslateFileHandle
NTSTATUS __stdcall WmipTranslateFileHandle(WMIFHTOINSTANCENAME *FhToInstanceName, UINT64 *OutBufferLen){
VOID *v4;
int FilePDO;
VOID *v6;
unsigned __int16 Length;
unsigned int v8;
wchar_t *Buffer;
_UNICODE_STRING BaseName;
UINT64 BaseIndex;
PVOID Object;
_DEVICE_OBJECT *Pdo;
LODWORD(BaseIndex) = 0;
*(_QWORD *)&BaseName.Length = 0i64;
v4 = *(VOID **)FhToInstanceName;
Pdo = 0i64;
BaseName.Buffer = 0i64;
FilePDO = WmipGetFilePDO(v4, 1, &Pdo);
if( FilePDO < 0 )
return FilePDO;
v6 = (VOID *)*((_QWORD *)FhToInstanceName + 1);
Object = 0i64;
FilePDO = ObReferenceObjectByHandle(v6, 1ui64, WmipGuidObjectType, 1, &Object, 0i64);
if( FilePDO >= 0 )
{
FilePDO = WmipGetGuidObjectInstanceInfo((_WMIGUIDOBJECT *)Object, (ULONG_PTR)Pdo, &BaseName, &BaseIndex);
if( FilePDO < 0 )
{
LABEL_12:
if( Object )
HalPutDmaAdapter((PADAPTER_OBJECT)Object);
goto LABEL_14;
}
Length = BaseName.Length;
v8 = BaseName.Length + 26;
if( *(_DWORD *)OutBufferLen >= v8 )
{
Buffer = BaseName.Buffer;
FhToInstanceName[4] = BaseIndex;
*((_WORD *)FhToInstanceName + 10) = Length + 4;
memmove((char *)FhToInstanceName + 22, Buffer, Length);
*(_DWORD *)OutBufferLen = v8;
*(WMIFHTOINSTANCENAME *)((char *)FhToInstanceName + 2 * ((unsigned __int64)Length >> 1) + 22) = 0;
}
else
{
if( *(_DWORD *)OutBufferLen < 4u )
{
FilePDO = -1073741823;
goto LABEL_10;
}
*FhToInstanceName = v8;
*(_DWORD *)OutBufferLen = 4;
}
FilePDO = 0;
LABEL_10:
if( BaseName.Buffer )
RtlFreeAnsiString(&BaseName);
goto LABEL_12;
}
LABEL_14:
if( Pdo )
HalPutDmaAdapter((PADAPTER_OBJECT)Pdo);
return FilePDO;
}Referenced by:
WmipIoControl