42 #include <sys/utime.h>
43 #include <sys/timeb.h>
62 #if defined (_MSC_VER) && (_MSC_VER >= 1400)
64 #elif defined (_M_IX86)
65 static void __cpuid(
int* cpuid_data,
int info_type)
92 static void __cpuid(
int* cpuid_data,
int) {
93 cpuid_data[0] = 0x00000000;
94 cpuid_data[1] = 0x00000000;
95 cpuid_data[2] = 0x00000000;
96 cpuid_data[3] = 0x00000000;
98 __int64 __rdtsc() {
return (__int64)0; }
102 extern void Gl_setwidth(
int width);
103 void *_ReturnAddress(
void);
111 TFdSet() { fds_bits =
new fd_set; fds_bits->fd_count = 0; }
112 virtual ~TFdSet() {
delete fds_bits; }
113 void Copy(TFdSet &fd)
const { memcpy((
void*)fd.fds_bits, fds_bits,
sizeof(fd_set)); }
114 TFdSet(
const TFdSet& fd) { fd.Copy(*
this); }
115 TFdSet& operator=(
const TFdSet& fd) { fd.Copy(*
this);
return *
this; }
116 void Zero() { fds_bits->fd_count = 0; }
119 if (fds_bits->fd_count < FD_SETSIZE-1)
120 fds_bits->fd_array[fds_bits->fd_count++] = (SOCKET)fd;
122 ::SysError(
"TFdSet::Set",
"fd_count will exeed FD_SETSIZE");
127 for (i=0; i<fds_bits->fd_count; i++) {
128 if (fds_bits->fd_array[i]==(SOCKET)fd) {
129 while (i<fds_bits->fd_count-1) {
130 fds_bits->fd_array[i] = fds_bits->fd_array[i+1];
133 fds_bits->fd_count--;
138 Int_t IsSet(Int_t fd) {
return __WSAFDIsSet((SOCKET)fd, fds_bits); }
139 Int_t *GetBits() {
return fds_bits && fds_bits->fd_count ? (Int_t*)fds_bits : 0; }
140 UInt_t GetCount() {
return (UInt_t)fds_bits->fd_count; }
141 Int_t GetFd(Int_t i) {
return i<fds_bits->fd_count ? fds_bits->fd_array[i] : 0; }
145 const char *kProtocolName =
"tcp";
146 typedef void (*SigHandler_t)(ESignals);
147 static TWinNTSystem::ThreadMsgFunc_t gGUIThreadMsgFunc = 0;
149 static HANDLE gGlobalEvent;
150 static HANDLE gTimerThreadHandle;
151 typedef NET_API_STATUS (WINAPI *pfn1)(LPVOID);
152 typedef NET_API_STATUS (WINAPI *pfn2)(LPCWSTR, LPCWSTR, DWORD, LPBYTE*);
153 typedef NET_API_STATUS (WINAPI *pfn3)(LPCWSTR, LPCWSTR, DWORD, LPBYTE*,
154 DWORD, LPDWORD, LPDWORD, PDWORD);
155 typedef NET_API_STATUS (WINAPI *pfn4)(LPCWSTR, DWORD, LPBYTE*, DWORD, LPDWORD,
157 static pfn1 p2NetApiBufferFree;
158 static pfn2 p2NetUserGetInfo;
159 static pfn3 p2NetLocalGroupGetMembers;
160 static pfn4 p2NetLocalGroupEnum;
162 static struct signal_map {
164 SigHandler_t handler;
166 } signal_map[kMAXSIGNALS] = {
168 SIGSEGV, 0,
"segmentation violation",
169 -1 , 0,
"bad argument to system call",
170 -1 , 0,
"write on a pipe with no one to read it",
171 SIGILL, 0,
"illegal instruction",
173 SIGINT, 0,
"interrupt",
174 -1 , 0,
"window size change",
175 -1 , 0,
"alarm clock",
176 -1 , 0,
"death of a child",
177 -1 , 0,
"urgent data arrived on an I/O channel",
178 SIGFPE, 0,
"floating point exception",
179 SIGTERM, 0,
"termination signal",
180 -1 , 0,
"user-defined signal 1",
181 -1 , 0,
"user-defined signal 2"
202 static int WinNTRecv(
int socket,
void *buffer,
int length,
int flag)
204 if (socket == -1)
return -1;
205 SOCKET sock = socket;
212 if (flag == MSG_PEEK) {
217 char *buf = (
char *)buffer;
219 for (n = 0; n < length; n += nrecv) {
220 if ((nrecv = ::recv(sock, buf+n, length-n, flag)) <= 0) {
224 if (flag == MSG_OOB) {
225 if (::WSAGetLastError() == WSAEWOULDBLOCK) {
227 }
else if (::WSAGetLastError() == WSAEINVAL) {
231 if (::WSAGetLastError() == WSAEWOULDBLOCK) {
234 if (::WSAGetLastError() != WSAEINTR)
235 ::SysError(
"TWinNTSystem::WinNTRecv",
"recv");
236 if (::WSAGetLastError() == EPIPE ||
237 ::WSAGetLastError() == WSAECONNRESET)
256 static int WinNTSend(
int socket,
const void *buffer,
int length,
int flag)
258 if (socket < 0)
return -1;
259 SOCKET sock = socket;
268 const char *buf = (
const char *)buffer;
270 for (n = 0; n < length; n += nsent) {
271 if ((nsent = ::send(sock, buf+n, length-n, flag)) <= 0) {
275 if (::WSAGetLastError() == WSAEWOULDBLOCK) {
278 if (::WSAGetLastError() != WSAEINTR)
279 ::SysError(
"TWinNTSystem::WinNTSend",
"send");
280 if (::WSAGetLastError() == EPIPE ||
281 ::WSAGetLastError() == WSAECONNRESET)
298 static int WinNTSelect(TFdSet *readready, TFdSet *writeready, Long_t timeout)
301 fd_set* rbits = readready ? (fd_set*)readready->GetBits() : 0;
302 fd_set* wbits = writeready ? (fd_set*)writeready->GetBits() : 0;
306 tv.tv_sec = timeout / 1000;
307 tv.tv_usec = (timeout % 1000) * 1000;
309 retcode = ::select(0, rbits, wbits, 0, &tv);
311 retcode = ::select(0, rbits, wbits, 0, 0);
314 if (retcode == SOCKET_ERROR) {
315 int errcode = ::WSAGetLastError();
319 if (errcode == WSAENOTSOCK) {
321 int result = _fstat64( readready->GetFd(0), &buf );
329 ::WaitForSingleObject(gGlobalEvent, 1);
330 ::ResetEvent(gGlobalEvent);
335 if ( errcode == WSAEINTR) {
336 TSystem::ResetErrno();
339 if (errcode == EBADF) {
350 static const char *DynamicPath(
const char *newpath = 0, Bool_t reset = kFALSE)
352 static TString dynpath;
354 if (reset || newpath) {
361 }
else if (dynpath ==
"") {
362 TString rdynpath = gEnv ? gEnv->GetValue(
"Root.DynamicPath", (
char*)0) :
"";
363 rdynpath.ReplaceAll(
"; ",
";");
364 if (rdynpath ==
"") {
365 rdynpath =
".;"; rdynpath += TROOT::GetBinDir();
367 TString path = gSystem->Getenv(
"PATH");
371 dynpath = path; dynpath +=
";"; dynpath += rdynpath;
376 if (!dynpath.Contains(TROOT::GetLibDir())) {
377 dynpath +=
";"; dynpath += TROOT::GetLibDir();
386 static void sighandler(
int sig)
388 for (
int i = 0; i < kMAXSIGNALS; i++) {
389 if (signal_map[i].code == sig) {
390 (*signal_map[i].handler)((ESignals)i);
399 static void WinNTSignal(ESignals sig, SigHandler_t handler)
401 signal_map[sig].handler = handler;
402 if (signal_map[sig].code != -1)
403 (SigHandler_t)signal(signal_map[sig].code, sighandler);
409 static const char *WinNTSigname(ESignals sig)
411 return signal_map[sig].signame;
417 static BOOL ConsoleSigHandler(DWORD sig)
422 ((TWinNTSystem*)gSystem)->DispatchSignals(kSigInterrupt);
425 Break(
"TInterruptHandler::Notify",
"keyboard interrupt");
426 if (TROOT::Initialized()) {
427 gInterpreter->RewindDictionary();
431 case CTRL_BREAK_EVENT:
432 case CTRL_LOGOFF_EVENT:
433 case CTRL_SHUTDOWN_EVENT:
434 case CTRL_CLOSE_EVENT:
436 printf(
"\n *** Break *** keyboard interrupt - ROOT is terminated\n");
442 static CONTEXT *fgXcptContext = 0;
445 static void SigHandler(ESignals sig)
448 ((TWinNTSystem*)gSystem)->DispatchSignals(sig);
456 LONG WINAPI ExceptionFilter(LPEXCEPTION_POINTERS pXcp)
458 fgXcptContext = pXcp->ContextRecord;
459 gSystem->StackTrace();
460 return EXCEPTION_CONTINUE_SEARCH;
464 #pragma intrinsic(_ReturnAddress)
465 #pragma auto_inline(off)
466 DWORD_PTR GetProgramCounter()
469 return (DWORD_PTR)_ReturnAddress();
471 #pragma auto_inline(on)
482 static DWORD WINAPI GUIThreadMessageProcessingLoop(
void *p)
487 ::PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE);
490 Bool_t endLoop = kFALSE;
492 if (gGlobalEvent) ::SetEvent(gGlobalEvent);
493 erret = ::GetMessage(&msg, NULL, NULL, NULL);
494 if (erret <= 0) endLoop = kTRUE;
495 if (gGUIThreadMsgFunc)
496 endLoop = (*gGUIThreadMsgFunc)(&msg);
499 gVirtualX->CloseDisplay();
503 erret = ::GetLastError();
504 Error(
"MsgLoop",
"Error in GetMessage");
518 typedef BOOL (__stdcall *SYMINITIALIZEPROC)( HANDLE, LPSTR, BOOL );
519 typedef BOOL (__stdcall *SYMCLEANUPPROC)( HANDLE );
520 typedef BOOL (__stdcall *STACKWALK64PROC)
521 ( DWORD, HANDLE, HANDLE, LPSTACKFRAME64, LPVOID,
522 PREAD_PROCESS_MEMORY_ROUTINE,PFUNCTION_TABLE_ACCESS_ROUTINE,
523 PGET_MODULE_BASE_ROUTINE, PTRANSLATE_ADDRESS_ROUTINE );
524 typedef LPVOID (__stdcall *SYMFUNCTIONTABLEACCESS64PROC)( HANDLE, DWORD64 );
525 typedef DWORD (__stdcall *SYMGETMODULEBASE64PROC)( HANDLE, DWORD64 );
526 typedef BOOL (__stdcall *SYMGETMODULEINFO64PROC)(HANDLE, DWORD64, PIMAGEHLP_MODULE64);
527 typedef BOOL (__stdcall *SYMGETSYMFROMADDR64PROC)( HANDLE, DWORD64, PDWORD64, PIMAGEHLP_SYMBOL64);
528 typedef BOOL (__stdcall *SYMGETLINEFROMADDR64PROC)(HANDLE, DWORD64, PDWORD, PIMAGEHLP_LINE64);
529 typedef DWORD (__stdcall *UNDECORATESYMBOLNAMEPROC)(PCSTR, PSTR, DWORD, DWORD);
532 static SYMINITIALIZEPROC _SymInitialize = 0;
533 static SYMCLEANUPPROC _SymCleanup = 0;
534 static STACKWALK64PROC _StackWalk64 = 0;
535 static SYMFUNCTIONTABLEACCESS64PROC _SymFunctionTableAccess64 = 0;
536 static SYMGETMODULEBASE64PROC _SymGetModuleBase64 = 0;
537 static SYMGETMODULEINFO64PROC _SymGetModuleInfo64 = 0;
538 static SYMGETSYMFROMADDR64PROC _SymGetSymFromAddr64 = 0;
539 static SYMGETLINEFROMADDR64PROC _SymGetLineFromAddr64 = 0;
540 static UNDECORATESYMBOLNAMEPROC _UnDecorateSymbolName = 0;
542 BOOL InitImagehlpFunctions()
550 HMODULE hModImagehlp = LoadLibrary(
"IMAGEHLP.DLL" );
554 _SymInitialize = (SYMINITIALIZEPROC) GetProcAddress( hModImagehlp,
"SymInitialize" );
558 _SymCleanup = (SYMCLEANUPPROC) GetProcAddress( hModImagehlp,
"SymCleanup" );
562 _StackWalk64 = (STACKWALK64PROC) GetProcAddress( hModImagehlp,
"StackWalk64" );
566 _SymFunctionTableAccess64 = (SYMFUNCTIONTABLEACCESS64PROC) GetProcAddress(hModImagehlp,
"SymFunctionTableAccess64" );
567 if (!_SymFunctionTableAccess64)
570 _SymGetModuleBase64=(SYMGETMODULEBASE64PROC)GetProcAddress(hModImagehlp,
"SymGetModuleBase64");
571 if (!_SymGetModuleBase64)
574 _SymGetModuleInfo64=(SYMGETMODULEINFO64PROC)GetProcAddress(hModImagehlp,
"SymGetModuleInfo64");
575 if (!_SymGetModuleInfo64)
578 _SymGetSymFromAddr64=(SYMGETSYMFROMADDR64PROC)GetProcAddress(hModImagehlp,
"SymGetSymFromAddr64");
579 if (!_SymGetSymFromAddr64)
582 _SymGetLineFromAddr64=(SYMGETLINEFROMADDR64PROC)GetProcAddress(hModImagehlp,
"SymGetLineFromAddr64");
583 if (!_SymGetLineFromAddr64)
586 _UnDecorateSymbolName=(UNDECORATESYMBOLNAMEPROC)GetProcAddress(hModImagehlp,
"UnDecorateSymbolName");
587 if (!_UnDecorateSymbolName)
590 if (!_SymInitialize(GetCurrentProcess(), 0, TRUE ))
606 std::string GetModuleName(DWORD64 address)
610 std::ostringstream out;
611 HANDLE process = ::GetCurrentProcess();
613 DWORD lineDisplacement = 0;
614 IMAGEHLP_LINE64 line;
615 ::ZeroMemory(&line,
sizeof(line));
616 line.SizeOfStruct =
sizeof(line);
617 if(_SymGetLineFromAddr64(process, address, &lineDisplacement, &line)) {
618 out << line.FileName <<
"(" << line.LineNumber <<
"): ";
620 IMAGEHLP_MODULE64 module;
621 ::ZeroMemory(&module,
sizeof(module));
622 module.SizeOfStruct =
sizeof(module);
623 if(_SymGetModuleInfo64(process, address, &module)) {
624 out << module.ModuleName <<
"!";
626 out <<
"0x" << std::hex << address << std::dec <<
" ";
633 std::string GetFunctionName(DWORD64 address)
637 DWORD64 symbolDisplacement = 0;
638 HANDLE process = ::GetCurrentProcess();
640 const unsigned int SYMBOL_BUFFER_SIZE = 8192;
641 char symbolBuffer[SYMBOL_BUFFER_SIZE];
642 PIMAGEHLP_SYMBOL64 symbol =
reinterpret_cast<PIMAGEHLP_SYMBOL64
>(symbolBuffer);
643 ::ZeroMemory(symbol, SYMBOL_BUFFER_SIZE);
644 symbol->SizeOfStruct = SYMBOL_BUFFER_SIZE;
645 symbol->MaxNameLength = SYMBOL_BUFFER_SIZE -
sizeof(IMAGEHLP_SYMBOL64);
647 if(_SymGetSymFromAddr64(process, address, &symbolDisplacement, symbol)) {
649 const unsigned int NAME_SIZE = 8192;
650 char name[NAME_SIZE];
651 _UnDecorateSymbolName(
656 UNDNAME_NO_THISTYPE |
657 UNDNAME_NO_SPECIAL_SYMS |
658 UNDNAME_NO_MEMBER_TYPE |
659 UNDNAME_NO_MS_KEYWORDS |
660 UNDNAME_NO_ACCESS_SPECIFIERS
678 static BOOL IsShortcut(
const char *filename)
681 const char *extLnk =
".lnk";
682 if (filename != NULL) {
684 TString strfilename(filename);
685 if (strfilename.EndsWith(extLnk))
694 static BOOL ResolveShortCut(LPCSTR pszShortcutFile,
char *pszPath,
int maxbuf)
698 char szGotPath[MAX_PATH];
705 typedef HRESULT (__stdcall *COINITIALIZEPROC)( LPVOID );
706 static COINITIALIZEPROC _CoInitialize = 0;
707 typedef void (__stdcall *COUNINITIALIZEPROC)( void );
708 static COUNINITIALIZEPROC _CoUninitialize = 0;
709 typedef HRESULT (__stdcall *COCREATEINSTANCEPROC)( REFCLSID, LPUNKNOWN,
710 DWORD, REFIID, LPVOID );
711 static COCREATEINSTANCEPROC _CoCreateInstance = 0;
713 HMODULE hModImagehlp = LoadLibrary(
"ole32.dll" );
717 _CoInitialize = (COINITIALIZEPROC) GetProcAddress( hModImagehlp,
"CoInitialize" );
720 _CoUninitialize = (COUNINITIALIZEPROC) GetProcAddress( hModImagehlp,
"CoUninitialize");
721 if (!_CoUninitialize)
723 _CoCreateInstance = (COCREATEINSTANCEPROC) GetProcAddress( hModImagehlp,
"CoCreateInstance" );
724 if (!_CoCreateInstance)
729 hres = _CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
730 IID_IShellLink, (
void **) &psl);
731 if (SUCCEEDED(hres)) {
734 hres = psl->QueryInterface(IID_IPersistFile, (
void **) &ppf);
735 if (SUCCEEDED(hres)) {
737 MultiByteToWideChar(CP_ACP, 0, pszShortcutFile, -1, wsz, MAX_PATH);
739 hres = ppf->Load(wsz, STGM_READ);
740 if (SUCCEEDED(hres)) {
741 hres = psl->Resolve(HWND_DESKTOP, SLR_ANY_MATCH | SLR_NO_UI | SLR_UPDATE);
742 if (SUCCEEDED(hres)) {
743 strlcpy(szGotPath, pszShortcutFile,MAX_PATH);
744 hres = psl->GetPath(szGotPath, MAX_PATH, (WIN32_FIND_DATA *)&wfd,
745 SLGP_UNCPRIORITY | SLGP_RAWPATH);
746 strlcpy(pszPath,szGotPath, maxbuf);
747 if (maxbuf) pszPath[maxbuf-1] = 0;
756 return SUCCEEDED(hres);
759 void UpdateRegistry(TWinNTSystem* sys,
char* buf ) {
761 GetModuleFileName(0, buf, MAX_MODULE_NAME32 + 1);
762 if (strcmp(sys->TWinNTSystem::BaseName(buf),
"root.exe"))
765 if (!::RegOpenKeyEx(HKEY_CURRENT_USER,
"Software", 0, KEY_READ, ®CUS) == ERROR_SUCCESS)
768 if (!::RegOpenKeyEx(regCUS,
"Classes", 0, KEY_READ, ®CUSC) == ERROR_SUCCESS) {
769 ::RegCloseKey(regCUS);
774 bool regROOTwrite =
false;
775 TString iconloc(buf);
778 if (::RegOpenKeyEx(regCUSC,
"ROOTDEV.ROOT", 0, KEY_READ, ®ROOT) != ERROR_SUCCESS) {
779 ::RegCloseKey(regCUSC);
780 if (::RegOpenKeyEx(regCUS,
"Classes", 0, KEY_READ | KEY_WRITE, ®CUSC) == ERROR_SUCCESS &&
781 ::RegCreateKeyEx(regCUSC,
"ROOTDEV.ROOT", 0, NULL, 0, KEY_READ | KEY_WRITE,
782 NULL, ®ROOT, NULL) == ERROR_SUCCESS) {
787 if (::RegOpenKeyEx(regROOT,
"DefaultIcon", 0, KEY_READ, ®ROOTIcon) == ERROR_SUCCESS) {
788 char bufIconLoc[1024];
790 DWORD dwSize =
sizeof(bufIconLoc);
792 if (::RegQueryValueEx(regROOTIcon, NULL, NULL, &dwType, (BYTE*)bufIconLoc, &dwSize) == ERROR_SUCCESS)
793 regROOTwrite = (iconloc != bufIconLoc);
796 ::RegCloseKey(regROOTIcon);
801 ::RegCloseKey(regCUSC);
802 ::RegCloseKey(regROOT);
803 if (::RegOpenKeyEx(regCUS,
"Classes", 0, KEY_READ | KEY_WRITE, ®CUSC) != ERROR_SUCCESS) {
805 regROOTwrite =
false;
807 if (::RegOpenKeyEx(regCUSC,
"ROOTDEV.ROOT", 0, KEY_WRITE, ®ROOT) != ERROR_SUCCESS) {
809 regROOTwrite =
false;
810 ::RegCloseKey(regCUSC);
817 TString fileopen =
"fileopen.C";
818 TString rootmacrodir =
"macros";
819 sys->PrependPathName(getenv(
"ROOTSYS"), rootmacrodir);
820 sys->PrependPathName(rootmacrodir.Data(), fileopen);
824 regROOTwrite = (::_access(fileopen, kReadPermission) == 0);
828 ::RegCloseKey(regROOT);
829 ::RegCloseKey(regCUSC);
830 ::RegCloseKey(regCUS);
834 static const char apptitle[] =
"ROOT data file";
835 ::RegSetValueEx(regROOT, NULL, 0, REG_SZ, (BYTE*)apptitle,
sizeof(apptitle));
836 DWORD editflags = 0x00010000;
837 ::RegSetValueEx(regROOT,
"EditFlags", 0, REG_DWORD, (BYTE*)&editflags,
sizeof(editflags));
840 if (::RegCreateKeyEx(regROOT,
"DefaultIcon", 0, NULL, 0, KEY_READ | KEY_WRITE,
841 NULL, ®ROOTIcon, NULL) == ERROR_SUCCESS) {
842 TString iconloc(buf);
844 ::RegSetValueEx(regROOTIcon, NULL, 0, REG_SZ, (BYTE*)iconloc.Data(), iconloc.Length() + 1);
845 ::RegCloseKey(regROOTIcon);
850 if (::RegCreateKeyEx(regROOT,
"shell", 0, NULL, 0, KEY_READ | KEY_WRITE,
851 NULL, ®ROOTshell, NULL) == ERROR_SUCCESS) {
853 if (::RegCreateKeyEx(regROOTshell,
"open", 0, NULL, 0, KEY_READ | KEY_WRITE,
854 NULL, ®ShellOpen, NULL) == ERROR_SUCCESS) {
855 HKEY regShellOpenCmd;
856 if (::RegCreateKeyEx(regShellOpen,
"command", 0, NULL, 0, KEY_READ | KEY_WRITE,
857 NULL, ®ShellOpenCmd, NULL) == ERROR_SUCCESS) {
859 cmd +=
" -l \"%1\" \"";
862 ::RegSetValueEx(regShellOpenCmd, NULL, 0, REG_SZ, (BYTE*)cmd.Data(), cmd.Length() + 1);
863 ::RegCloseKey(regShellOpenCmd);
865 ::RegCloseKey(regShellOpen);
867 ::RegCloseKey(regROOTshell);
869 ::RegCloseKey(regROOT);
871 if (::RegCreateKeyEx(regCUSC,
".root", 0, NULL, 0, KEY_READ | KEY_WRITE,
872 NULL, ®ROOT, NULL) == ERROR_SUCCESS) {
873 static const char appname[] =
"ROOTDEV.ROOT";
874 ::RegSetValueEx(regROOT, NULL, 0, REG_SZ, (BYTE*)appname,
sizeof(appname));
876 ::RegCloseKey(regCUSC);
877 ::RegCloseKey(regCUS);
880 ::SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL);
888 static bool once =
true;
891 if (!once || gROOT->IsBatch())
return false;
892 TString cmdline(::GetCommandLine());
893 Int_t i = 0, from = 0;
894 while (cmdline.Tokenize(arg, from,
" ")) {
895 arg.Strip(TString::kBoth);
896 if (i == 0 && ((arg !=
"root") && (arg !=
"rootn") &&
897 (arg !=
"root.exe") && (arg !=
"rootn.exe")))
return false;
898 else if ((arg ==
"-l") || (arg ==
"-b"))
return false;
910 static void SetConsoleWindowName()
912 char pszNewWindowTitle[1024];
913 char pszOldWindowTitle[1024];
915 CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
917 if (!::GetConsoleTitle(pszOldWindowTitle, 1024))
920 wsprintf(pszNewWindowTitle,
"%d/%d", ::GetTickCount(), ::GetCurrentProcessId());
922 if (!::SetConsoleTitle(pszNewWindowTitle))
927 gConsoleWindow = (ULong_t)::FindWindow(0, pszNewWindowTitle);
928 if (gConsoleWindow) {
930 ::ShowWindow((HWND)gConsoleWindow, SW_RESTORE);
932 ::SetConsoleTitle(
"ROOT session");
934 hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
935 ::SetConsoleMode(hStdout, ENABLE_PROCESSED_OUTPUT |
936 ENABLE_WRAP_AT_EOL_OUTPUT);
937 if (!::GetConsoleScreenBufferInfo(hStdout, &csbiInfo))
939 Gl_setwidth(csbiInfo.dwMaximumWindowSize.X);
946 ClassImp(TWinNTSystem);
948 ULong_t gConsoleWindow = 0;
953 Bool_t TWinNTSystem::HandleConsoleEvent()
956 TIter next(fSignalHandler);
959 while (sh = (TSignalHandler*)next()) {
961 if (s == kSigInterrupt) {
973 TWinNTSystem::TWinNTSystem() : TSystem(
"WinNT",
"WinNT System"),
974 fGUIThreadHandle(0), fGUIThreadId(0)
976 fhProcess = ::GetCurrentProcess();
982 if (initwinsock = ::WSAStartup(MAKEWORD(2, 0), &WSAData)) {
983 Error(
"TWinNTSystem()",
"Starting sockets failed");
990 fBeepDuration = gEnv->GetValue(
"Root.System.BeepDuration", 1);
991 fBeepFreq = gEnv->GetValue(
"Root.System.BeepFreq", 0);
994 char *buf =
new char[MAX_MODULE_NAME32 + 1];
997 if (gSystem->Getenv(
"ROOTIGNOREPREFIX")) {
1000 HMODULE hModCore = ::GetModuleHandle(
"libCore.dll");
1002 ::GetModuleFileName(hModCore, buf, MAX_MODULE_NAME32 + 1);
1003 char *pLibName = strstr(buf,
"libCore.dll");
1006 while (--pLibName >= buf && *pLibName !=
'\\' && *pLibName !=
'/');
1008 TString check_path = buf;
1009 check_path +=
"\\etc";
1011 while (buf[0] && GetFileAttributes(check_path.Data()) == INVALID_FILE_ATTRIBUTES) {
1012 while (--pLibName >= buf && *pLibName !=
'\\' && *pLibName !=
'/');
1015 check_path +=
"\\etc";
1018 Setenv(
"ROOTSYS", buf);
1021 path += Getenv(
"PATH");
1022 Setenv(
"PATH", path.Data());
1030 UpdateRegistry(
this, buf);
1038 TWinNTSystem::~TWinNTSystem()
1041 typedef UINT (WINAPI* LPTIMEENDPERIOD)( UINT uPeriod );
1042 HINSTANCE hInstWinMM = LoadLibrary(
"winmm.dll" );
1044 LPTIMEENDPERIOD pTimeEndPeriod = (LPTIMEENDPERIOD)GetProcAddress( hInstWinMM,
"timeEndPeriod" );
1045 if( NULL != pTimeEndPeriod )
1047 FreeLibrary(hInstWinMM);
1052 if (fDirNameBuffer) {
1053 delete [] fDirNameBuffer;
1058 ::ResetEvent(gGlobalEvent);
1059 ::CloseHandle(gGlobalEvent);
1062 if (gTimerThreadHandle) {
1063 ::TerminateThread(gTimerThreadHandle, 0);
1064 ::CloseHandle(gTimerThreadHandle);
1071 Bool_t TWinNTSystem::Init()
1073 const char *dir = 0;
1075 if (TSystem::Init()) {
1079 fReadmask =
new TFdSet;
1080 fWritemask =
new TFdSet;
1081 fReadready =
new TFdSet;
1082 fWriteready =
new TFdSet;
1083 fSignals =
new TFdSet;
1101 ::SetUnhandledExceptionFilter(ExceptionFilter);
1106 gRootDir = ROOT::FoundationUtils::GetFallbackRootSys().c_str();
1109 typedef UINT (WINAPI* LPTIMEBEGINPERIOD)( UINT uPeriod );
1110 HINSTANCE hInstWinMM = LoadLibrary(
"winmm.dll" );
1112 LPTIMEBEGINPERIOD pTimeBeginPeriod = (LPTIMEBEGINPERIOD)GetProcAddress( hInstWinMM,
"timeBeginPeriod" );
1113 if( NULL != pTimeBeginPeriod )
1114 pTimeBeginPeriod(1);
1115 FreeLibrary(hInstWinMM);
1117 gTimerThreadHandle = ::CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)ThreadStub,
1120 gGlobalEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL);
1121 fGUIThreadHandle = ::CreateThread( NULL, 0, &GUIThreadMessageProcessingLoop, 0, 0, &fGUIThreadId );
1123 char *buf =
new char[MAX_MODULE_NAME32 + 1];
1124 HMODULE hModCore = ::GetModuleHandle(
"libCore.dll");
1126 ::GetModuleFileName(hModCore, buf, MAX_MODULE_NAME32 + 1);
1127 char *pLibName = strstr(buf,
"libCore.dll");
1131 if (buf[0]) AddDynamicPath(buf);
1134 SetConsoleWindowName();
1135 fGroupsInitDone = kFALSE;
1148 const char *TWinNTSystem::BaseName(
const char *name)
1158 const char *symbol=name;
1161 while ( (*symbol ==
' ' || *symbol ==
'\t') && *symbol) symbol++;
1164 if (isalpha(symbol[idx]) && symbol[idx+1] ==
':') idx = 2;
1165 if ( (symbol[idx] ==
'/' || symbol[idx] ==
'\\') && symbol[idx+1] ==
'\0') {
1170 Error(
"BaseName",
"name = 0");
1174 char *bslash = (
char *)strrchr(&symbol[idx],
'\\');
1175 char *rslash = (
char *)strrchr(&symbol[idx],
'/');
1176 if (cp = (std::max)(rslash, bslash)) {
1181 return &symbol[idx];
1183 Error(
"BaseName",
"name = 0");
1191 void TWinNTSystem::SetProgname(
const char *name)
1199 ULong_t namelen=name ? strlen(name) : 0;
1200 if (name && namelen > 0) {
1202 fullname =
new char[namelen+5];
1203 strlcpy(fullname, name,namelen+5);
1204 if ( !strrchr(fullname,
'.') )
1205 strlcat(fullname,
".exe",namelen+5);
1207 progname = StrDup(BaseName(fullname));
1208 dot = strrchr(progname,
'.');
1209 idot = dot ? (ULong_t)(dot - progname) : strlen(progname);
1213 if (IsAbsoluteFileName(fullname) && !AccessPathName(fullname)) {
1214 which = StrDup(fullname);
1216 which = Which(Form(
"%s;%s", WorkingDirectory(), Getenv(
"PATH")), progname);
1221 char driveletter = DriveName(which);
1222 const char *d = DirName(which);
1225 dirname.Form(
"%c:%s", driveletter, d);
1227 dirname.Form(
"%s", d);
1230 gProgPath = StrDup(dirname);
1236 gProgPath = WorkingDirectory();
1240 progname[idot] =
'\0';
1241 gProgName = StrDup(progname);
1242 if (which)
delete [] which;
1246 if (::NeedSplash()) {
1247 new TWin32SplashThread(FALSE);
1254 const char *TWinNTSystem::GetError()
1256 Int_t err = GetErrno();
1257 if (err == 0 && GetLastErrorString() !=
"")
1258 return GetLastErrorString();
1259 if (err < 0 || err >= sys_nerr) {
1260 static TString error_msg;
1261 error_msg.Form(
"errno out of range %d", err);
1264 return sys_errlist[err];
1270 const char *TWinNTSystem::HostName()
1272 if (fHostname ==
"")
1273 fHostname = ::getenv(
"COMPUTERNAME");
1274 if (fHostname ==
"") {
1277 DWORD il =
sizeof(hn);
1278 ::GetComputerName(hn, &il);
1288 void TWinNTSystem::DoBeep(Int_t freq , Int_t duration )
const
1294 if (freq < 37) freq = 440;
1295 if (duration < 0) duration = 100;
1296 ::Beep(freq, duration);
1302 void TWinNTSystem::SetGUIThreadMsgHandler(ThreadMsgFunc_t func)
1304 gGUIThreadMsgFunc = func;
1310 void TWinNTSystem::NotifyApplicationCreated()
1313 ::PostThreadMessage(fGUIThreadId, 0, NULL, 0L);
1323 void TWinNTSystem::AddFileHandler(TFileHandler *h)
1325 TSystem::AddFileHandler(h);
1327 int fd = h->GetFd();
1330 if (h->HasReadInterest()) {
1333 if (h->HasWriteInterest()) {
1334 fWritemask->Set(fd);
1343 TFileHandler *TWinNTSystem::RemoveFileHandler(TFileHandler *h)
1347 TFileHandler *oh = TSystem::RemoveFileHandler(h);
1349 fReadmask->Clr(h->GetFd());
1350 fWritemask->Clr(h->GetFd());
1359 void TWinNTSystem::AddSignalHandler(TSignalHandler *h)
1361 Bool_t set_console = kFALSE;
1362 ESignals sig = h->GetSignal();
1364 if (sig == kSigInterrupt) {
1365 set_console = kTRUE;
1367 TIter next(fSignalHandler);
1369 while ((hs = (TSignalHandler*) next())) {
1370 if (hs->GetSignal() == kSigInterrupt)
1371 set_console = kFALSE;
1374 TSystem::AddSignalHandler(h);
1378 ::SetConsoleCtrlHandler((PHANDLER_ROUTINE)ConsoleSigHandler, TRUE);
1380 WinNTSignal(h->GetSignal(), SigHandler);
1387 TSignalHandler *TWinNTSystem::RemoveSignalHandler(TSignalHandler *h)
1391 int sig = h->GetSignal();
1393 if (sig = kSigInterrupt) {
1394 Bool_t last = kTRUE;
1396 TIter next(fSignalHandler);
1398 while ((hs = (TSignalHandler*) next())) {
1399 if (hs->GetSignal() == kSigInterrupt)
1404 ::SetConsoleCtrlHandler((PHANDLER_ROUTINE)ConsoleSigHandler, FALSE);
1406 return TSystem::RemoveSignalHandler(h);
1413 void TWinNTSystem::ResetSignal(ESignals sig, Bool_t reset)
1421 void TWinNTSystem::ResetSignals()
1430 void TWinNTSystem::IgnoreSignal(ESignals sig, Bool_t ignore)
1443 void TWinNTSystem::StackTrace()
1445 if (!gEnv->GetValue(
"Root.Stacktrace", 1))
1448 HANDLE snapshot = ::CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,::GetCurrentProcessId());
1453 if (!InitImagehlpFunctions()) {
1454 std::cerr <<
"No stack trace: cannot find (functions in) dbghelp.dll!" << std::endl;
1459 SYSTEM_INFO sysInfo;
1460 ::GetSystemInfo(&sysInfo);
1461 DWORD machineType = IMAGE_FILE_MACHINE_I386;
1462 switch (sysInfo.wProcessorArchitecture) {
1463 case PROCESSOR_ARCHITECTURE_AMD64:
1464 machineType = IMAGE_FILE_MACHINE_AMD64;
1466 case PROCESSOR_ARCHITECTURE_IA64:
1467 machineType = IMAGE_FILE_MACHINE_IA64;
1471 DWORD currentThreadID = ::GetCurrentThreadId();
1472 DWORD currentProcessID = ::GetCurrentProcessId();
1474 if (snapshot == INVALID_HANDLE_VALUE)
return;
1476 THREADENTRY32 threadentry;
1477 threadentry.dwSize =
sizeof(THREADENTRY32);
1478 if (!::Thread32First(snapshot, &threadentry))
return;
1480 std::cerr << std::endl <<
"==========================================" << std::endl;
1481 std::cerr <<
"=============== STACKTRACE ===============" << std::endl;
1482 std::cerr <<
"==========================================" << std::endl << std::endl;
1485 if (threadentry.th32OwnerProcessID != currentProcessID)
1487 HANDLE thread = ::OpenThread(THREAD_GET_CONTEXT|THREAD_SUSPEND_RESUME|THREAD_QUERY_INFORMATION,
1488 FALSE, threadentry.th32ThreadID);
1490 memset(&context, 0,
sizeof(CONTEXT));
1492 if (threadentry.th32ThreadID != currentThreadID) {
1493 ::SuspendThread(thread);
1494 context.ContextFlags = CONTEXT_ALL;
1495 ::GetThreadContext(thread, &context);
1496 ::ResumeThread(thread);
1498 if (fgXcptContext) {
1499 context = *fgXcptContext;
1501 typedef void (WINAPI *RTLCCTXT)(PCONTEXT);
1502 RTLCCTXT p2RtlCCtxt = (RTLCCTXT) ::GetProcAddress(
1503 GetModuleHandle(
"kernel32.dll"),
"RtlCaptureContext");
1505 context.ContextFlags = CONTEXT_ALL;
1506 p2RtlCCtxt(&context);
1512 ::ZeroMemory(&frame,
sizeof(frame));
1514 frame.AddrPC.Mode = AddrModeFlat;
1515 frame.AddrFrame.Mode = AddrModeFlat;
1516 frame.AddrStack.Mode = AddrModeFlat;
1517 #if defined(_M_IX86)
1518 frame.AddrPC.Offset = context.Eip;
1519 frame.AddrFrame.Offset = context.Ebp;
1520 frame.AddrStack.Offset = context.Esp;
1521 #elif defined(_M_X64)
1522 frame.AddrPC.Offset = context.Rip;
1523 frame.AddrFrame.Offset = context.Rsp;
1524 frame.AddrStack.Offset = context.Rsp;
1525 #elif defined(_M_IA64)
1526 frame.AddrPC.Offset = context.StIIP;
1527 frame.AddrFrame.Offset = context.IntSp;
1528 frame.AddrStack.Offset = context.IntSp;
1529 frame.AddrBStore.Offset= context.RsBSP;
1531 std::cerr <<
"Stack traces not supported on your architecture yet." << std::endl;
1535 Bool_t bFirst = kTRUE;
1536 while (_StackWalk64(machineType, (HANDLE)::GetCurrentProcess(), thread, (LPSTACKFRAME64)&frame,
1537 (LPVOID)&context, (PREAD_PROCESS_MEMORY_ROUTINE)NULL, (PFUNCTION_TABLE_ACCESS_ROUTINE)_SymFunctionTableAccess64,
1538 (PGET_MODULE_BASE_ROUTINE)_SymGetModuleBase64, NULL)) {
1540 std::cerr << std::endl <<
"================ Thread " << iThread++ <<
" ================" << std::endl;
1541 if (!bFirst || threadentry.th32ThreadID != currentThreadID) {
1542 const std::string moduleName = GetModuleName(frame.AddrPC.Offset);
1543 const std::string functionName = GetFunctionName(frame.AddrPC.Offset);
1544 std::cerr <<
" " << moduleName << functionName << std::endl;
1548 ::CloseHandle(thread);
1549 }
while (::Thread32Next(snapshot, &threadentry));
1551 std::cerr << std::endl <<
"==========================================" << std::endl;
1552 std::cerr <<
"============= END STACKTRACE =============" << std::endl;
1553 std::cerr <<
"==========================================" << std::endl << std::endl;
1554 ::CloseHandle(snapshot);
1555 _SymCleanup(GetCurrentProcess());
1561 Int_t TWinNTSystem::GetFPEMask()
1564 UInt_t oldmask = _statusfp( );
1566 if (oldmask & _EM_INVALID ) mask |= kInvalid;
1567 if (oldmask & _EM_ZERODIVIDE) mask |= kDivByZero;
1568 if (oldmask & _EM_OVERFLOW ) mask |= kOverflow;
1569 if (oldmask & _EM_UNDERFLOW) mask |= kUnderflow;
1570 if (oldmask & _EM_INEXACT ) mask |= kInexact;
1579 Int_t TWinNTSystem::SetFPEMask(Int_t mask)
1581 Int_t old = GetFPEMask();
1584 if (mask & kInvalid ) newm |= _EM_INVALID;
1585 if (mask & kDivByZero) newm |= _EM_ZERODIVIDE;
1586 if (mask & kOverflow ) newm |= _EM_OVERFLOW;
1587 if (mask & kUnderflow) newm |= _EM_UNDERFLOW;
1588 if (mask & kInexact ) newm |= _EM_INEXACT;
1590 UInt_t cm = ::_statusfp();
1592 ::_controlfp(cm , _MCW_EM);
1600 Bool_t TWinNTSystem::ProcessEvents()
1602 return TSystem::ProcessEvents();
1608 void TWinNTSystem::DispatchOneEvent(Bool_t pendingOnly)
1611 if (pendingOnly && gGlobalEvent) ::SetEvent(gGlobalEvent);
1613 Bool_t pollOnce = pendingOnly;
1617 if (gROOT->GetApplication()) {
1618 gApplication->HandleTermInput();
1628 if (gROOT->IsLineProcessing() && (!gVirtualX || !gVirtualX->IsCmdThread())) {
1633 ::WaitForSingleObject(gGlobalEvent, 1);
1634 ::ResetEvent(gGlobalEvent);
1640 if (gXDisplay && !gROOT->IsBatch()) {
1641 if (gXDisplay->Notify()) {
1649 if ((fNfd > 0) && fFileHandler && (fFileHandler->GetSize() > 0)) {
1650 if (CheckDescriptors()) {
1658 fWriteready->Zero();
1660 if (pendingOnly && !pollOnce)
1664 if (fSigcnt > 0 && fSignalHandler->GetSize() > 0) {
1665 if (CheckSignals(kTRUE)) {
1676 if (fTimers && fTimers->GetSize() > 0) {
1677 if (DispatchTimers(kTRUE)) {
1679 nextto = NextTimeOut(kTRUE);
1680 if (nextto > (kItimerResolution>>1) || nextto == -1) {
1687 nextto = NextTimeOut(kTRUE);
1689 if (fFileHandler && fFileHandler->GetSize() == 0)
1695 if (fReadmask && !fReadmask->GetBits() &&
1696 fWritemask && !fWritemask->GetBits()) {
1699 if (!pendingOnly && gGlobalEvent) {
1700 ::WaitForSingleObject(gGlobalEvent, 1);
1701 ::ResetEvent(gGlobalEvent);
1706 *fReadready = *fReadmask;
1707 *fWriteready = *fWritemask;
1709 fNfd = WinNTSelect(fReadready, fWriteready, nextto);
1712 if ((fNfd < 0) && (fNfd != -2)) {
1715 for (i = 0; i < fReadmask->GetCount(); i++) {
1717 Int_t fd = fReadmask->GetFd(i);
1719 if (fReadmask->IsSet(fd)) {
1720 rc = WinNTSelect(&t, 0, 0);
1721 if (rc < 0 && rc != -2) {
1722 ::SysError(
"DispatchOneEvent",
"select: read error on %d\n", fd);
1728 for (i = 0; i < fWritemask->GetCount(); i++) {
1730 Int_t fd = fWritemask->GetFd(i);
1733 if (fWritemask->IsSet(fd)) {
1734 rc = WinNTSelect(0, &t, 0);
1735 if (rc < 0 && rc != -2) {
1736 ::SysError(
"DispatchOneEvent",
"select: write error on %d\n", fd);
1737 fWritemask->Clr(fd);
1749 void TWinNTSystem::ExitLoop()
1751 TSystem::ExitLoop();
1758 void TWinNTSystem::DispatchSignals(ESignals sig)
1760 if (sig == kSigInterrupt) {
1766 if (TROOT::Initialized()) {
1773 if (fSigcnt > 0 && fSignalHandler->GetSize() > 0)
1774 CheckSignals(kFALSE);
1780 Bool_t TWinNTSystem::CheckSignals(Bool_t sync)
1785 TIter next(fSignalHandler);
1787 while (sh = (TSignalHandler*)next()) {
1788 if (sync == sh->IsSync()) {
1789 ESignals sig = sh->GetSignal();
1790 if ((fSignals->IsSet(sig) && sigdone == -1) || sigdone == sig) {
1791 if (sigdone == -1) {
1801 if (sigdone != -1)
return kTRUE;
1810 Bool_t TWinNTSystem::CheckDescriptors()
1814 Bool_t read = kFALSE;
1816 TOrdCollectionIter it((TOrdCollection*)fFileHandler);
1818 while ((fh = (TFileHandler*) it.Next())) {
1819 Int_t fd = fh->GetFd();
1822 if ((fReadready->IsSet(fd) && fddone == -1) ||
1823 (fddone == fd && read)) {
1825 fReadready->Clr(fd);
1832 if ((fWriteready->IsSet(fd) && fddone == -1) ||
1833 (fddone == fd && !read)) {
1835 fWriteready->Clr(fd);
1843 if (fddone != -1)
return kTRUE;
1856 int TWinNTSystem::mkdir(
const char *name, Bool_t recursive)
1859 TString dirname = DirName(name);
1860 if (dirname.Length() == 0) {
1865 if (IsAbsoluteFileName(name)) {
1869 const char driveletter = DriveName(name);
1871 dirname.Prepend(
":");
1872 dirname.Prepend(driveletter);
1875 if (AccessPathName(dirname, kFileExists)) {
1876 int res = this->mkdir(dirname, kTRUE);
1877 if (res)
return res;
1879 if (!AccessPathName(name, kFileExists)) {
1883 return MakeDirectory(name);
1891 int TWinNTSystem::MakeDirectory(
const char *name)
1893 TSystem *helper = FindHelper(name);
1895 return helper->MakeDirectory(name);
1897 const char *proto = (strstr(name,
"file:///")) ?
"file://" :
"file:";
1900 if (!name)
return 0;
1901 return ::mkdir(StripOffProto(name, proto));
1904 if (!name)
return 0;
1905 return ::_mkdir(StripOffProto(name, proto));
1912 void TWinNTSystem::FreeDirectory(
void *dirp)
1914 TSystem *helper = FindHelper(0, dirp);
1916 helper->FreeDirectory(dirp);
1928 const char *TWinNTSystem::GetDirEntry(
void *dirp)
1930 TSystem *helper = FindHelper(0, dirp);
1932 return helper->GetDirEntry(dirp);
1936 HANDLE searchFile = (HANDLE)dirp;
1941 fFirstFile = kFALSE;
1942 return (
const char *)fFindFileData.cFileName;
1944 if (::FindNextFile(searchFile, &fFindFileData)) {
1945 return (
const char *)fFindFileData.cFileName;
1954 Bool_t TWinNTSystem::ChangeDirectory(
const char *path)
1956 Bool_t ret = (Bool_t) (::chdir(path) == 0);
1968 __inline BOOL DBL_BSLASH(LPCTSTR psz)
1970 return (psz[0] == TEXT(
'\\') && psz[1] == TEXT(
'\\'));
1985 BOOL PathIsUNC(LPCTSTR pszPath)
1987 return DBL_BSLASH(pszPath);
1990 #pragma data_seg(".text", "CODE")
1991 const TCHAR c_szColonSlash[] = TEXT(
":\\");
2003 BOOL PathIsRoot(LPCTSTR pPath)
2005 if (!IsDBCSLeadByte(*pPath)) {
2006 if (!lstrcmpi(pPath + 1, c_szColonSlash))
2010 if ((*pPath == TEXT(
'\\')) && (*(pPath + 1) == 0))
2013 if (DBL_BSLASH(pPath)) {
2016 int cBackslashes = 0;
2017 for (p = pPath + 2; *p; p = CharNext(p)) {
2018 if (*p == TEXT(
'\\') && (++cBackslashes > 1))
2031 void *TWinNTSystem::OpenDirectory(
const char *fdir)
2033 TSystem *helper = FindHelper(fdir);
2035 return helper->OpenDirectory(fdir);
2038 const char *proto = (strstr(fdir,
"file:///")) ?
"file://" :
"file:";
2039 const char *sdir = StripOffProto(fdir, proto);
2041 char *dir =
new char[MAX_PATH];
2042 if (IsShortcut(sdir)) {
2043 if (!ResolveShortCut(sdir, dir, MAX_PATH))
2044 strlcpy(dir, sdir,MAX_PATH);
2047 strlcpy(dir, sdir,MAX_PATH);
2049 int nche = strlen(dir)+3;
2050 char *entry =
new char[nche];
2051 struct _stati64 finfo;
2053 if(PathIsUNC(dir)) {
2054 strlcpy(entry, dir,nche);
2055 if ((entry[strlen(dir)-1] ==
'/') || (entry[strlen(dir)-1] ==
'\\' )) {
2056 entry[strlen(dir)-1] =
'\0';
2058 if(PathIsRoot(entry)) {
2059 strlcat(entry,
"\\",nche);
2061 if (_stati64(entry, &finfo) < 0) {
2068 strlcpy(entry, dir,nche);
2069 if ((entry[strlen(dir)-1] ==
'/') || (entry[strlen(dir)-1] ==
'\\' )) {
2070 if(!PathIsRoot(entry))
2071 entry[strlen(dir)-1] =
'\0';
2073 if (_stati64(entry, &finfo) < 0) {
2080 if (finfo.st_mode & S_IFDIR) {
2081 strlcpy(entry, dir,nche);
2082 if (!(entry[strlen(dir)-1] ==
'/' || entry[strlen(dir)-1] ==
'\\' )) {
2083 strlcat(entry,
"\\",nche);
2085 if (entry[strlen(dir)-1] ==
' ')
2086 entry[strlen(dir)-1] =
'\0';
2087 strlcat(entry,
"*",nche);
2090 searchFile = ::FindFirstFile(entry, &fFindFileData);
2091 if (searchFile == INVALID_HANDLE_VALUE) {
2092 ((TWinNTSystem *)gSystem)->Error(
"Unable to find' for reading:", entry);
2111 const char *TWinNTSystem::WorkingDirectory()
2113 return WorkingDirectory(
'\0');
2119 std::string TWinNTSystem::GetWorkingDirectory()
const
2121 char *wdpath = GetWorkingDirectory(
'\0');
2134 const char *TWinNTSystem::WorkingDirectory(
char driveletter)
2136 char *wdpath = GetWorkingDirectory(driveletter);
2141 if (fWdpath[1] ==
':')
2142 fWdpath[0] = toupper(fWdpath[0]);
2153 char *TWinNTSystem::GetWorkingDirectory(
char driveletter)
const
2156 char drive = driveletter ? toupper( driveletter ) -
'A' + 1 : 0;
2162 if (!(wdpath = ::_getdcwd( (
int)drive, wdpath, kMAXPATHLEN))) {
2164 Warning(
"WorkingDirectory",
"getcwd() failed");
2174 const char *TWinNTSystem::HomeDirectory(
const char *userName)
2176 static char mydir[kMAXPATHLEN] =
"./";
2177 FillWithHomeDirectory(userName, mydir);
2184 std::string TWinNTSystem::GetHomeDirectory(
const char *userName)
const
2186 char mydir[kMAXPATHLEN] =
"./";
2187 FillWithHomeDirectory(userName, mydir);
2188 return std::string(mydir);
2194 void TWinNTSystem::FillWithHomeDirectory(
const char *userName,
char *mydir)
const
2197 if (!(h = ::getenv(
"home"))) h = ::getenv(
"HOME");
2200 strlcpy(mydir, h,kMAXPATHLEN);
2204 h = ::getenv(
"HOMESHARE");
2205 if (!h) h = ::getenv(
"HOMEDRIVE");
2207 strlcpy(mydir, h,kMAXPATHLEN);
2208 h = ::getenv(
"HOMEPATH");
2209 if(h) strlcat(mydir, h,kMAXPATHLEN);
2213 h = ::getenv(
"USERPROFILE");
2214 if (h) strlcpy(mydir, h,kMAXPATHLEN);
2218 if (mydir[1] ==
':')
2219 mydir[0] = toupper(mydir[0]);
2227 const char *TWinNTSystem::TempDirectory()
const
2229 const char *dir = gSystem->Getenv(
"TEMP");
2230 if (!dir) dir = gSystem->Getenv(
"TEMPDIR");
2231 if (!dir) dir = gSystem->Getenv(
"TEMP_DIR");
2232 if (!dir) dir = gSystem->Getenv(
"TMP");
2233 if (!dir) dir = gSystem->Getenv(
"TMPDIR");
2234 if (!dir) dir = gSystem->Getenv(
"TMP_DIR");
2235 if (!dir) dir =
"c:\\";
2249 FILE *TWinNTSystem::TempFileName(TString &base,
const char *dir)
2251 char tmpName[MAX_PATH];
2253 ::GetTempFileName(dir ? dir : TempDirectory(), base.Data(), 0, tmpName);
2255 FILE *fp = fopen(tmpName,
"w+");
2257 if (!fp) ::SysError(
"TempFileName",
"error opening %s", tmpName);
2268 TList *TWinNTSystem::GetVolumes(Option_t *opt)
const
2272 TString sDrive, sType;
2275 if (!opt || !opt[0]) {
2280 UINT nOldErrorMode = ::SetErrorMode(SEM_FAILCRITICALERRORS);
2281 TList *drives =
new TList();
2284 curdrive = _getdrive();
2285 if (strstr(opt,
"cur")) {
2287 sDrive.Form(
"%c:", (curdrive +
'A' - 1));
2288 sType.Form(
"Unknown Drive (%s)", sDrive.Data());
2289 ::GetVolumeInformation(Form(
"%s\\", sDrive.Data()), NULL, 0, NULL, NULL,
2290 NULL, (LPSTR)szFs, 32);
2291 type = ::GetDriveType(sDrive.Data());
2294 case DRIVE_NO_ROOT_DIR:
2296 case DRIVE_REMOVABLE:
2297 sType.Form(
"Removable Disk (%s)", sDrive.Data());
2300 sType.Form(
"Local Disk (%s)", sDrive.Data());
2303 sType.Form(
"Network Drive (%s) (%s)", szFs, sDrive.Data());
2306 sType.Form(
"CD/DVD Drive (%s)", sDrive.Data());
2309 sType.Form(
"RAM Disk (%s)", sDrive.Data());
2312 drives->Add(
new TNamed(sDrive.Data(), sType.Data()));
2314 else if (strstr(opt,
"all")) {
2317 if (::GetLogicalDriveStrings(511, szTemp)) {
2318 TCHAR szDrive[3] = TEXT(
" :");
2324 sDrive.Form(
"%s", szDrive);
2326 if ((sDrive ==
"A:") || (sDrive ==
"B:")) {
2330 sType.Form(
"Unknown Drive (%s)", sDrive.Data());
2331 ::GetVolumeInformation(Form(
"%s\\", sDrive.Data()), NULL, 0, NULL,
2332 NULL, NULL, (LPSTR)szFs, 32);
2333 type = ::GetDriveType(sDrive.Data());
2336 case DRIVE_NO_ROOT_DIR:
2338 case DRIVE_REMOVABLE:
2339 sType.Form(
"Removable Disk (%s)", sDrive.Data());
2342 sType.Form(
"Local Disk (%s)", sDrive.Data());
2345 sType.Form(
"Network Drive (%s) (%s)", szFs, sDrive.Data());
2348 sType.Form(
"CD/DVD Drive (%s)", sDrive.Data());
2351 sType.Form(
"RAM Disk (%s)", sDrive.Data());
2354 drives->Add(
new TNamed(sDrive.Data(), sType.Data()));
2361 ::SetErrorMode(nOldErrorMode);
2370 const char *TWinNTSystem::DirName(
const char *pathname)
2373 if (fDirNameBuffer) {
2380 if (strchr(pathname,
'/') || strchr(pathname,
'\\')) {
2381 const char *rslash = strrchr(pathname,
'/');
2382 const char *bslash = strrchr(pathname,
'\\');
2383 const char *r = (std::max)(rslash, bslash);
2384 const char *ptr = pathname;
2394 int len = r - pathname;
2396 fDirNameBuffer =
new char[len+1];
2397 memcpy(fDirNameBuffer, pathname, len);
2398 fDirNameBuffer[len] = 0;
2402 if (!fDirNameBuffer) {
2403 fDirNameBuffer =
new char[1];
2404 *fDirNameBuffer =
'\0';
2406 return fDirNameBuffer;
2424 const char TWinNTSystem::DriveName(
const char *pathname)
2426 if (!pathname)
return 0;
2427 if (!pathname[0])
return 0;
2433 while(*lpchar ==
' ') lpchar++;
2435 if (isalpha((
int)*lpchar) && *(lpchar+1) ==
':') {
2439 if ( (*lpchar ==
'\\' || *lpchar ==
'/' ) &&
2440 (*(lpchar+1) ==
'\\' || *(lpchar+1) ==
'/') )
return 0;
2443 return DriveName(WorkingDirectory());
2449 Bool_t TWinNTSystem::IsAbsoluteFileName(
const char *dir)
2453 if (strchr(dir,
':')) idx = 2;
2454 return (dir[idx] ==
'/' || dir[idx] ==
'\\');
2485 const char *TWinNTSystem::UnixPathName(
const char *name)
2487 const int kBufSize = 1024;
2488 TTHREAD_TLS_ARRAY(
char, kBufSize, temp);
2490 strlcpy(temp, name, kBufSize);
2491 char *currentChar = temp;
2494 while (*currentChar !=
'\0') {
2495 if (*currentChar ==
'\\') *currentChar =
'/';
2506 Bool_t TWinNTSystem::AccessPathName(
const char *path, EAccessMode mode)
2508 TSystem *helper = FindHelper(path);
2510 return helper->AccessPathName(path, mode);
2513 UINT nOldErrorMode = ::SetErrorMode(SEM_FAILCRITICALERRORS);
2514 if (mode==kExecutePermission)
2516 mode=kReadPermission;
2517 const char *proto = (strstr(path,
"file:///")) ?
"file://" :
"file:";
2518 if (::_access(StripOffProto(path, proto), mode) == 0) {
2520 ::SetErrorMode(nOldErrorMode);
2523 GetLastErrorString() = GetError();
2525 ::SetErrorMode(nOldErrorMode);
2533 Bool_t TWinNTSystem::IsPathLocal(
const char *path)
2535 TSystem *helper = FindHelper(path);
2537 return helper->IsPathLocal(path);
2539 return TSystem::IsPathLocal(path);
2545 const char *TWinNTSystem::PrependPathName(
const char *dir, TString& name)
2547 if (name ==
".") name =
"";
2548 if (dir && dir[0]) {
2550 char last = dir[strlen(dir) - 1];
2551 if (last !=
'/' && last !=
'\\') {
2555 name.ReplaceAll(
"/",
"\\");
2565 int TWinNTSystem::CopyFile(
const char *f,
const char *t, Bool_t overwrite)
2567 if (AccessPathName(f, kReadPermission))
return -1;
2568 if (!AccessPathName(t) && !overwrite)
return -2;
2570 Bool_t ret = ::CopyFileA(f, t, kFALSE);
2572 if (!ret)
return -1;
2579 int TWinNTSystem::Rename(
const char *f,
const char *t)
2581 int ret = ::rename(f, t);
2582 GetLastErrorString() = GetError();
2592 int TWinNTSystem::GetPathInfo(
const char *path, FileStat_t &buf)
2594 TSystem *helper = FindHelper(path);
2596 return helper->GetPathInfo(path, buf);
2598 struct _stati64 sbuf;
2601 const char *proto = (strstr(path,
"file:///")) ?
"file://" :
"file:";
2602 char *newpath = StrDup(StripOffProto(path, proto));
2603 int l = strlen(newpath);
2605 if (newpath[--l] !=
'\\' || newpath[--l] !=
'/') {
2611 if (newpath && ::_stati64(newpath, &sbuf) >= 0) {
2613 buf.fDev = sbuf.st_dev;
2614 buf.fIno = sbuf.st_ino;
2615 buf.fMode = sbuf.st_mode;
2616 buf.fUid = sbuf.st_uid;
2617 buf.fGid = sbuf.st_gid;
2618 buf.fSize = sbuf.st_size;
2619 buf.fMtime = sbuf.st_mtime;
2620 buf.fIsLink = IsShortcut(newpath);
2622 char *lpath =
new char[MAX_PATH];
2623 if (IsShortcut(newpath)) {
2624 struct _stati64 sbuf2;
2625 if (ResolveShortCut(newpath, lpath, MAX_PATH)) {
2626 if (::_stati64(lpath, &sbuf2) >= 0) {
2627 buf.fMode = sbuf2.st_mode;
2649 int TWinNTSystem::GetFsInfo(
const char *path, Long_t *
id, Long_t *bsize,
2650 Long_t *blocks, Long_t *bfree)
2653 LPCTSTR lpRootPathName = path;
2656 LPTSTR lpVolumeNameBuffer = 0;
2657 DWORD nVolumeNameSize = 0;
2659 DWORD volumeSerialNumber;
2660 DWORD maximumComponentLength;
2663 DWORD fileSystemFlags;
2666 char fileSystemNameBuffer[512];
2667 DWORD nFileSystemNameSize =
sizeof(fileSystemNameBuffer);
2670 UINT nOldErrorMode = ::SetErrorMode(SEM_FAILCRITICALERRORS);
2671 if (!::GetVolumeInformation(lpRootPathName,
2672 lpVolumeNameBuffer, nVolumeNameSize,
2673 &volumeSerialNumber,
2674 &maximumComponentLength,
2676 fileSystemNameBuffer, nFileSystemNameSize)) {
2678 ::SetErrorMode(nOldErrorMode);
2682 const char *fsNames[] = {
"FAT",
"NTFS" };
2684 for (i = 0; i < 2; i++) {
2685 if (!strncmp(fileSystemNameBuffer, fsNames[i], nFileSystemNameSize))
2690 DWORD sectorsPerCluster;
2691 DWORD bytesPerSector;
2692 DWORD numberOfFreeClusters;
2693 DWORD totalNumberOfClusters;
2695 if (!::GetDiskFreeSpace(lpRootPathName,
2698 &numberOfFreeClusters,
2699 &totalNumberOfClusters)) {
2701 ::SetErrorMode(nOldErrorMode);
2705 ::SetErrorMode(nOldErrorMode);
2707 *bsize = sectorsPerCluster * bytesPerSector;
2708 *blocks = totalNumberOfClusters;
2709 *bfree = numberOfFreeClusters;
2717 int TWinNTSystem::Link(
const char *from,
const char *to)
2719 struct _stati64 finfo;
2724 char linkname[1024];
2725 LPTSTR lpszFilePart;
2726 TCHAR szPath[MAX_PATH];
2729 typedef BOOL (__stdcall *CREATEHARDLINKPROC)( LPCTSTR, LPCTSTR, LPSECURITY_ATTRIBUTES );
2730 static CREATEHARDLINKPROC _CreateHardLink = 0;
2732 HMODULE hModImagehlp = LoadLibrary(
"Kernel32.dll" );
2737 _CreateHardLink = (CREATEHARDLINKPROC) GetProcAddress( hModImagehlp,
"CreateHardLinkW" );
2739 _CreateHardLink = (CREATEHARDLINKPROC) GetProcAddress( hModImagehlp,
"CreateHardLinkA" );
2741 if (!_CreateHardLink)
2744 dwRet = GetFullPathName(from,
sizeof(szPath) /
sizeof(TCHAR),
2745 szPath, &lpszFilePart);
2747 if (_stati64(szPath, &finfo) < 0)
2750 if (finfo.st_mode & S_IFDIR)
2753 snprintf(linkname,1024,
"%s",to);
2754 _splitpath(linkname,winDrive,winDir,winName,winExt);
2755 if ((!winDrive[0] ) &&
2757 _splitpath(szPath,winDrive,winDir,winName,winExt);
2758 snprintf(linkname,1024,
"%s\\%s\\%s", winDrive, winDir, to);
2760 else if (!winDrive[0]) {
2761 _splitpath(szPath,winDrive,winDir,winName,winExt);
2762 snprintf(linkname,1024,
"%s\\%s", winDrive, to);
2765 if (!_CreateHardLink(linkname, szPath, NULL))
2775 int TWinNTSystem::Symlink(
const char *from,
const char *to)
2778 IShellLink* pShellLink;
2779 IPersistFile* pPersistFile;
2780 WCHAR wszLinkfile[MAX_PATH];
2781 int iWideCharsWritten;
2783 LPTSTR lpszFilePart;
2784 TCHAR szPath[MAX_PATH];
2786 hRes = E_INVALIDARG;
2787 if ((from == NULL) || (!from[0]) || (to == NULL) ||
2793 typedef HRESULT (__stdcall *COINITIALIZEPROC)( LPVOID );
2794 static COINITIALIZEPROC _CoInitialize = 0;
2795 typedef void (__stdcall *COUNINITIALIZEPROC)( void );
2796 static COUNINITIALIZEPROC _CoUninitialize = 0;
2797 typedef HRESULT (__stdcall *COCREATEINSTANCEPROC)( REFCLSID, LPUNKNOWN, DWORD, REFIID, LPVOID );
2798 static COCREATEINSTANCEPROC _CoCreateInstance = 0;
2800 HMODULE hModImagehlp = LoadLibrary(
"ole32.dll" );
2804 _CoInitialize = (COINITIALIZEPROC) GetProcAddress( hModImagehlp,
"CoInitialize" );
2807 _CoUninitialize = (COUNINITIALIZEPROC) GetProcAddress( hModImagehlp,
"CoUninitialize" );
2808 if (!_CoUninitialize)
2810 _CoCreateInstance = (COCREATEINSTANCEPROC) GetProcAddress( hModImagehlp,
"CoCreateInstance" );
2811 if (!_CoCreateInstance)
2814 TString linkname(to);
2815 if (!linkname.EndsWith(
".lnk"))
2816 linkname.Append(
".lnk");
2818 _CoInitialize(NULL);
2821 dwRet = GetFullPathName(from,
sizeof(szPath) /
sizeof(TCHAR),
2822 szPath, &lpszFilePart);
2823 hRes = _CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
2824 IID_IShellLink, (LPVOID *)&pShellLink);
2825 if (SUCCEEDED(hRes)) {
2827 hRes = pShellLink->SetPath(szPath);
2829 hRes = pShellLink->QueryInterface(IID_IPersistFile, (
void **)&pPersistFile);
2830 if (SUCCEEDED(hRes)){
2831 iWideCharsWritten = MultiByteToWideChar(CP_ACP, 0, linkname.Data(), -1,
2832 wszLinkfile, MAX_PATH);
2833 hRes = pPersistFile->Save(wszLinkfile, TRUE);
2834 pPersistFile->Release();
2836 pShellLink->Release();
2848 int TWinNTSystem::Unlink(
const char *name)
2850 TSystem *helper = FindHelper(name);
2852 return helper->Unlink(name);
2854 struct _stati64 finfo;
2856 if (_stati64(name, &finfo) < 0) {
2860 if (finfo.st_mode & S_IFDIR) {
2861 return ::_rmdir(name);
2863 return ::_unlink(name);
2870 int TWinNTSystem::SetNonBlock(
int fd)
2872 if (::ioctlsocket(fd, FIONBIO, (u_long *)1) == SOCKET_ERROR) {
2873 ::SysError(
"SetNonBlock",
"ioctlsocket");
2882 *shellMeta =
"~*[]{}?$%",
2883 *shellStuff =
"(){}<>\"'",
2889 Bool_t TWinNTSystem::ExpandPathName(TString &patbuf0)
2891 const char *patbuf = (
const char *)patbuf0;
2896 Int_t old_level = gErrorIgnoreLevel;
2897 gErrorIgnoreLevel = kFatal;
2898 if (patbuf0.BeginsWith(
"\\")) {
2899 const char driveletter = DriveName(patbuf);
2901 patbuf0.Prepend(
":");
2902 patbuf0.Prepend(driveletter);
2905 TUrl urlpath(patbuf0, kTRUE);
2906 TString proto = urlpath.GetProtocol();
2907 gErrorIgnoreLevel = old_level;
2908 if (!proto.EqualTo(
"file"))
2912 if (patbuf0.BeginsWith(
"file:"))
2916 while (*patbuf ==
' ') {
2921 while (*patbuf ==
':') {
2926 while (*patbuf ==
';') {
2932 for (q = (
char*)patbuf; *q; q++) {
2936 if ( (((q-2)>patbuf) && ( (*(q-2)!=
';') || !isalpha(*(q-1)) )) &&
2943 for (p = patbuf; *p; p++) {
2944 if (strchr(shellMeta, *p)) {
2960 char replacement[4];
2963 for (
int k = 0; k<3; k++) replacement[k] = 0x1;
2965 replacement[3] = 0x0;
2967 TRegexp TildaNum =
"~[0-9]";
2969 while ( (pos = patbuf0.Index(TildaNum,pos)) != kNPOS ) {
2970 patbuf0.Replace(pos, 1, replacement);
2975 ExpandFileName(patbuf0);
2976 Int_t lbuf = ::ExpandEnvironmentStrings(
2982 cmd =
new char[lbuf+1];
2983 ::ExpandEnvironmentStrings(
2989 patbuf0.ReplaceAll(replacement,
"~");
3000 char *TWinNTSystem::ExpandPathName(
const char *path)
3002 char newpath[MAX_PATH];
3003 if (IsShortcut(path)) {
3004 if (!ResolveShortCut(path, newpath, MAX_PATH))
3005 strlcpy(newpath, path, MAX_PATH);
3008 strlcpy(newpath, path, MAX_PATH);
3009 TString patbuf = newpath;
3010 if (ExpandPathName(patbuf))
return 0;
3012 return StrDup(patbuf.Data());
3021 int TWinNTSystem::Chmod(
const char *file, UInt_t mode)
3023 return ::_chmod(file, mode);
3029 int TWinNTSystem::Umask(Int_t mask)
3031 return ::umask(mask);
3038 int TWinNTSystem::Utime(
const char *file, Long_t modtime, Long_t actime)
3040 if (AccessPathName(file, kWritePermission)) {
3041 Error(
"Utime",
"need write permission for %s to change utime", file);
3044 if (!actime) actime = modtime;
3047 t.actime = (time_t)actime;
3048 t.modtime = (time_t)modtime;
3049 return ::utime(file, &t);
3056 const char *TWinNTSystem::FindFile(
const char *search, TString& infile, EAccessMode mode)
3059 if (mode==kExecutePermission)
3060 mode=kReadPermission;
3064 gSystem->ExpandPathName(infile);
3066 if (IsAbsoluteFileName(infile.Data()) ) {
3067 if (!AccessPathName(infile.Data(), mode))
3068 return infile.Data();
3072 TString exsearch(search);
3073 gSystem->ExpandPathName(exsearch);
3076 Int_t lastDelim = -1;
3077 for(
int i=0; i < exsearch.Length(); ++i) {
3078 switch( exsearch[i] ) {
3081 if (i-lastDelim!=2) exsearch[i] =
';';
3084 case ';': lastDelim = i;
break;
3090 char name[kMAXPATHLEN];
3091 char *lpFilePart = 0;
3092 if (::SearchPath(exsearch.Data(), infile.Data(), NULL, kMAXPATHLEN, name, &lpFilePart) &&
3093 ::access(name, mode) == 0 && stat(name, &finfo) == 0 &&
3094 finfo.st_mode & S_IFREG) {
3095 if (gEnv->GetValue(
"Root.ShowPath", 0)) {
3096 Printf(
"Which: %s = %s", infile, name);
3099 return infile.Data();
3110 Bool_t TWinNTSystem::InitUsersGroups()
3113 if ((gEnv->GetValue(
"WinNT.UseNetAPI", 0)) && (::GetVersion() < 0x80000000)) {
3115 fNbGroups = fNbUsers = 0;
3116 HINSTANCE netapi = ::LoadLibrary(
"netapi32.DLL");
3117 if (!netapi)
return kFALSE;
3119 p2NetApiBufferFree = (pfn1)::GetProcAddress(netapi,
"NetApiBufferFree");
3120 p2NetUserGetInfo = (pfn2)::GetProcAddress(netapi,
"NetUserGetInfo");
3121 p2NetLocalGroupGetMembers = (pfn3)::GetProcAddress(netapi,
"NetLocalGroupGetMembers");
3122 p2NetLocalGroupEnum = (pfn4)::GetProcAddress(netapi,
"NetLocalGroupEnum");
3124 if (!p2NetApiBufferFree || !p2NetUserGetInfo ||
3125 !p2NetLocalGroupGetMembers || !p2NetLocalGroupEnum)
return kFALSE;
3129 fGroups = (
struct group *)calloc(fNbGroups,
sizeof(
struct group));
3130 for(
int i=0;i<fNbGroups;i++) {
3131 fGroups[i].gr_mem = (
char **)calloc(fNbUsers,
sizeof (
char*));
3133 fPasswords = (
struct passwd *)calloc(fNbUsers,
sizeof(
struct passwd));
3136 ::FreeLibrary(netapi);
3138 fGroupsInitDone = kTRUE;
3144 Bool_t TWinNTSystem::CountMembers(
const char *lpszGroupName)
3146 NET_API_STATUS NetStatus = NERR_Success;
3148 DWORD Index = 0, ResumeHandle = 0, Total = 0;
3149 LOCALGROUP_MEMBERS_INFO_1 *MemberInfo;
3150 WCHAR wszGroupName[256];
3152 DWORD dwLastError = 0;
3154 iRetOp = MultiByteToWideChar (
3156 (DWORD)MB_PRECOMPOSED,
3157 (LPCSTR)lpszGroupName,
3159 (LPWSTR)wszGroupName,
3160 (
int)
sizeof(wszGroupName) );
3163 dwLastError = GetLastError();
3165 p2NetApiBufferFree(Data);
3171 NetStatus = p2NetLocalGroupGetMembers (NULL, wszGroupName, 1,
3172 &Data, 8192, &Index, &Total, &ResumeHandle );
3174 if (NetStatus != NERR_Success || Data == NULL) {
3175 dwLastError = GetLastError();
3177 if (dwLastError == ERROR_ENVVAR_NOT_FOUND) {
3183 NetStatus = p2NetLocalGroupGetMembers ( NULL, wszGroupName, 0,
3184 &Data, 8192, &Index, &Total, &ResumeHandle );
3188 p2NetApiBufferFree(Data);
3193 MemberInfo = (LOCALGROUP_MEMBERS_INFO_1 *)Data;
3196 p2NetApiBufferFree(Data);
3203 Bool_t TWinNTSystem::GetNbGroups()
3205 NET_API_STATUS NetStatus = NERR_Success;
3207 DWORD Index = 0, ResumeHandle = 0, Total = 0, i;
3208 LOCALGROUP_INFO_0 *GroupInfo;
3209 char szAnsiName[256];
3210 DWORD dwLastError = 0;
3213 NetStatus = p2NetLocalGroupEnum(NULL, 0, &Data, 8192, &Index,
3214 &Total, &ResumeHandle );
3216 if (NetStatus != NERR_Success || Data == NULL) {
3217 dwLastError = GetLastError();
3219 p2NetApiBufferFree(Data);
3224 GroupInfo = (LOCALGROUP_INFO_0 *)Data;
3225 for (i=0; i < Total; i++) {
3227 iRetOp = WideCharToMultiByte (
3230 (LPCWSTR)(GroupInfo->lgrpi0_name),
3233 (
int)(
sizeof(szAnsiName)),
3239 CountMembers((LPCTSTR)szAnsiName);
3245 p2NetApiBufferFree(Data);
3256 Long_t TWinNTSystem::LookupSID (
const char *lpszAccountName,
int what,
3257 int &groupIdx,
int &memberIdx)
3259 BOOL bRetOp = FALSE;
3261 DWORD dwSidSize, dwDomainNameSize;
3262 BYTE bySidBuffer[MAX_SID_SIZE];
3263 char szDomainName[MAX_NAME_STRING];
3264 SID_NAME_USE sidType;
3265 PUCHAR puchar_SubAuthCount = NULL;
3266 SID_IDENTIFIER_AUTHORITY sid_identifier_authority;
3267 PSID_IDENTIFIER_AUTHORITY psid_identifier_authority = NULL;
3268 unsigned char j = 0;
3269 DWORD dwLastError = 0;
3271 pSid = (PSID)bySidBuffer;
3272 dwSidSize =
sizeof(bySidBuffer);
3273 dwDomainNameSize =
sizeof(szDomainName);
3275 bRetOp = LookupAccountName (
3277 (LPCTSTR)lpszAccountName,
3279 (LPDWORD)&dwSidSize,
3280 (LPTSTR)szDomainName,
3281 (LPDWORD)&dwDomainNameSize,
3282 (PSID_NAME_USE)&sidType );
3284 if (bRetOp == FALSE) {
3285 dwLastError = GetLastError();
3289 bRetOp = IsValidSid((PSID)pSid);
3291 if (bRetOp == FALSE) {
3292 dwLastError = GetLastError();
3297 psid_identifier_authority = GetSidIdentifierAuthority ((PSID)pSid);
3300 memcpy (&sid_identifier_authority, psid_identifier_authority,
3301 sizeof(SID_IDENTIFIER_AUTHORITY));
3304 puchar_SubAuthCount = (PUCHAR)GetSidSubAuthorityCount((PSID)pSid);
3306 j = (
unsigned char)(*puchar_SubAuthCount);
3308 DWORD dwSubAuth = 0;
3309 PDWORD pdwSubAuth = NULL;
3311 pdwSubAuth = (PDWORD)GetSidSubAuthority (
3314 dwSubAuth = *pdwSubAuth;
3315 if(what == SID_MEMBER) {
3316 fPasswords[memberIdx].pw_uid = dwSubAuth;
3317 fPasswords[memberIdx].pw_gid = fGroups[groupIdx].gr_gid;
3318 fPasswords[memberIdx].pw_group = strdup(fGroups[groupIdx].gr_name);
3320 else if(what == SID_GROUP) {
3321 fGroups[groupIdx].gr_gid = dwSubAuth;
3329 Bool_t TWinNTSystem::CollectMembers(
const char *lpszGroupName,
int &groupIdx,
3333 NET_API_STATUS NetStatus = NERR_Success;
3335 DWORD Index = 0, ResumeHandle = 0, Total = 0, i;
3336 LOCALGROUP_MEMBERS_INFO_1 *MemberInfo;
3337 char szAnsiMemberName[256];
3338 char szFullMemberName[256];
3339 char szMemberHomeDir[256];
3340 WCHAR wszGroupName[256];
3343 DWORD length =
sizeof (act_name);
3344 DWORD dwLastError = 0;
3345 LPUSER_INFO_11 pUI11Buf = NULL;
3346 NET_API_STATUS nStatus;
3348 iRetOp = MultiByteToWideChar (
3350 (DWORD)MB_PRECOMPOSED,
3351 (LPCSTR)lpszGroupName,
3353 (LPWSTR)wszGroupName,
3354 (
int)
sizeof(wszGroupName) );
3357 dwLastError = GetLastError();
3359 p2NetApiBufferFree(Data);
3363 GetUserName (act_name, &length);
3367 NetStatus = p2NetLocalGroupGetMembers (NULL, wszGroupName, 1,
3368 &Data, 8192, &Index, &Total, &ResumeHandle );
3370 if (NetStatus != NERR_Success || Data == NULL) {
3371 dwLastError = GetLastError();
3373 if (dwLastError == ERROR_ENVVAR_NOT_FOUND) {
3379 NetStatus = p2NetLocalGroupGetMembers ( NULL, wszGroupName, 0,
3380 &Data, 8192, &Index, &Total, &ResumeHandle );
3384 p2NetApiBufferFree(Data);
3388 MemberInfo = (LOCALGROUP_MEMBERS_INFO_1 *)Data;
3389 for (i=0; i < Total; i++) {
3390 iRetOp = WideCharToMultiByte (
3393 (LPCWSTR)(MemberInfo->lgrmi1_name),
3395 (LPSTR)szAnsiMemberName,
3396 (
int)(
sizeof(szAnsiMemberName)),
3401 dwLastError = GetLastError();
3404 fPasswords[memberIdx].pw_name = strdup(szAnsiMemberName);
3405 fPasswords[memberIdx].pw_passwd = strdup(
"");
3406 fGroups[groupIdx].gr_mem[i] = strdup(szAnsiMemberName);
3408 if(fActUser == -1 && !stricmp(fPasswords[memberIdx].pw_name,act_name))
3409 fActUser = memberIdx;
3412 TCHAR szUserName[255]=TEXT(
"");
3413 MultiByteToWideChar(CP_ACP, 0, szAnsiMemberName, -1, (LPWSTR)szUserName, 255);
3417 nStatus = p2NetUserGetInfo(NULL, (LPCWSTR)szUserName, 11, (LPBYTE *)&pUI11Buf);
3421 if (nStatus == NERR_Success) {
3422 if (pUI11Buf != NULL) {
3423 wsprintf(szFullMemberName,
"%S",pUI11Buf->usri11_full_name);
3424 fPasswords[memberIdx].pw_gecos = strdup(szFullMemberName);
3425 wsprintf(szMemberHomeDir,
"%S",pUI11Buf->usri11_home_dir);
3426 fPasswords[memberIdx].pw_dir = strdup(szMemberHomeDir);
3429 if((fPasswords[memberIdx].pw_gecos == NULL) || (strlen(fPasswords[memberIdx].pw_gecos) == 0))
3430 fPasswords[memberIdx].pw_gecos = strdup(fPasswords[memberIdx].pw_name);
3431 if((fPasswords[memberIdx].pw_dir == NULL) || (strlen(fPasswords[memberIdx].pw_dir) == 0))
3432 fPasswords[memberIdx].pw_dir = strdup(
"c:\\");
3436 if (pUI11Buf != NULL) {
3437 p2NetApiBufferFree(pUI11Buf);
3442 if (getenv(
"SHELL") == NULL)
3443 putenv ((GetVersion () & 0x80000000) ?
"SHELL=command" :
"SHELL=cmd");
3446 fPasswords[memberIdx].pw_shell = getenv(
"SHELL");
3449 LookupSID ((LPCTSTR)szAnsiMemberName, SID_MEMBER, groupIdx, memberIdx);
3453 if(fActUser == -1) fActUser = 0;
3456 p2NetApiBufferFree(Data);
3464 Bool_t TWinNTSystem::CollectGroups()
3466 NET_API_STATUS NetStatus = NERR_Success;
3468 DWORD Index = 0, ResumeHandle = 0, Total = 0, i;
3469 LOCALGROUP_INFO_0 *GroupInfo;
3470 char szAnsiName[256];
3471 DWORD dwLastError = 0;
3472 int iRetOp = 0, iGroupIdx = 0, iMemberIdx = 0;
3474 NetStatus = p2NetLocalGroupEnum(NULL, 0, &Data, 8192, &Index,
3475 &Total, &ResumeHandle );
3477 if (NetStatus != NERR_Success || Data == NULL) {
3478 dwLastError = GetLastError();
3480 p2NetApiBufferFree(Data);
3484 GroupInfo = (LOCALGROUP_INFO_0 *)Data;
3485 for (i=0; i < Total; i++) {
3487 iRetOp = WideCharToMultiByte (
3490 (LPCWSTR)(GroupInfo->lgrpi0_name),
3493 (
int)(
sizeof(szAnsiName)),
3497 fGroups[iGroupIdx].gr_name = strdup(szAnsiName);
3498 fGroups[iGroupIdx].gr_passwd = strdup(
"");
3501 LookupSID ((LPCTSTR)szAnsiName, SID_GROUP, iGroupIdx, iMemberIdx);
3504 CollectMembers((LPCTSTR)szAnsiName, iGroupIdx, iMemberIdx);
3511 p2NetApiBufferFree(Data);
3519 Int_t TWinNTSystem::GetUid(
const char *user)
3521 if(!fGroupsInitDone)
3525 if ((!gEnv->GetValue(
"WinNT.UseNetAPI", 0)) || (::GetVersion() >= 0x80000000)) {
3528 DWORD length =
sizeof (name);
3529 if (::GetUserName (name, &length)) {
3530 if (stricmp (
"administrator", name) == 0)
3540 if (!user || !user[0])
3541 return fPasswords[fActUser].pw_uid;
3543 struct passwd *pwd = 0;
3544 for(
int i=0;i<fNbUsers;i++) {
3545 if (!stricmp (user, fPasswords[i].pw_name)) {
3546 pwd = &fPasswords[i];
3560 Int_t TWinNTSystem::GetEffectiveUid()
3562 if(!fGroupsInitDone)
3566 if ((!gEnv->GetValue(
"WinNT.UseNetAPI", 0)) || (::GetVersion() >= 0x80000000)) {
3569 DWORD length =
sizeof (name);
3570 if (::GetUserName (name, &length)) {
3571 if (stricmp (
"administrator", name) == 0)
3581 return fPasswords[fActUser].pw_uid;
3587 Int_t TWinNTSystem::GetGid(
const char *group)
3589 if(!fGroupsInitDone)
3593 if ((!gEnv->GetValue(
"WinNT.UseNetAPI", 0)) || (::GetVersion() >= 0x80000000)) {
3596 DWORD length =
sizeof (name);
3597 if (::GetUserName (name, &length)) {
3598 if (stricmp (
"administrator", name) == 0)
3608 if (!group || !group[0])
3609 return fPasswords[fActUser].pw_gid;
3611 struct group *grp = 0;
3612 for(
int i=0;i<fNbGroups;i++) {
3613 if (!stricmp (group, fGroups[i].gr_name)) {
3628 Int_t TWinNTSystem::GetEffectiveGid()
3630 if(!fGroupsInitDone)
3634 if ((!gEnv->GetValue(
"WinNT.UseNetAPI", 0)) || (::GetVersion() >= 0x80000000)) {
3637 DWORD length =
sizeof (name);
3638 if (::GetUserName (name, &length)) {
3639 if (stricmp (
"administrator", name) == 0)
3649 return fPasswords[fActUser].pw_gid;
3656 UserGroup_t *TWinNTSystem::GetUserInfo(Int_t uid)
3658 if(!fGroupsInitDone)
3662 if ((!gEnv->GetValue(
"WinNT.UseNetAPI", 0)) || (::GetVersion() >= 0x80000000)) {
3664 DWORD length =
sizeof (name);
3665 UserGroup_t *ug =
new UserGroup_t;
3666 if (::GetUserName (name, &length)) {
3668 if (stricmp (
"administrator", name) == 0) {
3670 ug->fGroup =
"administrators";
3674 ug->fGroup =
"users";
3676 ug->fGid = ug->fUid;
3679 ug->fUser =
"unknown";
3680 ug->fGroup =
"unknown";
3681 ug->fUid = ug->fGid = 123;
3684 ug->fRealName = ug->fUser;
3685 ug->fShell =
"command";
3688 struct passwd *pwd = 0;
3690 pwd = &fPasswords[fActUser];
3692 for (
int i = 0; i < fNbUsers; i++) {
3693 if (uid == fPasswords[i].pw_uid) {
3694 pwd = &fPasswords[i];
3700 UserGroup_t *ug =
new UserGroup_t;
3701 ug->fUid = pwd->pw_uid;
3702 ug->fGid = pwd->pw_gid;
3703 ug->fUser = pwd->pw_name;
3704 ug->fPasswd = pwd->pw_passwd;
3705 ug->fRealName = pwd->pw_gecos;
3706 ug->fShell = pwd->pw_shell;
3707 ug->fGroup = pwd->pw_group;
3718 UserGroup_t *TWinNTSystem::GetUserInfo(
const char *user)
3720 return GetUserInfo(GetUid(user));
3730 UserGroup_t *TWinNTSystem::GetGroupInfo(Int_t gid)
3732 if(!fGroupsInitDone)
3736 if ((!gEnv->GetValue(
"WinNT.UseNetAPI", 0)) || (::GetVersion() >= 0x80000000)) {
3738 DWORD length =
sizeof (name);
3739 UserGroup_t *gr =
new UserGroup_t;
3740 if (::GetUserName (name, &length)) {
3741 if (stricmp (
"administrator", name) == 0) {
3742 gr->fGroup =
"administrators";
3746 gr->fGroup =
"users";
3751 gr->fGroup =
"unknown";
3757 struct group *grp = 0;
3758 for(
int i=0;i<fNbGroups;i++) {
3759 if (gid == fGroups[i].gr_gid) {
3765 UserGroup_t *gr =
new UserGroup_t;
3767 gr->fGid = grp->gr_gid;
3768 gr->fGroup = grp->gr_name;
3782 UserGroup_t *TWinNTSystem::GetGroupInfo(
const char *group)
3784 return GetGroupInfo(GetGid(group));
3792 void TWinNTSystem::Setenv(
const char *name,
const char *value)
3794 ::_putenv(TString::Format(
"%s=%s", name, value));
3800 const char *TWinNTSystem::Getenv(
const char *name)
3802 const char *env = ::getenv(name);
3804 if (::_stricmp(name,
"home") == 0 ) {
3805 env = HomeDirectory();
3806 }
else if (::_stricmp(name,
"rootsys") == 0 ) {
3818 int TWinNTSystem::Exec(
const char *shellcmd)
3820 return ::system(shellcmd);
3826 FILE *TWinNTSystem::OpenPipe(
const char *command,
const char *mode)
3828 return ::_popen(command, mode);
3834 int TWinNTSystem::ClosePipe(FILE *pipe)
3836 return ::_pclose(pipe);
3842 int TWinNTSystem::GetPid()
3850 HANDLE TWinNTSystem::GetProcess()
3858 void TWinNTSystem::Exit(
int code, Bool_t mode)
3864 gROOT->CloseFiles();
3865 if (gROOT->GetListOfBrowsers()) {
3868 if (gROOT->IsBatch())
3869 gROOT->GetListOfBrowsers()->Delete();
3872 TIter next(gROOT->GetListOfBrowsers());
3873 while ((b = (TBrowser*) next()))
3874 gROOT->ProcessLine(TString::Format(
"\
3875 if (((TBrowser*)0x%lx)->GetBrowserImp() &&\
3876 ((TBrowser*)0x%lx)->GetBrowserImp()->GetMainFrame()) \
3877 ((TBrowser*)0x%lx)->GetBrowserImp()->GetMainFrame()->CloseWindow();\
3878 else delete (TBrowser*)0x%lx", (ULong_t)b, (ULong_t)b, (ULong_t)b, (ULong_t)b));
3881 gROOT->EndOfProcessCleanups();
3884 gInterpreter->ShutDown();
3886 gVirtualX->CloseDisplay();
3898 void TWinNTSystem::Abort(
int)
3917 Int_t TWinNTSystem::RedirectOutput(
const char *file,
const char *mode,
3918 RedirectHandle_t *h)
3921 static int fd1=0, fd2=0;
3922 static fpos_t pos1=0, pos2=0;
3924 static RedirectHandle_t loch;
3928 RedirectHandle_t *xh = (h) ? h : &loch;
3932 const char *m = (mode[0] ==
'a' || mode[0] ==
'w') ? mode :
"a";
3935 xh->fReadOffSet = 0;
3939 if (!gSystem->GetPathInfo(file, st))
3940 xh->fReadOffSet = (st.fSize > 0) ? st.fSize : xh->fReadOffSet;
3945 fgetpos(stdout, &pos1);
3946 fd1 = _dup(fileno(stdout));
3948 if ((fout = freopen(file, m, stdout)) == 0) {
3949 SysError(
"RedirectOutput",
"could not freopen stdout");
3951 _dup2(fd1, fileno(stdout));
3955 fsetpos(stdout, &pos1);
3960 fgetpos(stderr, &pos2);
3961 fd2 = _dup(fileno(stderr));
3962 if ((ferr = freopen(file, m, stderr)) == 0) {
3963 SysError(
"RedirectOutput",
"could not freopen stderr");
3965 _dup2(fd1, fileno(stdout));
3969 fsetpos(stdout, &pos1);
3971 _dup2(fd2, fileno(stderr));
3975 fsetpos(stderr, &pos2);
3980 fseek(fout, 0, SEEK_END);
3981 fseek(ferr, 0, SEEK_END);
3988 if (_dup2(fd1, fileno(stdout))) {
3989 SysError(
"RedirectOutput",
"could not restore stdout");
3995 fsetpos(stdout, &pos1);
4002 if (_dup2(fd2, fileno(stderr))) {
4003 SysError(
"RedirectOutput",
"could not restore stderr");
4009 fsetpos(stderr, &pos2);
4025 void TWinNTSystem::AddDynamicPath(
const char *dir)
4028 TString oldpath = DynamicPath(0, kFALSE);
4029 oldpath.Append(
";");
4030 oldpath.Append(dir);
4031 DynamicPath(oldpath);
4038 const char* TWinNTSystem::GetDynamicPath()
4040 return DynamicPath(0, kFALSE);
4048 void TWinNTSystem::SetDynamicPath(
const char *path)
4051 DynamicPath(0, kTRUE);
4061 const char *TWinNTSystem::FindDynamicLibrary(TString &sLib, Bool_t quiet)
4063 int len = sLib.Length();
4064 if (len > 4 && (!stricmp(sLib.Data()+len-4,
".dll"))) {
4065 if (gSystem->FindFile(GetDynamicPath(), sLib, kReadPermission))
4068 TString sLibDll(sLib);
4070 if (gSystem->FindFile(GetDynamicPath(), sLibDll, kReadPermission)) {
4077 Error(
"DynamicPathName",
4078 "%s does not exist in %s,\nor has wrong file extension (.dll)",
4079 sLib.Data(), GetDynamicPath());
4089 int TWinNTSystem::Load(
const char *module,
const char *entry, Bool_t system)
4091 return TSystem::Load(module, entry, system);
4095 #pragma warning(push)
4096 #pragma warning(disable:4200)
4101 const char *TWinNTSystem::GetLinkedLibraries()
4108 if (!gApplication)
return 0;
4110 static Bool_t once = kFALSE;
4111 static TString linkedLibs;
4113 if (!linkedLibs.IsNull())
4119 char *exe = gSystem->Which(Getenv(
"PATH"), gApplication->Argv(0),
4120 kExecutePermission);
4126 HANDLE hFile, hMapping;
4129 if((hFile = CreateFile(exe,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0))==INVALID_HANDLE_VALUE) {
4133 if(!(hMapping = CreateFileMapping(hFile,0,PAGE_READONLY|SEC_COMMIT,0,0,0))) {
4138 if(!(basepointer = MapViewOfFile(hMapping,FILE_MAP_READ,0,0,0))) {
4139 CloseHandle(hMapping);
4146 IMAGE_DOS_HEADER *dos_head = (IMAGE_DOS_HEADER *)basepointer;
4149 IMAGE_FILE_HEADER _head;
4150 IMAGE_OPTIONAL_HEADER opt_head;
4151 IMAGE_SECTION_HEADER section_header[];
4153 struct header *pheader;
4154 const IMAGE_SECTION_HEADER * section_header;
4156 if(dos_head->e_magic!=
'ZM') {
4161 pheader = (
struct header *)((
char*)dos_head + dos_head->e_lfanew);
4163 if(IsBadReadPtr(pheader,
sizeof(
struct header))) {
4167 if(pheader->signature!=IMAGE_NT_SIGNATURE) {
4168 switch((
unsigned short)pheader->signature) {
4169 case IMAGE_DOS_SIGNATURE:
4172 case IMAGE_OS2_SIGNATURE:
4175 case IMAGE_OS2_SIGNATURE_LE:
4183 #define isin(address,start,length) ((address)>=(start) && (address)<(start)+(length))
4186 for(sect=0,section_header=pheader->section_header;
4187 sect<pheader->_head.NumberOfSections;sect++,section_header++) {
4189 const void *
const section_data =
4190 (
char*)basepointer + section_header->PointerToRawData;
4191 for(directory=0;directory<IMAGE_NUMBEROF_DIRECTORY_ENTRIES;directory++) {
4192 if(isin(pheader->opt_head.DataDirectory[directory].VirtualAddress,
4193 section_header->VirtualAddress,
4194 section_header->SizeOfRawData)) {
4195 const IMAGE_IMPORT_DESCRIPTOR *stuff_start =
4196 (IMAGE_IMPORT_DESCRIPTOR *)((
char*)section_data +
4197 (pheader->opt_head.DataDirectory[directory].VirtualAddress -
4198 section_header->VirtualAddress));
4201 const unsigned stuff_length =
4202 pheader->opt_head.DataDirectory[directory].Size;
4203 if(directory == IMAGE_DIRECTORY_ENTRY_IMPORT) {
4204 while(!IsBadReadPtr(stuff_start,
sizeof(*stuff_start)) &&
4205 stuff_start->Name) {
4206 TString dll = (
char*)section_data +
4207 ((DWORD)(stuff_start->Name)) -
4208 section_header->VirtualAddress;
4209 if (dll.EndsWith(
".dll")) {
4210 char *dllPath = DynamicPathName(dll, kTRUE);
4212 char *winPath = getenv(
"windir");
4213 _splitpath(winPath,winDrive,winDir,winName,winExt);
4214 if(!strstr(dllPath, winDir)) {
4215 if (!linkedLibs.IsNull())
4217 linkedLibs += dllPath;
4229 UnmapViewOfFile(basepointer);
4230 CloseHandle(hMapping);
4237 if (linkedLibs.IsNull())
4242 #pragma warning(pop)
4255 const char *TWinNTSystem::GetLibraries(
const char *regexp,
const char *options,
4258 TString libs(TSystem::GetLibraries(regexp, options, isRegexp));
4260 TString opt = options;
4262 if ( (opt.First(
'L')!=kNPOS) ) {
4263 TRegexp separator(
"[^ \\t\\s]+");
4264 TRegexp user_dll(
"\\.dll$");
4265 TRegexp user_lib(
"\\.lib$");
4268 Ssiz_t start, index, end;
4269 start = index = end = 0;
4271 while ((start < libs.Length()) && (index != kNPOS)) {
4272 index = libs.Index(separator, &end, start);
4276 s = libs(index, end);
4278 if ((s.Index(
"c:/windows/") != kNPOS) ||
4279 (s.Index(
"python") != kNPOS)) {
4283 if (s.Index(user_dll) != kNPOS) {
4284 s.ReplaceAll(
".dll",
".lib");
4285 if ( GetPathInfo( s, sbuf ) != 0 ) {
4286 s.Replace( 0, s.Last(
'/')+1, 0, 0);
4287 s.Replace( 0, s.Last(
'\\')+1, 0, 0);
4289 }
else if (s.Index(user_lib) != kNPOS) {
4290 if ( GetPathInfo( s, sbuf ) != 0 ) {
4291 s.Replace( 0, s.Last(
'/')+1, 0, 0);
4292 s.Replace( 0, s.Last(
'\\')+1, 0, 0);
4295 if (!ntlibs.IsNull()) ntlibs.Append(
" ");
4296 if ((s.Index(
"python") == kNPOS) && (s.Index(
"cppyy") == kNPOS) &&
4297 (s.Index(
"vcruntime") == kNPOS) && (s.Index(
".pyd") == kNPOS))
4307 fListLibs.ReplaceAll(
"/",
"\\");
4316 void TWinNTSystem::AddTimer(TTimer *ti)
4318 TSystem::AddTimer(ti);
4324 TTimer *TWinNTSystem::RemoveTimer(TTimer *ti)
4328 TTimer *t = TSystem::RemoveTimer(ti);
4335 void TWinNTSystem::TimerThread()
4339 DispatchTimers(kFALSE);
4340 ::Sleep(kItimerResolution/2);
4348 Bool_t TWinNTSystem::DispatchTimers(Bool_t mode)
4350 if (!fTimers)
return kFALSE;
4352 fInsideNotify = kTRUE;
4354 TOrdCollectionIter it((TOrdCollection*)fTimers);
4356 Bool_t timedout = kFALSE;
4358 while ((t = (TTimer *) it.Next())) {
4361 if (mode && t->IsSync()) {
4362 if (t->CheckTimer(now)) {
4365 }
else if (!mode && t->IsAsync()) {
4366 if (t->CheckTimer(now)) {
4371 fInsideNotify = kFALSE;
4376 const Double_t gTicks = 1.0e-7;
4380 Double_t TWinNTSystem::GetRealTime()
4383 FILETIME ftFileTime;
4387 ::GetSystemTimeAsFileTime(&ftRealTime.ftFileTime);
4388 return (Double_t)ftRealTime.ftInt64 * gTicks;
4394 Double_t TWinNTSystem::GetCPUTime()
4396 OSVERSIONINFO OsVersionInfo;
4405 OsVersionInfo.dwOSVersionInfoSize =
sizeof(OSVERSIONINFO);
4406 GetVersionEx(&OsVersionInfo);
4407 if (OsVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT) {
4413 FILETIME ftFileTime;
4418 FILETIME ftFileTime;
4422 HANDLE hThread = GetCurrentThread();
4423 ret = GetThreadTimes (hThread, &ftCreate, &ftExit,
4424 &ftKernel.ftFileTime,
4425 &ftUser.ftFileTime);
4427 ret = ::GetLastError();
4428 ::Error(
"GetCPUTime",
" Error on GetProcessTimes 0x%lx", (
int)ret);
4437 return (Double_t) (ftKernel.ftInt64 + ftUser.ftInt64) * gTicks;
4439 return GetRealTime();
4446 TTime TWinNTSystem::Now()
4448 static time_t jan95 = 0;
4459 jan95 = mktime(&tp);
4460 if ((
int)jan95 == -1) {
4461 ::SysError(
"TWinNTSystem::Now",
"error converting 950001 0:00 to time_t");
4468 return TTime((now.time-(Long_t)jan95)*1000 + now.millitm);
4476 void TWinNTSystem::Sleep(UInt_t milliSec)
4484 Int_t TWinNTSystem::Select(TList *act, Long_t to)
4491 TFileHandler *h = 0;
4492 while ((h = (TFileHandler *) next())) {
4493 Int_t fd = h->GetFd();
4494 if (h->HasReadInterest())
4496 if (h->HasWriteInterest())
4498 h->ResetReadyMask();
4500 rc = WinNTSelect(&rd, &wr, to);
4505 while ((h = (TFileHandler *) next())) {
4506 Int_t fd = h->GetFd();
4521 Int_t TWinNTSystem::Select(TFileHandler *h, Long_t to)
4529 if (h->HasReadInterest())
4531 if (h->HasWriteInterest())
4533 h->ResetReadyMask();
4534 rc = WinNTSelect(&rd, &wr, to);
4552 int TWinNTSystem::GetServiceByName(
const char *servicename)
4556 if ((sp = ::getservbyname(servicename, kProtocolName)) == 0) {
4557 Error(
"GetServiceByName",
"no service \"%s\" with protocol \"%s\"\n",
4558 servicename, kProtocolName);
4561 return ::ntohs(sp->s_port);
4566 char *TWinNTSystem::GetServiceByPort(
int port)
4572 if ((sp = ::getservbyport(::htons(port), kProtocolName)) == 0) {
4573 return Form(
"%d", port);
4581 TInetAddress TWinNTSystem::GetHostByName(
const char *hostname)
4583 struct hostent *host_ptr;
4588 if ((addr = ::inet_addr(hostname)) != INADDR_NONE) {
4590 if ((host_ptr = ::gethostbyaddr((
const char *)&addr,
4591 sizeof(addr), AF_INET))) {
4592 host = host_ptr->h_name;
4593 TInetAddress a(host, ntohl(addr), type);
4596 for (i = 1; host_ptr->h_addr_list[i]; i++) {
4597 memcpy(&addr2, host_ptr->h_addr_list[i], host_ptr->h_length);
4598 a.AddAddress(ntohl(addr2));
4600 for (i = 0; host_ptr->h_aliases[i]; i++)
4601 a.AddAlias(host_ptr->h_aliases[i]);
4604 host =
"UnNamedHost";
4606 }
else if ((host_ptr = ::gethostbyname(hostname))) {
4608 if (host_ptr->h_addrtype != AF_INET) {
4609 Error(
"GetHostByName",
"%s is not an internet host\n", hostname);
4610 return TInetAddress();
4612 memcpy(&addr, host_ptr->h_addr, host_ptr->h_length);
4613 host = host_ptr->h_name;
4614 type = host_ptr->h_addrtype;
4615 TInetAddress a(host, ntohl(addr), type);
4618 for (i = 1; host_ptr->h_addr_list[i]; i++) {
4619 memcpy(&addr2, host_ptr->h_addr_list[i], host_ptr->h_length);
4620 a.AddAddress(ntohl(addr2));
4622 for (i = 0; host_ptr->h_aliases[i]; i++)
4623 a.AddAlias(host_ptr->h_aliases[i]);
4626 if (gDebug > 0) Error(
"GetHostByName",
"unknown host %s", hostname);
4627 return TInetAddress(hostname, 0, -1);
4630 return TInetAddress(host, ::ntohl(addr), type);
4636 TInetAddress TWinNTSystem::GetPeerName(
int socket)
4638 SOCKET sock = socket;
4639 struct sockaddr_in addr;
4640 int len =
sizeof(addr);
4642 if (::getpeername(sock, (
struct sockaddr *)&addr, &len) == SOCKET_ERROR) {
4643 ::SysError(
"GetPeerName",
"getpeername");
4644 return TInetAddress();
4647 struct hostent *host_ptr;
4648 const char *hostname;
4652 if ((host_ptr = ::gethostbyaddr((
const char *)&addr.sin_addr,
4653 sizeof(addr.sin_addr), AF_INET))) {
4654 memcpy(&iaddr, host_ptr->h_addr, host_ptr->h_length);
4655 hostname = host_ptr->h_name;
4656 family = host_ptr->h_addrtype;
4658 memcpy(&iaddr, &addr.sin_addr,
sizeof(addr.sin_addr));
4663 return TInetAddress(hostname, ::ntohl(iaddr), family, ::ntohs(addr.sin_port));
4669 TInetAddress TWinNTSystem::GetSockName(
int socket)
4671 SOCKET sock = socket;
4672 struct sockaddr_in addr;
4673 int len =
sizeof(addr);
4675 if (::getsockname(sock, (
struct sockaddr *)&addr, &len) == SOCKET_ERROR) {
4676 ::SysError(
"GetSockName",
"getsockname");
4677 return TInetAddress();
4680 struct hostent *host_ptr;
4681 const char *hostname;
4685 if ((host_ptr = ::gethostbyaddr((
const char *)&addr.sin_addr,
4686 sizeof(addr.sin_addr), AF_INET))) {
4687 memcpy(&iaddr, host_ptr->h_addr, host_ptr->h_length);
4688 hostname = host_ptr->h_name;
4689 family = host_ptr->h_addrtype;
4691 memcpy(&iaddr, &addr.sin_addr,
sizeof(addr.sin_addr));
4696 return TInetAddress(hostname, ::ntohl(iaddr), family, ::ntohs(addr.sin_port));
4702 int TWinNTSystem::AnnounceUnixService(
int port,
int backlog)
4707 if ((sock = ::socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) {
4708 ::SysError(
"TWinNTSystem::AnnounceUnixService",
"socket");
4712 struct sockaddr_in inserver;
4713 memset(&inserver, 0,
sizeof(inserver));
4714 inserver.sin_family = AF_INET;
4715 inserver.sin_addr.s_addr = ::htonl(INADDR_LOOPBACK);
4716 inserver.sin_port = port;
4720 if (::bind(sock, (
struct sockaddr*) &inserver,
sizeof(inserver)) == SOCKET_ERROR) {
4721 ::SysError(
"TWinNTSystem::AnnounceUnixService",
"bind");
4726 if (::listen(sock, backlog)) {
4727 ::SysError(
"TWinNTSystem::AnnounceUnixService",
"listen");
4737 int TWinNTSystem::AnnounceUnixService(
const char *sockpath,
int backlog)
4739 if (!sockpath || strlen(sockpath) <= 0) {
4740 ::SysError(
"TWinNTSystem::AnnounceUnixService",
"socket path undefined");
4744 struct sockaddr_in myaddr;
4746 int len =
sizeof myaddr;
4751 if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
4752 ::SysError(
"TWinNTSystem::AnnounceUnixService",
"socket");
4756 memset(&myaddr, 0,
sizeof(myaddr));
4757 myaddr.sin_port = 0;
4758 myaddr.sin_family = AF_INET;
4759 myaddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
4761 rc = bind(sock, (
struct sockaddr *)&myaddr, len);
4763 ::SysError(
"TWinNTSystem::AnnounceUnixService",
"bind");
4766 rc = getsockname(sock, (
struct sockaddr *)&myaddr, &len);
4768 ::SysError(
"TWinNTSystem::AnnounceUnixService",
"getsockname");
4771 TString socketpath = sockpath;
4772 socketpath.ReplaceAll(
"/",
"\\");
4773 fp = fopen(socketpath,
"wb");
4775 ::SysError(
"TWinNTSystem::AnnounceUnixService",
"fopen");
4778 fprintf(fp,
"%d", myaddr.sin_port);
4782 if (listen(sock, backlog)) {
4783 ::SysError(
"TWinNTSystem::AnnounceUnixService",
"listen");
4793 void TWinNTSystem::CloseConnection(
int socket, Bool_t force)
4795 if (socket == -1)
return;
4796 SOCKET sock = socket;
4799 ::shutdown(sock, 2);
4801 struct linger linger = {0, 0};
4802 ::setsockopt(sock, SOL_SOCKET, SO_LINGER, (
char *) &linger,
sizeof(linger));
4803 while (::closesocket(sock) == SOCKET_ERROR && WSAGetLastError() == WSAEINTR) {
4804 TSystem::ResetErrno();
4813 int TWinNTSystem::RecvBuf(
int sock,
void *buf,
int length)
4817 if (WinNTRecv(sock, &header,
sizeof(header), 0) > 0) {
4818 int count = ::ntohl(header);
4820 if (count > length) {
4821 Error(
"RecvBuf",
"record header exceeds buffer size");
4823 }
else if (count > 0) {
4824 if (WinNTRecv(sock, buf, count, 0) < 0) {
4825 Error(
"RecvBuf",
"cannot receive buffer");
4838 int TWinNTSystem::SendBuf(
int sock,
const void *buf,
int length)
4840 Int_t header = ::htonl(length);
4842 if (WinNTSend(sock, &header,
sizeof(header), 0) < 0) {
4843 Error(
"SendBuf",
"cannot send header");
4847 if (WinNTSend(sock, buf, length, 0) < 0) {
4848 Error(
"SendBuf",
"cannot send buffer");
4865 int TWinNTSystem::RecvRaw(
int sock,
void *buf,
int length,
int opt)
4888 if ((n = WinNTRecv(sock, buf, length, flag)) <= 0) {
4890 Error(
"RecvRaw",
"cannot receive buffer");
4903 int TWinNTSystem::SendRaw(
int sock,
const void *buf,
int length,
int opt)
4924 if ((n = WinNTSend(sock, buf, length, flag)) <= 0) {
4925 if (n == -1 && GetErrno() != EINTR) {
4926 Error(
"SendRaw",
"cannot send buffer");
4936 int TWinNTSystem::SetSockOpt(
int socket,
int opt,
int value)
4939 if (socket == -1)
return -1;
4940 SOCKET sock = socket;
4944 if (::setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (
char*)&val,
sizeof(val)) == SOCKET_ERROR) {
4945 ::SysError(
"SetSockOpt",
"setsockopt(SO_SNDBUF)");
4950 if (::setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (
char*)&val,
sizeof(val)) == SOCKET_ERROR) {
4951 ::SysError(
"SetSockOpt",
"setsockopt(SO_RCVBUF)");
4956 if (::setsockopt(sock, SOL_SOCKET, SO_OOBINLINE, (
char*)&val,
sizeof(val)) == SOCKET_ERROR) {
4957 SysError(
"SetSockOpt",
"setsockopt(SO_OOBINLINE)");
4962 if (::setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, (
char*)&val,
sizeof(val)) == SOCKET_ERROR) {
4963 ::SysError(
"SetSockOpt",
"setsockopt(SO_KEEPALIVE)");
4968 if (::setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (
char*)&val,
sizeof(val)) == SOCKET_ERROR) {
4969 ::SysError(
"SetSockOpt",
"setsockopt(SO_REUSEADDR)");
4974 if (::setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (
char*)&val,
sizeof(val)) == SOCKET_ERROR) {
4975 ::SysError(
"SetSockOpt",
"setsockopt(TCP_NODELAY)");
4980 if (::ioctlsocket(sock, FIONBIO, &val) == SOCKET_ERROR) {
4981 ::SysError(
"SetSockOpt",
"ioctl(FIONBIO)");
4987 if (::ioctl(sock, SIOCSPGRP, &val) == -1) {
4988 ::SysError(
"SetSockOpt",
"ioctl(SIOCSPGRP)");
4996 Error(
"SetSockOpt",
"illegal option (%d)", opt);
5006 int TWinNTSystem::GetSockOpt(
int socket,
int opt,
int *val)
5008 if (socket == -1)
return -1;
5009 SOCKET sock = socket;
5011 int optlen =
sizeof(*val);
5015 if (::getsockopt(sock, SOL_SOCKET, SO_SNDBUF, (
char*)val, &optlen) == SOCKET_ERROR) {
5016 ::SysError(
"GetSockOpt",
"getsockopt(SO_SNDBUF)");
5021 if (::getsockopt(sock, SOL_SOCKET, SO_RCVBUF, (
char*)val, &optlen) == SOCKET_ERROR) {
5022 ::SysError(
"GetSockOpt",
"getsockopt(SO_RCVBUF)");
5027 if (::getsockopt(sock, SOL_SOCKET, SO_OOBINLINE, (
char*)val, &optlen) == SOCKET_ERROR) {
5028 ::SysError(
"GetSockOpt",
"getsockopt(SO_OOBINLINE)");
5033 if (::getsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, (
char*)val, &optlen) == SOCKET_ERROR) {
5034 ::SysError(
"GetSockOpt",
"getsockopt(SO_KEEPALIVE)");
5039 if (::getsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (
char*)val, &optlen) == SOCKET_ERROR) {
5040 ::SysError(
"GetSockOpt",
"getsockopt(SO_REUSEADDR)");
5045 if (::getsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (
char*)val, &optlen) == SOCKET_ERROR) {
5046 ::SysError(
"GetSockOpt",
"getsockopt(TCP_NODELAY)");
5053 if (sock == INVALID_SOCKET) {
5054 ::SysError(
"GetSockOpt",
"INVALID_SOCKET");
5062 if (::ioctlsocket(sock, SIOCGPGRP, (u_long*)val) == SOCKET_ERROR) {
5063 ::SysError(
"GetSockOpt",
"ioctl(SIOCGPGRP)");
5069 if (::ioctlsocket(sock, SIOCATMARK, (u_long*)val) == SOCKET_ERROR) {
5070 ::SysError(
"GetSockOpt",
"ioctl(SIOCATMARK)");
5075 if (::ioctlsocket(sock, FIONREAD, (u_long*)val) == SOCKET_ERROR) {
5076 ::SysError(
"GetSockOpt",
"ioctl(FIONREAD)");
5081 Error(
"GetSockOpt",
"illegal option (%d)", opt);
5092 int TWinNTSystem::ConnectService(
const char *servername,
int port,
5093 int tcpwindowsize,
const char *protocol)
5098 if (!strcmp(servername,
"unix")) {
5099 return WinNTUnixConnect(port);
5101 else if (!gSystem->AccessPathName(servername) || servername[0] ==
'/' ||
5102 (servername[1] ==
':' && servername[2] ==
'/')) {
5103 return WinNTUnixConnect(servername);
5106 if (!strcmp(protocol,
"udp")){
5107 return WinNTUdpConnect(servername, port);
5110 if ((sp = ::getservbyport(::htons(port), kProtocolName))) {
5113 sport = ::htons(port);
5116 TInetAddress addr = gSystem->GetHostByName(servername);
5117 if (!addr.IsValid())
return -1;
5118 UInt_t adr = ::htonl(addr.GetAddress());
5120 struct sockaddr_in server;
5121 memset(&server, 0,
sizeof(server));
5122 memcpy(&server.sin_addr, &adr,
sizeof(adr));
5123 server.sin_family = addr.GetFamily();
5124 server.sin_port = sport;
5128 if ((sock = ::socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) {
5129 ::SysError(
"TWinNTSystem::WinNTConnectTcp",
"socket");
5133 if (tcpwindowsize > 0) {
5134 gSystem->SetSockOpt((
int)sock, kRecvBuffer, tcpwindowsize);
5135 gSystem->SetSockOpt((
int)sock, kSendBuffer, tcpwindowsize);
5138 if (::connect(sock, (
struct sockaddr*) &server,
sizeof(server)) == INVALID_SOCKET) {
5140 ::closesocket(sock);
5149 int TWinNTSystem::WinNTUnixConnect(
int port)
5151 struct sockaddr_in myaddr;
5154 memset(&myaddr, 0,
sizeof(myaddr));
5155 myaddr.sin_family = AF_INET;
5156 myaddr.sin_port = port;
5157 myaddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
5160 if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
5161 ::SysError(
"TWinNTSystem::WinNTUnixConnect",
"socket");
5165 while ((connect(sock, (
struct sockaddr *)&myaddr,
sizeof myaddr)) == -1) {
5166 if (GetErrno() == EINTR)
5169 ::SysError(
"TWinNTSystem::WinNTUnixConnect",
"connect");
5180 int TWinNTSystem::WinNTUnixConnect(
const char *sockpath)
5185 if (!sockpath || strlen(sockpath) <= 0) {
5186 ::SysError(
"TWinNTSystem::WinNTUnixConnect",
"socket path undefined");
5189 TString socketpath = sockpath;
5190 socketpath.ReplaceAll(
"/",
"\\");
5191 fp = fopen(socketpath.Data(),
"rb");
5193 ::SysError(
"TWinNTSystem::WinNTUnixConnect",
"fopen");
5196 fscanf(fp,
"%d", &port);
5199 if (port < 0 || port > 65535) {
5200 ::SysError(
"TWinNTSystem::WinNTUnixConnect",
"invalid port");
5203 return WinNTUnixConnect(port);
5210 int TWinNTSystem::WinNTUdpConnect(
const char *hostname,
int port)
5215 if ((sp = getservbyport(htons(port), kProtocolName)))
5218 sport = htons(port);
5220 TInetAddress addr = gSystem->GetHostByName(hostname);
5221 if (!addr.IsValid())
return -1;
5222 UInt_t adr = htonl(addr.GetAddress());
5224 struct sockaddr_in server;
5225 memset(&server, 0,
sizeof(server));
5226 memcpy(&server.sin_addr, &adr,
sizeof(adr));
5227 server.sin_family = addr.GetFamily();
5228 server.sin_port = sport;
5232 if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
5233 ::SysError(
"TWinNTSystem::WinNTUdpConnect",
"socket (%s:%d)",
5238 while (connect(sock, (
struct sockaddr*) &server,
sizeof(server)) == -1) {
5239 if (GetErrno() == EINTR)
5242 ::SysError(
"TWinNTSystem::WinNTUdpConnect",
"connect (%s:%d)",
5259 int TWinNTSystem::OpenConnection(
const char *server,
int port,
int tcpwindowsize,
5260 const char *protocol)
5262 return ConnectService(server, port, tcpwindowsize, protocol);
5276 int TWinNTSystem::AnnounceTcpService(
int port, Bool_t reuse,
int backlog,
5281 const short kSOCKET_MINPORT = 5000, kSOCKET_MAXPORT = 15000;
5282 short tryport = kSOCKET_MINPORT;
5284 if ((sp = ::getservbyport(::htons(port), kProtocolName))) {
5287 sport = ::htons(port);
5290 if (port == 0 && reuse) {
5291 ::Error(
"TWinNTSystem::WinNTTcpService",
"cannot do a port scan while reuse is true");
5295 if ((sp = ::getservbyport(::htons(port), kProtocolName))) {
5298 sport = ::htons(port);
5303 if ((sock = ::socket(AF_INET, SOCK_STREAM, 0)) < 0) {
5304 ::SysError(
"TWinNTSystem::WinNTTcpService",
"socket");
5309 gSystem->SetSockOpt((
int)sock, kReuseAddr, 1);
5312 if (tcpwindowsize > 0) {
5313 gSystem->SetSockOpt((
int)sock, kRecvBuffer, tcpwindowsize);
5314 gSystem->SetSockOpt((
int)sock, kSendBuffer, tcpwindowsize);
5317 struct sockaddr_in inserver;
5318 memset(&inserver, 0,
sizeof(inserver));
5319 inserver.sin_family = AF_INET;
5320 inserver.sin_addr.s_addr = ::htonl(INADDR_ANY);
5321 inserver.sin_port = sport;
5325 if (::bind(sock, (
struct sockaddr*) &inserver,
sizeof(inserver)) == SOCKET_ERROR) {
5326 ::SysError(
"TWinNTSystem::WinNTTcpService",
"bind");
5332 inserver.sin_port = ::htons(tryport);
5333 bret = ::bind(sock, (
struct sockaddr*) &inserver,
sizeof(inserver));
5335 }
while (bret == SOCKET_ERROR && WSAGetLastError() == WSAEADDRINUSE &&
5336 tryport < kSOCKET_MAXPORT);
5337 if (bret == SOCKET_ERROR) {
5338 ::SysError(
"TWinNTSystem::WinNTTcpService",
"bind (port scan)");
5344 if (::listen(sock, backlog) == SOCKET_ERROR) {
5345 ::SysError(
"TWinNTSystem::WinNTTcpService",
"listen");
5354 int TWinNTSystem::AnnounceUdpService(
int port,
int backlog)
5362 const short kSOCKET_MINPORT = 5000, kSOCKET_MAXPORT = 15000;
5363 short sport, tryport = kSOCKET_MINPORT;
5366 if ((sp = getservbyport(htons(port), kProtocolName)))
5369 sport = htons(port);
5373 if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
5374 ::SysError(
"TUnixSystem::UnixUdpService",
"socket");
5378 struct sockaddr_in inserver;
5379 memset(&inserver, 0,
sizeof(inserver));
5380 inserver.sin_family = AF_INET;
5381 inserver.sin_addr.s_addr = htonl(INADDR_ANY);
5382 inserver.sin_port = sport;
5386 if (bind(sock, (
struct sockaddr*) &inserver,
sizeof(inserver))) {
5387 ::SysError(
"TWinNTSystem::AnnounceUdpService",
"bind");
5393 inserver.sin_port = htons(tryport);
5394 bret = bind(sock, (
struct sockaddr*) &inserver,
sizeof(inserver));
5396 }
while (bret == SOCKET_ERROR && WSAGetLastError() == WSAEADDRINUSE &&
5397 tryport < kSOCKET_MAXPORT);
5399 ::SysError(
"TWinNTSystem::AnnounceUdpService",
"bind (port scan)");
5405 if (listen(sock, backlog)) {
5406 ::SysError(
"TWinNTSystem::AnnounceUdpService",
"listen");
5418 int TWinNTSystem::AcceptConnection(
int socket)
5421 SOCKET sock = socket;
5423 while ((soc = ::accept(sock, 0, 0)) == INVALID_SOCKET &&
5424 (::WSAGetLastError() == WSAEINTR)) {
5425 TSystem::ResetErrno();
5429 if (::WSAGetLastError() == WSAEWOULDBLOCK) {
5432 ::SysError(
"AcceptConnection",
"accept");
5443 #define SystemBasicInformation 0
5444 #define SystemPerformanceInformation 2
5449 ULONG uKeMaximumIncrement;
5451 ULONG uMmNumberOfPhysicalPages;
5452 ULONG uMmLowestPhysicalPage;
5453 ULONG UMmHighestPhysicalPage;
5454 ULONG uAllocationGranularity;
5455 PVOID pLowestUserAddress;
5456 PVOID pMmHighestUserAddress;
5457 ULONG uKeActiveProcessors;
5458 BYTE bKeNumberProcessors;
5461 } SYSTEM_BASIC_INFORMATION;
5465 LARGE_INTEGER liIdleTime;
5467 } SYSTEM_PERFORMANCE_INFORMATION;
5469 typedef struct _PROCESS_MEMORY_COUNTERS {
5471 DWORD PageFaultCount;
5472 SIZE_T PeakWorkingSetSize;
5473 SIZE_T WorkingSetSize;
5474 SIZE_T QuotaPeakPagedPoolUsage;
5475 SIZE_T QuotaPagedPoolUsage;
5476 SIZE_T QuotaPeakNonPagedPoolUsage;
5477 SIZE_T QuotaNonPagedPoolUsage;
5478 SIZE_T PagefileUsage;
5479 SIZE_T PeakPagefileUsage;
5480 } PROCESS_MEMORY_COUNTERS, *PPROCESS_MEMORY_COUNTERS;
5482 typedef LONG (WINAPI *PROCNTQSI) (UINT, PVOID, ULONG, PULONG);
5484 #define Li2Double(x) ((double)((x).HighPart) * 4.294967296E9 + (double)((x).LowPart))
5490 static DWORD GetCPUSpeed()
5492 LARGE_INTEGER ulFreq, ulTicks, ulValue, ulStartCounter;
5496 if (QueryPerformanceFrequency(&ulFreq)) {
5498 QueryPerformanceCounter(&ulTicks);
5501 ulValue.QuadPart = ulTicks.QuadPart + ulFreq.QuadPart/10;
5502 ulStartCounter.QuadPart = __rdtsc();
5506 QueryPerformanceCounter(&ulTicks);
5507 }
while (ulTicks.QuadPart <= ulValue.QuadPart);
5509 return (DWORD)((__rdtsc() - ulStartCounter.QuadPart)/100000);
5517 #define SM_SERVERR2 89
5518 typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO);
5522 static const char *GetWindowsVersion()
5524 OSVERSIONINFOEX osvi;
5527 BOOL bOsVersionInfoEx;
5528 static char *strReturn = 0;
5532 strReturn =
new char[2048];
5536 ZeroMemory(&si,
sizeof(SYSTEM_INFO));
5537 ZeroMemory(&osvi,
sizeof(OSVERSIONINFOEX));
5542 osvi.dwOSVersionInfoSize =
sizeof(OSVERSIONINFOEX);
5544 if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) )
5546 osvi.dwOSVersionInfoSize =
sizeof (OSVERSIONINFO);
5547 if (! GetVersionEx ( (OSVERSIONINFO *) &osvi) )
5552 pGNSI = (PGNSI) GetProcAddress( GetModuleHandle(
"kernel32.dll"),
5553 "GetNativeSystemInfo");
5556 else GetSystemInfo(&si);
5558 switch (osvi.dwPlatformId)
5561 case VER_PLATFORM_WIN32_NT:
5564 if ( osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 0 )
5566 if( osvi.wProductType == VER_NT_WORKSTATION )
5567 strlcpy(strReturn,
"Microsoft Windows Vista ",2048);
5568 else strlcpy(strReturn,
"Windows Server \"Longhorn\" " ,2048);
5570 if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2 )
5572 if( GetSystemMetrics(SM_SERVERR2) )
5573 strlcpy(strReturn,
"Microsoft Windows Server 2003 \"R2\" ",2048);
5574 else if( osvi.wProductType == VER_NT_WORKSTATION &&
5575 si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64)
5577 strlcpy(strReturn,
"Microsoft Windows XP Professional x64 Edition ",2048);
5579 else strlcpy(strReturn,
"Microsoft Windows Server 2003, ",2048);
5581 if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1 )
5582 strlcpy(strReturn,
"Microsoft Windows XP ",2048);
5584 if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 )
5585 strlcpy(strReturn,
"Microsoft Windows 2000 ",2048);
5587 if ( osvi.dwMajorVersion <= 4 )
5588 strlcpy(strReturn,
"Microsoft Windows NT ",2048);
5591 if( bOsVersionInfoEx )
5594 if ( osvi.wProductType == VER_NT_WORKSTATION &&
5595 si.wProcessorArchitecture!=PROCESSOR_ARCHITECTURE_AMD64)
5597 if( osvi.dwMajorVersion == 4 )
5598 strlcat(strReturn,
"Workstation 4.0 ",2048 );
5599 else if( osvi.wSuiteMask & VER_SUITE_PERSONAL )
5600 strlcat(strReturn,
"Home Edition " ,2048);
5601 else strlcat(strReturn,
"Professional " ,2048);
5604 else if ( osvi.wProductType == VER_NT_SERVER ||
5605 osvi.wProductType == VER_NT_DOMAIN_CONTROLLER )
5607 if(osvi.dwMajorVersion==5 && osvi.dwMinorVersion==2)
5609 if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_IA64 )
5611 if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
5612 strlcat(strReturn,
"Datacenter Edition for Itanium-based Systems",2048 );
5613 else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
5614 strlcat(strReturn,
"Enterprise Edition for Itanium-based Systems" ,2048);
5616 else if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64 )
5618 if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
5619 strlcat(strReturn,
"Datacenter x64 Edition ",2048 );
5620 else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
5621 strlcat(strReturn,
"Enterprise x64 Edition ",2048 );
5622 else strlcat(strReturn,
"Standard x64 Edition ",2048 );
5626 if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
5627 strlcat(strReturn,
"Datacenter Edition ",2048 );
5628 else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
5629 strlcat(strReturn,
"Enterprise Edition ",2048 );
5630 else if ( osvi.wSuiteMask == VER_SUITE_BLADE )
5631 strlcat(strReturn,
"Web Edition " ,2048);
5632 else strlcat(strReturn,
"Standard Edition ",2048 );
5635 else if(osvi.dwMajorVersion==5 && osvi.dwMinorVersion==0)
5637 if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
5638 strlcat(strReturn,
"Datacenter Server ",2048 );
5639 else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
5640 strlcat(strReturn,
"Advanced Server ",2048 );
5641 else strlcat(strReturn,
"Server ",2048 );
5645 if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
5646 strlcat(strReturn,
"Server 4.0, Enterprise Edition " ,2048);
5647 else strlcat(strReturn,
"Server 4.0 ",2048 );
5655 TCHAR szProductType[BUFSIZE];
5656 DWORD dwBufLen=BUFSIZE*
sizeof(TCHAR);
5659 lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
5660 "SYSTEM\\CurrentControlSet\\Control\\ProductOptions",
5661 0, KEY_QUERY_VALUE, &hKey );
5662 if( lRet != ERROR_SUCCESS )
5665 lRet = RegQueryValueEx( hKey,
"ProductType", NULL, NULL,
5666 (LPBYTE) szProductType, &dwBufLen);
5667 RegCloseKey( hKey );
5669 if( (lRet != ERROR_SUCCESS) || (dwBufLen > BUFSIZE*
sizeof(TCHAR)) )
5672 if ( lstrcmpi(
"WINNT", szProductType) == 0 )
5673 strlcat(strReturn,
"Workstation " ,2048);
5674 if ( lstrcmpi(
"LANMANNT", szProductType) == 0 )
5675 strlcat(strReturn,
"Server " ,2048);
5676 if ( lstrcmpi(
"SERVERNT", szProductType) == 0 )
5677 strlcat(strReturn,
"Advanced Server " ,2048);
5678 snprintf(temp,512,
"%d.%d ", osvi.dwMajorVersion, osvi.dwMinorVersion);
5679 strlcat(strReturn, temp,2048);
5684 if( osvi.dwMajorVersion == 4 &&
5685 lstrcmpi( osvi.szCSDVersion,
"Service Pack 6" ) == 0 )
5691 lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
5692 "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Hotfix\\Q246009",
5693 0, KEY_QUERY_VALUE, &hKey );
5694 if( lRet == ERROR_SUCCESS ) {
5695 snprintf(temp, 512,
"Service Pack 6a (Build %d)", osvi.dwBuildNumber & 0xFFFF );
5696 strlcat(strReturn, temp,2048 );
5700 snprintf(temp,512,
"%s (Build %d)", osvi.szCSDVersion, osvi.dwBuildNumber & 0xFFFF);
5701 strlcat(strReturn, temp,2048 );
5704 RegCloseKey( hKey );
5708 snprintf(temp, 512,
"%s (Build %d)", osvi.szCSDVersion, osvi.dwBuildNumber & 0xFFFF);
5709 strlcat(strReturn, temp,2048 );
5715 case VER_PLATFORM_WIN32_WINDOWS:
5717 if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0)
5719 strlcpy(strReturn,
"Microsoft Windows 95 ",2048);
5720 if (osvi.szCSDVersion[1]==
'C' || osvi.szCSDVersion[1]==
'B')
5721 strlcat(strReturn,
"OSR2 " ,2048);
5724 if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10)
5726 strlcpy(strReturn,
"Microsoft Windows 98 ",2048);
5727 if ( osvi.szCSDVersion[1]==
'A' || osvi.szCSDVersion[1]==
'B')
5728 strlcat(strReturn,
"SE ",2048 );
5731 if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90)
5733 strlcpy(strReturn,
"Microsoft Windows Millennium Edition",2048);
5737 case VER_PLATFORM_WIN32s:
5738 strlcpy(strReturn,
"Microsoft Win32s",2048);
5747 static int GetL2CacheSize()
5749 unsigned nHighestFeatureEx;
5752 __cpuid(nBuff, 0x80000000);
5753 nHighestFeatureEx = (unsigned)nBuff[0];
5755 if (nHighestFeatureEx >= 0x80000006) {
5756 __cpuid(nBuff, 0x80000006);
5757 return (((
unsigned)nBuff[2])>>16);
5765 static void GetWinNTSysInfo(SysInfo_t *sysinfo)
5767 SYSTEM_PERFORMANCE_INFORMATION SysPerfInfo;
5768 SYSTEM_INFO sysInfo;
5769 MEMORYSTATUSEX statex;
5770 OSVERSIONINFO OsVersionInfo;
5772 char szKeyValueString[80];
5773 DWORD szKeyValueDword;
5776 PROCNTQSI NtQuerySystemInformation;
5778 NtQuerySystemInformation = (PROCNTQSI)GetProcAddress(
5779 GetModuleHandle(
"ntdll"),
"NtQuerySystemInformation");
5781 if (!NtQuerySystemInformation) {
5782 ::Error(
"GetWinNTSysInfo",
5783 "Error on GetProcAddress(NtQuerySystemInformation)");
5787 status = NtQuerySystemInformation(SystemPerformanceInformation,
5788 &SysPerfInfo,
sizeof(SysPerfInfo),
5790 OsVersionInfo.dwOSVersionInfoSize =
sizeof(OSVERSIONINFO);
5791 GetVersionEx(&OsVersionInfo);
5792 GetSystemInfo(&sysInfo);
5793 statex.dwLength =
sizeof(statex);
5794 if (!GlobalMemoryStatusEx(&statex)) {
5795 ::Error(
"GetWinNTSysInfo",
"Error on GlobalMemoryStatusEx()");
5798 sysinfo->fCpus = sysInfo.dwNumberOfProcessors;
5799 sysinfo->fPhysRam = (Int_t)(statex.ullTotalPhys >> 20);
5800 sysinfo->fOS = GetWindowsVersion();
5801 sysinfo->fModel =
"";
5802 sysinfo->fCpuType =
"";
5803 sysinfo->fCpuSpeed = GetCPUSpeed();
5804 sysinfo->fBusSpeed = 0;
5805 sysinfo->fL2Cache = GetL2CacheSize();
5807 status = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
"HARDWARE\\DESCRIPTION\\System",
5808 0, KEY_QUERY_VALUE, &hKey);
5809 if (status == ERROR_SUCCESS) {
5810 dwBufLen =
sizeof(szKeyValueString);
5811 RegQueryValueEx(hKey,
"Identifier", NULL, NULL,(LPBYTE)szKeyValueString,
5813 sysinfo->fModel = szKeyValueString;
5816 status = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
5817 "Hardware\\Description\\System\\CentralProcessor\\0",
5818 0, KEY_QUERY_VALUE, &hKey);
5819 if (status == ERROR_SUCCESS) {
5820 dwBufLen =
sizeof(szKeyValueString);
5821 status = RegQueryValueEx(hKey,
"ProcessorNameString", NULL, NULL,
5822 (LPBYTE)szKeyValueString, &dwBufLen);
5823 if (status == ERROR_SUCCESS)
5824 sysinfo->fCpuType = szKeyValueString;
5825 dwBufLen =
sizeof(DWORD);
5826 status = RegQueryValueEx(hKey,
"~MHz",NULL,NULL,(LPBYTE)&szKeyValueDword,
5828 if ((status == ERROR_SUCCESS) && ((sysinfo->fCpuSpeed <= 0) ||
5829 (sysinfo->fCpuSpeed < (szKeyValueDword >> 1))))
5830 sysinfo->fCpuSpeed = (Int_t)szKeyValueDword;
5833 sysinfo->fCpuType.Remove(TString::kBoth,
' ');
5834 sysinfo->fModel.Remove(TString::kBoth,
' ');
5841 static void GetWinNTCpuInfo(CpuInfo_t *cpuinfo, Int_t sampleTime)
5843 SYSTEM_INFO sysInfo;
5844 Float_t idle_ratio, kernel_ratio, user_ratio, total_ratio;
5845 FILETIME ft_sys_idle, ft_sys_kernel, ft_sys_user, ft_fun_time;
5846 SYSTEMTIME st_fun_time;
5848 ULARGE_INTEGER ul_sys_idle, ul_sys_kernel, ul_sys_user;
5849 static ULARGE_INTEGER ul_sys_idleold = {0, 0};
5850 static ULARGE_INTEGER ul_sys_kernelold = {0, 0};
5851 static ULARGE_INTEGER ul_sys_userold = {0, 0};
5852 ULARGE_INTEGER ul_sys_idle_diff, ul_sys_kernel_diff, ul_sys_user_diff;
5854 ULARGE_INTEGER ul_fun_time;
5855 ULARGE_INTEGER ul_fun_timeold = {0, 0};
5856 ULARGE_INTEGER ul_fun_time_diff;
5858 typedef BOOL (__stdcall *GetSystemTimesProc)( LPFILETIME lpIdleTime,
5859 LPFILETIME lpKernelTime, LPFILETIME lpUserTime );
5860 static GetSystemTimesProc pGetSystemTimes = 0;
5862 HMODULE hModImagehlp = LoadLibrary(
"Kernel32.dll" );
5863 if (!hModImagehlp) {
5864 ::Error(
"GetWinNTCpuInfo",
"Error on LoadLibrary(Kernel32.dll)");
5868 pGetSystemTimes = (GetSystemTimesProc) GetProcAddress( hModImagehlp,
5870 if (!pGetSystemTimes) {
5871 ::Error(
"GetWinNTCpuInfo",
"Error on GetProcAddress(GetSystemTimes)");
5874 GetSystemInfo(&sysInfo);
5877 pGetSystemTimes(&ft_sys_idle,&ft_sys_kernel,&ft_sys_user);
5878 GetSystemTime(&st_fun_time);
5879 SystemTimeToFileTime(&st_fun_time,&ft_fun_time);
5881 memcpy(&ul_sys_idle, &ft_sys_idle,
sizeof(FILETIME));
5882 memcpy(&ul_sys_kernel, &ft_sys_kernel,
sizeof(FILETIME));
5883 memcpy(&ul_sys_user, &ft_sys_user,
sizeof(FILETIME));
5884 memcpy(&ul_fun_time, &ft_fun_time,
sizeof(FILETIME));
5886 ul_sys_idle_diff.QuadPart = ul_sys_idle.QuadPart -
5887 ul_sys_idleold.QuadPart;
5888 ul_sys_kernel_diff.QuadPart = ul_sys_kernel.QuadPart -
5889 ul_sys_kernelold.QuadPart;
5890 ul_sys_user_diff.QuadPart = ul_sys_user.QuadPart -
5891 ul_sys_userold.QuadPart;
5893 ul_fun_time_diff.QuadPart = ul_fun_time.QuadPart -
5894 ul_fun_timeold.QuadPart;
5896 ul_sys_idleold.QuadPart = ul_sys_idle.QuadPart;
5897 ul_sys_kernelold.QuadPart = ul_sys_kernel.QuadPart;
5898 ul_sys_userold.QuadPart = ul_sys_user.QuadPart;
5900 if (ul_fun_timeold.QuadPart == 0) {
5902 ul_fun_timeold.QuadPart = ul_fun_time.QuadPart;
5905 ul_fun_timeold.QuadPart = ul_fun_time.QuadPart;
5907 idle_ratio = (Float_t)(Li2Double(ul_sys_idle_diff)/
5908 Li2Double(ul_fun_time_diff))*100.0;
5909 user_ratio = (Float_t)(Li2Double(ul_sys_user_diff)/
5910 Li2Double(ul_fun_time_diff))*100.0;
5911 kernel_ratio = (Float_t)(Li2Double(ul_sys_kernel_diff)/
5912 Li2Double(ul_fun_time_diff))*100.0;
5913 idle_ratio /= (Float_t)sysInfo.dwNumberOfProcessors;
5914 user_ratio /= (Float_t)sysInfo.dwNumberOfProcessors;
5915 kernel_ratio /= (Float_t)sysInfo.dwNumberOfProcessors;
5916 total_ratio = 100.0 - idle_ratio;
5918 cpuinfo->fLoad1m = 0;
5919 cpuinfo->fLoad5m = 0;
5920 cpuinfo->fLoad15m = 0;
5921 cpuinfo->fUser = user_ratio;
5922 cpuinfo->fSys = kernel_ratio;
5923 cpuinfo->fTotal = total_ratio;
5924 cpuinfo->fIdle = idle_ratio;
5930 static void GetWinNTMemInfo(MemInfo_t *meminfo)
5932 Long64_t total, used, free, swap_total, swap_used, swap_avail;
5933 MEMORYSTATUSEX statex;
5934 statex.dwLength =
sizeof(statex);
5935 if (!GlobalMemoryStatusEx(&statex)) {
5936 ::Error(
"GetWinNTMemInfo",
"Error on GlobalMemoryStatusEx()");
5939 used = (Long64_t)(statex.ullTotalPhys - statex.ullAvailPhys);
5940 free = (Long64_t) statex.ullAvailPhys;
5941 total = (Long64_t) statex.ullTotalPhys;
5943 meminfo->fMemTotal = (Int_t) (total >> 20);
5944 meminfo->fMemUsed = (Int_t) (used >> 20);
5945 meminfo->fMemFree = (Int_t) (free >> 20);
5947 swap_total = (Long64_t)(statex.ullTotalPageFile - statex.ullTotalPhys);
5948 swap_avail = (Long64_t)(statex.ullAvailPageFile - statex.ullAvailPhys);
5949 swap_used = swap_total - swap_avail;
5951 meminfo->fSwapTotal = (Int_t) (swap_total >> 20);
5952 meminfo->fSwapUsed = (Int_t) (swap_used >> 20);
5953 meminfo->fSwapFree = (Int_t) (swap_avail >> 20);
5959 static void GetWinNTProcInfo(ProcInfo_t *procinfo)
5961 PROCESS_MEMORY_COUNTERS pmc;
5962 FILETIME starttime, exittime, kerneltime, usertime;
5963 timeval ru_stime, ru_utime;
5966 typedef BOOL (__stdcall *GetProcessMemoryInfoProc)( HANDLE Process,
5967 PPROCESS_MEMORY_COUNTERS ppsmemCounters, DWORD cb );
5968 static GetProcessMemoryInfoProc pGetProcessMemoryInfo = 0;
5970 HMODULE hModImagehlp = LoadLibrary(
"Psapi.dll" );
5971 if (!hModImagehlp) {
5972 ::Error(
"GetWinNTProcInfo",
"Error on LoadLibrary(Psapi.dll)");
5976 pGetProcessMemoryInfo = (GetProcessMemoryInfoProc) GetProcAddress(
5977 hModImagehlp,
"GetProcessMemoryInfo" );
5978 if (!pGetProcessMemoryInfo) {
5979 ::Error(
"GetWinNTProcInfo",
5980 "Error on GetProcAddress(GetProcessMemoryInfo)");
5984 if ( pGetProcessMemoryInfo( GetCurrentProcess(), &pmc,
sizeof(pmc)) ) {
5985 procinfo->fMemResident = pmc.WorkingSetSize / 1024;
5986 procinfo->fMemVirtual = pmc.PagefileUsage / 1024;
5988 if ( GetProcessTimes(GetCurrentProcess(), &starttime, &exittime,
5989 &kerneltime, &usertime)) {
5992 memcpy(&li, &kerneltime,
sizeof(FILETIME));
5994 ru_stime.tv_sec = li.QuadPart / 1000000L;
5995 ru_stime.tv_usec = li.QuadPart % 1000000L;
5997 memcpy(&li, &usertime,
sizeof(FILETIME));
5999 ru_utime.tv_sec = li.QuadPart / 1000000L;
6000 ru_utime.tv_usec = li.QuadPart % 1000000L;
6002 procinfo->fCpuUser = (Float_t)(ru_utime.tv_sec) +
6003 ((Float_t)(ru_utime.tv_usec) / 1000000.);
6004 procinfo->fCpuSys = (Float_t)(ru_stime.tv_sec) +
6005 ((Float_t)(ru_stime.tv_usec) / 1000000.);
6014 Int_t TWinNTSystem::GetSysInfo(SysInfo_t *info)
const
6016 if (!info)
return -1;
6017 GetWinNTSysInfo(info);
6026 Int_t TWinNTSystem::GetCpuInfo(CpuInfo_t *info, Int_t sampleTime)
const
6028 if (!info)
return -1;
6029 GetWinNTCpuInfo(info, sampleTime);
6037 Int_t TWinNTSystem::GetMemInfo(MemInfo_t *info)
const
6039 if (!info)
return -1;
6040 GetWinNTMemInfo(info);
6048 Int_t TWinNTSystem::GetProcInfo(ProcInfo_t *info)
const
6050 if (!info)
return -1;
6051 GetWinNTProcInfo(info);