IopBuildGlobalSymbolicLinkString
NTSTATUS __stdcall IopBuildGlobalSymbolicLinkString(
_UNICODE_STRING *SymbolicLink,
_UNICODE_STRING *GlobalString,
INT64 a3,
UINT64 a4){
VOID **PoolWithTag;
NTSTATUS DeviceInterfaceSymbolicLinkName;
WCHAR *v8;
_UNICODE_STRING *v9;
WCHAR *v11;
WCHAR *SymbolicLinkName;
PoolWithTag = 0i64;
SymbolicLinkName = 0i64;
DeviceInterfaceSymbolicLinkName = PnpUnicodeStringToWstr((__int16 **)&SymbolicLinkName, 0i64, &SymbolicLink->Length);
if( DeviceInterfaceSymbolicLinkName < 0 )
goto LABEL_8;
PoolWithTag = ExAllocatePoolWithTag(1ui64, 0x400ui64, 538996816i64);
if( !PoolWithTag )
goto LABEL_13;
DeviceInterfaceSymbolicLinkName = CmGetDeviceInterfaceSymbolicLinkName(
v8,
SymbolicLinkName,
(UINT64)PoolWithTag,
(UINT64 *)0x200);
if( DeviceInterfaceSymbolicLinkName != -1073741789 )
goto LABEL_4;
ExFreePoolWithTag(PoolWithTag, 0);
PoolWithTag = ExAllocatePoolWithTag(1ui64, 0x400ui64, 538996816i64);
if( !PoolWithTag )
{
LABEL_13:
DeviceInterfaceSymbolicLinkName = -1073741670;
goto LABEL_8;
}
DeviceInterfaceSymbolicLinkName = CmGetDeviceInterfaceSymbolicLinkName(
v11,
SymbolicLinkName,
(UINT64)PoolWithTag,
(UINT64 *)0x200);
LABEL_4:
if( DeviceInterfaceSymbolicLinkName < 0 )
{
if( DeviceInterfaceSymbolicLinkName == -1073741773 )
DeviceInterfaceSymbolicLinkName = -1073741811;
}
else
{
DeviceInterfaceSymbolicLinkName = IopAllocateUnicodeString(GlobalString, 0x414u);
if( DeviceInterfaceSymbolicLinkName < 0 )
goto LABEL_8;
DeviceInterfaceSymbolicLinkName = RtlAppendUnicodeToString(GlobalString, (WCHAR *)L"\\GLOBAL??\\");
v9 = GlobalString;
if( DeviceInterfaceSymbolicLinkName >= 0 )
{
DeviceInterfaceSymbolicLinkName = RtlAppendUnicodeToString(GlobalString, (WCHAR *)PoolWithTag);
if( DeviceInterfaceSymbolicLinkName >= 0 )
goto LABEL_8;
v9 = GlobalString;
}
RtlFreeAnsiString(v9);
}
LABEL_8:
PnpUnicodeStringToWstrFree(SymbolicLinkName, (__int64)SymbolicLink);
if( PoolWithTag )
ExFreePoolWithTag(PoolWithTag, 0);
return DeviceInterfaceSymbolicLinkName;
}Referenced by:
IopProcessSetInterfaceState