IopCheckTopDeviceHint

INT64 __fastcall IopCheckTopDeviceHint(
        _DEVICE_OBJECT **TargetDeviceObject,
        _OPEN_PACKET *Op,
        const _UNICODE_STRING *DirectDeviceOpen,
        const _UNICODE_STRING *RemainingName){
  _DEVICE_OBJECT *v4; 
  unsigned __int64 v8; 
  __int64 v9; 
  struct _ECP_LIST *ExtraCreateParameter; 
  char *v12; 
  UNICODE_STRING *v13; 
  unsigned int InternalFlags; 
  PVOID EcpContext; 
  v4 = *TargetDeviceObject;
  if( (_BYTE)DirectDeviceOpen )
    return 3221225485i64;
  v8 = *((unsigned int *)v4 + 18);
  if( (unsigned int)v8 > 0x35 )
    return 3221225485i64;
  v9 = 0x20000100121108i64;
  if( !_bittest64(&v9, v8) )
    return 3221225485i64;
  if( IopVerifyDeviceObjectOnStack(v4, (_DEVICE_OBJECT *)Op->DriverCreateContext.DeviceObjectHint, 1u) )
  {
    *TargetDeviceObject = (_DEVICE_OBJECT *)Op->DriverCreateContext.DeviceObjectHint;
    return 0i64;
  }
  ExtraCreateParameter = Op->DriverCreateContext.ExtraCreateParameter;
  if( ExtraCreateParameter )
  {
    EcpContext = 0i64;
    if( FsRtlFindExtraCreateParameter(ExtraCreateParameter, &GUID_ECP_IO_DEVICE_HINT, &EcpContext, 0i64) >= 0 )
    {
      v12 = (char *)EcpContext;
      if( *((_WORD *)EcpContext + 5) < RemainingName->Length )
      {
        *((_WORD *)EcpContext + 4) = RemainingName->Length;
        return 3221226646i64;
      }
      ObfReferenceObject(v4);
      *(_QWORD *)v12 = v4;
      RtlCopyUnicodeString((UNICODE_STRING *)(v12 + 8), (UNICODE_STRING *)RemainingName, v13);
      *((_DWORD *)v12 - 6) |= 8u;
    }
  }
  InternalFlags = Op->InternalFlags;
  if( (InternalFlags & 0x10) == 0 )
    return 3221226345i64;
  Op->InternalFlags = InternalFlags & 0xFFFFFFEF;
  return 3221226344i64;
}

Referenced by:

IopParseDevice