In ascii function you are calling unicode function and copying it's output (unicode string) to the ascii string buffer. This is wrong. Also because these functions deal with strings you have to implement both ascii and unicode functions at the same time. You can't forward one to the other.
Variable ps->wsz not a ascii string buffer because wsz field of struct DIPROPSTRING has type WCHAR[MAX_PATH]. Function IDirectInputDevice8::GetProperty works only with unicode strings.