Fix Debug build and script execution: Add _USE_32BIT_TIME_T, disable DEP for JIT script engine

This commit is contained in:
2025-11-30 19:12:08 +09:00
parent bd9cb3776e
commit 955e032217
7 changed files with 87 additions and 35 deletions

View File

@@ -75,12 +75,18 @@
<OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../Executable/$(Configuration)\</OutDir>
<IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../Intermediate/$(ProjectName)/$(Configuration)\</IntDir>
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>
<LocalDebuggerWorkingDirectory Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">F:\YouxiLand\ROW</LocalDebuggerWorkingDirectory>
<DebuggerFlavor Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">WindowsLocalDebugger</DebuggerFlavor>
<OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../Executable/$(Configuration)\</OutDir>
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../Intermediate/$(ProjectName)/$(Configuration)\</IntDir>
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
<LocalDebuggerWorkingDirectory Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">F:\YouxiLand\ROW</LocalDebuggerWorkingDirectory>
<DebuggerFlavor Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">WindowsLocalDebugger</DebuggerFlavor>
<OutDir Condition="'$(Configuration)|$(Platform)'=='Release_NoGD|Win32'">../../Executable/$(Configuration)\</OutDir>
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release_NoGD|Win32'">../../Intermediate/$(ProjectName)/$(Configuration)\</IntDir>
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release_NoGD|Win32'">false</LinkIncremental>
<LocalDebuggerWorkingDirectory Condition="'$(Configuration)|$(Platform)'=='Release_NoGD|Win32'">F:\YouxiLand\ROW</LocalDebuggerWorkingDirectory>
<DebuggerFlavor Condition="'$(Configuration)|$(Platform)'=='Release_NoGD|Win32'">WindowsLocalDebugger</DebuggerFlavor>
<OutDir Condition="'$(Configuration)|$(Platform)'=='Release_MY|Win32'">../../Executable/$(Configuration)\</OutDir>
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release_MY|Win32'">../../Intermediate/$(ProjectName)/$(Configuration)\</IntDir>
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release_MY|Win32'">false</LinkIncremental>
@@ -130,8 +136,8 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>$(OutDir)Client.pdb</ProgramDatabaseFile>
<SubSystem>Windows</SubSystem>
<StackReserveSize>
</StackReserveSize>
<StackReserveSize>8388608</StackReserveSize>
<DataExecutionPrevention>false</DataExecutionPrevention>
<TargetMachine>MachineX86</TargetMachine>
<EnableUAC>false</EnableUAC>
<UACExecutionLevel>HighestAvailable</UACExecutionLevel>

View File

@@ -5,7 +5,7 @@
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LocalDebuggerCommand>$(OutDir)Client.exe</LocalDebuggerCommand>
<LocalDebuggerCommand>F:\YouxiLand\ROW\Client.exe</LocalDebuggerCommand>
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
</PropertyGroup>
</Project>

View File

