70#if defined (_MSC_VER) && (_MSC_VER >= 1400)
72#elif defined (_M_IX86)
73 static void __cpuid(
int* cpuid_data,
int info_type)
101 cpuid_data[0] = 0x00000000;
102 cpuid_data[1] = 0x00000000;
103 cpuid_data[2] = 0x00000000;
104 cpuid_data[3] = 0x00000000;
127 if (
fds_bits->fd_count < FD_SETSIZE-1)
130 ::SysError(
"TFdSet::Set",
"fd_count will exeed FD_SETSIZE");
135 for (i=0; i<
fds_bits->fd_count; i++) {
136 if (
fds_bits->fd_array[i]==(SOCKET)fd) {
137 while (i<fds_bits->fd_count-1) {
157 static HANDLE gGlobalEvent;
158 static HANDLE gTimerThreadHandle;
159 typedef NET_API_STATUS (WINAPI *pfn1)(LPVOID);
160 typedef NET_API_STATUS (WINAPI *pfn2)(LPCWSTR, LPCWSTR,
DWORD, LPBYTE*);
161 typedef NET_API_STATUS (WINAPI *pfn3)(LPCWSTR, LPCWSTR,
DWORD, LPBYTE*,
162 DWORD, LPDWORD, LPDWORD, PDWORD_PTR);
163 typedef NET_API_STATUS (WINAPI *pfn4)(LPCWSTR,
DWORD, LPBYTE*,
DWORD, LPDWORD,
164 LPDWORD, PDWORD_PTR);
165 static pfn1 p2NetApiBufferFree;
166 static pfn2 p2NetUserGetInfo;
167 static pfn3 p2NetLocalGroupGetMembers;
168 static pfn4 p2NetLocalGroupEnum;
170 static struct signal_map {
176 SIGSEGV, 0,
"segmentation violation",
177 -1 , 0,
"bad argument to system call",
178 -1 , 0,
"write on a pipe with no one to read it",
179 SIGILL, 0,
"illegal instruction",
182 SIGINT, 0,
"interrupt",
183 -1 , 0,
"window size change",
184 -1 , 0,
"alarm clock",
185 -1 , 0,
"death of a child",
186 -1 , 0,
"urgent data arrived on an I/O channel",
187 SIGFPE, 0,
"floating point exception",
188 SIGTERM, 0,
"termination signal",
189 -1 , 0,
"user-defined signal 1",
190 -1 , 0,
"user-defined signal 2"
211 static int WinNTRecv(
int socket,
void *buffer,
int length,
int flag)
213 if (socket == -1)
return -1;
214 SOCKET sock = socket;
221 if (flag == MSG_PEEK) {
226 char *buf = (
char *)buffer;
229 if ((nrecv = ::recv(sock, buf+
n,
length-
n, flag)) <= 0) {
233 if (flag == MSG_OOB) {
234 if (::WSAGetLastError() == WSAEWOULDBLOCK) {
236 }
else if (::WSAGetLastError() == WSAEINVAL) {
240 if (::WSAGetLastError() == WSAEWOULDBLOCK) {
243 if (::WSAGetLastError() != WSAEINTR)
244 ::SysError(
"TWinNTSystem::WinNTRecv",
"recv");
245 if (::WSAGetLastError() == EPIPE ||
246 ::WSAGetLastError() == WSAECONNRESET)
265 static int WinNTSend(
int socket,
const void *buffer,
int length,
int flag)
267 if (socket < 0)
return -1;
268 SOCKET sock = socket;
277 const char *buf = (
const char *)buffer;
280 if ((nsent = ::send(sock, buf+
n,
length-
n, flag)) <= 0) {
284 if (::WSAGetLastError() == WSAEWOULDBLOCK) {
287 if (::WSAGetLastError() != WSAEINTR)
288 ::SysError(
"TWinNTSystem::WinNTSend",
"send");
289 if (::WSAGetLastError() == EPIPE ||
290 ::WSAGetLastError() == WSAECONNRESET)
310 fd_set* rbits = readready ? (fd_set*)readready->
GetBits() : 0;
311 fd_set* wbits = writeready ? (fd_set*)writeready->
GetBits() : 0;
315 tv.tv_sec = timeout / 1000;
316 tv.tv_usec = (timeout % 1000) * 1000;
318 retcode = ::select(0, rbits, wbits, 0, &tv);
320 retcode = ::select(0, rbits, wbits, 0, 0);
323 if (retcode == SOCKET_ERROR) {
324 int errcode = ::WSAGetLastError();
328 if (errcode == WSAENOTSOCK) {
330 int result = _fstat64( readready->
GetFd(0), &buf );
338 ::WaitForSingleObject(gGlobalEvent, 1);
339 ::ResetEvent(gGlobalEvent);
344 if ( errcode == WSAEINTR) {
348 if (errcode == EBADF) {
363 if (reset || newpath) {
368 }
else if (dynpath ==
"") {
372 if (rdynpath ==
"") {
400 if (signal_map[i].code == sig) {
401 (*signal_map[i].handler)((
ESignals)i);
412 signal_map[sig].handler = handler;
413 if (signal_map[sig].code != -1)
420 static const char *WinNTSigname(
ESignals sig)
422 return signal_map[sig].signame;
428 static BOOL ConsoleSigHandler(
DWORD sig)
436 Break(
"TInterruptHandler::Notify",
"keyboard interrupt");
442 case CTRL_BREAK_EVENT:
443 case CTRL_LOGOFF_EVENT:
444 case CTRL_SHUTDOWN_EVENT:
445 case CTRL_CLOSE_EVENT:
447 printf(
"\n *** Break *** keyboard interrupt - ROOT is terminated\n");
453 static CONTEXT *fgXcptContext = 0;
467 LONG WINAPI ExceptionFilter(LPEXCEPTION_POINTERS pXcp)
469 fgXcptContext = pXcp->ContextRecord;
471 return EXCEPTION_CONTINUE_SEARCH;
475#pragma intrinsic(_ReturnAddress)
476#pragma auto_inline(off)
477 DWORD_PTR GetProgramCounter()
482#pragma auto_inline(on)
493 static DWORD WINAPI GUIThreadMessageProcessingLoop(
void *
p)
498 ::PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE);
503 if (gGlobalEvent) ::SetEvent(gGlobalEvent);
504 erret = ::GetMessage(&msg, NULL, NULL, NULL);
505 if (erret <= 0) endLoop =
kTRUE;
506 if (gGUIThreadMsgFunc)
507 endLoop = (*gGUIThreadMsgFunc)(&msg);
514 erret = ::GetLastError();
515 Error(
"MsgLoop",
"Error in GetMessage");
529 typedef BOOL (__stdcall *SYMINITIALIZEPROC)(
HANDLE, LPSTR, BOOL );
530 typedef BOOL (__stdcall *SYMCLEANUPPROC)(
HANDLE );
531 typedef BOOL (__stdcall *STACKWALK64PROC)
533 PREAD_PROCESS_MEMORY_ROUTINE,PFUNCTION_TABLE_ACCESS_ROUTINE,
534 PGET_MODULE_BASE_ROUTINE, PTRANSLATE_ADDRESS_ROUTINE );
535 typedef LPVOID (__stdcall *SYMFUNCTIONTABLEACCESS64PROC)(
HANDLE, DWORD64 );
536 typedef DWORD (__stdcall *SYMGETMODULEBASE64PROC)(
HANDLE, DWORD64 );
537 typedef BOOL (__stdcall *SYMGETMODULEINFO64PROC)(
HANDLE, DWORD64, PIMAGEHLP_MODULE64);
538 typedef BOOL (__stdcall *SYMGETSYMFROMADDR64PROC)(
HANDLE, DWORD64, PDWORD64, PIMAGEHLP_SYMBOL64);
539 typedef BOOL (__stdcall *SYMGETLINEFROMADDR64PROC)(
HANDLE, DWORD64, PDWORD, PIMAGEHLP_LINE64);
540 typedef DWORD (__stdcall *UNDECORATESYMBOLNAMEPROC)(PCSTR, PSTR,
DWORD,
DWORD);
543 static SYMINITIALIZEPROC _SymInitialize = 0;
544 static SYMCLEANUPPROC _SymCleanup = 0;
545 static STACKWALK64PROC _StackWalk64 = 0;
546 static SYMFUNCTIONTABLEACCESS64PROC _SymFunctionTableAccess64 = 0;
547 static SYMGETMODULEBASE64PROC _SymGetModuleBase64 = 0;
548 static SYMGETMODULEINFO64PROC _SymGetModuleInfo64 = 0;
549 static SYMGETSYMFROMADDR64PROC _SymGetSymFromAddr64 = 0;
550 static SYMGETLINEFROMADDR64PROC _SymGetLineFromAddr64 = 0;
551 static UNDECORATESYMBOLNAMEPROC _UnDecorateSymbolName = 0;
553 BOOL InitImagehlpFunctions()
561 HMODULE hModImagehlp = LoadLibrary(
"IMAGEHLP.DLL" );
565 _SymInitialize = (SYMINITIALIZEPROC) GetProcAddress( hModImagehlp,
"SymInitialize" );
569 _SymCleanup = (SYMCLEANUPPROC) GetProcAddress( hModImagehlp,
"SymCleanup" );
573 _StackWalk64 = (STACKWALK64PROC) GetProcAddress( hModImagehlp,
"StackWalk64" );
577 _SymFunctionTableAccess64 = (SYMFUNCTIONTABLEACCESS64PROC) GetProcAddress(hModImagehlp,
"SymFunctionTableAccess64" );
578 if (!_SymFunctionTableAccess64)
581 _SymGetModuleBase64=(SYMGETMODULEBASE64PROC)GetProcAddress(hModImagehlp,
"SymGetModuleBase64");
582 if (!_SymGetModuleBase64)
585 _SymGetModuleInfo64=(SYMGETMODULEINFO64PROC)GetProcAddress(hModImagehlp,
"SymGetModuleInfo64");
586 if (!_SymGetModuleInfo64)
589 _SymGetSymFromAddr64=(SYMGETSYMFROMADDR64PROC)GetProcAddress(hModImagehlp,
"SymGetSymFromAddr64");
590 if (!_SymGetSymFromAddr64)
593 _SymGetLineFromAddr64=(SYMGETLINEFROMADDR64PROC)GetProcAddress(hModImagehlp,
"SymGetLineFromAddr64");
594 if (!_SymGetLineFromAddr64)
597 _UnDecorateSymbolName=(UNDECORATESYMBOLNAMEPROC)GetProcAddress(hModImagehlp,
"UnDecorateSymbolName");
598 if (!_UnDecorateSymbolName)
601 if (!_SymInitialize(GetCurrentProcess(), 0, TRUE ))
617 std::string GetModuleName(DWORD64 address)
621 std::ostringstream out;
622 HANDLE process = ::GetCurrentProcess();
624 DWORD lineDisplacement = 0;
625 IMAGEHLP_LINE64
line;
628 if(_SymGetLineFromAddr64(process, address, &lineDisplacement, &
line)) {
629 out <<
line.FileName <<
"(" <<
line.LineNumber <<
"): ";
631 IMAGEHLP_MODULE64
module;
632 ::ZeroMemory(&module,
sizeof(module));
633 module.SizeOfStruct = sizeof(module);
634 if(_SymGetModuleInfo64(process, address, &module)) {
635 out <<
module.ModuleName << "!";
637 out <<
"0x" << std::hex << address << std::dec <<
" ";
644 std::string GetFunctionName(DWORD64 address)
648 DWORD64 symbolDisplacement = 0;
649 HANDLE process = ::GetCurrentProcess();
651 const unsigned int SYMBOL_BUFFER_SIZE = 8192;
652 char symbolBuffer[SYMBOL_BUFFER_SIZE];
653 PIMAGEHLP_SYMBOL64 symbol =
reinterpret_cast<PIMAGEHLP_SYMBOL64
>(symbolBuffer);
654 ::ZeroMemory(symbol, SYMBOL_BUFFER_SIZE);
655 symbol->SizeOfStruct = SYMBOL_BUFFER_SIZE;
656 symbol->MaxNameLength = SYMBOL_BUFFER_SIZE -
sizeof(IMAGEHLP_SYMBOL64);
658 if(_SymGetSymFromAddr64(process, address, &symbolDisplacement, symbol)) {
660 const unsigned int NAME_SIZE = 8192;
661 char name[NAME_SIZE];
662 _UnDecorateSymbolName(
667 UNDNAME_NO_THISTYPE |
668 UNDNAME_NO_SPECIAL_SYMS |
669 UNDNAME_NO_MEMBER_TYPE |
670 UNDNAME_NO_MS_KEYWORDS |
671 UNDNAME_NO_ACCESS_SPECIFIERS
689 static BOOL IsShortcut(
const char *
filename)
692 const char *extLnk =
".lnk";
696 if (strfilename.EndsWith(extLnk))
705 static BOOL ResolveShortCut(LPCSTR pszShortcutFile,
char *pszPath,
int maxbuf)
709 char szGotPath[MAX_PATH];
716 typedef HRESULT (__stdcall *COINITIALIZEPROC)( LPVOID );
717 static COINITIALIZEPROC _CoInitialize = 0;
718 typedef void (__stdcall *COUNINITIALIZEPROC)( void );
719 static COUNINITIALIZEPROC _CoUninitialize = 0;
720 typedef HRESULT (__stdcall *COCREATEINSTANCEPROC)( REFCLSID, LPUNKNOWN,
721 DWORD, REFIID, LPVOID );
722 static COCREATEINSTANCEPROC _CoCreateInstance = 0;
724 HMODULE hModImagehlp = LoadLibrary(
"ole32.dll" );
728 _CoInitialize = (COINITIALIZEPROC) GetProcAddress( hModImagehlp,
"CoInitialize" );
731 _CoUninitialize = (COUNINITIALIZEPROC) GetProcAddress( hModImagehlp,
"CoUninitialize");
732 if (!_CoUninitialize)
734 _CoCreateInstance = (COCREATEINSTANCEPROC) GetProcAddress( hModImagehlp,
"CoCreateInstance" );
735 if (!_CoCreateInstance)
740 hres = _CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
741 IID_IShellLink, (
void **) &psl);
742 if (SUCCEEDED(hres)) {
745 hres = psl->QueryInterface(IID_IPersistFile, (
void **) &ppf);
746 if (SUCCEEDED(hres)) {
748 MultiByteToWideChar(CP_ACP, 0, pszShortcutFile, -1, wsz, MAX_PATH);
750 hres = ppf->Load(wsz, STGM_READ);
751 if (SUCCEEDED(hres)) {
752 hres = psl->Resolve(HWND_DESKTOP, SLR_ANY_MATCH | SLR_NO_UI | SLR_UPDATE);
753 if (SUCCEEDED(hres)) {
754 strlcpy(szGotPath, pszShortcutFile,MAX_PATH);
755 hres = psl->GetPath(szGotPath, MAX_PATH, (WIN32_FIND_DATA *)&wfd,
756 SLGP_UNCPRIORITY | SLGP_RAWPATH);
757 strlcpy(pszPath,szGotPath, maxbuf);
758 if (maxbuf) pszPath[maxbuf-1] = 0;
767 return SUCCEEDED(hres);
773 if (strcmp(sys->TWinNTSystem::BaseName(buf),
"root.exe"))
776 if (!::RegOpenKeyEx(HKEY_CURRENT_USER,
"Software", 0, KEY_READ, ®CUS) == ERROR_SUCCESS)
779 if (!::RegOpenKeyEx(regCUS,
"Classes", 0, KEY_READ, ®CUSC) == ERROR_SUCCESS) {
780 ::RegCloseKey(regCUS);
785 bool regROOTwrite =
false;
789 if (::RegOpenKeyEx(regCUSC,
"ROOTDEV.ROOT", 0, KEY_READ, ®ROOT) != ERROR_SUCCESS) {
790 ::RegCloseKey(regCUSC);
791 if (::RegOpenKeyEx(regCUS,
"Classes", 0, KEY_READ | KEY_WRITE, ®CUSC) == ERROR_SUCCESS &&
792 ::RegCreateKeyEx(regCUSC,
"ROOTDEV.ROOT", 0, NULL, 0, KEY_READ | KEY_WRITE,
793 NULL, ®ROOT, NULL) == ERROR_SUCCESS) {
798 if (::RegOpenKeyEx(regROOT,
"DefaultIcon", 0, KEY_READ, ®ROOTIcon) == ERROR_SUCCESS) {
799 char bufIconLoc[1024];
801 DWORD dwSize =
sizeof(bufIconLoc);
803 if (::RegQueryValueEx(regROOTIcon, NULL, NULL, &dwType, (BYTE*)bufIconLoc, &dwSize) == ERROR_SUCCESS)
804 regROOTwrite = (iconloc != bufIconLoc);
807 ::RegCloseKey(regROOTIcon);
812 ::RegCloseKey(regCUSC);
813 ::RegCloseKey(regROOT);
814 if (::RegOpenKeyEx(regCUS,
"Classes", 0, KEY_READ | KEY_WRITE, ®CUSC) != ERROR_SUCCESS) {
816 regROOTwrite =
false;
818 if (::RegOpenKeyEx(regCUSC,
"ROOTDEV.ROOT", 0, KEY_WRITE, ®ROOT) != ERROR_SUCCESS) {
820 regROOTwrite =
false;
821 ::RegCloseKey(regCUSC);
828 TString fileopen =
"fileopen.C";
829 TString rootmacrodir =
"macros";
830 sys->PrependPathName(std::getenv(
"ROOTSYS"), rootmacrodir);
831 sys->PrependPathName(rootmacrodir.
Data(), fileopen);
839 ::RegCloseKey(regROOT);
840 ::RegCloseKey(regCUSC);
841 ::RegCloseKey(regCUS);
845 static const char apptitle[] =
"ROOT data file";
846 ::RegSetValueEx(regROOT, NULL, 0, REG_SZ, (BYTE*)apptitle,
sizeof(apptitle));
847 DWORD editflags = 0x00010000;
848 ::RegSetValueEx(regROOT,
"EditFlags", 0, REG_DWORD, (BYTE*)&editflags,
sizeof(editflags));
851 if (::RegCreateKeyEx(regROOT,
"DefaultIcon", 0, NULL, 0, KEY_READ | KEY_WRITE,
852 NULL, ®ROOTIcon, NULL) == ERROR_SUCCESS) {
855 ::RegSetValueEx(regROOTIcon, NULL, 0, REG_SZ, (BYTE*)iconloc.Data(), iconloc.Length() + 1);
856 ::RegCloseKey(regROOTIcon);
861 if (::RegCreateKeyEx(regROOT,
"shell", 0, NULL, 0, KEY_READ | KEY_WRITE,
862 NULL, ®ROOTshell, NULL) == ERROR_SUCCESS) {
864 if (::RegCreateKeyEx(regROOTshell,
"open", 0, NULL, 0, KEY_READ | KEY_WRITE,
865 NULL, ®ShellOpen, NULL) == ERROR_SUCCESS) {
866 HKEY regShellOpenCmd;
867 if (::RegCreateKeyEx(regShellOpen,
"command", 0, NULL, 0, KEY_READ | KEY_WRITE,
868 NULL, ®ShellOpenCmd, NULL) == ERROR_SUCCESS) {
870 cmd +=
" -l \"%1\" \"";
873 ::RegSetValueEx(regShellOpenCmd, NULL, 0, REG_SZ, (BYTE*)cmd.Data(), cmd.Length() + 1);
874 ::RegCloseKey(regShellOpenCmd);
876 ::RegCloseKey(regShellOpen);
878 ::RegCloseKey(regROOTshell);
880 ::RegCloseKey(regROOT);
882 if (::RegCreateKeyEx(regCUSC,
".root", 0, NULL, 0, KEY_READ | KEY_WRITE,
883 NULL, ®ROOT, NULL) == ERROR_SUCCESS) {
884 static const char appname[] =
"ROOTDEV.ROOT";
885 ::RegSetValueEx(regROOT, NULL, 0, REG_SZ, (BYTE*)appname,
sizeof(appname));
887 ::RegCloseKey(regCUSC);
888 ::RegCloseKey(regCUS);
891 ::SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL);
899 static bool once =
true;
902 if (!once ||
gROOT->IsBatch())
return false;
903 TString cmdline(::GetCommandLine());
904 Int_t i = 0, from = 0;
905 while (cmdline.Tokenize(arg, from,
" ")) {
907 if (i == 0 && ((arg !=
"root") && (arg !=
"rootn") &&
908 (arg !=
"root.exe") && (arg !=
"rootn.exe")))
return false;
909 else if ((arg ==
"-l") || (arg ==
"-b"))
return false;
921 static void SetConsoleWindowName()
923 char pszNewWindowTitle[1024];
924 char pszOldWindowTitle[1024];
926 CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
928 if (!::GetConsoleTitle(pszOldWindowTitle, 1024))
931 wsprintf(pszNewWindowTitle,
"%d/%d", ::GetTickCount(), ::GetCurrentProcessId());
933 if (!::SetConsoleTitle(pszNewWindowTitle))
943 ::SetConsoleTitle(
"ROOT session");
945 hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
948 ::SetConsoleMode(hStdout, ENABLE_PROCESSED_OUTPUT |
949 ENABLE_WRAP_AT_EOL_OUTPUT);
950 if (!::GetConsoleScreenBufferInfo(hStdout, &csbiInfo))
992 if (initwinsock = ::WSAStartup(MAKEWORD(2, 0), &WSAData)) {
993 Error(
"TWinNTSystem()",
"Starting sockets failed");
1004 char *buf =
new char[MAX_MODULE_NAME32 + 1];
1010 HMODULE hModCore = ::GetModuleHandle(
"libCore.dll");
1012 ::GetModuleFileName(hModCore, buf, MAX_MODULE_NAME32 + 1);
1013 char *pLibName = strstr(buf,
"libCore.dll");
1016 while (--pLibName >= buf && *pLibName !=
'\\' && *pLibName !=
'/');
1019 check_path +=
"\\etc";
1021 while (buf[0] && GetFileAttributes(check_path.
Data()) == INVALID_FILE_ATTRIBUTES) {
1022 while (--pLibName >= buf && *pLibName !=
'\\' && *pLibName !=
'/');
1025 check_path +=
"\\etc";
1040 UpdateRegistry(
this, buf);
1051 typedef UINT (WINAPI* LPTIMEENDPERIOD)( UINT uPeriod );
1052 HINSTANCE hInstWinMM = LoadLibrary(
"winmm.dll" );
1054 LPTIMEENDPERIOD pTimeEndPeriod = (LPTIMEENDPERIOD)GetProcAddress( hInstWinMM,
"timeEndPeriod" );
1055 if( NULL != pTimeEndPeriod )
1057 FreeLibrary(hInstWinMM);
1063 ::ResetEvent(gGlobalEvent);
1064 ::CloseHandle(gGlobalEvent);
1067 if (gTimerThreadHandle) {
1068 ::TerminateThread(gTimerThreadHandle, 0);
1069 ::CloseHandle(gTimerThreadHandle);
1102 ::SetUnhandledExceptionFilter(ExceptionFilter);
1110 typedef UINT (WINAPI* LPTIMEBEGINPERIOD)( UINT uPeriod );
1111 HINSTANCE hInstWinMM = LoadLibrary(
"winmm.dll" );
1113 LPTIMEBEGINPERIOD pTimeBeginPeriod = (LPTIMEBEGINPERIOD)GetProcAddress( hInstWinMM,
"timeBeginPeriod" );
1114 if( NULL != pTimeBeginPeriod )
1115 pTimeBeginPeriod(1);
1116 FreeLibrary(hInstWinMM);
1118 gTimerThreadHandle = ::CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)
ThreadStub,
1121 gGlobalEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL);
1124 char *buf =
new char[MAX_MODULE_NAME32 + 1];
1125 HMODULE hModCore = ::GetModuleHandle(
"libCore.dll");
1127 ::GetModuleFileName(hModCore, buf, MAX_MODULE_NAME32 + 1);
1128 char *pLibName = strstr(buf,
"libCore.dll");
1135 std::this_thread::sleep_for(std::chrono::duration<double, std::nano>(10));
1136 SetConsoleWindowName();
1159 const char *symbol=
name;
1162 while ( (*symbol ==
' ' || *symbol ==
'\t') && *symbol) symbol++;
1165 if (isalpha(symbol[idx]) && symbol[idx+1] ==
':') idx = 2;
1166 if ( (symbol[idx] ==
'/' || symbol[idx] ==
'\\') && symbol[idx+1] ==
'\0') {
1171 Error(
"BaseName",
"name = 0");
1175 char *bslash = (
char *)strrchr(&symbol[idx],
'\\');
1176 char *rslash = (
char *)strrchr(&symbol[idx],
'/');
1177 if (cp = (std::max)(rslash, bslash)) {
1182 return &symbol[idx];
1184 Error(
"BaseName",
"name = 0");
1195 char *dot =
nullptr;
1197 char *fullname =
nullptr;
1200 size_t namelen =
name ? strlen(
name) : 0;
1201 if (
name && namelen > 0) {
1203 fullname =
new char[namelen+5];
1204 strlcpy(fullname,
name,namelen+5);
1205 if ( !strrchr(fullname,
'.') )
1206 strlcat(fullname,
".exe",namelen+5);
1209 dot = strrchr(progname,
'.');
1210 idot = dot ? (size_t)(dot - progname) : strlen(progname);
1212 char *which =
nullptr;
1215 which =
StrDup(fullname);
1226 dirname.
Form(
"%c:%s", driveletter,
d.Data());
1241 progname[idot] =
'\0';
1243 if (which)
delete [] which;
1247 if (::NeedSplash()) {
1260 if (err < 0 || err >= sys_nerr) {
1262 error_msg.
Form(
"errno out of range %d", err);
1265 return sys_errlist[err];
1274 fHostname = std::getenv(
"COMPUTERNAME");
1278 DWORD il =
sizeof(hn);
1279 ::GetComputerName(hn, &il);
1295 if (freq < 37) freq = 440;
1296 if (duration < 0) duration = 100;
1305 gGUIThreadMsgFunc = func;
1328 int fd =
h->GetFd();
1331 if (
h->HasReadInterest()) {
1334 if (
h->HasWriteInterest()) {
1346 if (!
h)
return nullptr;
1366 set_console =
kTRUE;
1379 ::SetConsoleCtrlHandler((PHANDLER_ROUTINE)ConsoleSigHandler, TRUE);
1390 if (!
h)
return nullptr;
1405 ::SetConsoleCtrlHandler((PHANDLER_ROUTINE)ConsoleSigHandler, FALSE);
1449 HANDLE snapshot = ::CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,::GetCurrentProcessId());
1454 if (!InitImagehlpFunctions()) {
1455 std::cerr <<
"No stack trace: cannot find (functions in) dbghelp.dll!" << std::endl;
1460 SYSTEM_INFO sysInfo;
1461 ::GetSystemInfo(&sysInfo);
1462 DWORD machineType = IMAGE_FILE_MACHINE_I386;
1463 switch (sysInfo.wProcessorArchitecture) {
1464 case PROCESSOR_ARCHITECTURE_AMD64:
1465 machineType = IMAGE_FILE_MACHINE_AMD64;
1467 case PROCESSOR_ARCHITECTURE_IA64:
1468 machineType = IMAGE_FILE_MACHINE_IA64;
1472 DWORD currentThreadID = ::GetCurrentThreadId();
1473 DWORD currentProcessID = ::GetCurrentProcessId();
1477 THREADENTRY32 threadentry;
1478 threadentry.dwSize =
sizeof(THREADENTRY32);
1479 if (!::Thread32First(snapshot, &threadentry))
return;
1481 std::cerr << std::endl <<
"==========================================" << std::endl;
1482 std::cerr <<
"=============== STACKTRACE ===============" << std::endl;
1483 std::cerr <<
"==========================================" << std::endl << std::endl;
1486 if (threadentry.th32OwnerProcessID != currentProcessID)
1488 HANDLE thread = ::OpenThread(THREAD_GET_CONTEXT|THREAD_SUSPEND_RESUME|THREAD_QUERY_INFORMATION,
1489 FALSE, threadentry.th32ThreadID);
1491 memset(&context, 0,
sizeof(CONTEXT));
1493 if (threadentry.th32ThreadID != currentThreadID) {
1494 ::SuspendThread(thread);
1495 context.ContextFlags = CONTEXT_ALL;
1496 ::GetThreadContext(thread, &context);
1497 ::ResumeThread(thread);
1499 if (fgXcptContext) {
1500 context = *fgXcptContext;
1502 typedef void (WINAPI *RTLCCTXT)(PCONTEXT);
1503 RTLCCTXT p2RtlCCtxt = (RTLCCTXT) ::GetProcAddress(
1504 GetModuleHandle(
"kernel32.dll"),
"RtlCaptureContext");
1506 context.ContextFlags = CONTEXT_ALL;
1507 p2RtlCCtxt(&context);
1513 ::ZeroMemory(&frame,
sizeof(frame));
1515 frame.AddrPC.Mode = AddrModeFlat;
1516 frame.AddrFrame.Mode = AddrModeFlat;
1517 frame.AddrStack.Mode = AddrModeFlat;
1519 frame.AddrPC.Offset = context.Eip;
1520 frame.AddrFrame.Offset = context.Ebp;
1521 frame.AddrStack.Offset = context.Esp;
1522#elif defined(_M_X64)
1523 frame.AddrPC.Offset = context.Rip;
1524 frame.AddrFrame.Offset = context.Rsp;
1525 frame.AddrStack.Offset = context.Rsp;
1526#elif defined(_M_IA64)
1527 frame.AddrPC.Offset = context.StIIP;
1528 frame.AddrFrame.Offset = context.IntSp;
1529 frame.AddrStack.Offset = context.IntSp;
1530 frame.AddrBStore.Offset= context.RsBSP;
1532 std::cerr <<
"Stack traces not supported on your architecture yet." << std::endl;
1537 while (_StackWalk64(machineType, (
HANDLE)::GetCurrentProcess(), thread, (LPSTACKFRAME64)&frame,
1538 (LPVOID)&context, (PREAD_PROCESS_MEMORY_ROUTINE)NULL, (PFUNCTION_TABLE_ACCESS_ROUTINE)_SymFunctionTableAccess64,
1539 (PGET_MODULE_BASE_ROUTINE)_SymGetModuleBase64, NULL)) {
1541 std::cerr << std::endl <<
"================ Thread " << iThread++ <<
" ================" << std::endl;
1542 if (!bFirst || threadentry.th32ThreadID != currentThreadID) {
1543 const std::string moduleName = GetModuleName(frame.AddrPC.Offset);
1544 const std::string functionName = GetFunctionName(frame.AddrPC.Offset);
1545 std::cerr <<
" " << moduleName << functionName << std::endl;
1549 ::CloseHandle(thread);
1550 }
while (::Thread32Next(snapshot, &threadentry));
1552 std::cerr << std::endl <<
"==========================================" << std::endl;
1553 std::cerr <<
"============= END STACKTRACE =============" << std::endl;
1554 std::cerr <<
"==========================================" << std::endl << std::endl;
1555 ::CloseHandle(snapshot);
1556 _SymCleanup(GetCurrentProcess());
1565 UInt_t oldmask = _statusfp( );
1591 UInt_t cm = ::_statusfp();
1593 ::_controlfp(cm , _MCW_EM);
1612 if (pendingOnly && gGlobalEvent) ::SetEvent(gGlobalEvent);
1614 Bool_t pollOnce = pendingOnly;
1618 if (
gROOT->GetApplication()) {
1634 ::WaitForSingleObject(gGlobalEvent, 1);
1635 ::ResetEvent(gGlobalEvent);
1661 if (pendingOnly && !pollOnce)
1700 if (!pendingOnly && gGlobalEvent) {
1701 ::WaitForSingleObject(gGlobalEvent, 1);
1702 ::ResetEvent(gGlobalEvent);
1721 rc = WinNTSelect(&t, 0, 0);
1722 if (rc < 0 && rc != -2) {
1723 ::SysError(
"DispatchOneEvent",
"select: read error on %d\n", fd);
1735 rc = WinNTSelect(0, &t, 0);
1736 if (rc < 0 && rc != -2) {
1737 ::SysError(
"DispatchOneEvent",
"select: write error on %d\n", fd);
1799 if (sync == sh->
IsSync()) {
1801 if ((
fSignals->
IsSet(sig) && sigdone == -1) || sigdone == sig) {
1802 if (sigdone == -1) {
1812 if (sigdone != -1)
return kTRUE;
1834 (fddone == fd && read)) {
1844 (fddone == fd && !read)) {
1854 if (fddone != -1)
return kTRUE;
1871 if (dirname.
Length() == 0) {
1888 if (res)
return res;
1908 const char *proto = (strstr(
name,
"file:///")) ?
"file://" :
"file:";
1911 if (!
name)
return 0;
1915 if (!
name)
return 0;
1938 helper->FreeDirectory(dirp);
1942 ::FindClose(tsfd->fSearchFile);
1954 return helper->GetDirEntry(dirp);
1957 if (tsfd->fFirstFile) {
1962 return (
const char *)tsfd->fFindFileData.cFileName;
1964 if (::FindNextFile(tsfd->fSearchFile, &tsfd->fFindFileData)) {
1965 return (
const char *)tsfd->fFindFileData.cFileName;
1989 return (psz[0] == TEXT(
'\\') && psz[1] == TEXT(
'\\'));
2009#pragma data_seg(".text", "CODE")
2024 if (!IsDBCSLeadByte(*pPath)) {
2029 if ((*pPath == TEXT(
'\\')) && (*(pPath + 1) == 0))
2035 int cBackslashes = 0;
2036 for (
p = pPath + 2; *
p;
p = CharNext(
p)) {
2037 if (*
p == TEXT(
'\\') && (++cBackslashes > 1))
2057 const char *proto = (strstr(fdir,
"file:///")) ?
"file://" :
"file:";
2060 char *dir =
new char[MAX_PATH];
2061 if (IsShortcut(sdir)) {
2062 if (!ResolveShortCut(sdir, dir, MAX_PATH))
2063 strlcpy(dir, sdir,MAX_PATH);
2066 strlcpy(dir, sdir,MAX_PATH);
2068 size_t nche = strlen(dir)+3;
2069 char *entry =
new char[nche];
2070 struct _stati64 finfo;
2073 strlcpy(entry, dir,nche);
2074 if ((entry[strlen(dir)-1] ==
'/') || (entry[strlen(dir)-1] ==
'\\' )) {
2075 entry[strlen(dir)-1] =
'\0';
2078 strlcat(entry,
"\\",nche);
2080 if (_stati64(entry, &finfo) < 0) {
2086 strlcpy(entry, dir,nche);
2087 if ((entry[strlen(dir)-1] ==
'/') || (entry[strlen(dir)-1] ==
'\\' )) {
2089 entry[strlen(dir)-1] =
'\0';
2091 if (_stati64(entry, &finfo) < 0) {
2098 if (finfo.st_mode & S_IFDIR) {
2099 strlcpy(entry, dir,nche);
2100 if (!(entry[strlen(dir)-1] ==
'/' || entry[strlen(dir)-1] ==
'\\' )) {
2101 strlcat(entry,
"\\",nche);
2103 if (entry[strlen(dir)-1] ==
' ')
2104 entry[strlen(dir)-1] =
'\0';
2105 strlcat(entry,
"*",nche);
2174 char *wdpath =
nullptr;
2175 char drive = driveletter ? toupper( driveletter ) -
'A' + 1 : 0;
2181 if (!(wdpath = ::_getdcwd( (
int)drive, wdpath,
kMAXPATHLEN))) {
2183 Warning(
"WorkingDirectory",
"getcwd() failed");
2207 return std::string(mydir);
2215 const char *
h =
nullptr;
2216 if (!(
h = std::getenv(
"home")))
h = std::getenv(
"HOME");
2223 h = std::getenv(
"HOMESHARE");
2224 if (!
h)
h = std::getenv(
"HOMEDRIVE");
2227 h = std::getenv(
"HOMEPATH");
2232 h = std::getenv(
"USERPROFILE");
2237 if (mydir[1] ==
':')
2238 mydir[0] = toupper(mydir[0]);
2254 if (!dir) dir =
"c:\\";
2272 char tmpName[MAX_PATH];
2274 auto res = ::GetTempFileName(dir ? dir :
TempDirectory(), base.
Data(), 0, tmpName);
2276 ::SysError(
"TempFileName",
"Fail to generate temporary file name");
2281 if (suffix && *suffix) {
2285 ::SysError(
"TempFileName",
"Temporary file %s already exists", base.
Data());
2292 ::SysError(
"TempFileName",
"Fail to rename temporary file to %s", base.
Data());
2298 FILE *fp = fopen(base.
Data(),
"w+");
2300 if (!fp)
::SysError(
"TempFileName",
"error opening %s", base.
Data());
2318 if (!opt || !opt[0]) {
2323 UINT nOldErrorMode = ::SetErrorMode(SEM_FAILCRITICALERRORS);
2327 curdrive = _getdrive();
2328 if (strstr(opt,
"cur")) {
2330 sDrive.
Form(
"%c:", (curdrive +
'A' - 1));
2331 sType.
Form(
"Unknown Drive (%s)", sDrive.
Data());
2332 ::GetVolumeInformation(
Form(
"%s\\", sDrive.
Data()), NULL, 0, NULL, NULL,
2333 NULL, (LPSTR)szFs, 32);
2334 type = ::GetDriveType(sDrive.
Data());
2337 case DRIVE_NO_ROOT_DIR:
2339 case DRIVE_REMOVABLE:
2340 sType.
Form(
"Removable Disk (%s)", sDrive.
Data());
2343 sType.
Form(
"Local Disk (%s)", sDrive.
Data());
2346 sType.
Form(
"Network Drive (%s) (%s)", szFs, sDrive.
Data());
2349 sType.
Form(
"CD/DVD Drive (%s)", sDrive.
Data());
2352 sType.
Form(
"RAM Disk (%s)", sDrive.
Data());
2357 else if (strstr(opt,
"all")) {
2360 if (::GetLogicalDriveStrings(511, szTemp)) {
2361 TCHAR szDrive[3] = TEXT(
" :");
2367 sDrive.
Form(
"%s", szDrive);
2369 if ((sDrive ==
"A:") || (sDrive ==
"B:")) {
2373 sType.
Form(
"Unknown Drive (%s)", sDrive.
Data());
2374 ::GetVolumeInformation(
Form(
"%s\\", sDrive.
Data()), NULL, 0, NULL,
2375 NULL, NULL, (LPSTR)szFs, 32);
2376 type = ::GetDriveType(sDrive.
Data());
2379 case DRIVE_NO_ROOT_DIR:
2381 case DRIVE_REMOVABLE:
2382 sType.
Form(
"Removable Disk (%s)", sDrive.
Data());
2385 sType.
Form(
"Local Disk (%s)", sDrive.
Data());
2388 sType.
Form(
"Network Drive (%s) (%s)", szFs, sDrive.
Data());
2391 sType.
Form(
"CD/DVD Drive (%s)", sDrive.
Data());
2394 sType.
Form(
"RAM Disk (%s)", sDrive.
Data());
2404 ::SetErrorMode(nOldErrorMode);
2427 if (strchr(pathname,
'/') || strchr(pathname,
'\\')) {
2428 const char *rslash = strrchr(pathname,
'/');
2429 const char *bslash = strrchr(pathname,
'\\');
2430 const char *
r = std::max(rslash, bslash);
2431 const char *ptr = pathname;
2441 int len =
r - pathname;
2466 if (!pathname)
return 0;
2467 if (!pathname[0])
return 0;
2473 while(*lpchar ==
' ') lpchar++;
2475 if (isalpha((
int)*lpchar) && *(lpchar+1) ==
':') {
2479 if ( (*lpchar ==
'\\' || *lpchar ==
'/' ) &&
2480 (*(lpchar+1) ==
'\\' || *(lpchar+1) ==
'/') )
return 0;
2493 if (strchr(dir,
':')) idx = 2;
2494 return (dir[idx] ==
'/' || dir[idx] ==
'\\');
2527 const int kBufSize = 1024;
2528 TTHREAD_TLS_ARRAY(
char, kBufSize, temp);
2530 strlcpy(temp,
name, kBufSize);
2531 char *currentChar = temp;
2534 while (*currentChar !=
'\0') {
2535 if (*currentChar ==
'\\') *currentChar =
'/';
2553 UINT nOldErrorMode = ::SetErrorMode(SEM_FAILCRITICALERRORS);
2557 const char *proto = (strstr(path,
"file:///")) ?
"file://" :
"file:";
2560 ::SetErrorMode(nOldErrorMode);
2565 ::SetErrorMode(nOldErrorMode);
2588 if (dir && dir[0]) {
2590 char last = dir[strlen(dir) - 1];
2591 if (last !=
'/' && last !=
'\\') {
2595 name.ReplaceAll(
"/",
"\\");
2612 if (!ret)
return -1;
2621 int ret = std::rename(
f, t);
2638 struct _stati64 sbuf;
2641 const char *proto = (strstr(path,
"file:///")) ?
"file://" :
"file:";
2643 size_t l = strlen(newpath);
2645 if (newpath[--
l] !=
'\\' || newpath[--
l] !=
'/') {
2651 if (newpath && ::_stati64(newpath, &sbuf) >= 0) {
2653 buf.
fDev = sbuf.st_dev;
2654 buf.
fIno = sbuf.st_ino;
2655 buf.
fMode = sbuf.st_mode;
2656 buf.
fUid = sbuf.st_uid;
2657 buf.
fGid = sbuf.st_gid;
2658 buf.
fSize = sbuf.st_size;
2659 buf.
fMtime = sbuf.st_mtime;
2660 buf.
fIsLink = IsShortcut(newpath);
2662 char *lpath =
new char[MAX_PATH];
2663 if (IsShortcut(newpath)) {
2664 struct _stati64 sbuf2;
2665 if (ResolveShortCut(newpath, lpath, MAX_PATH)) {
2666 if (::_stati64(lpath, &sbuf2) >= 0) {
2667 buf.
fMode = sbuf2.st_mode;
2693 LPCTSTR lpRootPathName = path;
2696 LPTSTR lpVolumeNameBuffer = 0;
2697 DWORD nVolumeNameSize = 0;
2699 DWORD volumeSerialNumber;
2700 DWORD maximumComponentLength;
2703 DWORD fileSystemFlags;
2706 char fileSystemNameBuffer[512];
2707 DWORD nFileSystemNameSize =
sizeof(fileSystemNameBuffer);
2710 UINT nOldErrorMode = ::SetErrorMode(SEM_FAILCRITICALERRORS);
2711 if (!::GetVolumeInformation(lpRootPathName,
2712 lpVolumeNameBuffer, nVolumeNameSize,
2713 &volumeSerialNumber,
2714 &maximumComponentLength,
2716 fileSystemNameBuffer, nFileSystemNameSize)) {
2718 ::SetErrorMode(nOldErrorMode);
2722 const char *fsNames[] = {
"FAT",
"NTFS" };
2724 for (i = 0; i < 2; i++) {
2725 if (!strncmp(fileSystemNameBuffer, fsNames[i], nFileSystemNameSize))
2730 DWORD sectorsPerCluster;
2731 DWORD bytesPerSector;
2732 DWORD numberOfFreeClusters;
2733 DWORD totalNumberOfClusters;
2735 if (!::GetDiskFreeSpace(lpRootPathName,
2738 &numberOfFreeClusters,
2739 &totalNumberOfClusters)) {
2741 ::SetErrorMode(nOldErrorMode);
2745 ::SetErrorMode(nOldErrorMode);
2747 *bsize = sectorsPerCluster * bytesPerSector;
2748 *blocks = totalNumberOfClusters;
2749 *bfree = numberOfFreeClusters;
2759 struct _stati64 finfo;
2764 char linkname[1024];
2765 LPTSTR lpszFilePart;
2766 TCHAR szPath[MAX_PATH];
2769 typedef BOOL (__stdcall *CREATEHARDLINKPROC)( LPCTSTR, LPCTSTR, LPSECURITY_ATTRIBUTES );
2770 static CREATEHARDLINKPROC _CreateHardLink = 0;
2772 HMODULE hModImagehlp = LoadLibrary(
"Kernel32.dll" );
2777 _CreateHardLink = (CREATEHARDLINKPROC) GetProcAddress( hModImagehlp,
"CreateHardLinkW" );
2779 _CreateHardLink = (CREATEHARDLINKPROC) GetProcAddress( hModImagehlp,
"CreateHardLinkA" );
2781 if (!_CreateHardLink)
2784 dwRet = GetFullPathName(from,
sizeof(szPath) /
sizeof(TCHAR),
2785 szPath, &lpszFilePart);
2787 if (_stati64(szPath, &finfo) < 0)
2790 if (finfo.st_mode & S_IFDIR)
2793 snprintf(linkname,1024,
"%s",to);
2794 _splitpath(linkname,winDrive,winDir,winName,winExt);
2795 if ((!winDrive[0] ) &&
2797 _splitpath(szPath,winDrive,winDir,winName,winExt);
2798 snprintf(linkname,1024,
"%s\\%s\\%s", winDrive, winDir, to);
2800 else if (!winDrive[0]) {
2801 _splitpath(szPath,winDrive,winDir,winName,winExt);
2802 snprintf(linkname,1024,
"%s\\%s", winDrive, to);
2805 if (!_CreateHardLink(linkname, szPath, NULL))
2818 IShellLink* pShellLink;
2819 IPersistFile* pPersistFile;
2820 WCHAR wszLinkfile[MAX_PATH];
2821 int iWideCharsWritten;
2823 LPTSTR lpszFilePart;
2824 TCHAR szPath[MAX_PATH];
2826 hRes = E_INVALIDARG;
2827 if ((from == NULL) || (!from[0]) || (to == NULL) ||
2833 typedef HRESULT (__stdcall *COINITIALIZEPROC)( LPVOID );
2834 static COINITIALIZEPROC _CoInitialize = 0;
2835 typedef void (__stdcall *COUNINITIALIZEPROC)( void );
2836 static COUNINITIALIZEPROC _CoUninitialize = 0;
2837 typedef HRESULT (__stdcall *COCREATEINSTANCEPROC)( REFCLSID, LPUNKNOWN,
DWORD, REFIID, LPVOID );
2838 static COCREATEINSTANCEPROC _CoCreateInstance = 0;
2840 HMODULE hModImagehlp = LoadLibrary(
"ole32.dll" );
2844 _CoInitialize = (COINITIALIZEPROC) GetProcAddress( hModImagehlp,
"CoInitialize" );
2847 _CoUninitialize = (COUNINITIALIZEPROC) GetProcAddress( hModImagehlp,
"CoUninitialize" );
2848 if (!_CoUninitialize)
2850 _CoCreateInstance = (COCREATEINSTANCEPROC) GetProcAddress( hModImagehlp,
"CoCreateInstance" );
2851 if (!_CoCreateInstance)
2858 _CoInitialize(NULL);
2861 dwRet = GetFullPathName(from,
sizeof(szPath) /
sizeof(TCHAR),
2862 szPath, &lpszFilePart);
2863 hRes = _CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
2864 IID_IShellLink, (LPVOID *)&pShellLink);
2865 if (SUCCEEDED(hRes)) {
2867 hRes = pShellLink->SetPath(szPath);
2869 hRes = pShellLink->QueryInterface(IID_IPersistFile, (
void **)&pPersistFile);
2870 if (SUCCEEDED(hRes)){
2871 iWideCharsWritten = MultiByteToWideChar(CP_ACP, 0, linkname.
Data(), -1,
2872 wszLinkfile, MAX_PATH);
2873 hRes = pPersistFile->Save(wszLinkfile, TRUE);
2874 pPersistFile->Release();
2876 pShellLink->Release();
2894 struct _stati64 finfo;
2896 if (_stati64(
name, &finfo) < 0) {
2900 if (finfo.st_mode & S_IFDIR) {
2901 return ::_rmdir(
name);
2903 return ::_unlink(
name);
2912 if (::ioctlsocket(fd, FIONBIO, (u_long *)1) == SOCKET_ERROR) {
2931 const char *patbuf = (
const char *)patbuf0;
2933 char *cmd =
nullptr;
2945 const char driveletter =
DriveName(patbuf);
2962 while (*patbuf ==
' ') {
2967 while (*patbuf ==
':') {
2972 while (*patbuf ==
';') {
2978 for (
q = (
char*)patbuf; *
q;
q++) {
2982 if ( (((
q-2)>patbuf) && ( (*(
q-2)!=
';') || !isalpha(*(
q-1)) )) &&
2989 for (
p = patbuf; *
p;
p++) {
3006 char replacement[4];
3009 for (
int k = 0; k<3; k++) replacement[k] = 0x1;
3011 replacement[3] = 0x0;
3015 while ( (pos = patbuf0.
Index(TildaNum,pos)) !=
kNPOS ) {
3016 patbuf0.
Replace(pos, 1, replacement);
3022 Int_t lbuf = ::ExpandEnvironmentStrings(
3028 cmd =
new char[lbuf+1];
3029 ::ExpandEnvironmentStrings(
3048 char newpath[MAX_PATH];
3049 if (IsShortcut(path)) {
3050 if (!ResolveShortCut(path, newpath, MAX_PATH))
3051 strlcpy(newpath, path, MAX_PATH);
3054 strlcpy(newpath, path, MAX_PATH);
3070 return ::_chmod(file,
mode);
3078 return ::umask(
mask);
3088 Error(
"Utime",
"need write permission for %s to change utime", file);
3091 if (!actime) actime = modtime;
3094 t.actime = (time_t)actime;
3095 t.modtime = (time_t)modtime;
3096 return ::utime(file, &t);
3115 return infile.
Data();
3123 Int_t lastDelim = -1;
3124 for(
int i=0; i < exsearch.
Length(); ++i) {
3125 switch( exsearch[i] ) {
3128 if (i-lastDelim!=2) exsearch[i] =
';';
3131 case ';': lastDelim = i;
break;
3138 char *lpFilePart =
nullptr;
3140 ::access(
name,
mode) == 0 && stat(
name, &finfo) == 0 &&
3141 finfo.st_mode & S_IFREG) {
3146 return infile.
Data();
3160 if ((
gEnv->
GetValue(
"WinNT.UseNetAPI", 0)) && (::GetVersion() < 0x80000000)) {
3163 HINSTANCE netapi = ::LoadLibrary(
"netapi32.DLL");
3164 if (!netapi)
return kFALSE;
3166 p2NetApiBufferFree = (pfn1)::GetProcAddress(netapi,
"NetApiBufferFree");
3167 p2NetUserGetInfo = (pfn2)::GetProcAddress(netapi,
"NetUserGetInfo");
3168 p2NetLocalGroupGetMembers = (pfn3)::GetProcAddress(netapi,
"NetLocalGroupGetMembers");
3169 p2NetLocalGroupEnum = (pfn4)::GetProcAddress(netapi,
"NetLocalGroupEnum");
3171 if (!p2NetApiBufferFree || !p2NetUserGetInfo ||
3172 !p2NetLocalGroupGetMembers || !p2NetLocalGroupEnum)
return kFALSE;
3183 ::FreeLibrary(netapi);
3193 NET_API_STATUS NetStatus = NERR_Success;
3195 DWORD Index = 0, Total = 0;
3196 DWORD_PTR ResumeHandle = 0;
3197 LOCALGROUP_MEMBERS_INFO_1 *MemberInfo;
3198 WCHAR wszGroupName[256];
3200 DWORD dwLastError = 0;
3202 iRetOp = MultiByteToWideChar (
3204 (
DWORD)MB_PRECOMPOSED,
3205 (LPCSTR)lpszGroupName,
3207 (LPWSTR)wszGroupName,
3208 (
int)
sizeof(wszGroupName) );
3211 dwLastError = GetLastError();
3213 p2NetApiBufferFree(Data);
3219 NetStatus = p2NetLocalGroupGetMembers (NULL, wszGroupName, 1,
3220 &Data, 8192, &Index, &Total, &ResumeHandle );
3222 if (NetStatus != NERR_Success || Data == NULL) {
3223 dwLastError = GetLastError();
3225 if (dwLastError == ERROR_ENVVAR_NOT_FOUND) {
3231 NetStatus = p2NetLocalGroupGetMembers ( NULL, wszGroupName, 0,
3232 &Data, 8192, &Index, &Total, &ResumeHandle );
3236 p2NetApiBufferFree(Data);
3241 MemberInfo = (LOCALGROUP_MEMBERS_INFO_1 *)Data;
3244 p2NetApiBufferFree(Data);
3253 NET_API_STATUS NetStatus = NERR_Success;
3255 DWORD Index = 0, Total = 0, i;
3256 DWORD_PTR ResumeHandle = 0;
3257 LOCALGROUP_INFO_0 *GroupInfo;
3258 char szAnsiName[256];
3259 DWORD dwLastError = 0;
3262 NetStatus = p2NetLocalGroupEnum(NULL, 0, &Data, 8192, &Index,
3263 &Total, &ResumeHandle );
3265 if (NetStatus != NERR_Success || Data == NULL) {
3266 dwLastError = GetLastError();
3268 p2NetApiBufferFree(Data);
3273 GroupInfo = (LOCALGROUP_INFO_0 *)Data;
3274 for (i=0; i < Total; i++) {
3276 iRetOp = WideCharToMultiByte (
3279 (LPCWSTR)(GroupInfo->lgrpi0_name),
3282 (
int)(
sizeof(szAnsiName)),
3294 p2NetApiBufferFree(Data);
3306 int &groupIdx,
int &memberIdx)
3308 BOOL bRetOp = FALSE;
3310 DWORD dwSidSize, dwDomainNameSize;
3313 SID_NAME_USE sidType;
3314 PUCHAR puchar_SubAuthCount = NULL;
3315 SID_IDENTIFIER_AUTHORITY sid_identifier_authority;
3316 PSID_IDENTIFIER_AUTHORITY psid_identifier_authority = NULL;
3317 unsigned char j = 0;
3318 DWORD dwLastError = 0;
3320 pSid = (PSID)bySidBuffer;
3321 dwSidSize =
sizeof(bySidBuffer);
3322 dwDomainNameSize =
sizeof(szDomainName);
3324 bRetOp = LookupAccountName (
3326 (LPCTSTR)lpszAccountName,
3328 (LPDWORD)&dwSidSize,
3329 (LPTSTR)szDomainName,
3330 (LPDWORD)&dwDomainNameSize,
3331 (PSID_NAME_USE)&sidType );
3333 if (bRetOp == FALSE) {
3334 dwLastError = GetLastError();
3338 bRetOp = IsValidSid((PSID)pSid);
3340 if (bRetOp == FALSE) {
3341 dwLastError = GetLastError();
3346 psid_identifier_authority = GetSidIdentifierAuthority ((PSID)pSid);
3349 memcpy (&sid_identifier_authority, psid_identifier_authority,
3350 sizeof(SID_IDENTIFIER_AUTHORITY));
3353 puchar_SubAuthCount = (PUCHAR)GetSidSubAuthorityCount((PSID)pSid);
3355 j = (
unsigned char)(*puchar_SubAuthCount);
3357 DWORD dwSubAuth = 0;
3358 PDWORD pdwSubAuth = NULL;
3360 pdwSubAuth = (PDWORD)GetSidSubAuthority (
3363 dwSubAuth = *pdwSubAuth;
3382 NET_API_STATUS NetStatus = NERR_Success;
3384 DWORD Index = 0, Total = 0, i;
3385 DWORD_PTR ResumeHandle = 0;
3386 LOCALGROUP_MEMBERS_INFO_1 *MemberInfo;
3387 char szAnsiMemberName[256];
3388 char szFullMemberName[256];
3389 char szMemberHomeDir[256];
3390 WCHAR wszGroupName[256];
3394 DWORD dwLastError = 0;
3395 LPUSER_INFO_11 pUI11Buf = NULL;
3396 NET_API_STATUS nStatus;
3398 iRetOp = MultiByteToWideChar (
3400 (
DWORD)MB_PRECOMPOSED,
3401 (LPCSTR)lpszGroupName,
3403 (LPWSTR)wszGroupName,
3404 (
int)
sizeof(wszGroupName) );
3407 dwLastError = GetLastError();
3409 p2NetApiBufferFree(Data);
3413 GetUserName (act_name, &
length);
3417 NetStatus = p2NetLocalGroupGetMembers (NULL, wszGroupName, 1,
3418 &Data, 8192, &Index, &Total, &ResumeHandle );
3420 if (NetStatus != NERR_Success || Data == NULL) {
3421 dwLastError = GetLastError();
3423 if (dwLastError == ERROR_ENVVAR_NOT_FOUND) {
3429 NetStatus = p2NetLocalGroupGetMembers ( NULL, wszGroupName, 0,
3430 &Data, 8192, &Index, &Total, &ResumeHandle );
3434 p2NetApiBufferFree(Data);
3438 MemberInfo = (LOCALGROUP_MEMBERS_INFO_1 *)Data;
3439 for (i=0; i < Total; i++) {
3440 iRetOp = WideCharToMultiByte (
3443 (LPCWSTR)(MemberInfo->lgrmi1_name),
3445 (LPSTR)szAnsiMemberName,
3446 (
int)(
sizeof(szAnsiMemberName)),
3451 dwLastError = GetLastError();
3462 TCHAR szUserName[255]=TEXT(
"");
3463 MultiByteToWideChar(CP_ACP, 0, szAnsiMemberName, -1, (LPWSTR)szUserName, 255);
3467 nStatus = p2NetUserGetInfo(NULL, (LPCWSTR)szUserName, 11, (LPBYTE *)&pUI11Buf);
3471 if (nStatus == NERR_Success) {
3472 if (pUI11Buf != NULL) {
3473 wsprintf(szFullMemberName,
"%S",pUI11Buf->usri11_full_name);
3475 wsprintf(szMemberHomeDir,
"%S",pUI11Buf->usri11_home_dir);
3486 if (pUI11Buf != NULL) {
3487 p2NetApiBufferFree(pUI11Buf);
3492 if (getenv(
"SHELL") == NULL)
3493 putenv ((GetVersion () & 0x80000000) ?
"SHELL=command" :
"SHELL=cmd");
3506 p2NetApiBufferFree(Data);
3516 NET_API_STATUS NetStatus = NERR_Success;
3518 DWORD Index = 0, Total = 0, i;
3519 DWORD_PTR ResumeHandle = 0;
3520 LOCALGROUP_INFO_0 *GroupInfo;
3521 char szAnsiName[256];
3522 DWORD dwLastError = 0;
3523 int iRetOp = 0, iGroupIdx = 0, iMemberIdx = 0;
3525 NetStatus = p2NetLocalGroupEnum(NULL, 0, &Data, 8192, &Index,
3526 &Total, &ResumeHandle );
3528 if (NetStatus != NERR_Success || Data == NULL) {
3529 dwLastError = GetLastError();
3531 p2NetApiBufferFree(Data);
3535 GroupInfo = (LOCALGROUP_INFO_0 *)Data;
3536 for (i=0; i < Total; i++) {
3538 iRetOp = WideCharToMultiByte (
3541 (LPCWSTR)(GroupInfo->lgrpi0_name),
3544 (
int)(
sizeof(szAnsiName)),
3562 p2NetApiBufferFree(Data);
3576 if ((!
gEnv->
GetValue(
"WinNT.UseNetAPI", 0)) || (::GetVersion() >= 0x80000000)) {
3581 if (stricmp (
"administrator",
name) == 0)
3591 if (!user || !user[0])
3596 if (!stricmp (user,
fPasswords[i].pw_name)) {
3617 if ((!
gEnv->
GetValue(
"WinNT.UseNetAPI", 0)) || (::GetVersion() >= 0x80000000)) {
3622 if (stricmp (
"administrator",
name) == 0)
3644 if ((!
gEnv->
GetValue(
"WinNT.UseNetAPI", 0)) || (::GetVersion() >= 0x80000000)) {
3649 if (stricmp (
"administrator",
name) == 0)
3662 struct group *grp =
nullptr;
3685 if ((!
gEnv->
GetValue(
"WinNT.UseNetAPI", 0)) || (::GetVersion() >= 0x80000000)) {
3690 if (stricmp (
"administrator",
name) == 0)
3713 if ((!
gEnv->
GetValue(
"WinNT.UseNetAPI", 0)) || (::GetVersion() >= 0x80000000)) {
3719 if (stricmp (
"administrator",
name) == 0) {
3721 ug->
fGroup =
"administrators";
3730 ug->
fUser =
"unknown";
3743 for (
int i = 0; i <
fNbUsers; i++) {
3787 if ((!
gEnv->
GetValue(
"WinNT.UseNetAPI", 0)) || (::GetVersion() >= 0x80000000)) {
3792 if (stricmp (
"administrator",
name) == 0) {
3793 gr->fGroup =
"administrators";
3797 gr->fGroup =
"users";
3802 gr->fGroup =
"unknown";
3808 struct group *grp =
nullptr;
3810 if (gid ==
fGroups[i].gr_gid) {
3852 const char *env = std::getenv(
name);
3854 if (::_stricmp(
name,
"home") == 0 ) {
3856 }
else if (::_stricmp(
name,
"rootsys") == 0 ) {
3870 return ::system(shellcmd);
3878 return ::_popen(command,
mode);
3886 return ::_pclose(pipe);
3914 gROOT->CloseFiles();
3915 if (
gROOT->GetListOfBrowsers()) {
3918 if (
gROOT->IsBatch())
3919 gROOT->GetListOfBrowsers()->Delete();
3924 if (
b->GetBrowserImp() &&
b->GetBrowserImp()->GetMainFrame())
3926 (((TBrowser*)0x%zx)->GetBrowserImp()->GetMainFrame()->CloseWindow();",
3968 static int fd1=0, fd2=0;
3969 static fpos_t pos1=0, pos2=0;
3979 const char *
m = (
mode[0] ==
'a' ||
mode[0] ==
'w') ?
mode :
"a";
3992 fgetpos(stdout, &pos1);
3993 fd1 = _dup(fileno(stdout));
3995 if ((fout = freopen(file,
m, stdout)) == 0) {
3996 SysError(
"RedirectOutput",
"could not freopen stdout");
3998 _dup2(fd1, fileno(stdout));
4002 fsetpos(stdout, &pos1);
4007 fgetpos(stderr, &pos2);
4008 fd2 = _dup(fileno(stderr));
4009 if ((ferr = freopen(file,
m, stderr)) == 0) {
4010 SysError(
"RedirectOutput",
"could not freopen stderr");
4012 _dup2(fd1, fileno(stdout));
4016 fsetpos(stdout, &pos1);
4018 _dup2(fd2, fileno(stderr));
4022 fsetpos(stderr, &pos2);
4027 fseek(fout, 0, SEEK_END);
4028 fseek(ferr, 0, SEEK_END);
4035 if (_dup2(fd1, fileno(stdout))) {
4036 SysError(
"RedirectOutput",
"could not restore stdout");
4042 fsetpos(stdout, &pos1);
4049 if (_dup2(fd2, fileno(stderr))) {
4050 SysError(
"RedirectOutput",
"could not restore stderr");
4056 fsetpos(stderr, &pos2);
4111 if (
len > 4 && (!stricmp(sLib.
Data()+
len-4,
".dll"))) {
4124 Error(
"DynamicPathName",
4125 "%s does not exist in %s,\nor has wrong file extension (.dll)",
4142#pragma warning(push)
4143#pragma warning(disable:4200)
4160 if (!linkedLibs.
IsNull())
4176 if((hFile = CreateFile(exe,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0))==
INVALID_HANDLE_VALUE) {
4180 if(!(hMapping = CreateFileMapping(hFile,0,PAGE_READONLY|SEC_COMMIT,0,0,0))) {
4185 if(!(basepointer = MapViewOfFile(hMapping,FILE_MAP_READ,0,0,0))) {
4186 CloseHandle(hMapping);
4193 IMAGE_DOS_HEADER *dos_head = (IMAGE_DOS_HEADER *)basepointer;
4196 IMAGE_FILE_HEADER _head;
4197 IMAGE_OPTIONAL_HEADER opt_head;
4198 IMAGE_SECTION_HEADER section_header[];
4200 struct header *pheader;
4201 const IMAGE_SECTION_HEADER * section_header;
4203 if(dos_head->e_magic!=
'ZM') {
4208 pheader = (
struct header *)((
char*)dos_head + dos_head->e_lfanew);
4210 if(IsBadReadPtr(pheader,
sizeof(
struct header))) {
4214 if(pheader->signature!=IMAGE_NT_SIGNATURE) {
4215 switch((
unsigned short)pheader->signature) {
4216 case IMAGE_DOS_SIGNATURE:
4219 case IMAGE_OS2_SIGNATURE:
4222 case IMAGE_OS2_SIGNATURE_LE:
4230#define isin(address,start,length) ((address)>=(start) && (address)<(start)+(length))
4233 for(sect=0,section_header=pheader->section_header;
4234 sect<pheader->_head.NumberOfSections;sect++,section_header++) {
4236 const void *
const section_data =
4237 (
char*)basepointer + section_header->PointerToRawData;
4238 for(directory=0;directory<IMAGE_NUMBEROF_DIRECTORY_ENTRIES;directory++) {
4239 if(
isin(pheader->opt_head.DataDirectory[directory].VirtualAddress,
4240 section_header->VirtualAddress,
4241 section_header->SizeOfRawData)) {
4242 const IMAGE_IMPORT_DESCRIPTOR *stuff_start =
4243 (IMAGE_IMPORT_DESCRIPTOR *)((
char*)section_data +
4244 (pheader->opt_head.DataDirectory[directory].VirtualAddress -
4245 section_header->VirtualAddress));
4248 const unsigned stuff_length =
4249 pheader->opt_head.DataDirectory[directory].Size;
4250 if(directory == IMAGE_DIRECTORY_ENTRY_IMPORT) {
4251 while(!IsBadReadPtr(stuff_start,
sizeof(*stuff_start)) &&
4252 stuff_start->Name) {
4253 TString dll = (
char*)section_data +
4254 ((
DWORD)(stuff_start->Name)) -
4255 section_header->VirtualAddress;
4259 char *winPath = getenv(
"windir");
4260 _splitpath(winPath,winDrive,winDir,winName,winExt);
4261 if(!strstr(dllPath, winDir)) {
4262 if (!linkedLibs.
IsNull())
4264 linkedLibs += dllPath;
4276 UnmapViewOfFile(basepointer);
4277 CloseHandle(hMapping);
4308 char drive[_MAX_DRIVE], dir[_MAX_DIR], fname[_MAX_FNAME], ext[_MAX_EXT];
4311 std::vector<std::string> all_libs, libpaths;
4317 while (getline(libenv, str,
';')) {
4318 libpaths.push_back(str);
4321 std::stringstream libraries(libs.
Data());
4322 while (getline(libraries, str,
' ')) {
4323 std::string::size_type first, last;
4326 if (str.rfind(
"-L", 0) == 0) {
4327 first = str.find_first_of(
'%');
4328 last = str.find_last_of(
'%');
4329 if ((first != std::string::npos) && (last != std::string::npos) &&
4334 std::string var = str.substr(first+1, last-first-1);
4339 env += str.substr(last+1);
4340 libpaths.push_back(env);
4344 ntlibs.
Append(str.c_str());
4349 last = str.rfind(
".dll");
4350 if (last != std::string::npos)
4351 str.replace(last, 4,
".lib");
4352 last = str.rfind(
".DLL");
4353 if (last != std::string::npos)
4354 str.replace(last, 4,
".lib");
4355 if (str.rfind(
".lib") != std::string::npos ||
4356 str.rfind(
".LIB") != std::string::npos) {
4358 if (_stat( str.c_str(), &buf ) == 0) {
4360 ntlibs.
Append(str.c_str());
4370 size_t requiredSize;
4371 getenv_s( &requiredSize, NULL, 0,
"WinDir");
4372 if (requiredSize == 0) {
4373 windir = strdup(
":\\WINDOWS");
4375 windir = (
char*) malloc(requiredSize *
sizeof(
char));
4377 windir = strdup(
":\\WINDOWS");
4379 getenv_s( &requiredSize, windir, requiredSize,
"WinDir" );
4382 if (str.find(windir) == std::string::npos) {
4383 _splitpath(str.c_str(), drive, dir, fname, ext);
4384 std::string libname(fname);
4386 all_libs.push_back(libname);
4390 for (
auto lib : all_libs) {
4392 for (
auto libpath : libpaths) {
4394 std::string path_lib(libpath);
4397 if (_stat( path_lib.c_str(), &buf ) == 0) {
4399 ntlibs.
Append(lib.c_str());
4428 if (!ti)
return nullptr;
4485 FILETIME ftFileTime;
4489 ::GetSystemTimeAsFileTime(&ftRealTime.ftFileTime);
4498 OSVERSIONINFO OsVersionInfo;
4507 OsVersionInfo.dwOSVersionInfoSize =
sizeof(OSVERSIONINFO);
4508 GetVersionEx(&OsVersionInfo);
4509 if (OsVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT) {
4515 FILETIME ftFileTime;
4520 FILETIME ftFileTime;
4524 HANDLE hThread = GetCurrentThread();
4525 ret = GetThreadTimes (hThread, &ftCreate, &ftExit,
4526 &ftKernel.ftFileTime,
4527 &ftUser.ftFileTime);
4529 ret = ::GetLastError();
4530 ::Error(
"GetCPUTime",
" Error on GetProcessTimes 0x%lx", (
int)ret);
4550 static time_t jan95 = 0;
4561 jan95 = mktime(&tp);
4562 if ((
int)jan95 == -1) {
4563 ::SysError(
"TWinNTSystem::Now",
"error converting 950001 0:00 to time_t");
4570 return TTime((now.time-(
Long_t)jan95)*1000 + now.millitm);
4580 std::this_thread::sleep_for(std::chrono::milliseconds(milliSec));
4596 if (
h->HasReadInterest())
4598 if (
h->HasWriteInterest())
4600 h->ResetReadyMask();
4602 rc = WinNTSelect(&rd, &wr, to);
4631 if (
h->HasReadInterest())
4633 if (
h->HasWriteInterest())
4635 h->ResetReadyMask();
4636 rc = WinNTSelect(&rd, &wr, to);
4658 if ((sp = ::getservbyname(servicename,
kProtocolName)) == 0) {
4659 Error(
"GetServiceByName",
"no service \"%s\" with protocol \"%s\"\n",
4663 return ::ntohs(sp->s_port);
4674 if ((sp = ::getservbyport(::htons(port),
kProtocolName)) == 0) {
4675 return Form(
"%d", port);
4685 struct hostent *host_ptr;
4690 if ((addr = ::inet_addr(hostname)) != INADDR_NONE) {
4692 if ((host_ptr = ::gethostbyaddr((
const char *)&addr,
4693 sizeof(addr), AF_INET))) {
4694 host = host_ptr->h_name;
4698 for (i = 1; host_ptr->h_addr_list[i]; i++) {
4699 memcpy(&addr2, host_ptr->h_addr_list[i], host_ptr->h_length);
4700 a.AddAddress(ntohl(addr2));
4702 for (i = 0; host_ptr->h_aliases[i]; i++)
4703 a.AddAlias(host_ptr->h_aliases[i]);
4706 host =
"UnNamedHost";
4708 }
else if ((host_ptr = ::gethostbyname(hostname))) {
4710 if (host_ptr->h_addrtype != AF_INET) {
4711 Error(
"GetHostByName",
"%s is not an internet host\n", hostname);
4714 memcpy(&addr, host_ptr->h_addr, host_ptr->h_length);
4715 host = host_ptr->h_name;
4716 type = host_ptr->h_addrtype;
4720 for (i = 1; host_ptr->h_addr_list[i]; i++) {
4721 memcpy(&addr2, host_ptr->h_addr_list[i], host_ptr->h_length);
4722 a.AddAddress(ntohl(addr2));
4724 for (i = 0; host_ptr->h_aliases[i]; i++)
4725 a.AddAlias(host_ptr->h_aliases[i]);
4728 if (
gDebug > 0)
Error(
"GetHostByName",
"unknown host %s", hostname);
4740 SOCKET sock = socket;
4741 struct sockaddr_in addr;
4742 int len =
sizeof(addr);
4744 if (::getpeername(sock, (
struct sockaddr *)&addr, &
len) == SOCKET_ERROR) {
4749 struct hostent *host_ptr;
4750 const char *hostname;
4754 if ((host_ptr = ::gethostbyaddr((
const char *)&addr.sin_addr,
4755 sizeof(addr.sin_addr), AF_INET))) {
4756 memcpy(&iaddr, host_ptr->h_addr, host_ptr->h_length);
4757 hostname = host_ptr->h_name;
4758 family = host_ptr->h_addrtype;
4760 memcpy(&iaddr, &addr.sin_addr,
sizeof(addr.sin_addr));
4765 return TInetAddress(hostname, ::ntohl(iaddr), family, ::ntohs(addr.sin_port));
4773 SOCKET sock = socket;
4774 struct sockaddr_in addr;
4775 int len =
sizeof(addr);
4777 if (::getsockname(sock, (
struct sockaddr *)&addr, &
len) == SOCKET_ERROR) {
4782 struct hostent *host_ptr;
4783 const char *hostname;
4787 if ((host_ptr = ::gethostbyaddr((
const char *)&addr.sin_addr,
4788 sizeof(addr.sin_addr), AF_INET))) {
4789 memcpy(&iaddr, host_ptr->h_addr, host_ptr->h_length);
4790 hostname = host_ptr->h_name;
4791 family = host_ptr->h_addrtype;
4793 memcpy(&iaddr, &addr.sin_addr,
sizeof(addr.sin_addr));
4798 return TInetAddress(hostname, ::ntohl(iaddr), family, ::ntohs(addr.sin_port));
4809 if ((sock = ::socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) {
4810 ::SysError(
"TWinNTSystem::AnnounceUnixService",
"socket");
4814 struct sockaddr_in inserver;
4815 memset(&inserver, 0,
sizeof(inserver));
4816 inserver.sin_family = AF_INET;
4817 inserver.sin_addr.s_addr = ::htonl(INADDR_LOOPBACK);
4818 inserver.sin_port = port;
4822 if (::bind(sock, (
struct sockaddr*) &inserver,
sizeof(inserver)) == SOCKET_ERROR) {
4823 ::SysError(
"TWinNTSystem::AnnounceUnixService",
"bind");
4828 if (::listen(sock, backlog)) {
4829 ::SysError(
"TWinNTSystem::AnnounceUnixService",
"listen");
4841 if (!sockpath || strlen(sockpath) <= 0) {
4842 ::SysError(
"TWinNTSystem::AnnounceUnixService",
"socket path undefined");
4846 struct sockaddr_in myaddr;
4848 int len =
sizeof myaddr;
4853 if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
4854 ::SysError(
"TWinNTSystem::AnnounceUnixService",
"socket");
4858 memset(&myaddr, 0,
sizeof(myaddr));
4859 myaddr.sin_port = 0;
4860 myaddr.sin_family = AF_INET;
4861 myaddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
4863 rc = bind(sock, (
struct sockaddr *)&myaddr,
len);
4865 ::SysError(
"TWinNTSystem::AnnounceUnixService",
"bind");
4868 rc = getsockname(sock, (
struct sockaddr *)&myaddr, &
len);
4870 ::SysError(
"TWinNTSystem::AnnounceUnixService",
"getsockname");
4873 TString socketpath = sockpath;
4875 fp = fopen(socketpath,
"wb");
4877 ::SysError(
"TWinNTSystem::AnnounceUnixService",
"fopen");
4880 fprintf(fp,
"%d", myaddr.sin_port);
4884 if (listen(sock, backlog)) {
4885 ::SysError(
"TWinNTSystem::AnnounceUnixService",
"listen");
4897 if (socket == -1)
return;
4898 SOCKET sock = socket;
4901 ::shutdown(sock, 2);
4903 struct linger linger = {0, 0};
4904 ::setsockopt(sock, SOL_SOCKET, SO_LINGER, (
char *) &linger,
sizeof(linger));
4905 while (::closesocket(sock) == SOCKET_ERROR && WSAGetLastError() == WSAEINTR) {
4919 if (WinNTRecv(sock, &header,
sizeof(header), 0) > 0) {
4920 int count = ::ntohl(header);
4923 Error(
"RecvBuf",
"record header exceeds buffer size");
4925 }
else if (count > 0) {
4926 if (WinNTRecv(sock, buf, count, 0) < 0) {
4927 Error(
"RecvBuf",
"cannot receive buffer");
4944 if (WinNTSend(sock, &header,
sizeof(header), 0) < 0) {
4945 Error(
"SendBuf",
"cannot send header");
4949 if (WinNTSend(sock, buf,
length, 0) < 0) {
4950 Error(
"SendBuf",
"cannot send buffer");
4990 if ((
n = WinNTRecv(sock, buf,
length, flag)) <= 0) {
4992 Error(
"RecvRaw",
"cannot receive buffer");
5026 if ((
n = WinNTSend(sock, buf,
length, flag)) <= 0) {
5028 Error(
"SendRaw",
"cannot send buffer");
5041 if (socket == -1)
return -1;
5042 SOCKET sock = socket;
5046 if (::setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (
char*)&val,
sizeof(val)) == SOCKET_ERROR) {
5047 ::SysError(
"SetSockOpt",
"setsockopt(SO_SNDBUF)");
5052 if (::setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (
char*)&val,
sizeof(val)) == SOCKET_ERROR) {
5053 ::SysError(
"SetSockOpt",
"setsockopt(SO_RCVBUF)");
5058 if (::setsockopt(sock, SOL_SOCKET, SO_OOBINLINE, (
char*)&val,
sizeof(val)) == SOCKET_ERROR) {
5059 SysError(
"SetSockOpt",
"setsockopt(SO_OOBINLINE)");
5064 if (::setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, (
char*)&val,
sizeof(val)) == SOCKET_ERROR) {
5065 ::SysError(
"SetSockOpt",
"setsockopt(SO_KEEPALIVE)");
5070 if (::setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (
char*)&val,
sizeof(val)) == SOCKET_ERROR) {
5071 ::SysError(
"SetSockOpt",
"setsockopt(SO_REUSEADDR)");
5076 if (::setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (
char*)&val,
sizeof(val)) == SOCKET_ERROR) {
5077 ::SysError(
"SetSockOpt",
"setsockopt(TCP_NODELAY)");
5082 if (::ioctlsocket(sock, FIONBIO, &val) == SOCKET_ERROR) {
5089 if (::ioctl(sock, SIOCSPGRP, &val) == -1) {
5090 ::SysError(
"SetSockOpt",
"ioctl(SIOCSPGRP)");
5098 Error(
"SetSockOpt",
"illegal option (%d)", opt);
5110 if (socket == -1)
return -1;
5111 SOCKET sock = socket;
5113 int optlen =
sizeof(*val);
5117 if (::getsockopt(sock, SOL_SOCKET, SO_SNDBUF, (
char*)val, &optlen) == SOCKET_ERROR) {
5118 ::SysError(
"GetSockOpt",
"getsockopt(SO_SNDBUF)");
5123 if (::getsockopt(sock, SOL_SOCKET, SO_RCVBUF, (
char*)val, &optlen) == SOCKET_ERROR) {
5124 ::SysError(
"GetSockOpt",
"getsockopt(SO_RCVBUF)");
5129 if (::getsockopt(sock, SOL_SOCKET, SO_OOBINLINE, (
char*)val, &optlen) == SOCKET_ERROR) {
5130 ::SysError(
"GetSockOpt",
"getsockopt(SO_OOBINLINE)");
5135 if (::getsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, (
char*)val, &optlen) == SOCKET_ERROR) {
5136 ::SysError(
"GetSockOpt",
"getsockopt(SO_KEEPALIVE)");
5141 if (::getsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (
char*)val, &optlen) == SOCKET_ERROR) {
5142 ::SysError(
"GetSockOpt",
"getsockopt(SO_REUSEADDR)");
5147 if (::getsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (
char*)val, &optlen) == SOCKET_ERROR) {
5148 ::SysError(
"GetSockOpt",
"getsockopt(TCP_NODELAY)");
5155 if (sock == INVALID_SOCKET) {
5164 if (::ioctlsocket(sock, SIOCGPGRP, (u_long*)val) == SOCKET_ERROR) {
5165 ::SysError(
"GetSockOpt",
"ioctl(SIOCGPGRP)");
5171 if (::ioctlsocket(sock, SIOCATMARK, (u_long*)val) == SOCKET_ERROR) {
5172 ::SysError(
"GetSockOpt",
"ioctl(SIOCATMARK)");
5177 if (::ioctlsocket(sock, FIONREAD, (u_long*)val) == SOCKET_ERROR) {
5183 Error(
"GetSockOpt",
"illegal option (%d)", opt);
5195 int tcpwindowsize,
const char *protocol)
5200 if (!strcmp(servername,
"unix")) {
5204 (servername[1] ==
':' && servername[2] ==
'/')) {
5208 if (!strcmp(protocol,
"udp")){
5215 sport = ::htons(port);
5219 if (!addr.
IsValid())
return -1;
5222 struct sockaddr_in server;
5223 memset(&server, 0,
sizeof(server));
5224 memcpy(&server.sin_addr, &adr,
sizeof(adr));
5226 server.sin_port = sport;
5230 if ((sock = ::socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) {
5231 ::SysError(
"TWinNTSystem::WinNTConnectTcp",
"socket");
5235 if (tcpwindowsize > 0) {
5240 if (::connect(sock, (
struct sockaddr*) &server,
sizeof(server)) == INVALID_SOCKET) {
5242 ::closesocket(sock);
5253 struct sockaddr_in myaddr;
5256 memset(&myaddr, 0,
sizeof(myaddr));
5257 myaddr.sin_family = AF_INET;
5258 myaddr.sin_port = port;
5259 myaddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
5262 if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
5263 ::SysError(
"TWinNTSystem::WinNTUnixConnect",
"socket");
5267 while ((connect(sock, (
struct sockaddr *)&myaddr,
sizeof myaddr)) == -1) {
5271 ::SysError(
"TWinNTSystem::WinNTUnixConnect",
"connect");
5287 if (!sockpath || strlen(sockpath) <= 0) {
5288 ::SysError(
"TWinNTSystem::WinNTUnixConnect",
"socket path undefined");
5291 TString socketpath = sockpath;
5293 fp = fopen(socketpath.
Data(),
"rb");
5295 ::SysError(
"TWinNTSystem::WinNTUnixConnect",
"fopen");
5298 fscanf(fp,
"%d", &port);
5301 if (port < 0 || port > 65535) {
5302 ::SysError(
"TWinNTSystem::WinNTUnixConnect",
"invalid port");
5320 sport = htons(port);
5323 if (!addr.
IsValid())
return -1;
5326 struct sockaddr_in server;
5327 memset(&server, 0,
sizeof(server));
5328 memcpy(&server.sin_addr, &adr,
sizeof(adr));
5330 server.sin_port = sport;
5334 if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
5335 ::SysError(
"TWinNTSystem::WinNTUdpConnect",
"socket (%s:%d)",
5340 while (connect(sock, (
struct sockaddr*) &server,
sizeof(server)) == -1) {
5344 ::SysError(
"TWinNTSystem::WinNTUdpConnect",
"connect (%s:%d)",
5362 const char *protocol)
5385 const short kSOCKET_MINPORT = 5000, kSOCKET_MAXPORT = 15000;
5386 short tryport = kSOCKET_MINPORT;
5391 sport = ::htons(port);
5394 if (port == 0 && reuse) {
5395 ::Error(
"TWinNTSystem::WinNTTcpService",
"cannot do a port scan while reuse is true");
5402 sport = ::htons(port);
5407 if ((sock = ::socket(AF_INET, SOCK_STREAM, 0)) < 0) {
5408 ::SysError(
"TWinNTSystem::WinNTTcpService",
"socket");
5416 if (tcpwindowsize > 0) {
5421 struct sockaddr_in inserver;
5422 memset(&inserver, 0,
sizeof(inserver));
5423 inserver.sin_family = AF_INET;
5425 inserver.sin_port = sport;
5429 if (::bind(sock, (
struct sockaddr*) &inserver,
sizeof(inserver)) == SOCKET_ERROR) {
5430 ::SysError(
"TWinNTSystem::WinNTTcpService",
"bind");
5436 inserver.sin_port = ::htons(tryport);
5437 bret = ::bind(sock, (
struct sockaddr*) &inserver,
sizeof(inserver));
5439 }
while (bret == SOCKET_ERROR && WSAGetLastError() == WSAEADDRINUSE &&
5440 tryport < kSOCKET_MAXPORT);
5441 if (bret == SOCKET_ERROR) {
5442 ::SysError(
"TWinNTSystem::WinNTTcpService",
"bind (port scan)");
5448 if (::listen(sock, backlog) == SOCKET_ERROR) {
5449 ::SysError(
"TWinNTSystem::WinNTTcpService",
"listen");
5468 const short kSOCKET_MINPORT = 5000, kSOCKET_MAXPORT = 15000;
5469 short sport, tryport = kSOCKET_MINPORT;
5475 sport = htons(port);
5479 if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
5480 ::SysError(
"TUnixSystem::UnixUdpService",
"socket");
5484 struct sockaddr_in inserver;
5485 memset(&inserver, 0,
sizeof(inserver));
5486 inserver.sin_family = AF_INET;
5488 inserver.sin_port = sport;
5492 if (bind(sock, (
struct sockaddr*) &inserver,
sizeof(inserver))) {
5493 ::SysError(
"TWinNTSystem::AnnounceUdpService",
"bind");
5499 inserver.sin_port = htons(tryport);
5500 bret = bind(sock, (
struct sockaddr*) &inserver,
sizeof(inserver));
5502 }
while (bret == SOCKET_ERROR && WSAGetLastError() == WSAEADDRINUSE &&
5503 tryport < kSOCKET_MAXPORT);
5505 ::SysError(
"TWinNTSystem::AnnounceUdpService",
"bind (port scan)");
5511 if (listen(sock, backlog)) {
5512 ::SysError(
"TWinNTSystem::AnnounceUdpService",
"listen");
5527 SOCKET sock = socket;
5529 while ((soc = ::accept(sock, 0, 0)) == INVALID_SOCKET &&
5530 (::WSAGetLastError() == WSAEINTR)) {
5535 if (::WSAGetLastError() == WSAEWOULDBLOCK) {
5549#define SystemBasicInformation 0
5550#define SystemPerformanceInformation 2
5577#define Li2Double(x) ((double)((x).HighPart) * 4.294967296E9 + (double)((x).LowPart))
5585 LARGE_INTEGER ulFreq, ulTicks, ulValue, ulStartCounter;
5589 if (QueryPerformanceFrequency(&ulFreq)) {
5591 QueryPerformanceCounter(&ulTicks);
5594 ulValue.QuadPart = ulTicks.QuadPart + ulFreq.QuadPart/10;
5595 ulStartCounter.QuadPart =
__rdtsc();
5599 QueryPerformanceCounter(&ulTicks);
5600 }
while (ulTicks.QuadPart <= ulValue.QuadPart);
5602 return (
DWORD)((
__rdtsc() - ulStartCounter.QuadPart)/100000);
5610#define SM_SERVERR2 89
5611typedef void (WINAPI *
PGNSI)(LPSYSTEM_INFO);
5617 OSVERSIONINFOEX osvi;
5620 BOOL bOsVersionInfoEx;
5621 static char *strReturn =
nullptr;
5625 strReturn =
new char[2048];
5629 ZeroMemory(&si,
sizeof(SYSTEM_INFO));
5630 ZeroMemory(&osvi,
sizeof(OSVERSIONINFOEX));
5635 osvi.dwOSVersionInfoSize =
sizeof(OSVERSIONINFOEX);
5637 if (!(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi))) {
5638 osvi.dwOSVersionInfoSize =
sizeof (OSVERSIONINFO);
5639 if (!GetVersionEx((OSVERSIONINFO *) &osvi))
5643 NTSTATUS(WINAPI *RtlGetVersion)(LPOSVERSIONINFOEXW);
5644 OSVERSIONINFOEXW osInfo;
5645 *(FARPROC*)&RtlGetVersion = GetProcAddress(GetModuleHandleA(
"ntdll"),
"RtlGetVersion");
5647 if (NULL != RtlGetVersion) {
5648 osInfo.dwOSVersionInfoSize =
sizeof(osInfo);
5649 RtlGetVersion(&osInfo);
5653 pGNSI = (
PGNSI)GetProcAddress(GetModuleHandle(
"kernel32.dll"),
"GetNativeSystemInfo");
5656 else GetSystemInfo(&si);
5658 switch (osvi.dwPlatformId) {
5660 case VER_PLATFORM_WIN32_NT:
5662 if (osInfo.dwMajorVersion == 10 && osInfo.dwMinorVersion == 0) {
5663 if (osvi.wProductType == VER_NT_WORKSTATION)
5664 strlcpy(strReturn,
"Microsoft Windows 10 ", 2048);
5665 else strlcpy(strReturn,
"Windows Server 2016 ", 2048);
5667 if (osInfo.dwMajorVersion == 6 && osInfo.dwMinorVersion == 3) {
5668 if (osvi.wProductType == VER_NT_WORKSTATION)
5669 strlcpy(strReturn,
"Microsoft Windows 8.1 ", 2048);
5670 else strlcpy(strReturn,
"Windows Server 2012 R2 ", 2048);
5672 if (osInfo.dwMajorVersion == 6 && osInfo.dwMinorVersion == 2) {
5673 if (osvi.wProductType == VER_NT_WORKSTATION)
5674 strlcpy(strReturn,
"Microsoft Windows 8 ", 2048);
5675 else strlcpy(strReturn,
"Windows Server 2012 ", 2048);
5677 if (osInfo.dwMajorVersion == 6 && osInfo.dwMinorVersion == 1) {
5678 if (osvi.wProductType == VER_NT_WORKSTATION)
5679 strlcpy(strReturn,
"Microsoft Windows 7 ", 2048);
5680 else strlcpy(strReturn,
"Windows Server 2008 R2 ", 2048);
5682 if (osInfo.dwMajorVersion == 6 && osInfo.dwMinorVersion == 0) {
5683 if (osvi.wProductType == VER_NT_WORKSTATION)
5684 strlcpy(strReturn,
"Microsoft Windows Vista ", 2048);
5685 else strlcpy(strReturn,
"Windows Server \"Longhorn\" ", 2048);
5687 if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2) {
5689 strlcpy(strReturn,
"Microsoft Windows Server 2003 \"R2\" ", 2048);
5690 else if (osvi.wProductType == VER_NT_WORKSTATION &&
5691 si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) {
5692 strlcpy(strReturn,
"Microsoft Windows XP Professional x64 Edition ", 2048);
5694 strlcpy(strReturn,
"Microsoft Windows Server 2003, ", 2048);
5696 if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1)
5697 strlcpy(strReturn,
"Microsoft Windows XP ", 2048);
5699 if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0)
5700 strlcpy(strReturn,
"Microsoft Windows 2000 ", 2048);
5702 if (osvi.dwMajorVersion <= 4)
5703 strlcpy(strReturn,
"Microsoft Windows NT ", 2048);
5706 if (bOsVersionInfoEx) {
5708 if (osvi.wProductType == VER_NT_WORKSTATION &&
5709 si.wProcessorArchitecture!=PROCESSOR_ARCHITECTURE_AMD64) {
5710 if (osvi.dwMajorVersion == 4)
5711 strlcat(strReturn,
"Workstation 4.0 ", 2048);
5712 else if (osvi.wSuiteMask & VER_SUITE_PERSONAL)
5713 strlcat(strReturn,
"Home Edition " , 2048);
5715 strlcat(strReturn,
"Professional ", 2048);
5718 else if (osvi.wProductType == VER_NT_SERVER ||
5719 osvi.wProductType == VER_NT_DOMAIN_CONTROLLER) {
5720 if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2) {
5721 if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64) {
5722 if (osvi.wSuiteMask & VER_SUITE_DATACENTER)
5723 strlcat(strReturn,
"Datacenter Edition for Itanium-based Systems", 2048);
5724 else if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE)
5725 strlcat(strReturn,
"Enterprise Edition for Itanium-based Systems", 2048);
5726 }
else if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) {
5727 if (osvi.wSuiteMask & VER_SUITE_DATACENTER)
5728 strlcat(strReturn,
"Datacenter x64 Edition ", 2048);
5729 else if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE)
5730 strlcat(strReturn,
"Enterprise x64 Edition ", 2048);
5732 strlcat(strReturn,
"Standard x64 Edition ", 2048);
5734 if (osvi.wSuiteMask & VER_SUITE_DATACENTER)
5735 strlcat(strReturn,
"Datacenter Edition ", 2048);
5736 else if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE)
5737 strlcat(strReturn,
"Enterprise Edition ", 2048);
5738 else if (osvi.wSuiteMask == VER_SUITE_BLADE)
5739 strlcat(strReturn,
"Web Edition " , 2048);
5741 strlcat(strReturn,
"Standard Edition ", 2048);
5743 }
else if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0) {
5744 if (osvi.wSuiteMask & VER_SUITE_DATACENTER)
5745 strlcat(strReturn,
"Datacenter Server ", 2048);
5746 else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE)
5747 strlcat(strReturn,
"Advanced Server ", 2048);
5749 strlcat(strReturn,
"Server ", 2048);
5751 if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE)
5752 strlcat(strReturn,
"Server 4.0, Enterprise Edition " , 2048);
5754 strlcat(strReturn,
"Server 4.0 ", 2048);
5763 lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
5764 "SYSTEM\\CurrentControlSet\\Control\\ProductOptions",
5765 0, KEY_QUERY_VALUE, &hKey );
5766 if (lRet != ERROR_SUCCESS)
5769 lRet = RegQueryValueEx(hKey,
"ProductType", NULL, NULL,
5770 (LPBYTE) szProductType, &dwBufLen);
5771 RegCloseKey( hKey );
5773 if ((lRet != ERROR_SUCCESS) || (dwBufLen >
BUFSIZE*
sizeof(TCHAR)))
5776 if (lstrcmpi(
"WINNT", szProductType) == 0)
5777 strlcat(strReturn,
"Workstation " , 2048);
5778 if (lstrcmpi(
"LANMANNT", szProductType) == 0)
5779 strlcat(strReturn,
"Server " , 2048);
5780 if (lstrcmpi(
"SERVERNT", szProductType) == 0)
5781 strlcat(strReturn,
"Advanced Server " , 2048);
5782 snprintf(temp, 512,
"%d.%d ", osvi.dwMajorVersion, osvi.dwMinorVersion);
5783 strlcat(strReturn, temp, 2048);
5786 if ( osvi.dwMajorVersion == 4 && lstrcmpi(osvi.szCSDVersion,
"Service Pack 6" ) == 0) {
5791 lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
5792 "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Hotfix\\Q246009",
5793 0, KEY_QUERY_VALUE, &hKey );
5794 if (lRet == ERROR_SUCCESS) {
5795 snprintf(temp, 512,
"Service Pack 6a (Build %d)", osvi.dwBuildNumber & 0xFFFF);
5796 strlcat(strReturn, temp, 2048);
5798 snprintf(temp, 512,
"%s (Build %d)", osvi.szCSDVersion, osvi.dwBuildNumber & 0xFFFF);
5799 strlcat(strReturn, temp, 2048);
5801 RegCloseKey( hKey );
5803 snprintf(temp, 512,
"%s (Build %d)", osvi.szCSDVersion, osvi.dwBuildNumber & 0xFFFF);
5804 strlcat(strReturn, temp, 2048);
5809 case VER_PLATFORM_WIN32_WINDOWS:
5810 if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0) {
5811 strlcpy(strReturn,
"Microsoft Windows 95 ", 2048);
5812 if (osvi.szCSDVersion[1]==
'C' || osvi.szCSDVersion[1]==
'B')
5813 strlcat(strReturn,
"OSR2 " , 2048);
5815 if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10) {
5816 strlcpy(strReturn,
"Microsoft Windows 98 ", 2048);
5817 if (osvi.szCSDVersion[1]==
'A' || osvi.szCSDVersion[1]==
'B')
5818 strlcat(strReturn,
"SE ", 2048);
5820 if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90) {
5821 strlcpy(strReturn,
"Microsoft Windows Millennium Edition", 2048);
5825 case VER_PLATFORM_WIN32s:
5826 strlcpy(strReturn,
"Microsoft Win32s", 2048);
5837 unsigned nHighestFeatureEx;
5841 nHighestFeatureEx = (unsigned)nBuff[0];
5843 if (nHighestFeatureEx >= 0x80000006) {
5845 return (((
unsigned)nBuff[2])>>16);
5856 SYSTEM_INFO sysInfo;
5857 MEMORYSTATUSEX statex;
5858 OSVERSIONINFO OsVersionInfo;
5860 char szKeyValueString[80];
5861 DWORD szKeyValueDword;
5866 NtQuerySystemInformation = (
PROCNTQSI)GetProcAddress(
5867 GetModuleHandle(
"ntdll"),
"NtQuerySystemInformation");
5869 if (!NtQuerySystemInformation) {
5871 "Error on GetProcAddress(NtQuerySystemInformation)");
5876 &SysPerfInfo,
sizeof(SysPerfInfo),
5878 OsVersionInfo.dwOSVersionInfoSize =
sizeof(OSVERSIONINFO);
5879 GetVersionEx(&OsVersionInfo);
5880 GetSystemInfo(&sysInfo);
5881 statex.dwLength =
sizeof(statex);
5882 if (!GlobalMemoryStatusEx(&statex)) {
5883 ::Error(
"GetWinNTSysInfo",
"Error on GlobalMemoryStatusEx()");
5886 sysinfo->
fCpus = sysInfo.dwNumberOfProcessors;
5895 status = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
"HARDWARE\\DESCRIPTION\\System",
5896 0, KEY_QUERY_VALUE, &hKey);
5897 if (status == ERROR_SUCCESS) {
5898 dwBufLen =
sizeof(szKeyValueString);
5899 RegQueryValueEx(hKey,
"Identifier", NULL, NULL,(LPBYTE)szKeyValueString,
5901 sysinfo->
fModel = szKeyValueString;
5904 status = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
5905 "Hardware\\Description\\System\\CentralProcessor\\0",
5906 0, KEY_QUERY_VALUE, &hKey);
5907 if (status == ERROR_SUCCESS) {
5908 dwBufLen =
sizeof(szKeyValueString);
5909 status = RegQueryValueEx(hKey,
"ProcessorNameString", NULL, NULL,
5910 (LPBYTE)szKeyValueString, &dwBufLen);
5911 if (status == ERROR_SUCCESS)
5912 sysinfo->
fCpuType = szKeyValueString;
5913 dwBufLen =
sizeof(
DWORD);
5914 status = RegQueryValueEx(hKey,
"~MHz",NULL,NULL,(LPBYTE)&szKeyValueDword,
5916 if ((status == ERROR_SUCCESS) && ((sysinfo->
fCpuSpeed <= 0) ||
5917 (sysinfo->
fCpuSpeed < (szKeyValueDword >> 1))))
5931 SYSTEM_INFO sysInfo;
5932 Float_t idle_ratio, kernel_ratio, user_ratio, total_ratio;
5933 FILETIME ft_sys_idle, ft_sys_kernel, ft_sys_user, ft_fun_time;
5934 SYSTEMTIME st_fun_time;
5936 ULARGE_INTEGER ul_sys_idle, ul_sys_kernel, ul_sys_user;
5937 static ULARGE_INTEGER ul_sys_idleold = {0, 0};
5938 static ULARGE_INTEGER ul_sys_kernelold = {0, 0};
5939 static ULARGE_INTEGER ul_sys_userold = {0, 0};
5940 ULARGE_INTEGER ul_sys_idle_diff, ul_sys_kernel_diff, ul_sys_user_diff;
5942 ULARGE_INTEGER ul_fun_time;
5943 ULARGE_INTEGER ul_fun_timeold = {0, 0};
5944 ULARGE_INTEGER ul_fun_time_diff;
5946 typedef BOOL (__stdcall *GetSystemTimesProc)( LPFILETIME lpIdleTime,
5947 LPFILETIME lpKernelTime, LPFILETIME lpUserTime );
5948 static GetSystemTimesProc pGetSystemTimes = 0;
5950 HMODULE hModImagehlp = LoadLibrary(
"Kernel32.dll" );
5951 if (!hModImagehlp) {
5952 ::Error(
"GetWinNTCpuInfo",
"Error on LoadLibrary(Kernel32.dll)");
5956 pGetSystemTimes = (GetSystemTimesProc) GetProcAddress( hModImagehlp,
5958 if (!pGetSystemTimes) {
5959 ::Error(
"GetWinNTCpuInfo",
"Error on GetProcAddress(GetSystemTimes)");
5962 GetSystemInfo(&sysInfo);
5965 pGetSystemTimes(&ft_sys_idle,&ft_sys_kernel,&ft_sys_user);
5966 GetSystemTime(&st_fun_time);
5967 SystemTimeToFileTime(&st_fun_time,&ft_fun_time);
5969 memcpy(&ul_sys_idle, &ft_sys_idle,
sizeof(FILETIME));
5970 memcpy(&ul_sys_kernel, &ft_sys_kernel,
sizeof(FILETIME));
5971 memcpy(&ul_sys_user, &ft_sys_user,
sizeof(FILETIME));
5972 memcpy(&ul_fun_time, &ft_fun_time,
sizeof(FILETIME));
5974 ul_sys_idle_diff.QuadPart = ul_sys_idle.QuadPart -
5975 ul_sys_idleold.QuadPart;
5976 ul_sys_kernel_diff.QuadPart = ul_sys_kernel.QuadPart -
5977 ul_sys_kernelold.QuadPart;
5978 ul_sys_user_diff.QuadPart = ul_sys_user.QuadPart -
5979 ul_sys_userold.QuadPart;
5981 ul_fun_time_diff.QuadPart = ul_fun_time.QuadPart -
5982 ul_fun_timeold.QuadPart;
5984 ul_sys_idleold.QuadPart = ul_sys_idle.QuadPart;
5985 ul_sys_kernelold.QuadPart = ul_sys_kernel.QuadPart;
5986 ul_sys_userold.QuadPart = ul_sys_user.QuadPart;
5988 if (ul_fun_timeold.QuadPart == 0) {
5990 ul_fun_timeold.QuadPart = ul_fun_time.QuadPart;
5993 ul_fun_timeold.QuadPart = ul_fun_time.QuadPart;
6001 idle_ratio /= (
Float_t)sysInfo.dwNumberOfProcessors;
6002 user_ratio /= (
Float_t)sysInfo.dwNumberOfProcessors;
6003 kernel_ratio /= (
Float_t)sysInfo.dwNumberOfProcessors;
6004 total_ratio = 100.0 - idle_ratio;
6009 cpuinfo->
fUser = user_ratio;
6010 cpuinfo->
fSys = kernel_ratio;
6011 cpuinfo->
fTotal = total_ratio;
6012 cpuinfo->
fIdle = idle_ratio;
6021 MEMORYSTATUSEX statex;
6022 PERFORMANCE_INFORMATION statex2;
6023 statex.dwLength =
sizeof(statex);
6024 statex2.cb =
sizeof(statex2);
6025 if (!GlobalMemoryStatusEx(&statex)) {
6026 ::Error(
"GetWinNTMemInfo",
"Error on GlobalMemoryStatusEx()");
6029 if (!GetPerformanceInfo(&statex2, statex2.cb)) {
6030 ::Error(
"GetWinNTMemInfo",
"Error on GetPerformanceInfo()");
6033 used = (
Long64_t)(statex.ullTotalPhys - statex.ullAvailPhys);
6034 free = (
Long64_t)statex.ullAvailPhys;
6036 sys_cache = (
Long64_t)(statex2.SystemCache * statex2.PageSize);
6044 swap_total = (
Long64_t)(statex.ullTotalPageFile - statex.ullTotalPhys);
6045 swap_avail = (
Long64_t)(statex.ullAvailPageFile - statex.ullAvailPhys);
6046 swap_used = swap_total - swap_avail;
6058 PROCESS_MEMORY_COUNTERS pmc;
6059 FILETIME starttime, exittime, kerneltime, usertime;
6060 timeval ru_stime, ru_utime;
6063 if (GetProcessMemoryInfo(GetCurrentProcess(), &pmc,
sizeof(pmc))) {
6067 if (GetProcessTimes(GetCurrentProcess(), &starttime, &exittime, &kerneltime, &usertime)) {
6069 memcpy(&li, &kerneltime,
sizeof(FILETIME));
6071 ru_stime.tv_sec = li.QuadPart / 1000000L;
6072 ru_stime.tv_usec = li.QuadPart % 1000000L;
6074 memcpy(&li, &usertime,
sizeof(FILETIME));
6076 ru_utime.tv_sec = li.QuadPart / 1000000L;
6077 ru_utime.tv_usec = li.QuadPart % 1000000L;
6080 ((
Float_t)(ru_utime.tv_usec) / 1000000.);
6082 ((
Float_t)(ru_stime.tv_usec) / 1000000.);
6093 if (!info)
return -1;
6105 if (!info)
return -1;
6116 if (!info)
return -1;
6127 if (!info)
return -1;
The file contains utilities which are foundational and could be used across the core component of ROO...
bool Bool_t
Boolean (0=false, 1=true) (bool)
int Int_t
Signed integer 4 bytes (int)
long Long_t
Signed long integer 4 bytes (long). Size depends on architecture.
unsigned long ULongptr_t
Unsigned integer large enough to hold a pointer (platform-dependent)
float Float_t
Float 4 bytes (float)
double Double_t
Double 8 bytes.
constexpr Ssiz_t kNPOS
The equivalent of std::string::npos for the ROOT class TString.
long long Long64_t
Portable signed long integer 8 bytes.
const char Option_t
Option string (const char)
@ kItimerResolution
interval-timer resolution in ms (used for TThread, TTimer, Emit, Connect, etc.)
R__EXTERN TApplication * gApplication
void Error(const char *location, const char *msgfmt,...)
Use this function in case an error occurred.
void SysError(const char *location, const char *msgfmt,...)
Use this function in case a system (OS or GUI) related error occurred.
void Break(const char *location, const char *msgfmt,...)
Use this function in case an error occurred.
Int_t gErrorIgnoreLevel
errors with level below this value will be ignored. Default is kUnset.
R__EXTERN TExceptionHandler * gExceptionHandler
R__EXTERN void Throw(int code)
If an exception context has been set (using the TRY and RETRY macros) jump back to where it was set.
static unsigned int total
winID h TVirtualViewer3D TVirtualGLPainter p
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t mask
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char filename
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t r
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t result
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h length
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void value
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t UChar_t len
Option_t Option_t TPoint TPoint const char mode
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t type
#define INVALID_HANDLE_VALUE
Int_t gDebug
Global variable setting the debug level. Set to 0 to disable, increase it in steps of 1 to increase t...
char * Form(const char *fmt,...)
Formats a string in a circular formatting buffer.
void Printf(const char *fmt,...)
Formats a string in a circular formatting buffer and prints the string.
char * StrDup(const char *str)
Duplicate the string str.
@ kSigSegmentationViolation
R__EXTERN const char * gProgName
R__EXTERN const char * gRootDir
ESocketBindOption
Options for binging the sockets created.
@ kInaddrAny
Any address for socket binding.
R__EXTERN TSystem * gSystem
R__EXTERN TFileHandler * gXDisplay
R__EXTERN const char * gProgPath
static void sighandler(int sig)
Call the signal handler associated with the signal.
static const char * DynamicPath(const char *newpath=nullptr, Bool_t reset=kFALSE)
Get shared library search path.
static void SigHandler(ESignals sig)
Unix signal handler.
const char * kProtocolName
void(* SigHandler_t)(ESignals)
R__EXTERN TWin32SplashThread * gSplash
static void __cpuid(int *cpuid_data, int)
static const char * shellMeta
BOOL PathIsRoot(LPCTSTR pPath)
check if a path is a root
static void GetWinNTProcInfo(ProcInfo_t *procinfo)
Get process info for this process on Windows NT.
static int GetL2CacheSize()
Use assembly to retrieve the L2 cache information ...
static void GetWinNTCpuInfo(CpuInfo_t *cpuinfo, Int_t sampleTime)
Get CPU stat for Window.
void Gl_setwidth(int width)
void(WINAPI * PGNSI)(LPSYSTEM_INFO)
#define SystemPerformanceInformation
ULongptr_t gConsoleWindow
BOOL PathIsUNC(LPCTSTR pszPath)
Returns TRUE if the given string is a UNC path.
static const char shellEscape
const TCHAR c_szColonSlash[]
static void GetWinNTMemInfo(MemInfo_t *meminfo)
Get VM stat for Windows NT.
static DWORD GetCPUSpeed()
Calculate the CPU clock speed using the 'rdtsc' instruction.
#define isin(address, start, length)
static const char * shellStuff
__inline BOOL DBL_BSLASH(LPCTSTR psz)
Inline function to check for a double-backslash at the beginning of a string.
static void GetWinNTSysInfo(SysInfo_t *sysinfo)
Get system info for Windows NT.
static const char * GetWindowsVersion()
void * _ReturnAddress(void)
LONG(WINAPI * PROCNTQSI)(UINT, PVOID, ULONG, PULONG)
virtual Bool_t HandleTermInput()
Using a TBrowser one can browse all ROOT objects.
virtual void SetOwner(Bool_t enable=kTRUE)
Set whether this collection is the owner (enable==true) of its content.
virtual Int_t GetSize() const
Return the capacity of the collection, i.e.
virtual Int_t GetValue(const char *name, Int_t dflt) const
Returns the integer value for a resource.
virtual void HandleException(int sig)=0
ULong_t fds_bits[(((kFDSETSIZE)+((kNFDBITS) -1))/(kNFDBITS))]
TFdSet & operator=(const TFdSet &fd)
void Copy(TFdSet &fd) const
virtual Bool_t WriteNotify()
Notify when something can be written to the descriptor associated with this handler.
virtual Bool_t ReadNotify()
Notify when something can be read from the descriptor associated with this handler.
Bool_t Notify() override
Notify when event occurred on descriptor associated with this handler.
This class represents an Internet Protocol (IP) address.
UInt_t GetAddress() const
TObject * Next() override
Return next object in the list. Returns 0 when no more objects in list.
void Add(TObject *obj) override
virtual void SysError(const char *method, const char *msgfmt,...) const
Issue system error message.
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
Iterator of ordered collection.
TObject * Next() override
Return next object in collection.
static const TString & GetBinDir()
Get the binary directory in the installation. Static utility function.
static void ShutDown()
Shut down ROOT.
static Bool_t Initialized()
Return kTRUE if the TROOT object has been initialized.
static const TString & GetLibDir()
Get the library directory in the installation.
Regular expression class.
Bool_t Notify() override
Notify when signal occurs.
ESignals GetSignal() const
Bool_t EndsWith(const char *pat, ECaseCompare cmp=kExact) const
Return true if string ends with the specified string.
TSubString Strip(EStripType s=kTrailing, char c=' ') const
Return a substring of self stripped at beginning and/or end.
TString & Replace(Ssiz_t pos, Ssiz_t n, const char *s)
Ssiz_t First(char c) const
Find first occurrence of a character c.
const char * Data() const
Bool_t EqualTo(const char *cs, ECaseCompare cmp=kExact) const
TString & ReplaceAll(const TString &s1, const TString &s2)
Bool_t BeginsWith(const char *s, ECaseCompare cmp=kExact) const
TString & Prepend(const char *cs)
TString & Swap(TString &other)
TString & Remove(Ssiz_t pos)
TString & Append(const char *cs)
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString.
void Form(const char *fmt,...)
Formats a string using a printf style format descriptor.
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
Abstract base class defining a generic interface to the underlying Operating System.
TSeqCollection * fFileHandler
virtual void AddFileHandler(TFileHandler *fh)
Add a file handler to the list of system file handlers.
TString & GetLastErrorString()
Return the thread local storage for the custom last error message.
void Beep(Int_t freq=-1, Int_t duration=-1, Bool_t setDefault=kFALSE)
Beep for duration milliseconds with a tone of frequency freq.
static void ResetErrno()
Static function resetting system error number.
virtual Bool_t ExpandPathName(TString &path)
Expand a pathname getting rid of special shell characters like ~.
static Int_t GetErrno()
Static function returning system error number.
TFdSet * fReadmask
!Files that should be checked for read events
virtual void * OpenDirectory(const char *name)
Open a directory.
virtual Long_t NextTimeOut(Bool_t mode)
Time when next timer of mode (synchronous=kTRUE or asynchronous=kFALSE) will time-out (in ms).
virtual int SetSockOpt(int sock, int kind, int val)
Set socket option.
virtual const char * Getenv(const char *env)
Get environment variable.
TFdSet * fWritemask
!Files that should be checked for write events
TFdSet * fSignals
!Signals that were trapped
virtual Bool_t IsPathLocal(const char *path)
Returns TRUE if the url in 'path' points to the local file system.
virtual const char * FindFile(const char *search, TString &file, EAccessMode mode=kFileExists)
Find location of file in a search path.
virtual int MakeDirectory(const char *name)
Make a directory.
virtual const char * ExpandFileName(const char *fname)
Expand a pathname getting rid of special shell characters like ~.
virtual TFileHandler * RemoveFileHandler(TFileHandler *fh)
Remove a file handler from the list of file handlers.
virtual int Load(const char *module, const char *entry="", Bool_t system=kFALSE)
Load a shared library.
int GetPathInfo(const char *path, Long_t *id, Long_t *size, Long_t *flags, Long_t *modtime)
Get info about a file: id, size, flags, modification time.
virtual Bool_t AccessPathName(const char *path, EAccessMode mode=kFileExists)
Returns FALSE if one can access a file using the specified access mode.
virtual void ExitLoop()
Exit from event loop.
virtual Bool_t Init()
Initialize the OS interface.
virtual void AddTimer(TTimer *t)
Add timer to list of system timers.
TFdSet * fWriteready
!Files with writes waiting
virtual void AddSignalHandler(TSignalHandler *sh)
Add a signal handler to list of system signal handlers.
TSeqCollection * fSignalHandler
virtual void Exit(int code, Bool_t mode=kTRUE)
Exit the application.
TFdSet * fReadready
!Files with reads waiting
TSystem * FindHelper(const char *path, void *dirptr=nullptr)
Create helper TSystem to handle file and directory operations that might be special for remote file a...
std::atomic< Bool_t > fInsideNotify
virtual char * Which(const char *search, const char *file, EAccessMode mode=kFileExists)
Find location of file in a search path.
virtual TInetAddress GetHostByName(const char *server)
Get Internet Protocol (IP) address of host.
virtual const char * GetLibraries(const char *regexp="", const char *option="", Bool_t isRegexp=kTRUE)
Return a space separated list of loaded shared libraries.
virtual TSignalHandler * RemoveSignalHandler(TSignalHandler *sh)
Remove a signal handler from list of signal handlers.
static const char * StripOffProto(const char *path, const char *proto)
Strip off protocol string from specified path.
virtual Bool_t ProcessEvents()
Process pending events (GUI, timers, sockets).
virtual TTimer * RemoveTimer(TTimer *t)
Remove timer from list of system timers.
virtual int Unlink(const char *name)
Unlink, i.e.
virtual void StackTrace()
Print a stack trace.
char * DynamicPathName(const char *lib, Bool_t quiet=kFALSE)
Find a dynamic library called lib using the system search paths.
Basic time type with millisecond precision.
Handles synchronous and a-synchronous timer events.
Bool_t CheckTimer(const TTime &now)
Check if timer timed out.
This class represents a WWW compatible URL.
const char * GetProtocol() const
Class providing an interface to the Windows NT Operating System.
void CloseConnection(int sock, Bool_t force=kFALSE) override
Close socket.
TList * GetVolumes(Option_t *opt="") const override
Get list of volumes (drives) mounted on the system.
FILE * OpenPipe(const char *shellcmd, const char *mode) override
Open a pipe.
void IgnoreSignal(ESignals sig, Bool_t ignore=kTRUE) override
If ignore is true ignore the specified signal, else restore previous behaviour.
Bool_t HandleConsoleEvent()
int Utime(const char *file, Long_t modtime, Long_t actime) override
Set a files modification and access times.
void Sleep(UInt_t milliSec) override
Sleep milliSec milli seconds.
TTime Now() override
Get current time in milliseconds since 0:00 Jan 1 1995.
int AnnounceUdpService(int port, int backlog, ESocketBindOption socketBindOption=ESocketBindOption::kInaddrAny) override
Announce UDP service.
const char * HostName() override
Return the system's host name.
virtual ~TWinNTSystem()
dtor
FILE * TempFileName(TString &base, const char *dir=nullptr, const char *suffix=nullptr) override
Create a secure temporary file by appending a unique 6 letter string to base.
void ExitLoop() override
Exit from event loop.
int SetNonBlock(int fd)
Make descriptor fd non-blocking.
int AnnounceUnixService(int port, int backlog) override
Announce unix domain service.
const char * GetLinkedLibraries() override
Get list of shared libraries loaded at the start of the executable.
void AddSignalHandler(TSignalHandler *sh) override
Add a signal handler to list of system signal handlers.
const char * PrependPathName(const char *dir, TString &name) override
Concatenate a directory and a file name.
void SetGUIThreadMsgHandler(ThreadMsgFunc_t func)
Set the (static part of) the event handler func for GUI messages.
Bool_t ProcessEvents() override
process pending events, i.e. DispatchOneEvent(kTRUE)
const char DriveName(const char *pathname="/")
Return the drive letter in pathname.
int SetSockOpt(int sock, int opt, int val) override
Set socket option.
struct passwd * fPasswords
Int_t GetCpuInfo(CpuInfo_t *info, Int_t sampleTime=1000) const override
Returns cpu load average and load info into the CpuInfo_t structure.
Int_t SetFPEMask(Int_t mask=kDefaultMask) override
Set which conditions trigger a floating point exception.
int GetPathInfo(const char *path, FileStat_t &buf) override
Get info about a file.
static void ThreadStub(void *Parameter)
void FreeDirectory(void *dirp) override
Close a WinNT file system directory.
static int WinNTUdpConnect(const char *hostname, int port)
Creates a UDP socket connection Is called via the TSocket constructor.
Int_t GetSysInfo(SysInfo_t *info) const override
Returns static system info, like OS type, CPU type, number of CPUs RAM size, etc into the SysInfo_t s...
void * OpenDirectory(const char *name) override
Open a directory. Returns 0 if directory does not exist.
const char * Getenv(const char *name) override
Get environment variable.
UserGroup_t * GetGroupInfo(Int_t gid) override
Returns all group info in the UserGroup_t structure.
void AddTimer(TTimer *ti) override
Add timer to list of system timers.
int RecvBuf(int sock, void *buffer, int length) override
Receive a buffer headed by a length indicator.
void DoBeep(Int_t freq=-1, Int_t duration=-1) const override
Beep.
void TimerThread()
Special Thread to check asynchronous timers.
const char * GetDynamicPath() override
Return the dynamic path (used to find shared libraries).
Bool_t ExpandPathName(TString &patbuf) override
Expand a pathname getting rid of special shell characaters like ~.$, etc.
int GetServiceByName(const char *service) override
Get port # of internet service.
int OpenConnection(const char *server, int port, int tcpwindowsize=-1, const char *protocol="tcp") override
Open a connection to a service on a server.
int ConnectService(const char *servername, int port, int tcpwindowsize, const char *protocol="tcp")
Connect to service servicename on server servername.
TString GetDirName(const char *pathname) override
Return the directory name in pathname.
int SendRaw(int sock, const void *buffer, int length, int flag) override
Send exactly length bytes from buffer.
const char * TempDirectory() const override
Return a user configured or systemwide directory to create temporary files in.
void DispatchSignals(ESignals sig)
Handle and dispatch signals.
int Exec(const char *shellcmd) override
Execute a command.
Long_t LookupSID(const char *lpszAccountName, int what, int &groupIdx, int &memberIdx)
Take the name and look up a SID so that we can get full domain/user information.
Int_t GetEffectiveUid() override
Returns the effective user id.
void NotifyApplicationCreated() override
Hook to tell TSystem that the TApplication object has been created.
void Abort(int code=0) override
Abort the application.
Int_t Select(TList *active, Long_t timeout) override
Select on file descriptors. The timeout to is in millisec.
Int_t GetMemInfo(MemInfo_t *info) const override
Returns ram and swap memory usage info into the MemInfo_t structure.
Int_t GetProcInfo(ProcInfo_t *info) const override
Returns cpu and memory used by this process into the ProcInfo_t structure.
TFileHandler * RemoveFileHandler(TFileHandler *fh) override
Remove a file handler from the list of file handlers.
Bool_t DispatchTimers(Bool_t mode)
Handle and dispatch timers.
const char * DirName(const char *pathname) override
Return the directory name in pathname.
Bool_t IsPathLocal(const char *path) override
Returns TRUE if the url in 'path' points to the local file system.
int SendBuf(int sock, const void *buffer, int length) override
Send a buffer headed by a length indicator.
TInetAddress GetHostByName(const char *server) override
Get Internet Protocol (IP) address of host.
Bool_t ChangeDirectory(const char *path) override
Change directory.
int AcceptConnection(int sock) override
Accept a connection.
int GetPid() override
Get process id.
const char * WorkingDirectory() override
Return the working directory for the default drive.
void SetProgname(const char *name) override
Set the application name (from command line, argv[0]) and copy it in gProgName.
int GetSockOpt(int sock, int opt, int *val) override
Get socket option.
int GetFsInfo(const char *path, Long_t *id, Long_t *bsize, Long_t *blocks, Long_t *bfree) override
Get info about a file system: id, bsize, bfree, blocks.
int AnnounceTcpService(int port, Bool_t reuse, int backlog, int tcpwindowsize=-1, ESocketBindOption socketBindOption=ESocketBindOption::kInaddrAny) override
Announce TCP/IP service.
int CopyFile(const char *from, const char *to, Bool_t overwrite=kFALSE) override
Copy a file.
Int_t RedirectOutput(const char *name, const char *mode="a", RedirectHandle_t *h=nullptr) override
Redirect standard output (stdout, stderr) to the specified file.
Bool_t IsAbsoluteFileName(const char *dir) override
Return true if dir is an absolute pathname.
int mkdir(const char *name, Bool_t recursive=kFALSE) override
Make a file system directory.
const char * UnixPathName(const char *unixpathname) override
Convert a pathname to a unix pathname.
Bool_t CheckSignals(Bool_t sync)
Check if some signals were raised and call their Notify() member.
int Symlink(const char *from, const char *to) override
Create a symlink from file1 to file2.
void DispatchOneEvent(Bool_t pendingOnly=kFALSE) override
Dispatch a single event in TApplication::Run() loop.
int Load(const char *module, const char *entry="", Bool_t system=kFALSE) override
Load a shared library.
TSignalHandler * RemoveSignalHandler(TSignalHandler *sh) override
Remove a signal handler from list of signal handlers.
const char * GetError() override
Return system error string.
void StackTrace() override
Print a stack trace, if gEnv entry "Root.Stacktrace" is unset or 1, and if the image helper functions...
int Unlink(const char *name) override
Unlink, i.e.
void ResetSignals() override
Reset signals handlers to previous behaviour.
int RecvRaw(int sock, void *buffer, int length, int flag) override
Receive exactly length bytes into buffer.
const char * BaseName(const char *name) override
Base name of a file name.
TTimer * RemoveTimer(TTimer *ti) override
Remove timer from list of system timers.
void Exit(int code, Bool_t mode=kTRUE) override
Exit the application.
void AddDynamicPath(const char *dir) override
Add a new directory to the dynamic path.
int Umask(Int_t mask) override
Set the process file creation mode mask.
void AddFileHandler(TFileHandler *fh) override
Add a file handler to the list of system file handlers.
std::string fDirNameBuffer
Bool_t CheckDescriptors()
Check if there is activity on some file descriptors and call their Notify() member.
static int WinNTUnixConnect(int port)
Connect to a Unix domain socket.
int Chmod(const char *file, UInt_t mode) override
Set the file permission bits.
Bool_t Init() override
Initialize WinNT system interface.
const char * GetDirEntry(void *dirp) override
Returns the next directory entry.
TInetAddress GetSockName(int sock) override
Get Internet Protocol (IP) address of host and port #.
Bool_t(* ThreadMsgFunc_t)(MSG *)
TInetAddress GetPeerName(int sock) override
Get Internet Protocol (IP) address of remote host and port #.
Int_t GetUid(const char *user=nullptr) override
Returns the user's id. If user = 0, returns current user's id.
const char * FindFile(const char *search, TString &file, EAccessMode mode=kFileExists) override
Find location of file in a search path.
const char * FindDynamicLibrary(TString &lib, Bool_t quiet=kFALSE) override
Returns and updates sLib to the path of a dynamic library (searches for library in the dynamic librar...
void ResetSignal(ESignals sig, Bool_t reset=kTRUE) override
If reset is true reset the signal handler for the specified signal to the default handler,...
Bool_t CollectMembers(const char *lpszGroupName, int &groupIdx, int &memberIdx)
Bool_t CountMembers(const char *lpszGroupName)
std::string GetHomeDirectory(const char *userName=nullptr) const override
Return the user's home directory.
Bool_t AccessPathName(const char *path, EAccessMode mode=kFileExists) override
Returns FALSE if one can access a file using the specified access mode.
void FillWithHomeDirectory(const char *userName, char *mydir) const
Fill buffer with user's home directory.
char * GetServiceByPort(int port) override
Get name of internet service.
Bool_t InitUsersGroups()
Collect local users and groups accounts information.
Int_t GetGid(const char *group=nullptr) override
Returns the group's id. If group = 0, returns current user's group.
const char * HomeDirectory(const char *userName=0) override
Return the user's home directory.
Int_t GetEffectiveGid() override
Returns the effective group id.
void Setenv(const char *name, const char *value) override
Set environment variable.
void SetDynamicPath(const char *path) override
Set the dynamic path to a new value.
std::string GetWorkingDirectory() const override
Return the working directory for the default drive.
HANDLE GetProcess()
Get current process handle.
UserGroup_t * GetUserInfo(Int_t uid) override
Returns all user info in the UserGroup_t structure.
int Rename(const char *from, const char *to) override
Rename a file. Returns 0 when successful, -1 in case of failure.
int MakeDirectory(const char *name) override
Make a WinNT file system directory.
int Link(const char *from, const char *to) override
Create a link from file1 to file2.
const char * GetLibraries(const char *regexp="", const char *option="", Bool_t isRegexp=kTRUE) override
Return a space separated list of loaded shared libraries.
int ClosePipe(FILE *pipe) override
Close the pipe.
Int_t GetFPEMask() override
Return the bitmap of conditions that trigger a floating point exception.
const std::string & GetFallbackRootSys()
R__EXTERN TROOT * gROOTLocal
Struct used to pass information between OpenDirectory and GetDirEntry in a thread safe way (each thre...
WIN32_FIND_DATA fFindFileData