PiCMGetDeviceInterfaceAlias
NTSTATUS __stdcall PiCMGetDeviceInterfaceAlias(
VOID *IoctlInputBuffer,
UINT64 IoctlInputBufferSize,
VOID *IoctlOutputBuffer,
UINT64 IoctlOutputBufferSize,
UINT64 *BytesUsed){
unsigned int v5;
unsigned int v6;
VOID **PoolWithTag;
unsigned __int64 v9;
NTSTATUS inited;
UINT64 v11;
NTSTATUS v12;
UINT64 BufferSize;
UINT64 ExpectedOutputSize;
UINT64 IoctlOutputBufferSizea;
_UNICODE_STRING AliasSymbolicLinkName;
_UNICODE_STRING DestinationString;
_GUID AliasInterfaceClassGuid;
PCWSTR SourceString[2];
UINT64 v21;
UINT64 *v22;
v5 = 0;
v6 = IoctlOutputBufferSize;
*(_DWORD *)v22 = 0;
AliasSymbolicLinkName = 0i64;
v21 = 0i64;
PoolWithTag = 0i64;
AliasInterfaceClassGuid = 0i64;
LODWORD(v9) = 0;
*(_OWORD *)SourceString = 0i64;
DestinationString = 0i64;
inited = PiCMCaptureInterfaceAliasInputData(
(unsigned __int64)IoctlInputBuffer,
IoctlInputBufferSize,
(int)BytesUsed,
(__int64)&AliasInterfaceClassGuid);
if( inited < 0 )
goto LABEL_23;
if( !SourceString[1] || *(_DWORD *)&AliasInterfaceClassGuid.Data2 )
{
inited = -1073741811;
}
else
{
if( !IoctlOutputBuffer || v6 < 0x14 )
{
inited = -1073741811;
v11 = 0i64;
goto LABEL_28;
}
if( v6 - 20 >= 2 )
v5 = v6 - 20;
if( v5 )
{
PoolWithTag = ExAllocatePoolWithTag(1ui64, v5, 879783504i64);
if( !PoolWithTag )
inited = -1073741670;
}
if( inited >= 0 )
{
if( v5 >= 2 )
*(_WORD *)PoolWithTag = 0;
inited = RtlInitUnicodeStringEx(&DestinationString, (WCHAR *)SourceString[1]);
if( inited >= 0 )
{
inited = IoGetDeviceInterfaceAlias(
&DestinationString,
(_GUID *)AliasInterfaceClassGuid.Data4,
&AliasSymbolicLinkName);
if( inited >= 0 )
{
v9 = ((unsigned __int64)AliasSymbolicLinkName.Length + 2) >> 1;
if( 2 * (unsigned __int64)(unsigned int)v9 > v5 )
{
inited = -1073741789;
}
else
{
memmove(PoolWithTag, AliasSymbolicLinkName.Buffer, AliasSymbolicLinkName.Length);
*((_WORD *)PoolWithTag + (unsigned int)(v9 - 1)) = 0;
}
ExFreePoolWithTag(AliasSymbolicLinkName.Buffer, 0);
}
}
}
}
v11 = (unsigned int)(2 * v9);
if( inited >= 0 )
{
LODWORD(IoctlOutputBufferSizea) = v6;
LODWORD(ExpectedOutputSize) = HIDWORD(v21);
LODWORD(BufferSize) = 2 * v9;
v12 = PiCMReturnBufferResultData(
(unsigned int)inited,
v11,
0i64,
PoolWithTag,
BufferSize,
ExpectedOutputSize,
IoctlOutputBuffer,
IoctlOutputBufferSizea,
v22);
goto LABEL_21;
}
LABEL_28:
LODWORD(IoctlOutputBufferSizea) = v6;
LODWORD(ExpectedOutputSize) = HIDWORD(v21);
LODWORD(BufferSize) = 0;
v12 = PiCMReturnBufferResultData(
(unsigned int)inited,
v11,
0i64,
0i64,
BufferSize,
ExpectedOutputSize,
IoctlOutputBuffer,
IoctlOutputBufferSizea,
v22);
LABEL_21:
inited = v12;
if( PoolWithTag )
ExFreePoolWithTag(PoolWithTag, 0x34706E50u);
LABEL_23:
if( SourceString[1] )
PiControlFreeUserModeCallersBuffer(KeGetCurrentThread()->PreviousMode, (PVOID)SourceString[1]);
return inited;
}Referenced by:
PiCMHandleIoctl