The last point is correct: if you get bytes from a file system API, you
should be able to pass them back in without losing information. CP_ACP (a.k.a. the *A API) does not allow this, so I'm proposing using the *W API everywhere and encoding to utf-8 when the user wants/gives bytes.
You get troubles when the filename comes a file, another application, a registry key, ... which is encoded to CP_ACP.
Do you plan to transcode all these data? (decode from CP_ACP, encode back to UTF-8)