@@ -462,301 +462,6 @@ CFILENAME GetTempDir (void)
462
462
}
463
463
464
464
465
- #ifdef FREEARC_WIN
466
- #include < sys/utime.h>
467
-
468
- #if !defined(_WIN64) && defined(__GNUC__)
469
-
470
- typedef struct _MY_MEMORYSTATUSEX {
471
- DWORD dwLength;
472
- DWORD dwMemoryLoad;
473
- DWORDLONG ullTotalPhys;
474
- DWORDLONG ullAvailPhys;
475
- DWORDLONG ullTotalPageFile;
476
- DWORDLONG ullAvailPageFile;
477
- DWORDLONG ullTotalVirtual;
478
- DWORDLONG ullAvailVirtual;
479
- DWORDLONG ullAvailExtendedVirtual;
480
- } MY_MEMORYSTATUSEX, *MY_LPMEMORYSTATUSEX;
481
-
482
- #else
483
-
484
- #define MY_MEMORYSTATUSEX MEMORYSTATUSEX
485
- #define MY_LPMEMORYSTATUSEX LPMEMORYSTATUSEX
486
-
487
- #endif
488
-
489
- typedef BOOL (WINAPI *GlobalMemoryStatusExP)(MY_LPMEMORYSTATUSEX lpBuffer);
490
-
491
- uint64 GetPhysicalMemory (void )
492
- {
493
- MY_MEMORYSTATUSEX statx;
494
- statx.dwLength = sizeof (statx);
495
- GlobalMemoryStatusExP globalMemoryStatusEx = (GlobalMemoryStatusExP) GetProcAddress (GetModuleHandle (TEXT (" kernel32.dll" )), " GlobalMemoryStatusEx" );
496
- if (globalMemoryStatusEx != 0 && globalMemoryStatusEx (&statx))
497
- return statx.ullTotalPhys ;
498
-
499
- MEMORYSTATUS stat;
500
- stat.dwLength = sizeof (stat);
501
- GlobalMemoryStatus (&stat);
502
- return stat.dwTotalPhys ;
503
- }
504
-
505
- uint64 GetAvailablePhysicalMemory (void )
506
- {
507
- MY_MEMORYSTATUSEX statx;
508
- statx.dwLength = sizeof (statx);
509
- GlobalMemoryStatusExP globalMemoryStatusEx = (GlobalMemoryStatusExP) GetProcAddress (GetModuleHandle (TEXT (" kernel32.dll" )), " GlobalMemoryStatusEx" );
510
- if (globalMemoryStatusEx != 0 && globalMemoryStatusEx (&statx))
511
- return statx.ullAvailPhys ;
512
-
513
- MEMORYSTATUS stat;
514
- stat.dwLength = sizeof (stat);
515
- GlobalMemoryStatus (&stat);
516
- return stat.dwAvailPhys ;
517
- }
518
-
519
- int GetProcessorsCount (void )
520
- {
521
- SYSTEM_INFO si;
522
- GetSystemInfo (&si);
523
- return si.dwNumberOfProcessors ;
524
- }
525
-
526
- void SetFileDateTime (CFILENAME Filename, time_t t)
527
- {
528
- if (t<0 ) t=INT_MAX; // Èíà÷å ïîëó÷àåì âûëåò :(
529
- struct tm * t2 = gmtime (&t);
530
-
531
- SYSTEMTIME t3;
532
- t3.wYear = t2->tm_year +1900 ;
533
- t3.wMonth = t2->tm_mon +1 ;
534
- t3.wDay = t2->tm_mday ;
535
- t3.wHour = t2->tm_hour ;
536
- t3.wMinute = t2->tm_min ;
537
- t3.wSecond = t2->tm_sec ;
538
- t3.wMilliseconds = 0 ;
539
-
540
- FILETIME ft;
541
- SystemTimeToFileTime (&t3, &ft);
542
-
543
- HANDLE hndl = CreateFileW (Filename, FILE_WRITE_ATTRIBUTES,
544
- FILE_SHARE_READ|FILE_SHARE_WRITE, NULL ,
545
- OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL );
546
- SetFileTime (hndl,NULL ,NULL ,&ft); // creation, last access, modification times
547
- CloseHandle (hndl);
548
- // SetFileAttributes (Filename, attrib);
549
- }
550
-
551
- // Execute program `filename` in the directory `curdir` optionally waiting until it finished
552
- void RunProgram (CFILENAME filename, CFILENAME curdir, int wait_finish)
553
- {
554
- STARTUPINFO si;
555
- PROCESS_INFORMATION pi ;
556
- ZeroMemory (&si, sizeof (si));
557
- si.cb = sizeof (si);
558
- ZeroMemory (&pi , sizeof (pi ));
559
- BOOL process_created = CreateProcessW (filename, NULL , NULL , NULL , FALSE , 0 , NULL , curdir, &si, &pi );
560
-
561
- if (process_created)
562
- {
563
- if (wait_finish)
564
- WaitForSingleObject (pi .hProcess , INFINITE);
565
- CloseHandle (pi .hProcess );
566
- CloseHandle (pi .hThread );
567
- }
568
- }
569
-
570
- // Execute `command` in the directory `curdir` optionally waiting until it finished
571
- int RunCommand (CFILENAME command, CFILENAME curdir, int wait_finish, SIMPLE_CALLBACK *callback, void *auxdata)
572
- {
573
- STARTUPINFO si;
574
- ZeroMemory (&si, sizeof (si));
575
- si.cb = sizeof (si);
576
- si.dwFlags = (callback? STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES : 0 ); // `callback` used here as a flag distinguishing calls from C_External.cpp
577
- si.wShowWindow = SW_HIDE; // For GUI executables - hide console window of called external decompressor; for console executables this flag is ignored anyway
578
- si.hStdInput = (HANDLE) _get_osfhandle (0 );
579
- si.hStdOutput = (HANDLE) _get_osfhandle (1 );
580
- si.hStdError = (HANDLE) _get_osfhandle (2 );
581
- PROCESS_INFORMATION pi ;
582
- ZeroMemory (&pi , sizeof (pi ));
583
- DWORD ExitCode = 0 ; // êîä âîçâðàòà âûçûâàåìîé ïðîãðàììû
584
-
585
- BOOL process_created = CreateProcessW (NULL , command, NULL , NULL , TRUE , 0 , NULL , curdir, &si, &pi );
586
- if (callback)
587
- callback (auxdata); // Action that should be executed BEFORE waiting for process finish
588
- if (process_created)
589
- {
590
- if (wait_finish)
591
- WaitForSingleObject (pi .hProcess , INFINITE),
592
- GetExitCodeProcess (pi .hProcess , &ExitCode);
593
- CloseHandle (pi .hProcess );
594
- CloseHandle (pi .hThread );
595
- }
596
- return ExitCode;
597
- }
598
-
599
- // Execute file `filename` in the directory `curdir` optionally waiting until it finished
600
- void RunFile (CFILENAME filename, CFILENAME curdir, int wait_finish)
601
- {
602
- SHELLEXECUTEINFO sei;
603
- ZeroMemory (&sei, sizeof (SHELLEXECUTEINFO));
604
- sei.cbSize = sizeof (SHELLEXECUTEINFO);
605
- sei.fMask = (wait_finish? SEE_MASK_NOCLOSEPROCESS : 0 );
606
- sei.hwnd = GetActiveWindow ();
607
- sei.lpFile = filename;
608
- sei.lpDirectory = curdir;
609
- sei.nShow = SW_SHOW;
610
-
611
- CoInitializeEx (NULL , COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
612
- DWORD rc = ShellExecuteEx (&sei);
613
- if (rc && wait_finish)
614
- WaitForSingleObject (sei.hProcess , INFINITE),
615
- CloseHandle (sei.hProcess );
616
- }
617
-
618
- // Âåðñèÿ Windows
619
- #define CheckWinVersion (ver ) (GetWinVersion() >= ver)
620
-
621
- #define WIN_VERSION_VISTA 0x600
622
- int GetWinVersion ()
623
- {
624
- static int result = -1 ;
625
- if (result < 0 )
626
- {
627
- OSVERSIONINFOEX osvi;
628
- ZeroMemory (&osvi, sizeof (OSVERSIONINFOEX));
629
- osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFOEX);
630
- if ( !GetVersionEx ((OSVERSIONINFO *) &osvi) )
631
- result = 0 ;
632
- else result = (VER_PLATFORM_WIN32_NT==osvi.dwPlatformId ? osvi.dwMajorVersion *0x100 +osvi.dwMinorVersion : 0 );
633
- }
634
- return result;
635
- }
636
-
637
-
638
- #ifndef THREAD_MODE_BACKGROUND_BEGIN
639
- #define THREAD_MODE_BACKGROUND_BEGIN 0x00010000
640
- #define THREAD_MODE_BACKGROUND_END 0x00020000
641
- #endif
642
-
643
- // Óñòàíîâèòü ïðèîðèòåò òðåäà êàêîé ïîëàãàåòñÿ äëÿ òðåäîâ ñæàòèÿ (ðàñïàêîâêè, øèôðîâàíèÿ...).
644
- // Èñïîëüçóåòñÿ äëÿ òðåäîâ, êîòîðûå âûïîëíÿþò òîëüêî ñæàòèå
645
- void SetCompressionThreadPriority (void )
646
- {
647
- SetThreadPriority (GetCurrentThread (), THREAD_PRIORITY_BELOW_NORMAL);
648
- }
649
-
650
- // Âðåìåííî óñòàíîâèòü ïðèîðèòåò òðåäà êàêîé ïîëàãàåòñÿ äëÿ òðåäîâ ñæàòèÿ (ðàñïàêîâêè, øèôðîâàíèÿ...)
651
- // è âîçâðàòèòü ñòàðîå çíà÷åíèå óðîâíÿ ïðèîðèòåòà. Èñïîëüçóåòñÿ äëÿ òðåäîâ, âðåìåííî âûïîëíÿþùèõ çàäà÷è ñæàòèÿ
652
- int BeginCompressionThreadPriority (void )
653
- {
654
- DWORD dwThreadPriority = GetThreadPriority (GetCurrentThread ());
655
- SetCompressionThreadPriority ();
656
- return dwThreadPriority;
657
- }
658
-
659
- // Âîññòàíîâèòü ïðèîðèòåò òðåäà òàêèì, êàê ìû åãî çàïîìíèëè
660
- void EndCompressionThreadPriority (int old_priority)
661
- {
662
- SetThreadPriority (GetCurrentThread (), old_priority);
663
- }
664
-
665
-
666
- #else // For Unix: ========================================================================================================================
667
-
668
- #include < unistd.h>
669
- #include < sys/resource.h>
670
- #include < sys/sysctl.h>
671
-
672
- uint64 GetPhysicalMemory (void )
673
- {
674
- return uint64 (sysconf (_SC_PHYS_PAGES)) * sysconf (_SC_PAGE_SIZE);
675
- }
676
-
677
- uint64 GetAvailablePhysicalMemory (void )
678
- {
679
- #if defined(_SC_AVPHYS_PAGES)
680
- return uint64 (sysconf (_SC_AVPHYS_PAGES)) * sysconf (_SC_PAGE_SIZE);
681
- #elif defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) || defined(__minix)
682
- unsigned long page_count = 0 ;
683
- size_t page_count_size = sizeof (page_count);
684
- sysctlbyname (" hw.availpages" , &page_count, &page_count, NULL , 0 );
685
- return page_count * sysconf (_SC_PAGE_SIZE);
686
- #else
687
- # error "There's no support for memory stats on your system."
688
- #endif
689
- }
690
-
691
- int GetProcessorsCount (void )
692
- {
693
- return sysconf (_SC_NPROCESSORS_ONLN);
694
- }
695
-
696
- void SetFileDateTime (CFILENAME Filename, time_t t)
697
- {
698
- if (t<0 ) t=INT_MAX; // Èíà÷å ïîëó÷àåì âûëåò :(
699
- struct stat st;
700
- stat (Filename, &st);
701
- struct utimbuf times;
702
- times.actime = st.st_atime ;
703
- times.modtime = t;
704
- utime (Filename, ×);
705
- }
706
-
707
- // Execute `command` in the directory `curdir` optionally waiting until it finished
708
- int RunCommand (CFILENAME command, CFILENAME curdir, int wait_finish, SIMPLE_CALLBACK *callback, void *auxdata)
709
- {
710
- char *olddir = (char *) malloc_msg (),
711
- *cmd = (char *) malloc_msg (strlen (command)+10 );
712
- getcwd (olddir, MY_FILENAME_MAX);
713
-
714
- chdir (curdir);
715
- const char *prefix = (memcmp (command," /" ,1 ) == 0 )? " " :
716
- (memcmp (command," \" /" ,2 ) == 0 )? " " :
717
- (memcmp (command," \" " ,1 ) == 0 )? (command++, " \" ./" ) :
718
- " ./" ;
719
- sprintf (cmd, " %s%s%s" , prefix, command, wait_finish? " " : " &" );
720
- int ExitCode = system (cmd);
721
-
722
- if (callback)
723
- callback (auxdata); // Action that should be executed BEFORE waiting for process finish
724
-
725
- chdir (olddir);
726
- free (cmd);
727
- free (olddir);
728
- return ExitCode;
729
- }
730
-
731
- // Execute file `filename` in the directory `curdir` optionally waiting until it finished
732
- void RunFile (CFILENAME filename, CFILENAME curdir, int wait_finish)
733
- {
734
- RunCommand (filename, curdir, wait_finish, NULL , NULL );
735
- }
736
-
737
- // Óñòàíîâèòü ïðèîðèòåò òðåäà êàêîé ïîëàãàåòñÿ äëÿ òðåäîâ ñæàòèÿ (ðàñïàêîâêè, øèôðîâàíèÿ...).
738
- // Èñïîëüçóåòñÿ äëÿ òðåäîâ, êîòîðûå âûïîëíÿþò òîëüêî ñæàòèå
739
- void SetCompressionThreadPriority (void )
740
- {
741
- int old = getpriority (PRIO_PROCESS, 0 );
742
- setpriority (PRIO_PROCESS, 0 , old+1 );
743
- }
744
-
745
- // Âðåìåííî óñòàíîâèòü ïðèîðèòåò òðåäà êàêîé ïîëàãàåòñÿ äëÿ òðåäîâ ñæàòèÿ (ðàñïàêîâêè, øèôðîâàíèÿ...)
746
- int BeginCompressionThreadPriority (void )
747
- {
748
- int old = getpriority (PRIO_PROCESS, 0 );
749
- // setpriority(PRIO_PROCESS, 0, old+1); çàêîììåíòèðîâàíî èç-çà ïðîáëåì ñ âîññòàíîâëåíèåì ñòàðîãî ïðèîðèòåòà :(
750
- return old;
751
- }
752
-
753
- // Âîññòàíîâèòü ïðèîðèòåò òðåäà òàêèì, êàê ìû åãî çàïîìíèëè
754
- void EndCompressionThreadPriority (int old_priority)
755
- {
756
- // setpriority(PRIO_PROCESS, 0, old_priority);
757
- }
758
-
759
- #endif // Windows/Unix
760
465
761
466
762
467
// Ñîçäàòü êàòàëîãè íà ïóòè ê name
0 commit comments