ObpCreateSymbolicLinkName
void __fastcall ObpCreateSymbolicLinkName(__int64 a1){
__int64 v1;
char v2;
__int64 v4;
UINT16 *v5;
UINT16 v6;
CHAR **v7;
__int16 v8;
char v9;
char v10;
_EJOB *CurrentSilo;
CHAR *v12;
UNICODE_STRING v13;
__int64 *CurrentServerSiloGlobals;
CHAR *v15;
unsigned __int16 Length;
wchar_t *v17;
wchar_t *Buffer;
char *v19;
char *v20;
_OBJECT_TYPE *v21;
char v22;
__int64 v23;
unsigned int v24;
_ETHREAD *CurrentThread;
__int64 v26;
int v27;
bool v28;
UNICODE_STRING v29;
UNICODE_STRING v30;
INT64 v31[2];
__int64 v32;
int v33;
__int16 v34;
__int16 v35;
int v36;
int v37;
int v39;
CHAR *v40;
PADAPTER_OBJECT DmaAdapter;
v1 = a1 - 48;
v32 = 0i64;
v2 = *(_BYTE *)(a1 - 48 + 26);
v33 = 0;
v34 = 0;
v39 = 64;
v37 = 0;
if( (v2 & 2) != 0 )
v4 = v1 - *((unsigned __int8 *)ObpInfoMaskToOffset + (v2 & 3));
else
v4 = 0i64;
if( !v4 )
return;
if( !*(_QWORD *)(*(_QWORD *)v4 + 304i64) )
return;
if( *(_WORD *)(v4 + 8) != 4 )
return;
v5 = *(UINT16 **)(v4 + 16);
if( v5[1] != 58 )
return;
v6 = NLS_UPCASE(*v5);
if( (unsigned __int16)(v6 - 65) > 0x19u )
return;
v35 = v8;
*(_DWORD *)(a1 + 24) = v6 - 64;
v9 = v8;
v10 = v8;
v40 = *v7;
*(_OWORD *)v31 = 0i64;
v36 = -60876;
CurrentSilo = PsGetCurrentSilo();
DmaAdapter = (PADAPTER_OBJECT)OBP_GET_SILO_ROOT_DIRECTORY_FROM_SILO((__int64)CurrentSilo);
v12 = (CHAR *)DmaAdapter;
ObfReferenceObject(DmaAdapter);
v13 = *(UNICODE_STRING *)(a1 + 8);
v29 = v13;
CurrentServerSiloGlobals = PsGetCurrentServerSiloGlobals();
while( 1 )
{
v15 = v12;
if( (_mm_cvtsi128_si32(_mm_srli_si128((__m128i)v13, 8)) & 7) != 0 || !*(_QWORD *)*CurrentServerSiloGlobals )
{
Length = v29.Length;
LABEL_48:
Buffer = v29.Buffer;
goto LABEL_15;
}
Length = _mm_cvtsi128_si32((__m128i)v13);
v29.Length = Length;
if( Length < 8u )
goto LABEL_48;
v17 = (wchar_t *)_mm_srli_si128((__m128i)v13, 8).m128i_u64[0];
Buffer = v17;
if( *(_QWORD *)v17 == ObpDosDevicesShortNamePrefix )
{
Buffer = v17 + 4;
Length -= 8;
v29.Buffer = v17 + 4;
v29.Length = Length;
v15 = *(CHAR **)*CurrentServerSiloGlobals;
v13 = v29;
}
while( 1 )
{
LABEL_15:
if( *Buffer == 92 )
{
++Buffer;
Length -= 2;
v29.Buffer = Buffer;
v29.Length = Length;
v13 = v29;
}
v30 = v13;
if( Length )
{
do
{
if( *Buffer == 92 )
break;
++Buffer;
v28 = Length == 2;
Length -= 2;
v29.Length = Length;
}
while( !v28 );
v29.Buffer = Buffer;
v13 = v29;
}
v30.Length -= Length;
if( !v30.Length )
goto LABEL_42;
if( v15 == v40 )
{
v35 = 257;
}
else
{
v9 = 0;
v10 = 0;
}
v19 = (char *)ObpLookupDirectoryEntryEx(v15, &v30, 0, 0, 0, (INT64)v31);
v20 = v19;
if( v15 == v40 )
{
LOBYTE(v35) = v9;
HIBYTE(v35) = v10;
}
else
{
v10 = HIBYTE(v35);
v9 = v35;
}
if( !v19 )
goto LABEL_30;
v21 = (_OBJECT_TYPE *)ObTypeIndexTable[(unsigned __int8)ObHeaderCookie ^ (unsigned __int8)*(v19 - 24) ^ (unsigned __int64)(unsigned __int8)((unsigned __int16)((_WORD)v19 - 48) >> 8)];
if( v21 != ObpDirectoryObjectType )
break;
v15 = v20;
}
if( v21 != ObpSymbolicLinkObjectType || *((_DWORD *)v20 + 6) )
break;
if( !v39 )
{
v20 = 0i64;
break;
}
v13 = *(UNICODE_STRING *)(v20 + 8);
v12 = (CHAR *)DmaAdapter;
--v39;
v29 = v13;
}
LABEL_30:
v22 = 1;
v23 = *(_QWORD *)(*(_QWORD *)(v1 - *((unsigned __int8 *)ObpInfoMaskToOffset + (*(_BYTE *)(v1 + 26) & 3))) + 304i64);
if( v20
&& ObTypeIndexTable[(unsigned __int8)ObHeaderCookie ^ (unsigned __int8)*(v20 - 24) ^ (unsigned __int64)(unsigned __int8)((unsigned __int16)((_WORD)v20 - 48) >> 8)] == IoDeviceObjectType )
{
v24 = *((_DWORD *)v20 + 18);
if( v24 <= 0x13 )
{
if( v24 < 0x12 )
{
if( v24 < 2 )
goto LABEL_44;
if( v24 <= 3 )
{
v22 = 5;
goto LABEL_39;
}
if( v24 <= 6 )
goto LABEL_44;
if( v24 <= 9 )
{
v22 = ((*((_DWORD *)v20 + 13) & 1) == 0) + 2;
goto LABEL_39;
}
v28 = v24 == 16;
LABEL_59:
if( v28 )
goto LABEL_60;
LABEL_44:
v22 = 0;
goto LABEL_39;
}
LABEL_60:
v22 = 4;
goto LABEL_39;
}
if( v24 == 20 )
goto LABEL_60;
if( v24 != 36 )
{
v28 = v24 == 40;
goto LABEL_59;
}
v22 = 6;
}
LABEL_39:
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 243);
ExAcquirePushLockExclusiveEx((UINT64)(CurrentServerSiloGlobals + 15), 0i64);
v26 = (unsigned int)(*(_DWORD *)(a1 + 24) - 1);
v27 = 1 << (*(_BYTE *)(a1 + 24) - 1);
*(_BYTE *)(v26 + v23 + 32) = v22;
*(_DWORD *)(v23 + 28) |= v27;
if( v23 == *CurrentServerSiloGlobals )
*((_DWORD *)CurrentServerSiloGlobals + 2) |= v27;
else
++*((_DWORD *)CurrentServerSiloGlobals + v26 + 3);
ExReleasePushLockEx((UINT64)(CurrentServerSiloGlobals + 15), 0i64);
KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
LABEL_42:
ObpReleaseLookupContext((INT64)v31);
HalPutDmaAdapter(DmaAdapter);
}Referenced by:
ObpCreateHandle