IoGetDeviceInterfaceAlias
NTSTATUS __stdcall IoGetDeviceInterfaceAlias(
_UNICODE_STRING *SymbolicLinkName,
_GUID *AliasInterfaceClassGuid,
_UNICODE_STRING *AliasSymbolicLinkName){
VOID **v6;
VOID **v7;
WCHAR *v8;
int v9;
WCHAR *v10;
int ObjectProperty;
UINT64 v12;
INT64 v13;
_ETHREAD *CurrentThread;
VOID **PoolWithTag;
WCHAR *v16;
WCHAR *v17;
WCHAR *v18;
WCHAR *v19;
VOID **v20;
char v21;
UINT64 v22;
WCHAR *v24;
int v25;
WCHAR *v26;
WCHAR *DesiredAccess;
WCHAR *DesiredAccessa;
INT64 Create;
UINT64 *v30;
UINT64 *v31;
UINT8 Matched;
char DeviceInterfaceName[11];
_DWORD v34[5];
VOID *DeviceInterfaceKey;
_SECURITY_SUBJECT_CONTEXT SubjectContext;
WCHAR GuidString[40];
Matched = 0;
DeviceInterfaceKey = 0i64;
DeviceInterfaceName[0] = 0;
v34[0] = 0;
v6 = 0i64;
v34[3] = 0;
v7 = 0i64;
*(_QWORD *)&v34[1] = 0i64;
v8 = 0i64;
memset(&SubjectContext, 0, sizeof(SubjectContext));
if( !SymbolicLinkName || !SymbolicLinkName->Buffer || !SymbolicLinkName->Length )
{
ObjectProperty = -1073741811;
goto LABEL_25;
}
v9 = PnpUnicodeStringToWstr((__int16 **)&v34[1], 0i64, &SymbolicLinkName->Length);
v8 = *(WCHAR **)&v34[1];
ObjectProperty = v9;
if( v9 >= 0 )
{
if( CmValidateDeviceInterfaceName(v10) < 0 )
{
ObjectProperty = -1073741811;
goto LABEL_29;
}
SeCaptureSubjectContext((INT64)&SubjectContext);
ObjectProperty = PiPnpRtlApplyMandatoryFilters(*(&stru_140CF2E80 + 607), v8, 3, 0i64, &SubjectContext, &Matched);
SeReleaseSubjectContext(&SubjectContext);
if( ObjectProperty >= 0 )
{
if( !Matched )
{
ObjectProperty = -1073741790;
goto LABEL_29;
}
ObjectProperty = PnpStringFromGuid(AliasInterfaceClassGuid, GuidString, v12);
if( ObjectProperty >= 0 )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
ExAcquireResourceExclusiveLite((UINT64)&PnpReplaceEvent + 6688, 1, v13);
PoolWithTag = ExAllocatePoolWithTag(1ui64, 0x190ui64, 538996816i64);
v6 = PoolWithTag;
if( PoolWithTag )
{
v16 = *(WCHAR **)&v34[1];
ObjectProperty = PnpGetObjectProperty(
*(&stru_140CF2E80 + 1214),
*(INT64 *)&v34[1],
3i64,
0i64,
0i64,
(INT64)&DEVPKEY_Device_InstanceId,
(INT64)v34,
(INT64)PoolWithTag);
if( ObjectProperty < 0 )
{
LABEL_24:
ExReleaseResourceLite((PERESOURCE)((char *)&PnpReplaceEvent + 6688));
KeLeaveCriticalRegionThread(KeGetCurrentThread());
v8 = *(WCHAR **)&v34[1];
LABEL_25:
if( v7 )
ExFreePoolWithTag(v7, 0);
if( v6 )
ExFreePoolWithTag(v6, 0);
goto LABEL_29;
}
if( v34[0] != 18 )
{
ObjectProperty = -1073741585;
goto LABEL_24;
}
*(_DWORD *)&DeviceInterfaceName[3] = 128;
v7 = ExAllocatePoolWithTag(1ui64, 0x100ui64, 538996816i64);
if( v7 )
{
DesiredAccess = (WCHAR *)&DeviceInterfaceName[3];
ObjectProperty = CmGetDeviceInterfaceReferenceString(v17, v16, (UINT64)v7, (UINT64 *)0x80);
if( ObjectProperty != -1073741789 )
goto LABEL_14;
ExFreePoolWithTag(v7, 0);
v7 = ExAllocatePoolWithTag(1ui64, 2i64 * *(unsigned int *)&DeviceInterfaceName[3], 538996816i64);
if( v7 )
{
DesiredAccess = (WCHAR *)&DeviceInterfaceName[3];
ObjectProperty = CmGetDeviceInterfaceReferenceString(
v24,
v16,
(UINT64)v7,
(UINT64 *)*(unsigned int *)&DeviceInterfaceName[3]);
LABEL_14:
if( ObjectProperty == -1073741772 )
{
ObjectProperty = 0;
ExFreePoolWithTag(v7, 0);
v7 = 0i64;
}
if( ObjectProperty < 0 )
goto LABEL_24;
ObjectProperty = CmGetDeviceInterfacePathFormat(v18, (UINT8 *)v16);
if( ObjectProperty < 0 )
goto LABEL_24;
*(_DWORD *)&DeviceInterfaceName[7] = 512;
v20 = ExAllocatePoolWithTag(1ui64, 0x400ui64, 538996816i64);
if( v20 )
{
v21 = DeviceInterfaceName[0];
LODWORD(v30) = 512;
LOBYTE(DesiredAccess) = DeviceInterfaceName[0];
ObjectProperty = CmGetDeviceInterfaceName(
v19,
GuidString,
(WCHAR *)v6,
(UINT8)v7,
DesiredAccess,
(UINT64)v20,
v30);
if( ObjectProperty != -1073741789 )
{
LABEL_20:
if( ObjectProperty >= 0 )
{
ObjectProperty = RtlInitUnicodeStringEx(AliasSymbolicLinkName, (WCHAR *)v20);
if( ObjectProperty >= 0 )
{
LOBYTE(Create) = 0;
LODWORD(DesiredAccessa) = 131097;
ObjectProperty = CmOpenDeviceInterfaceRegKey(
*(&stru_140CF2E80 + 607),
(const WCHAR *)v20,
48i64,
v22,
(INT64)DesiredAccessa,
Create,
&DeviceInterfaceKey,
0i64);
if( ObjectProperty < 0 )
RtlFreeAnsiString(AliasSymbolicLinkName);
else
ZwClose((_HANDLE)DeviceInterfaceKey);
}
}
goto LABEL_24;
}
ExFreePoolWithTag(v20, 0);
v25 = *(_DWORD *)&DeviceInterfaceName[7];
v20 = ExAllocatePoolWithTag(1ui64, 2i64 * *(unsigned int *)&DeviceInterfaceName[7], 538996816i64);
if( v20 )
{
LODWORD(v31) = v25;
LOBYTE(DesiredAccessa) = v21;
ObjectProperty = CmGetDeviceInterfaceName(
v26,
GuidString,
(WCHAR *)v6,
(UINT8)v7,
DesiredAccessa,
(UINT64)v20,
v31);
goto LABEL_20;
}
}
}
}
}
ObjectProperty = -1073741670;
goto LABEL_24;
}
}
}
LABEL_29:
PnpUnicodeStringToWstrFree(v8, (__int64)SymbolicLinkName);
return ObjectProperty;
}Referenced by:
PiCMGetDeviceInterfaceAlias