I am sure the following has a rational explanation but I am nevertheless a bit baffled.
The issue is with a function which creates a _TCHAR[CONSTANT], a _TCHAR*, concatenates them and returns the result.
For some reason the call to whatTheHeck() from _tmain() returns gibberish. 
_TCHAR* whatTheHeck(_TCHAR* name) {
    _TCHAR Buffer[BUFSIZE];
    DWORD dwRet;
    dwRet = GetCurrentDirectory(BUFSIZE, Buffer);
    _TCHAR* what = new _TCHAR[BUFSIZE];
    what = _tcscat(Buffer, TEXT("\\"));
    what = _tcscat(what, name);
    return what;
}
int _tmain(int argc, _TCHAR* argv[]) {
    _TCHAR* failure = whatTheHeck(TEXT("gibberish);")); // not again ..
    _tprintf(TEXT("|--> %s\n"), failure);
    _TCHAR* success = createFileName(TEXT("readme.txt")); // much better
    _tprintf(TEXT("|--> %s\n"), success);
    return 0;
}
In contrast, when going with heap things work as expected.
_TCHAR* createFileName(_TCHAR* name) {
    _TCHAR* Buffer = new _TCHAR[BUFSIZE];
    DWORD dwRet;
    dwRet = GetCurrentDirectory(BUFSIZE, Buffer);
    Buffer = _tcscat(Buffer, TEXT("\\"));
    Buffer = _tcscat(Buffer, name);
    return Buffer;
}
Why the difference?
Is it because _tcscat() concatenates memory addresses instead of their contents and return purges the stack?
There are lots of problems with your code. Let's take it apart, shall we:
_TCHAR* whatTheHeck(_TCHAR* name)   // We're inside a local scope
{
    _TCHAR Buffer[BUFSIZE];         // "Buffer" has automatic storage
    _TCHAR* what = new _TCHAR[BUFSIZE];  // "what" points to newly allocated dyn. memory
    what = _tcscat(Buffer, TEXT("\\"));  // Oh no, we overwrite "what" - leak!
                                         // Now what == Buffer.
    what = _tcscat(what, name);  // Equivalent to "_tcscat(Buffer, name)"
    return Buffer;               // WTPF? We're returning a local automatic!
 }
As you can see, you are both causing a memory leak with a gratuitious and reckless new, and you are also returning the address of a local object past its lifetime!
I would strongly recommmend
strcat and understanding "source" and "destination",strcat, but a safer version like strncat,strncat, but instead std::string.That happens because _tcscat concatenates into the destination parameter, which is the first one, and then returns it. So, it returns a pointer to the array Buffer and it gets stored in what in this line:
what = _tcscat(Buffer, TEXT("\\"));
Then this pointer is returned, and you have undefined behavior once you try to use it, because the local Buffer no longer exists.
Furthermore, the line above also causes the memory allocated for what to be leaked:
_TCHAR* what = new _TCHAR[BUFSIZE];
what = _tcscat(Buffer, TEXT("\\")); // this loses the memory allocated
                                    // in the previous line
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With