@@ -86,14 +86,14 @@ void File_XOR( const char * szSrcFilename, const char * szDstFilename, int keyVa
if( !infile.is_open() )
{
ErrorMessage2( "화일을 열 수 없습니다.(At File_XOR) : %s", szSrcFilename );
ErrorMessage2( "ȭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.(At File_XOR) : %s", szSrcFilename );
}
fstream outfile( szDstFilename, ios_base::out | ios_base::binary );
if( !outfile.is_open() )
{
ErrorMessage2( "화일을 열 수 없습니다.(At File_XOR) : %s", szDstFilename );
ErrorMessage2( "ȭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.(At File_XOR) : %s", szDstFilename );
}
infile.seekg( 0, ios_base::end );
@@ -119,7 +119,7 @@ void CVirtualMachine::Create( const char * szFilename )
ifstream file( szFilename, ios::binary | ios::in );
if( !file.is_open() )
ErrorMessage2( "지정한 화일을 찾을 수 없습니다. (At CVirtualMachine::Create) : %s", szFilename );
ErrorMessage2( "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȭ<><C8AD><EFBFBD><EFBFBD> ã<><C3A3> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>. (At CVirtualMachine::Create) : %s", szFilename );
file.seekg( 0, ios_base::end );
unsigned int filesize = (unsigned int)file.tellg();
@@ -132,6 +132,16 @@ void CVirtualMachine::Create( const char * szFilename )
file.read( pBuf, filesize );
Data_XOR( pBuf, filesize, xor_key_valueT );
// 복호?<3F>된 ?<3F>이?<3F><>? 로그 ?<3F><EFBFBD>??<3F>??(?<3F>버깅용)
char szLogPath[MAX_PATH];
strcpy(szLogPath, szFilename);
strcat(szLogPath, ".decrypted.log");
FILE* fpLog = fopen(szLogPath, "wb");
if (fpLog) {
fwrite(pBuf, 1, filesize, fpLog);
fclose(fpLog);
}
Create( pBuf, filesize );
delete [] pBuf;
@@ -141,7 +151,7 @@ void CVirtualMachine::Create( const char * szFilename )
ifstream file( szFilename, ios::binary | ios::in );
if( !file.is_open() )
ErrorMessage2( "지정한 화일을 찾을 수 없습니다. (At CVirtualMachine::Create) : %s", szFilename );
ErrorMessage2( "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȭ<><C8AD><EFBFBD><EFBFBD> ã<><C3A3> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>. (At CVirtualMachine::Create) : %s", szFilename );
m_pRelocation->Create( file );
@@ -277,13 +287,13 @@ void CVirtualMachine::Create( CIntermediateCode & IMCode, CSymbolTable & Symbo
m_pCodeBuffer = (char*)m_pStringBuffer + StringBufferSize;
if( IMCode.ToMachineCode( m_pCodeBuffer, m_pRelocation ) != m_iCodeSize )
ScriptSystemError( "계산된 코드 사이즈와 실제 코드 사이즈가 다릅니다.( at CVirtualMachine::Create )" );
ScriptSystemError( "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?<3F><><EFBFBD><EFBFBD> <20>ڵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><20>ٸ<EFBFBD><D9B8>ϴ<EFBFBD>.( at CVirtualMachine::Create )" );
//리로케이션
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̼<EFBFBD>
m_pRelocation->Relocate( m_pGlobalVars, m_pStringBuffer, m_pCodeBuffer );
m_bRelocated = true;
//함수 테이블 만들기
//<EFBFBD>Լ<EFBFBD> <20><><EFBFBD>̺<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>?
typedef CIntermediateCode::FUNCTABLE FUNCTABLE;
FUNCTABLE & funcTable = IMCode.GetFuncTable();
@@ -334,18 +344,18 @@ void CVirtualMachine::Destroy()
}
///////////////////////////////////////////////////////////////////////////////////
// 화일 포맷
// 1. 전역 변수 Relocation 개수(int)
// 2. 문자열 상수 Relocation 개수(int)
// 3. 전역 변수 Relocation Table
// 4. 문자열 상수 Relocation Table
// 5. 전역변수 버퍼 크기(int)
// 6. 문자열 버퍼 크기(int)
// 7. 코드 버퍼 크기(int)
// 8. 문자열 버퍼
// 9. 코드 버퍼
// 10. 함수맵 사이즈
// 11. < 문자열, 함수 타입(long), 오프셋(long) > * 사이즈
// ȭ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// 1. <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Relocation <EFBFBD><EFBFBD><EFBFBD><EFBFBD>(int)
// 2. <EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD> <20><><EFBFBD>?Relocation <EFBFBD><EFBFBD><EFBFBD><EFBFBD>(int)
// 3. <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Relocation Table
// 4. <EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD> <20><><EFBFBD>?Relocation Table
// 5. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ũ<><C5A9>(int)
// 6. <EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD> <20><><EFBFBD><EFBFBD> ũ<><C5A9>(int)
// 7. <EFBFBD>ڵ<EFBFBD> <20><><EFBFBD><EFBFBD> ũ<><C5A9>(int)
// 8. <EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD> <20><><EFBFBD><EFBFBD>
// 9. <EFBFBD>ڵ<EFBFBD> <20><><EFBFBD><EFBFBD>
// 10. <EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 11. < <EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD>, <20>Լ<EFBFBD> Ÿ<><C5B8>(long), <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(long) > * <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
///////////////////////////////////////////////////////////////////////////////////
bool CVirtualMachine::Save( const char * szFilename )
@@ -412,6 +422,31 @@ bool CVirtualMachine::Save( const char * szFilename )
void CVirtualMachine::Execute()
{
// 디버깅: 실행 전 상태 로그
FILE* fpLog = fopen("script_execute.log", "a");
if (fpLog) {
fprintf(fpLog, "=== Execute Start ===\n");
fprintf(fpLog, "m_pCodeBuffer: %p\n", m_pCodeBuffer);
fprintf(fpLog, "m_iCodeSize: %d\n", m_iCodeSize);
fprintf(fpLog, "m_pGlobalVars: %p\n", m_pGlobalVars);
fprintf(fpLog, "m_pStringBuffer: %p\n", m_pStringBuffer);
fprintf(fpLog, "m_bRelocated: %d\n", m_bRelocated);
// 코드 버퍼 첫 16바이트 덤프
if (m_pCodeBuffer && m_iCodeSize > 0) {
fprintf(fpLog, "Code buffer first 16 bytes: ");
unsigned char* p = (unsigned char*)m_pCodeBuffer;
int dumpSize = (m_iCodeSize < 16) ? m_iCodeSize : 16;
for (int i = 0; i < dumpSize; i++) {
fprintf(fpLog, "%02X ", p[i]);
}
fprintf(fpLog, "\n");
}
fprintf(fpLog, "===================\n");
fflush(fpLog);
fclose(fpLog);
}
void * pCodeBuffer = m_pCodeBuffer;
__asm call pCodeBuffer;
}
@@ -460,18 +495,18 @@ union long_byte
};
///////////////////////////////////////////////////////////////////////////////////
//Native함수를 스크립트에 바인드 하는 방식
//Native<EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD> <20><>ũ<EFBFBD><C5A9>Ʈ<EFBFBD><C6AE> <20><><EFBFBD>ε<EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD>?
//
//현재 방식 : 함수를 두 번 거치게 한다. ( 실행 속도는 좀 더 느리지만 더 간단하다. )
// 1-1. 선언만 있고, 정의가 없는 함수들만 함수 코드에서 처음 부분에 5바이트 이상의 공백(nop)를 만들어둔다.
// 1-2. RegisterFunction이 호출됐을 때 1-1에서 만들어둔 공백 부분에 call <native function> ret를 집어넣는다.
// 얼마나 느린가? 모든 함수에 nop가 2개 이상 추가되고, native call는 이중 호출이 된다.
// Empty Function을 제거한다.
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>?: <20>Լ<EFBFBD><D4BC><EFBFBD> <20><> <20><> <20><>ġ<EFBFBD><C4A1> <20>Ѵ<EFBFBD>. ( <20><><EFBFBD><EFBFBD> <20>ӵ<EFBFBD><D3B5><EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>. )
// 1-1. <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ְ<EFBFBD>, <20><><EFBFBD>ǰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD><D4BC><20>Լ<EFBFBD> <20>ڵ忡<DAB5><E5BFA1> ó<><C3B3> <20>κп<CEBA> 5<><35><EFBFBD><EFBFBD>Ʈ <20>̻<EFBFBD><CCBB><EFBFBD> <20><><EFBFBD><EFBFBD>(nop)<29><> <20><><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD>.
// 1-2. RegisterFunction<EFBFBD><EFBFBD> ȣ<><C8A3><EFBFBD><EFBFBD><EFBFBD>?<3F><> 1-1<><31><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>κп<CEBA> call <native function><EFBFBD><EFBFBD> ret<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ִ´<D6B4>?
// <EFBFBD>󸶳<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>? <20><><EFBFBD>?<3F>Լ<EFBFBD><D4BC><EFBFBD> nop<6F><70> 2<><32> <20>̻<EFBFBD> <20>߰<EFBFBD><DFB0>ǰ<EFBFBD>, native call<6C><6C> <20><><EFBFBD><EFBFBD> ȣ<><C8A3><EFBFBD><EFBFBD> <20>ȴ<EFBFBD>.
// Empty Function<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
//
//다른 대안 : 등록하려는 함수를 호출하는 모든 부분의 함수 주소를 바꾼다.( 실행 속도는 빠르나 복잡하다. )
// 2-1. 모든 함수 호출 부분을 Relocation Table처럼 call table에 저장해둔다.
// 2-2. RegisterFunction이 호출되었을 때 call table을 참조해서 call하고 있는 부분을 전부 바꾼다.
// call table? map< string, pair< SFuncType, vector<int> > >
//<EFBFBD>ٸ<EFBFBD> <20><><EFBFBD>?: <20><><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD>?<3F>Լ<EFBFBD><D4BC><EFBFBD> ȣ<><C8A3><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD>?<3F>κ<EFBFBD><CEBA><EFBFBD> <20>Լ<EFBFBD> <20>ּҸ<D6BC> <20>ٲ۴<D9B2>.( <20><><EFBFBD><EFBFBD> <20>ӵ<EFBFBD><D3B5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>. )
// 2-1. <EFBFBD><EFBFBD><EFBFBD>?<3F>Լ<EFBFBD> ȣ<><C8A3> <20>κ<EFBFBD><CEBA><EFBFBD> Relocation Tableó<EFBFBD><EFBFBD> call table<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>صд<D8B5>.
// 2-2. RegisterFunction<EFBFBD><EFBFBD> ȣ<><C8A3>Ǿ<EFBFBD><C7BE><EFBFBD>?<3F><> call table<6C><65> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> call<6C>ϰ<EFBFBD> <20>ִ<EFBFBD> <20>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ٲ۴<D9B2>.
// call table<EFBFBD><EFBFBD>? map< string, pair< SFuncType, vector<int> > >
///////////////////////////////////////////////////////////////////////////////////
@@ -490,9 +525,9 @@ void CVirtualMachine::RegisterFunction( ANY_FUNCTION FuncPtr, eDataType return
byte * pFunc = (byte*)GetFuncPtr( *m_pFunctionMap, szFuncName, funcType );
if( pFunc == NULL )
ErrorMessage2( "함수 등록에 실패했습니다. 함수를 찾을 수 없었습니다. : %s", funcType.ToString( szFuncName ) );
ErrorMessage2( "<EFBFBD>Լ<EFBFBD> <20><>Ͽ<EFBFBD>?<3F><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>. <20>Լ<EFBFBD><D4BC><EFBFBD> ã<><C3A3> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>. : %s", funcType.ToString( szFuncName ) );
if( pFunc[3] != 0x90 ) //nop가 아닐 때
if( pFunc[3] != 0x90 ) //nop<EFBFBD><EFBFBD> <20>ƴ<EFBFBD> <20><>
ScriptSystemError( "RegisterFunction Error!!( at CVirtualMachine::RegisterFunction )" );
int nArg = funcType.GetArgCount();
@@ -528,7 +563,7 @@ ScriptFunc CVirtualMachine::GetScriptFunction( eDataType returnType, const char
void * pFunc = GetFuncPtr( *m_pFunctionMap, szFuncName, funcType );
if( pFunc == NULL )
ErrorMessage2( "스크립트 함수를 얻어오는데 실패했습니다. 함수를 찾을 수 없었습니다. : %s", funcType.ToString( szFuncName ) );
ErrorMessage2( "<EFBFBD><EFBFBD>ũ<EFBFBD><EFBFBD>Ʈ <20>Լ<EFBFBD><D4BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>. <20>Լ<EFBFBD><D4BC><EFBFBD> ã<><C3A3> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>. : %s", funcType.ToString( szFuncName ) );
return ScriptFunc( pFunc, funcType.m_data );
}

View File

@@ -1,3 +1,4 @@
echo copy file
copy *.* S:\YouxiLand\ROW
copy *.* F:\YouxiLand\ROW
pause

BIN
Game/Client.exe Normal file

Binary file not shown.

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>