IoGetDeviceInterfaceAlias
NTSTATUS __stdcall IoGetDeviceInterfaceAlias(
UNICODE_STRING *SymbolicLinkName,
GUID *AliasInterfaceClassGuid,
UNICODE_STRING *AliasSymbolicLinkName){
void *v6;
void *v7;
WCHAR *v8;
int v9;
__int64 v10;
NTSTATUS ObjectProperty;
NTSTATUS v12;
int v13;
_ETHREAD *CurrentThread;
VOID *PoolWithTag;
WCHAR *v16;
__int64 v17;
__int64 v18;
__int64 v19;
wchar_t *v20;
char v21;
__int64 v22;
__int64 v24;
unsigned int v25;
__int64 v26;
size_t v27;
size_t v28;
__int16 v29;
unsigned int v30;
unsigned int v31;
int v32;
WCHAR *OutString;
ULONG v34;
HANDLE Handle;
struct _SECURITY_SUBJECT_CONTEXT SubjectContext;
__int16 v37[40];
v29 = 0;
Handle = 0i64;
v32 = 0;
v6 = 0i64;
v34 = 0;
v7 = 0i64;
OutString = 0i64;
v8 = 0i64;
memset(&SubjectContext, 0, sizeof(SubjectContext));
if( !SymbolicLinkName || !SymbolicLinkName->Buffer || !SymbolicLinkName->Length )
{
ObjectProperty = -1073741811;
goto LABEL_25;
}
v9 = PnpUnicodeStringToWstr(&OutString, 0i64, SymbolicLinkName);
v8 = OutString;
ObjectProperty = v9;
if( v9 >= 0 )
{
if( (int)CmValidateDeviceInterfaceName(v10, OutString) < 0 )
{
ObjectProperty = -1073741811;
goto LABEL_29;
}
SeCaptureSubjectContext(&SubjectContext);
PiPnpRtlApplyMandatoryFilters();
ObjectProperty = v12;
SeReleaseSubjectContext(&SubjectContext);
if( ObjectProperty >= 0 )
{
if( !(_BYTE)v29 )
{
ObjectProperty = -1073741790;
goto LABEL_29;
}
PnpStringFromGuid((int *)AliasInterfaceClassGuid, (wchar_t *)v37);
ObjectProperty = v13;
if( v13 >= 0 )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
ExAcquireResourceExclusiveLite(&PnpRegistryDeviceResource, 1u);
PoolWithTag = ExAllocatePoolWithTag(PagedPool, 0x190ui64, 0x20207050ui64);
v6 = PoolWithTag;
if( PoolWithTag )
{
v16 = OutString;
ObjectProperty = PnpGetObjectProperty(
PiPnpRtlCtx,
(__int64)OutString,
3i64,
0i64,
0i64,
(__int64)&DEVPKEY_Device_InstanceId,
&v32,
(unsigned __int64)PoolWithTag,
400,
&v34,
0);
if( ObjectProperty < 0 )
{
LABEL_24:
ExReleaseResourceLite(&PnpRegistryDeviceResource);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
v8 = OutString;
LABEL_25:
if( v7 )
ExFreePoolWithTag(v7, 0);
if( v6 )
ExFreePoolWithTag(v6, 0);
goto LABEL_29;
}
if( v32 != 18 )
{
ObjectProperty = -1073741585;
goto LABEL_24;
}
v30 = 128;
v7 = ExAllocatePoolWithTag(PagedPool, 0x100ui64, 0x20207050ui64);
if( v7 )
{
ObjectProperty = CmGetDeviceInterfaceReferenceString(v17, v16, (wchar_t *)v7, 0x80u, &v30);
if( ObjectProperty != -1073741789 )
goto LABEL_14;
ExFreePoolWithTag(v7, 0);
v7 = ExAllocatePoolWithTag(PagedPool, 2i64 * v30, 0x20207050ui64);
if( v7 )
{
ObjectProperty = CmGetDeviceInterfaceReferenceString(v24, v16, (wchar_t *)v7, v30, &v30);
LABEL_14:
if( ObjectProperty == -1073741772 )
{
ObjectProperty = 0;
ExFreePoolWithTag(v7, 0);
v7 = 0i64;
}
if( ObjectProperty < 0 )
goto LABEL_24;
ObjectProperty = CmGetDeviceInterfacePathFormat(v18, v16, (_BYTE *)&v29 + 1);
if( ObjectProperty < 0 )
goto LABEL_24;
v31 = 512;
v20 = (wchar_t *)ExAllocatePoolWithTag(PagedPool, 0x400ui64, 0x20207050ui64);
if( v20 )
{
v21 = HIBYTE(v29);
LODWORD(v27) = 512;
ObjectProperty = CmGetDeviceInterfaceName(
v19,
(const WCHAR *)v37,
(const wchar_t *)v6,
(const wchar_t *)v7,
SHIBYTE(v29),
v20,
v27,
&v31);
if( ObjectProperty != -1073741789 )
{
LABEL_20:
if( ObjectProperty >= 0 )
{
ObjectProperty = RtlInitUnicodeStringEx(AliasSymbolicLinkName, v20);
if( ObjectProperty >= 0 )
{
ObjectProperty = CmOpenDeviceInterfaceRegKey(
PiPnpRtlCtx,
v20,
0x30u,
v22,
131097,
0,
(__int64)&Handle,
0i64);
if( ObjectProperty < 0 )
RtlFreeAnsiString(AliasSymbolicLinkName);
else
ZwClose(Handle);
}
}
goto LABEL_24;
}
ExFreePoolWithTag(v20, 0);
v25 = v31;
v20 = (wchar_t *)ExAllocatePoolWithTag(PagedPool, 2i64 * v31, 0x20207050ui64);
if( v20 )
{
LODWORD(v28) = v25;
ObjectProperty = CmGetDeviceInterfaceName(
v26,
(const WCHAR *)v37,
(const wchar_t *)v6,
(const wchar_t *)v7,
v21,
v20,
v28,
&v31);
goto LABEL_20;
}
}
}
}
}
ObjectProperty = -1073741670;
goto LABEL_24;
}
}
}
LABEL_29:
PnpUnicodeStringToWstrFree(v8, SymbolicLinkName);
return ObjectProperty;
}Referenced by:
PiCMGetDeviceInterfaceAlias