I'm sorry for reviving an older thread on my first post, but I've been looking for an up-to-date address for the name storage for a while. Thank you very much SillyBoy72 
Oh, sorry... Where are my manners? Here is a copy of the original function posted, but in C#
Code:
public unsafe string NameFromGuid(ulong guid)
{
const ulong nameStorePtr = 0x011AE3D0 + 0x8; // Player name database
const ulong nameMaskOffset = 0x024; // Offset for the mask used with GUID to select a linked list
const ulong nameBaseOffset = 0x01c; // Offset for the start of the name linked list
const ulong nameStringOffset = 0x020; // Offset to the C string in a name structure
ulong mask, base_, offset, current, shortGUID, testGUID;
mask = Kernel32.ReadUInt32(WowProcessHandle, (IntPtr)(nameStorePtr + nameMaskOffset), true);
base_ = Kernel32.ReadUInt32(WowProcessHandle, (IntPtr)(nameStorePtr + nameBaseOffset), true);
shortGUID = guid & 0xffffffff; // Only half the guid is used to check for a hit
offset = 12 * (mask & shortGUID); // select the appropriate linked list
current = Kernel32.ReadUInt32(WowProcessHandle, (IntPtr)(base_ + offset + 8), true);
offset = Kernel32.ReadUInt32(WowProcessHandle, (IntPtr)(base_ + offset), true); // next-4 ?
//current == 0 || (current & 0x1)
if ((current & 0x1) == 0x1) { return "";}
testGUID = Kernel32.ReadUInt32(WowProcessHandle, (IntPtr)(current), true);
while (testGUID != shortGUID)
{
current = Kernel32.ReadUInt32(WowProcessHandle, (IntPtr)(current + offset + 4), true);
if ((current & 0x1) == 0x1) { return ""; }
testGUID = Kernel32.ReadUInt32(WowProcessHandle, (IntPtr)(current), true);
}
// Found the guid in the name list...
//ReadBytesIntoBuffer(current + nameStringOffset, numBytes, name);
return Kernel32.ReadString(WowProcessHandle, (IntPtr)(current + nameStringOffset), true);
}