ObpParseSymbolicLinkEx

NTSTATUS __stdcall ObpParseSymbolicLinkEx(
        PVOID ParseObject,
        PVOID ObjectType,
        ACCESS_STATE *AccessState,
        INT8 AccessMode,
        UINT64 Attributes,
        UNICODE_STRING *CompleteName,
        UNICODE_STRING *RemainingName,
        PVOID Context,
        SECURITY_QUALITY_OF_SERVICE *SecurityQos,
        _OB_EXTENDED_PARSE_PARAMETERS *ExtendedParameters,
        PVOID *Object){
  int v12; 
  UNICODE_STRING *v15; 
  int v16; 
  _OB_EXTENDED_PARSE_PARAMETERS *v17; 
  __int128 *v18; 
  unsigned int v19; 
  int Length; 
  unsigned __int16 v21; 
  UNICODE_STRING *v22; 
  unsigned __int16 MaximumLength; 
  UINT8 *PoolWithTag; 
  wchar_t *Buffer; 
  PADAPTER_OBJECT v26; 
  PVOID *v27; 
  NTSTATUS v29; 
  NTSTATUS v30; 
  __int128 v31; 
  PADAPTER_OBJECT DmaAdapter; 
  DmaAdapter = 0i64;
  v12 = *((_DWORD *)ParseObject + 7);
  v31 = 0i64;
  if( (v12 & 2) != 0 && !(unsigned __int8)RtlIsSandboxedToken((_SECURITY_SUBJECT_CONTEXT *)AccessState + 1, AccessMode) )
  {
    v30 = -1073741772;
    goto LABEL_24;
  }
  v15 = RemainingName;
  if( RemainingName->Length )
  {
    if( *RemainingName->Buffer != 92 )
    {
      v30 = -1073741788;
      goto LABEL_24;
    }
  }
  else if( ObjectType == ObpSymbolicLinkObjectType
         && ((*((_DWORD *)ParseObject + 7) & 1) == 0 || !PsIsCurrentThreadInServerSilo()) )
  {
    v29 = ObReferenceObjectByPointer(ParseObject, 0, (POBJECT_TYPE)ObjectType, AccessMode);
    v30 = v29;
    if( v29 >= 0 )
    {
      *Object = ParseObject;
LABEL_24:
      if( DmaAdapter )
        HalPutDmaAdapter(DmaAdapter);
      return v30;
    }
    if( v29 != -1073741788 )
      goto LABEL_24;
  }
  v16 = *((_DWORD *)ParseObject + 7);
  v17 = ExtendedParameters;
  if( (v16 & 8) != 0 )
  {
    ExtendedParameters->RestrictedAccessMask &= *((_DWORD *)ParseObject + 8);
    v16 = *((_DWORD *)ParseObject + 7);
  }
  if( (v16 & 4) != 0 )
  {
    v17->Silo = (_EJOB *)HalSystemVectorDispatchEntry();
    v16 = *((_DWORD *)ParseObject + 7);
  }
  v18 = (__int128 *)((char *)ParseObject + 8);
  if( (v16 & 0x10) != 0 )
  {
    v30 = (*(__int64(__fastcall **)(PVOID, _QWORD, __int128 *, PADAPTER_OBJECT *))v18)(
            ParseObject,
            *((_QWORD *)ParseObject + 2),
            &v31,
            &DmaAdapter);
    if( v30 < 0 )
      goto LABEL_24;
    v18 = &v31;
  }
  v19 = *(unsigned __int16 *)v18;
  if( *(_WORD *)v18
    && *(_WORD *)(*((_QWORD *)v18 + 1) + 2 * ((unsigned __int64)*(unsigned __int16 *)v18 >> 1) - 2) == 92
    && v15->Length
    && *v15->Buffer == 92 )
  {
    v19 -= 2;
  }
  Length = v15->Length;
  v21 = Length + v19;
  if( Length + v19 > 0xFFF0 )
  {
    v30 = -1073741562;
    goto LABEL_24;
  }
  v22 = CompleteName;
  MaximumLength = CompleteName->MaximumLength;
  if( MaximumLength <= v21 )
  {
    MaximumLength = v21 + 2;
    PoolWithTag = (UINT8 *)ExAllocatePoolWithTag(PagedPool, (unsigned __int16)(Length + v19 + 2), 0x6D4E624Fui64);
    if( !PoolWithTag )
    {
      v30 = -1073741670;
      goto LABEL_24;
    }
    LOWORD(Length) = v15->Length;
  }
  else
  {
    PoolWithTag = (UINT8 *)CompleteName->Buffer;
  }
  if( (_WORD)Length )
    memmove(&PoolWithTag[v19], (UINT8 *)v15->Buffer, (unsigned __int16)Length);
  memmove(PoolWithTag, *((UINT8 **)v18 + 1), v19);
  *(_WORD *)&PoolWithTag[2 * ((unsigned __int64)v21 >> 1)] = 0;
  Buffer = v22->Buffer;
  if( PoolWithTag != (UINT8 *)Buffer && Buffer )
    ExFreePoolWithTag(Buffer, 0);
  v26 = DmaAdapter;
  v27 = Object;
  v22->Buffer = (wchar_t *)PoolWithTag;
  v22->Length = v21;
  v22->MaximumLength = MaximumLength;
  if( v26 )
  {
    *v27 = v26;
    return 280;
  }
  else
  {
    *v27 = ParseObject;
    if( (*((_DWORD *)ParseObject + 7) & 1) != 0 )
      return 872;
    else
      return 260;
  }
}

Referenced by:

No references.