Ja, der Debugger sieht den Typ "PWideChar" und nimmt das als Nullterminiert an,
was aber egal ist, so lange doe Werte in FileName und FileNameLength korrekt sind und zusammenpassen, gehen die entsprechenden Funktionen damit "richtig" um, welche diesen Typ dann auch korrekt via Längenangabe auswerten.
Wie Assarbad schon sagte, wenn dieser Typ nicht nullterminiert ist (sein muß), dann
muß man eben auch die Längenangabe verwenden, wenn man den String auslesen will.
Neben WideCharLenToString gibt es auch noch
SetString,
aber diese brauchst du ja nur, wenn du selber diesen "String" auslesen und in einen Delphi-String umwandeln willst.
Das, was du als Zeiger an USNRecFromPointer übergibst, das wird nicht zufällig zwischendurch freigegeben, nachdem du diese Funktion aufgerufen hattest?
Der Dateiname bleibt weiterhin in der anderen Struktur und dieses USNRecFromPointer scheint nur einen Record zu erstellen, der darauf zeigt. (jedenfalls sieht die halbgezeigt Zeile Code danach aus)
Würde dann in etwa so aussehn.
SetString(S, PWideChar(NativeInt(AUSN) + AUSN.FileNameOffset), AUSN.FileNameLength div SizeOf(WideChar)); // oder einfach nur "div 2"
PS: statt NativeInt bzw. NativeUInt verwende ich lieber einen Typ IntPtr (was im Prinzip auch nur ein NativeInt ist, aber so besser anzeigt, was er machen will).