I don't know how it works with gdi, for directwrite there is GetVerticalGlyphVariants() that uses first 'vert' feature it finds, it does not have script/lang arguments. When it goes through full shaping, similar to ScriptShapeOpenType(), it will likely prioritize for given script/language.