rkr35/drg

Find FNamePool NamePoolData

Closed this issue · 6 comments

rkr35 commented
Find FNamePool NamePoolData
rkr35 commented
static bool bNamePoolInitialized;
alignas(FNamePool) static uint8 NamePoolData[sizeof(FNamePool)];

// Only call this once per public FName function called
//
// Not using magic statics to run as little code as possible
static FNamePool& GetNamePool()
{
	if (bNamePoolInitialized)
	{
		return *(FNamePool*)NamePoolData;
	}

	FNamePool* Singleton = new (NamePoolData) FNamePool;
	bNamePoolInitialized = true;
	return *Singleton;
}
rkr35 commented
static FName Make(FNameStringView View, EFindName FindType, int32 InternalNumber)
{
    if (View.Len >= NAME_SIZE)
    {
        checkf(false, TEXT("FName's %d max length exceeded. Got %d characters excluding null-terminator."), NAME_SIZE - 1, View.Len);
        return FName("ERROR_NAME_SIZE_EXCEEDED");
    }
    
    FNamePool& Pool = GetNamePool();

    ...
}
rkr35 commented
if (0x3ff < uStack32) {
  local_28 = "ERROR_NAME_SIZE_EXCEEDED";
  uStack32 = 0x18;
  FUN_0107cfe0(param_1,&local_28,1);
  return param_1;
}
if (bNamePoolInitialized == false) {
  pRVar2 = FUN_0107db60((PSRWLOCK)&NamePoolData);
  bNamePoolInitialized = true;
}
else {
  pRVar2 = (PSRWLOCK)&NamePoolData;
}
rkr35 commented
0107d527 81 f9 00        CMP        param_1,0x400
            04 00 00
0107d52d 72 40           JC         LAB_0107d56f
0107d52f c7 44 24        MOV        dword ptr [RSP + local_28[8]],0x18
            28 18 00 
            00 00
0107d537 48 8d 05        LEA        RAX,[s_ERROR_NAME_SIZE_EXCEEDED_036a4898]        = "ERROR_NAME_SIZE_EXCEEDED"
            5a 73 62 02
0107d53e 48 89 44        MOV        qword ptr [RSP + local_28[0]],RAX=>s_ERROR_NAM   = "ERROR_NAME_SIZE_EXCEEDED"
            24 20
0107d543 48 8d 54        LEA        param_2=>local_28,[RSP + 0x20]
            24 20
0107d548 0f 28 44        MOVAPS     XMM0,xmmword ptr [RSP + local_28[0]]
            24 20
0107d54d 41 b8 01        MOV        R8D,0x1
            00 00 00
0107d553 48 8b cf        MOV        param_1,RDI
0107d556 66 0f 7f        MOVDQA     xmmword ptr [RSP + local_28[0]],XMM0
            44 24 20
0107d55c e8 7f fa        CALL       FUN_0107cfe0                                     undefined8 * FUN_0107cfe0(undefi
            ff ff
0107d561 48 8b c7        MOV        RAX,RDI
0107d564 48 8b 5c        MOV        RBX,qword ptr [RSP + local_res10]
            24 58
0107d569 48 83 c4 40     ADD        RSP,0x40
0107d56d 5f              POP        RDI
0107d56e c3              RET
                        LAB_0107d56f                                    XREF[1]:     0107d52d(j)  
0107d56f 80 3d 32        CMP        byte ptr [bNamePoolInitialized],0x0              = ??
            c6 71 03 00
0107d576 74 09           JZ         LAB_0107d581
0107d578 48 8d 05        LEA        RAX,[NamePoolData]                               = ??
            41 c6 71 03
0107d57f eb 13           JMP        LAB_0107d594
                        LAB_0107d581                                    XREF[1]:     0107d576(j)  
0107d581 48 8d 0d        LEA        param_1,[NamePoolData]                           = ??
            38 c6 71 03
0107d588 e8 d3 05        CALL       FUN_0107db60                                     PSRWLOCK FUN_0107db60(PSRWLOCK p
            00 00
0107d58d c6 05 14        MOV        byte ptr [bNamePoolInitialized],0x1              = ??
            c6 71 03 01
rkr35 commented
89 74 24 30 89 44 24 34 74 09 4C 8D 05 ?? ?? ?? ??

00007FF6049D0F46 | 897424 30                | mov dword ptr ss:[rsp+30],esi           |
00007FF6049D0F4A | 894424 34                | mov dword ptr ss:[rsp+34],eax           |
00007FF6049D0F4E | 74 09                    | je fsd-win64-shipping.7FF6049D0F59      |
00007FF6049D0F50 | 4C:8D05 698C7103         | lea r8,qword ptr ds:[7FF6080E9BC0]      | NamePoolData
rkr35 commented

Done in 74b1db6.