Мультимедия таймер

Тема в разделе "WASM.BEGINNERS", создана пользователем vertox, 20 апр 2009.

  1. vertox

    vertox New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2009
    Сообщения:
    15
    Нужна прога для разгона мультимедия таймера для снижения пинга сервера
    http://faq.cs2.ru/faq.php?cat_id=10

    Под Winxp я запускал wmplayer, ping падал в три раза
    Сейчас сервера на Win server 2008
    Под ним wmplayer не работает
     
  2. vertox

    vertox New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2009
    Сообщения:
    15
    Вообщим нашел я бустер который ставиться как сервис и выставляет ммтаймер, проверял на winxp и windows 2008 - работает.
    Но на 2003 почему то не запускается.
    Код (Text):
    1. #include <windows.h>
    2. #include "fmmtimer.h"
    3.  
    4. // Based on "Five Steps to Writing Windows Services in C"
    5. // written by Yevgeny Menaker
    6.  
    7. SERVICE_STATUS ServiceStatus;
    8. SERVICE_STATUS_HANDLE hStatus;
    9.  
    10. void main()
    11. {
    12.     SERVICE_TABLE_ENTRY ServiceTable[2];
    13.     ServiceTable[0].lpServiceName = L"FastmmTimer";
    14.     ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;
    15.  
    16.     ServiceTable[1].lpServiceName = NULL;
    17.     ServiceTable[1].lpServiceProc = NULL;
    18.     // Start the control dispatcher thread for our service
    19.     StartServiceCtrlDispatcher(ServiceTable);  
    20. }
    21.  
    22.  
    23. void ServiceMain(int argc, char** argv)
    24. {
    25.     NTSTATUS error;
    26.     BYTE slowdown;
    27.  
    28.     // Use startup parameter to slow down timer
    29.     if (argc>1) slowdown = abs(atoi(argv[1]))+1;
    30.     else slowdown = 1;
    31.  
    32.     ServiceStatus.dwServiceType        = SERVICE_WIN32;
    33.     ServiceStatus.dwCurrentState       = SERVICE_START_PENDING;
    34.     ServiceStatus.dwControlsAccepted   = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
    35.     ServiceStatus.dwWin32ExitCode      = 0;
    36.     ServiceStatus.dwServiceSpecificExitCode = 0;
    37.     ServiceStatus.dwCheckPoint         = 0;
    38.     ServiceStatus.dwWaitHint           = 0;
    39.  
    40.     hStatus = RegisterServiceCtrlHandler(L"FastmmTimer", (LPHANDLER_FUNCTION)ControlHandler);
    41.     if (hStatus == (SERVICE_STATUS_HANDLE)0) return; // Registering Control Handler failed
    42.  
    43.     // Initialize Service
    44.     error = SetFastmmTimer(slowdown);
    45.     if (error)
    46.     {
    47.         // Initialization failed
    48.         ServiceStatus.dwCurrentState       = SERVICE_STOPPED;
    49.         ServiceStatus.dwWin32ExitCode      = -1;
    50.         SetServiceStatus(hStatus, &ServiceStatus);
    51.         return;
    52.     }
    53.  
    54.     // We report the running status to SCM.
    55.     ServiceStatus.dwCurrentState = SERVICE_RUNNING;
    56.     SetServiceStatus (hStatus, &ServiceStatus);
    57.  
    58.     // The worker loop of a service
    59.     while (ServiceStatus.dwCurrentState == SERVICE_RUNNING)
    60.     {
    61.         Sleep(SLEEP_TIME);
    62.     }
    63.     return;
    64. }
    65.  
    66. // Service initialization: set multimedia timer
    67. NTSTATUS SetFastmmTimer(BYTE slowdown)
    68. {
    69.     ULONG MinRes; // Minimum timer resolution
    70.     ULONG MaxRes;
    71.     ULONG ActRes; // Current timer resolution
    72.  
    73.     // Get timer resolutions
    74.     NtQueryTimerResolution(&MinRes, &MaxRes, &ActRes);
    75.  
    76.     // Attempt to set to timer
    77.     return( NtSetTimerResolution(MaxRes * slowdown, TRUE, &ActRes) );
    78. }
    79.  
    80. // Control handler function
    81. void ControlHandler(DWORD request)
    82. {
    83.     switch(request)
    84.     {
    85.         case SERVICE_CONTROL_STOP:
    86.             ServiceStatus.dwWin32ExitCode = 0;
    87.             ServiceStatus.dwCurrentState  = SERVICE_STOPPED;
    88.             SetServiceStatus (hStatus, &ServiceStatus);
    89.             return;
    90.  
    91.         case SERVICE_CONTROL_SHUTDOWN:
    92.             ServiceStatus.dwWin32ExitCode = 0;
    93.             ServiceStatus.dwCurrentState  = SERVICE_STOPPED;
    94.             SetServiceStatus (hStatus, &ServiceStatus);
    95.             return;
    96.        
    97.         default:
    98.             break;
    99.     }
    100.  
    101.     // Report current status
    102.     SetServiceStatus (hStatus,  &ServiceStatus);
    103.  
    104.     return;
    105. }
    Код (Text):
    1. #pragma comment (linker, "/DEFAULTLIB:ntdll.lib")
    2.  
    3. #define IN
    4. #define OUT
    5.  
    6. #ifndef NTSTATUS
    7. typedef LONG NTSTATUS;
    8. #endif
    9.  
    10. #define SLEEP_TIME -1
    11.  
    12. void ServiceMain(int argc, char** argv);
    13. void ControlHandler(DWORD request);
    14. NTSTATUS SetFastmmTimer(BYTE slowdown);
    15.  
    16. NTSTATUS NTAPI NtQueryTimerResolution (
    17.   OUT PULONG MinimumResolution,
    18.   OUT PULONG MaximumResolution,
    19.   OUT PULONG ActualResolution
    20. );
    21.  
    22. NTSTATUS NTAPI NtSetTimerResolution (
    23.   IN ULONG RequestedResolution,
    24.   IN BOOLEAN Set,
    25.   OUT PULONG ActualResolution
    26. );
    Кто нибудь может подсказать в чем может быть дело. Или как в пропатчить dll чтоб изначально винда работала с нормально выставленным таймером ?
     
  3. barmaley57

    barmaley57 New Member

    Публикаций:
    0
    Регистрация:
    10 авг 2009
    Сообщения:
    58
    timeBeginPeriod
     
  4. vertox

    vertox New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2009
    Сообщения:
    15
    Под Linux я знаю что можно ядро откомпилить так чтоб таймер работал как надо, наверника по запуску винды идет инициализация ммтаймера и установка дефалтовых значений, в какой dll это может находиться ?
     
  5. barmaley57

    barmaley57 New Member

    Публикаций:
    0
    Регистрация:
    10 авг 2009
    Сообщения:
    58
    winmm.dll
     
  6. vertox

    vertox New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2009
    Сообщения:
    15
    barmaley57
    Вот тут ?
    Код (Text):
    1. ; Attributes: bp-based frame
    2.  
    3. ; MMRESULT __stdcall timeBeginPeriod(UINT uPeriod)
    4. public timeBeginPeriod
    5. timeBeginPeriod proc near
    6.  
    7. uPeriod= dword ptr  8
    8.  
    9. ; FUNCTION CHUNK AT .text:6D00FAA6 SIZE 0000001E BYTES
    10.  
    11. mov     edi, edi
    12. push    ebp
    13. mov     ebp, esp
    14. push    esi
    15. mov     esi, [ebp+uPeriod]
    16. cmp     esi, dword_6D027B20
    17. jb      loc_6D00FAA6
    А что менять ?
     
  7. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    vertox
    Ничего менять и патчить не надо - просто используй timeBeginPeriod для настройки таймера и всё ;)
     
  8. vertox

    vertox New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2009
    Сообщения:
    15
    Y_Mur
    Зачем мне ее использовать ? У меня есть прога которая ставится как сервис и выставляет таймер,она почемуто не работает на 2003 servere, На крайняк могу и mplayer поставить он идет в комплекте с k-lite кодеками.
    Мне нужно патчить dll для работы винды всегда в режиме с ммтаймером который правильно выставлен
     
  9. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    vertox
    Зачем извращаться с сервисом или плеером когда один вызов timeBeginPeriod с нужным числом даёт тот же самый эффект либо до её следующего вызова с другим значением, либо до перезагрузки винды :)) Завершение проги вызвавшей timeBeginPeriod значения не имеет.
     
  10. vertox

    vertox New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2009
    Сообщения:
    15
    Y_Mur
    Ты можешь написать такую прогу ? Я в асме почти нуль.
     
  11. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    vertox
    При чём тут асм - это обычная API функция её можно вызвать из любого языка программирования.
     
  12. vertox

    vertox New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2009
    Сообщения:
    15
    Y_Mur
    Ну..... Не владею я почти никакими языками программирования, может тут кто нибудь помочь ?