IopDeviceObjectFromSymbolicName
_DEVICE_OBJECT *__stdcall IopDeviceObjectFromSymbolicName(_UNICODE_STRING *SymbolicLinkName){
_DEVICE_OBJECT *v1;
VOID **PoolWithTag;
WCHAR *v4;
NTSTATUS ObjectProperty;
_UNICODE_STRING DestinationString;
INT64 v8;
INT64 v9;
v1 = 0i64;
LODWORD(v8) = 0;
v9 = 0i64;
DestinationString = 0i64;
if( SymbolicLinkName )
{
if( SymbolicLinkName->Buffer )
{
if( SymbolicLinkName->Length )
{
if( (int)PnpUnicodeStringToWstr((__int16 **)&v9, 0i64, &SymbolicLinkName->Length) >= 0 )
{
PoolWithTag = ExAllocatePoolWithTag(1ui64, 0x190ui64, 1198550608i64);
v4 = (WCHAR *)PoolWithTag;
if( PoolWithTag )
{
ObjectProperty = PnpGetObjectProperty(
*(&stru_140CF2E80 + 1214),
v9,
3i64,
0i64,
0i64,
(INT64)&DEVPKEY_Device_InstanceId,
(INT64)&v8,
(INT64)PoolWithTag);
PnpUnicodeStringToWstrFree((void *)v9, (__int64)SymbolicLinkName);
if( ObjectProperty >= 0 && (_DWORD)v8 == 18 && RtlInitUnicodeStringEx(&DestinationString, v4) >= 0 )
v1 = (_DEVICE_OBJECT *)PnpDeviceObjectFromDeviceInstanceWithTag((__int64)&DestinationString, 0x746C6644u);
ExFreePoolWithTag(v4, 0x47706E50u);
}
}
}
}
}
return v1;
}Referenced by:
IopGetSessionIdFromSymbolicName