IopCheckTopDeviceHint

NTSTATUS __stdcall IopCheckTopDeviceHint(
        _DEVICE_OBJECT **TargetDeviceObject,
        _OPEN_PACKET *Op,
        UINT8 DirectDeviceOpen,
        _UNICODE_STRING *RemainingName){
  _DEVICE_OBJECT *v4; 
  unsigned __int64 DeviceType; 
  __int64 v9; 
  char v10; 
  _ECP_LIST *ExtraCreateParameter; 
  char *v13; 
  unsigned int InternalFlags; 
  PVOID EcpContext; 

  v4 = *TargetDeviceObject;
  if( DirectDeviceOpen )
    return -1073741811;
  DeviceType = v4->DeviceType;
  if( (unsigned int)DeviceType > 0x35 )
    return -1073741811;
  v9 = 0x20000100121108i64;
  if( !_bittest64(&v9, DeviceType) )
    return -1073741811;
  IopVerifyDeviceObjectOnStack(v4, (_DEVICE_OBJECT *)Op->DriverCreateContext.DeviceObjectHint, 1u);
  if( v10 )
  {
    *TargetDeviceObject = (_DEVICE_OBJECT *)Op->DriverCreateContext.DeviceObjectHint;
    return 0;
  }
  ExtraCreateParameter = Op->DriverCreateContext.ExtraCreateParameter;
  if( ExtraCreateParameter )
  {
    EcpContext = 0i64;
    if( FsRtlFindExtraCreateParameter(ExtraCreateParameter, &GUID_ECP_IO_DEVICE_HINT, &EcpContext, 0i64) >= 0 )
    {
      v13 = (char *)EcpContext;
      if( *((_WORD *)EcpContext + 5) < RemainingName->Length )
      {
        *((_WORD *)EcpContext + 4) = RemainingName->Length;
        return -1073740650;
      }
      ObfReferenceObject(v4);
      *(_QWORD *)v13 = v4;
      RtlCopyUnicodeString((PUNICODE_STRING)(v13 + 8), RemainingName);
      *((_DWORD *)v13 - 6) |= 8u;
    }
  }
  InternalFlags = Op->InternalFlags;
  if( (InternalFlags & 0x10) == 0 )
    return -1073740951;
  Op->InternalFlags = InternalFlags & 0xFFFFFFEF;
  return -1073740952;
}

Referenced by:

IopParseDevice