29 #include "../../idlib/precompiled.h"
42 #include <sys/types.h>
46 #include "../sys_local.h"
49 #include "../../renderer/tr_local.h"
85 stats = exeLaunchMemoryStats;
96 (LPTHREAD_START_ROUTINE)
function,
107 if ( *thread_count < MAX_THREADS ) {
108 threads[(*thread_count)++] = &info;
140 int id = GetCurrentThreadId();
142 if (
id == g_threads[
i]->threadId ) {
146 return g_threads[
i]->
name;
205 #pragma optimize( "", on )
210 static unsigned int debug_total_alloc = 0;
211 static unsigned int debug_total_alloc_count = 0;
212 static unsigned int debug_current_alloc = 0;
213 static unsigned int debug_current_alloc_count = 0;
214 static unsigned int debug_frame_alloc = 0;
215 static unsigned int debug_frame_alloc_count = 0;
221 typedef struct CrtMemBlockHeader
223 struct _CrtMemBlockHeader *pBlockHeaderNext;
224 struct _CrtMemBlockHeader *pBlockHeaderPrev;
242 int Sys_AllocHook(
int nAllocType,
void *pvData,
size_t nSize,
int nBlockUse,
long lRequest,
const unsigned char * szFileName,
int nLine )
244 CrtMemBlockHeader *pHead;
247 if ( nBlockUse == _CRT_BLOCK )
253 temp = (
byte * )pvData;
255 pHead = ( CrtMemBlockHeader * )temp;
257 switch( nAllocType ) {
259 debug_total_alloc += nSize;
260 debug_current_alloc += nSize;
261 debug_frame_alloc += nSize;
262 debug_total_alloc_count++;
263 debug_current_alloc_count++;
264 debug_frame_alloc_count++;
268 assert( pHead->gap[0] == 0xfd && pHead->gap[1] == 0xfd && pHead->gap[2] == 0xfd && pHead->gap[3] == 0xfd );
270 debug_current_alloc -= pHead->nDataSize;
271 debug_current_alloc_count--;
272 debug_total_alloc_count++;
273 debug_frame_alloc_count++;
277 assert( pHead->gap[0] == 0xfd && pHead->gap[1] == 0xfd && pHead->gap[2] == 0xfd && pHead->gap[3] == 0xfd );
279 debug_current_alloc -= pHead->nDataSize;
280 debug_total_alloc += nSize;
281 debug_current_alloc += nSize;
282 debug_frame_alloc += nSize;
283 debug_total_alloc_count++;
284 debug_current_alloc_count--;
285 debug_frame_alloc_count++;
296 void Sys_DebugMemory_f(
void ) {
297 common->
Printf(
"Total allocation %8dk in %d blocks\n", debug_total_alloc / 1024, debug_total_alloc_count );
298 common->
Printf(
"Current allocation %8dk in %d blocks\n", debug_current_alloc / 1024, debug_current_alloc_count );
306 void Sys_MemFrame(
void ) {
307 if( sys_showMallocs.GetInteger() ) {
308 common->
Printf(
"Frame: %8dk in %5d blocks\n", debug_frame_alloc / 1024, debug_frame_alloc_count );
311 debug_frame_alloc = 0;
312 debug_frame_alloc_count = 0;
340 va_start( argptr, error );
358 if ( !GetMessage( &msg,
NULL, 0, 0 ) ) {
361 TranslateMessage( &msg );
362 DispatchMessage( &msg );
388 #define MAXPRINTMSG 4096
393 va_start(argptr, fmt);
396 msg[
sizeof(msg)-1] =
'\0';
411 #define MAXPRINTMSG 4096
416 va_start( argptr, fmt );
418 msg[
sizeof(msg)-1 ] =
'\0';
433 msg[
sizeof(msg)-1 ] =
'\0';
453 ::ShowWindow( win32.
hWnd, show ? SW_SHOW : SW_HIDE );
462 return ( ::IsWindowVisible( win32.
hWnd ) != 0 );
481 _fstat( _fileno( fp ), &st );
482 return (
long) st.st_mtime;
493 _getcwd( cwd,
sizeof( cwd ) - 1 );
533 GetModuleFileName(
NULL, exe,
sizeof( exe ) - 1 );
544 struct _finddata_t findinfo;
553 if ( extension[0] ==
'/' && extension[1] == 0 ) {
560 sprintf( search,
"%s\\*%s", directory, extension );
565 findhandle = _findfirst( search, &findinfo );
566 if ( findhandle == -1 ) {
571 if ( flag ^ ( findinfo.attrib & _A_SUBDIR ) ) {
572 list.
Append( findinfo.name );
574 }
while ( _findnext( findhandle, &findinfo ) != -1 );
576 _findclose( findhandle );
591 if ( OpenClipboard(
NULL ) != 0 ) {
594 if ( ( hClipboardData = GetClipboardData( CF_TEXT ) ) != 0 ) {
595 if ( ( cliptext = (
char *)GlobalLock( hClipboardData ) ) != 0 ) {
596 data = (
char *)
Mem_Alloc( GlobalSize( hClipboardData ) + 1 );
597 strcpy( data, cliptext );
598 GlobalUnlock( hClipboardData );
600 strtok( data,
"\n\r\b" );
618 HMem = (
char *)::GlobalAlloc( GMEM_MOVEABLE | GMEM_DDESHARE, strlen(
string ) + 1 );
619 if ( HMem ==
NULL ) {
623 PMem = (
char *)::GlobalLock( HMem );
624 if ( PMem ==
NULL ) {
628 lstrcpy( PMem,
string );
630 ::GlobalUnlock( HMem );
632 if ( !OpenClipboard( 0 ) ) {
633 ::GlobalFree( HMem );
639 SetClipboardData( CF_TEXT, HMem );
660 libHandle = LoadLibrary( dllName );
664 GetModuleFileName( libHandle, loadedPath,
sizeof( loadedPath ) - 1 );
666 Sys_Printf(
"ERROR: LoadLibrary '%s' wants to load '%s'\n", dllName, loadedPath );
671 return (
int)libHandle;
680 return GetProcAddress( (HINSTANCE)dllHandle, procName );
692 if ( FreeLibrary( (HINSTANCE)dllHandle ) == 0 ) {
693 int lastError = GetLastError();
696 FORMAT_MESSAGE_ALLOCATE_BUFFER,
699 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
704 Sys_Error(
"Sys_DLL_Unload: FreeLibrary failed - %s (%d)", lpMsgBuf, lastError );
716 #define MAX_QUED_EVENTS 256
717 #define MASK_QUED_EVENTS ( MAX_QUED_EVENTS - 1 )
765 while( PeekMessage( &msg,
NULL, 0, 0, PM_NOREMOVE ) ) {
766 if ( !GetMessage( &msg,
NULL, 0, 0 ) ) {
778 #ifdef ID_ALLOW_TOOLS
784 TranslateMessage (&msg);
785 DispatchMessage (&msg);
795 static int entered =
false;
815 len = strlen( s ) + 1;
830 eventHead = eventTail = 0;
842 if ( eventHead > eventTail ) {
848 memset( &ev, 0,
sizeof( ev ) );
883 int r = WaitForSingleObject( hTimer, 100 );
884 if ( r != WAIT_OBJECT_0 ) {
892 int deltaTime = msec - startTime;
896 sprintf( str,
"%i ", deltaTime );
914 hTimer = CreateWaitableTimer(
NULL,
false,
NULL );
916 common->
Error(
"idPacketServer::Spawn: CreateWaitableTimer failed" );
920 t.HighPart = t.LowPart = 0;
925 #ifdef SET_THREAD_AFFINITY
946 if ( ::GetLastError() == ERROR_ALREADY_EXISTS || ::GetLastError() == ERROR_ACCESS_DENIED ) {
961 #define OSR2_BUILD_NUMBER 1111
962 #define WIN98_BUILD_NUMBER 1998
966 CoInitialize(
NULL );
970 timeBeginPeriod( 1 );
993 if ( !GetVersionEx( (LPOSVERSIONINFO)&win32.
osversion ) )
996 if ( win32.
osversion.dwMajorVersion < 4 ) {
999 if ( win32.
osversion.dwPlatformId == VER_PLATFORM_WIN32s ) {
1003 if( win32.
osversion.dwPlatformId == VER_PLATFORM_WIN32_NT ) {
1004 if( win32.
osversion.dwMajorVersion <= 4 ) {
1006 }
else if( win32.
osversion.dwMajorVersion == 5 && win32.
osversion.dwMinorVersion == 0 ) {
1008 }
else if( win32.
osversion.dwMajorVersion == 5 && win32.
osversion.dwMinorVersion == 1 ) {
1010 }
else if ( win32.
osversion.dwMajorVersion == 6 ) {
1015 }
else if( win32.
osversion.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS ) {
1018 if( win32.
osversion.szCSDVersion[1] ==
'C' ) {
1023 }
else if( win32.
osversion.dwMajorVersion == 4 && win32.
osversion.dwMinorVersion == 10 ) {
1025 if( win32.
osversion.szCSDVersion[1] ==
'A' ) {
1030 }
else if( win32.
osversion.dwMajorVersion == 4 && win32.
osversion.dwMinorVersion == 90 ) {
1053 string +=
"AMD CPU";
1055 string +=
"Intel CPU";
1057 string +=
"unsupported CPU";
1059 string +=
"generic CPU";
1067 string +=
"3DNow! & ";
1073 string +=
"SSE2 & ";
1076 string +=
"SSE3 & ";
1081 string.StripTrailing(
" & " );
1082 string.StripTrailing(
" with " );
1091 if ( token.
Icmp(
"generic" ) == 0 ) {
1093 }
else if ( token.
Icmp(
"intel" ) == 0 ) {
1095 }
else if ( token.
Icmp(
"amd" ) == 0 ) {
1097 }
else if ( token.
Icmp(
"mmx" ) == 0 ) {
1099 }
else if ( token.
Icmp(
"3dnow" ) == 0 ) {
1101 }
else if ( token.
Icmp(
"sse" ) == 0 ) {
1103 }
else if ( token.
Icmp(
"sse2" ) == 0 ) {
1105 }
else if ( token.
Icmp(
"sse3" ) == 0 ) {
1107 }
else if ( token.
Icmp(
"htt" ) == 0 ) {
1191 VirtualProtect(
_chkstk, 6, PAGE_EXECUTE_READWRITE, &old );
1205 case EXCEPTION_ACCESS_VIOLATION:
return "The thread tried to read from or write to a virtual address for which it does not have the appropriate access.";
1206 case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
return "The thread tried to access an array element that is out of bounds and the underlying hardware supports bounds checking.";
1207 case EXCEPTION_BREAKPOINT:
return "A breakpoint was encountered.";
1208 case EXCEPTION_DATATYPE_MISALIGNMENT:
return "The thread tried to read or write data that is misaligned on hardware that does not provide alignment. For example, 16-bit values must be aligned on 2-byte boundaries; 32-bit values on 4-byte boundaries, and so on.";
1209 case EXCEPTION_FLT_DENORMAL_OPERAND:
return "One of the operands in a floating-point operation is denormal. A denormal value is one that is too small to represent as a standard floating-point value.";
1210 case EXCEPTION_FLT_DIVIDE_BY_ZERO:
return "The thread tried to divide a floating-point value by a floating-point divisor of zero.";
1211 case EXCEPTION_FLT_INEXACT_RESULT:
return "The result of a floating-point operation cannot be represented exactly as a decimal fraction.";
1212 case EXCEPTION_FLT_INVALID_OPERATION:
return "This exception represents any floating-point exception not included in this list.";
1213 case EXCEPTION_FLT_OVERFLOW:
return "The exponent of a floating-point operation is greater than the magnitude allowed by the corresponding type.";
1214 case EXCEPTION_FLT_STACK_CHECK:
return "The stack overflowed or underflowed as the result of a floating-point operation.";
1215 case EXCEPTION_FLT_UNDERFLOW:
return "The exponent of a floating-point operation is less than the magnitude allowed by the corresponding type.";
1216 case EXCEPTION_ILLEGAL_INSTRUCTION:
return "The thread tried to execute an invalid instruction.";
1217 case EXCEPTION_IN_PAGE_ERROR:
return "The thread tried to access a page that was not present, and the system was unable to load the page. For example, this exception might occur if a network connection is lost while running a program over the network.";
1218 case EXCEPTION_INT_DIVIDE_BY_ZERO:
return "The thread tried to divide an integer value by an integer divisor of zero.";
1219 case EXCEPTION_INT_OVERFLOW:
return "The result of an integer operation caused a carry out of the most significant bit of the result.";
1220 case EXCEPTION_INVALID_DISPOSITION:
return "An exception handler returned an invalid disposition to the exception dispatcher. Programmers using a high-level language such as C should never encounter this exception.";
1221 case EXCEPTION_NONCONTINUABLE_EXCEPTION:
return "The thread tried to continue execution after a noncontinuable exception occurred.";
1222 case EXCEPTION_PRIV_INSTRUCTION:
return "The thread tried to execute an instruction whose operation is not allowed in the current machine mode.";
1223 case EXCEPTION_SINGLE_STEP:
return "A trace trap or other single-instruction mechanism signaled that one instruction has been executed.";
1224 case EXCEPTION_STACK_OVERFLOW:
return "The thread used up its stack.";
1225 default:
return "Unknown exception";
1237 LPMAPISENDMAIL MAPISendMail;
1238 MapiMessage message;
1239 static int lastEmailTime = 0;
1247 HINSTANCE mapi = LoadLibrary(
"MAPI32.DLL" );
1249 MAPISendMail = ( LPMAPISENDMAIL )GetProcAddress( mapi,
"MAPISendMail" );
1250 if( MAPISendMail ) {
1251 MapiRecipDesc toProgrammers =
1256 "SMTP:programmers@idsoftware.com",
1261 memset( &message, 0,
sizeof( message ) );
1262 message.lpszSubject =
"DOOM 3 Fatal Error";
1263 message.lpszNoteText = messageText;
1264 message.nRecipCount = 1;
1265 message.lpRecips = &toProgrammers;
1275 FreeLibrary( mapi );
1279 int Sys_FPU_PrintStateFlags(
char *ptr,
int ctrl,
int stat,
int tags,
int inof,
int inse,
int opof,
int opse );
1286 EXCEPTION_DISPOSITION __cdecl
_except_handler(
struct _EXCEPTION_RECORD *ExceptionRecord,
void * EstablisherFrame,
1287 struct _CONTEXT *ContextRecord,
void * DispatcherContext ) {
1289 static char msg[ 8192 ];
1290 char FPUFlags[2048];
1293 ContextRecord->FloatSave.StatusWord,
1294 ContextRecord->FloatSave.TagWord,
1295 ContextRecord->FloatSave.ErrorOffset,
1296 ContextRecord->FloatSave.ErrorSelector,
1297 ContextRecord->FloatSave.DataOffset,
1298 ContextRecord->FloatSave.DataSelector );
1302 "Please describe what you were doing when DOOM 3 crashed!\n"
1303 "If this text did not pop into your email client please copy and email it to programmers@idsoftware.com\n"
1305 "-= FATAL EXCEPTION =-\n"
1309 "0x%x at address 0x%08x\n"
1313 "EAX = 0x%08x EBX = 0x%08x\n"
1314 "ECX = 0x%08x EDX = 0x%08x\n"
1315 "ESI = 0x%08x EDI = 0x%08x\n"
1316 "EIP = 0x%08x ESP = 0x%08x\n"
1317 "EBP = 0x%08x EFL = 0x%08x\n"
1328 ExceptionRecord->ExceptionCode,
1329 ExceptionRecord->ExceptionAddress,
1331 ContextRecord->Eax, ContextRecord->Ebx,
1332 ContextRecord->Ecx, ContextRecord->Edx,
1333 ContextRecord->Esi, ContextRecord->Edi,
1334 ContextRecord->Eip, ContextRecord->Esp,
1335 ContextRecord->Ebp, ContextRecord->EFlags,
1336 ContextRecord->SegCs,
1337 ContextRecord->SegSs,
1338 ContextRecord->SegDs,
1339 ContextRecord->SegEs,
1340 ContextRecord->SegFs,
1341 ContextRecord->SegGs,
1349 return ExceptionContinueExecution;
1352 #define TEST_FPU_EXCEPTIONS \
1365 int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,
int nCmdShow ) {
1367 const HCURSOR hcurSave = ::SetCursor( LoadCursor( 0, IDC_WAIT ) );
1384 idStr::Copynz( sys_cmdline, lpCmdLine,
sizeof( sys_cmdline ) );
1390 SetErrorMode( SEM_FAILCRITICALERRORS );
1401 _CrtSetDbgFlag( 0 );
1409 #if TEST_FPU_EXCEPTIONS != 0
1413 #ifndef ID_DEDICATED
1428 #ifdef SET_THREAD_AFFINITY
1430 SetThreadAffinityMask( GetCurrentThread(), 1 );
1433 ::SetCursor( hcurSave );
1436 if ( strstr( lpCmdLine,
"+debugger" ) ) {
1441 ::SetFocus( win32.
hWnd );
1455 #ifdef ID_ALLOW_TOOLS
1515 static int parmBytes;
1520 neg eax ; compute
new stack
pointer in eax
1550 static bool doexit_spamguard =
false;
1553 if (doexit_spamguard) {
1554 common->
DPrintf(
"OpenURL: already in an exit sequence, ignoring %s\n", url );
1560 if ( !ShellExecute(
NULL,
"open", url,
NULL,
NULL, SW_RESTORE ) ) {
1561 common->
Error(
"Could not open url: '%s' ", url );
1565 wnd = GetForegroundWindow();
1567 ShowWindow( wnd, SW_MAXIMIZE );
1571 doexit_spamguard =
true;
1582 TCHAR szPathOrig[_MAX_PATH];
1584 PROCESS_INFORMATION pi;
1586 ZeroMemory( &si,
sizeof(si) );
1589 strncpy( szPathOrig, exePath, _MAX_PATH );
1592 common->
Error(
"Could not start process: '%s' ", szPathOrig );
void Sys_PumpEvents(void)
CRITICAL_SECTION criticalSections[MAX_CRITICAL_SECTIONS]
void Sys_AsyncThread(void)
GLsizei const GLfloat * value
HANDLE backgroundDownloadSemaphore
double Sys_ClockTicksPerSecond(void)
assert(prefInfo.fullscreenBtn)
idCVar com_skipRenderer("com_skipRenderer","0", CVAR_BOOL|CVAR_SYSTEM,"skip the renderer completely")
void * Sys_DLL_GetProcAddress(int dllHandle, const char *procName)
idCVarSystem * cvarSystem
void Sys_SetClipboardData(const char *string)
void Sys_CreateConsole(void)
void LightEditorRun(void)
static idCVar win_outputEditString
bool Sys_IsWindowVisible(void)
void Sys_FPU_EnableExceptions(int exceptions)
CONST PIXELFORMATDESCRIPTOR UINT
char * Sys_GetClipboardData(void)
void Sys_ShutdownInput(void)
void Sys_Error(const char *error,...)
int Sys_Milliseconds(void)
typedef HANDLE(WINAPI *PFNWGLCREATEBUFFERREGIONARBPROC)(HDC hDC
void Conbuf_AppendText(const char *msg)
static idCVar win_username
void Sys_WaitForEvent(int index)
const int MAX_CRITICAL_SECTIONS
__declspec(naked) void clrstk(void)
void Sys_Printf(const char *fmt,...)
OSVERSIONINFOEX osversion
char * Sys_ConsoleInput(void)
GLenum GLsizei const GLvoid * string
void Win_SetErrorText(const char *text)
void Sys_LeaveCriticalSection(int index)
GLuint GLuint GLsizei GLenum type
void Sys_SetFatalError(const char *error)
cpuid_t Sys_GetProcessorId(void)
bool Sys_AlreadyRunning(void)
void Sys_DLL_Unload(int dllHandle)
void Sleep(const int time)
void Sys_In_Restart_f(const idCmdArgs &args)
const char * Sys_FPU_GetState(void)
virtual void Async(void)=0
int Icmp(const char *text) const
void Sys_StartAsyncThread(void)
static idCVar win_viewlog
virtual void Frame(void)=0
void MaterialEditorRun(void)
Called every frame by the doom engine to allow the material editor to process messages.
virtual void BufferCommandText(cmdExecution_t exec, const char *text)=0
void Sys_DestroyConsole(void)
GLsizei const GLvoid * pointer
void Sys_CreateThread(xthread_t function, void *parms, xthreadPriority priority, xthreadInfo &info, const char *name, xthreadInfo *threads[MAX_THREADS], int *thread_count)
cpuid_t Sys_GetCPUId(void)
void SetString(const char *value)
void Sys_DebugPrintf(const char *fmt,...)
void Sys_ShowConsole(int visLevel, bool quitOnClose)
#define TEST_FPU_EXCEPTIONS
bool GUIEditorHandleMessage(void *msg)
virtual const char * GetCVarString(const char *name) const =0
static idCVar win_allowAltTab
GLsizei GLsizei GLenum GLenum const GLvoid * data
const char * Sys_DefaultBasePath(void)
void Sys_ShowWindow(bool show)
int GetInteger(void) const
int Sys_GetSystemRam(void)
virtual void virtual void FatalError(const char *fmt,...) id_attribute((format(printf
static void Copynz(char *dest, const char *src, int destsize)
static idCVar win_allowMultipleInstances
void EmailCrashReport(LPSTR messageText)
void Sys_DoPreferences(void)
char * Sys_GetCurrentUser(void)
static idCVar serverDedicated
const char * Sys_EXEPath(void)
void SoundEditorRun(void)
void Sys_TriggerEvent(int index)
unsigned int(* xthread_t)(void *)
virtual void Printf(const char *fmt,...) id_attribute((format(printf
xthreadInfo * g_threads[MAX_THREADS]
static idCVar win_outputDebugString
void Sys_FlushCacheMemory(void *base, int bytes)
const char * Sys_DefaultCDPath(void)
sysEvent_t Sys_GetEvent(void)
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
void Sys_ClearEvents(void)
virtual void OpenURL(const char *url, bool quit)
const char * GetString(void) const
const char * Sys_Cwd(void)
void Sys_DestroyThread(xthreadInfo &info)
int Append(const type &obj)
GLdouble GLdouble GLdouble r
void Sys_DebugVPrintf(const char *fmt, va_list arg)
static int static int vsnPrintf(char *dest, int size, const char *fmt, va_list argptr)
const char * Sys_GetThreadName(int *index)
void Sys_QueEvent(int time, sysEventType_t type, int value, int value2, int ptrLength, void *ptr)
void Sys_GenerateEvents(void)
ID_TIME_T Sys_FileTimeStamp(FILE *fp)
int Sys_FPU_PrintStateFlags(char *ptr, int ctrl, int stat, int tags, int inof, int inse, int opof, int opse)
void Sys_EnterCriticalSection(int index)
bool IsModified(void) const
sysEvent_t eventQue[MAX_QUED_EVENTS]
static idCVar win_timerUpdate
void GLimp_Shutdown(void)
void Sys_SetPhysicalWorkMemory(int minBytes, int maxBytes)
typedef LPVOID(WINAPI *PFNWGLCREATEIMAGEBUFFERI3DPROC)(HDC hDC
const char * Sys_DefaultSavePath(void)
int vsprintf(idStr &string, const char *fmt, va_list argptr)
virtual void StartProcess(const char *exeName, bool quit)
typedef void(APIENTRYP PFNGLBLENDCOLORPROC)(GLclampf red
void DeclBrowserRun(void)
const char * Sys_GetProcessorString(void)
void Sys_Mkdir(const char *path)
const char * GetExceptionCodeInfo(UINT code)
void Sys_GetCurrentMemoryStatus(sysMemoryStats_t &stats)
virtual void Quit(void)=0
void * Mem_Alloc(const int size)
int Sys_GetVideoRam(void)
void DisableTaskKeys(BOOL bDisable, BOOL bBeep, BOOL bTaskMgr)
void Sys_FPU_SetPrecision(int precision)
int Sys_DLL_Load(const char *dllName)
virtual void DPrintf(const char *fmt,...) id_attribute((format(printf
virtual void Error(const char *fmt,...) id_attribute((format(printf
static idCVar sys_cpustring
int ReadToken(idToken *token)
void OutputDebugString(const char *text)
int sprintf(idStr &string, const char *fmt,...)
virtual void Init(int argc, const char **argv, const char *cmdline)=0
void Sys_GetExeLaunchMemoryStatus(sysMemoryStats_t &stats)
idCVar com_version("si_version", version.string, CVAR_SYSTEM|CVAR_ROM|CVAR_SERVERINFO,"engine version")
void ParticleEditorRun(void)
virtual void AddCommand(const char *cmdName, cmdFunction_t function, int flags, const char *description, argCompletion_t argCompletion=NULL)=0
int IcmpPath(const char *text) const
int Sys_ListFiles(const char *directory, const char *extension, idStrList &list)
EXCEPTION_DISPOSITION __cdecl _except_handler(struct _EXCEPTION_RECORD *ExceptionRecord, void *EstablisherFrame, struct _CONTEXT *ContextRecord, void *DispatcherContext)
static idCVar win_notaskkeys
void ScriptEditorRun(void)
void CreateResourceIDs_f(const idCmdArgs &args)