Нужна прога для разгона мультимедия таймера для снижения пинга сервера http://faq.cs2.ru/faq.php?cat_id=10 Под Winxp я запускал wmplayer, ping падал в три раза Сейчас сервера на Win server 2008 Под ним wmplayer не работает
Вообщим нашел я бустер который ставиться как сервис и выставляет ммтаймер, проверял на winxp и windows 2008 - работает. Но на 2003 почему то не запускается. Код (Text): #include <windows.h> #include "fmmtimer.h" // Based on "Five Steps to Writing Windows Services in C" // written by Yevgeny Menaker SERVICE_STATUS ServiceStatus; SERVICE_STATUS_HANDLE hStatus; void main() { SERVICE_TABLE_ENTRY ServiceTable[2]; ServiceTable[0].lpServiceName = L"FastmmTimer"; ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain; ServiceTable[1].lpServiceName = NULL; ServiceTable[1].lpServiceProc = NULL; // Start the control dispatcher thread for our service StartServiceCtrlDispatcher(ServiceTable); } void ServiceMain(int argc, char** argv) { NTSTATUS error; BYTE slowdown; // Use startup parameter to slow down timer if (argc>1) slowdown = abs(atoi(argv[1]))+1; else slowdown = 1; ServiceStatus.dwServiceType = SERVICE_WIN32; ServiceStatus.dwCurrentState = SERVICE_START_PENDING; ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN; ServiceStatus.dwWin32ExitCode = 0; ServiceStatus.dwServiceSpecificExitCode = 0; ServiceStatus.dwCheckPoint = 0; ServiceStatus.dwWaitHint = 0; hStatus = RegisterServiceCtrlHandler(L"FastmmTimer", (LPHANDLER_FUNCTION)ControlHandler); if (hStatus == (SERVICE_STATUS_HANDLE)0) return; // Registering Control Handler failed // Initialize Service error = SetFastmmTimer(slowdown); if (error) { // Initialization failed ServiceStatus.dwCurrentState = SERVICE_STOPPED; ServiceStatus.dwWin32ExitCode = -1; SetServiceStatus(hStatus, &ServiceStatus); return; } // We report the running status to SCM. ServiceStatus.dwCurrentState = SERVICE_RUNNING; SetServiceStatus (hStatus, &ServiceStatus); // The worker loop of a service while (ServiceStatus.dwCurrentState == SERVICE_RUNNING) { Sleep(SLEEP_TIME); } return; } // Service initialization: set multimedia timer NTSTATUS SetFastmmTimer(BYTE slowdown) { ULONG MinRes; // Minimum timer resolution ULONG MaxRes; ULONG ActRes; // Current timer resolution // Get timer resolutions NtQueryTimerResolution(&MinRes, &MaxRes, &ActRes); // Attempt to set to timer return( NtSetTimerResolution(MaxRes * slowdown, TRUE, &ActRes) ); } // Control handler function void ControlHandler(DWORD request) { switch(request) { case SERVICE_CONTROL_STOP: ServiceStatus.dwWin32ExitCode = 0; ServiceStatus.dwCurrentState = SERVICE_STOPPED; SetServiceStatus (hStatus, &ServiceStatus); return; case SERVICE_CONTROL_SHUTDOWN: ServiceStatus.dwWin32ExitCode = 0; ServiceStatus.dwCurrentState = SERVICE_STOPPED; SetServiceStatus (hStatus, &ServiceStatus); return; default: break; } // Report current status SetServiceStatus (hStatus, &ServiceStatus); return; } Код (Text): #pragma comment (linker, "/DEFAULTLIB:ntdll.lib") #define IN #define OUT #ifndef NTSTATUS typedef LONG NTSTATUS; #endif #define SLEEP_TIME -1 void ServiceMain(int argc, char** argv); void ControlHandler(DWORD request); NTSTATUS SetFastmmTimer(BYTE slowdown); NTSTATUS NTAPI NtQueryTimerResolution ( OUT PULONG MinimumResolution, OUT PULONG MaximumResolution, OUT PULONG ActualResolution ); NTSTATUS NTAPI NtSetTimerResolution ( IN ULONG RequestedResolution, IN BOOLEAN Set, OUT PULONG ActualResolution ); Кто нибудь может подсказать в чем может быть дело. Или как в пропатчить dll чтоб изначально винда работала с нормально выставленным таймером ?
Под Linux я знаю что можно ядро откомпилить так чтоб таймер работал как надо, наверника по запуску винды идет инициализация ммтаймера и установка дефалтовых значений, в какой dll это может находиться ?
barmaley57 Вот тут ? Код (Text): ; Attributes: bp-based frame ; MMRESULT __stdcall timeBeginPeriod(UINT uPeriod) public timeBeginPeriod timeBeginPeriod proc near uPeriod= dword ptr 8 ; FUNCTION CHUNK AT .text:6D00FAA6 SIZE 0000001E BYTES mov edi, edi push ebp mov ebp, esp push esi mov esi, [ebp+uPeriod] cmp esi, dword_6D027B20 jb loc_6D00FAA6 А что менять ?
vertox Ничего менять и патчить не надо - просто используй timeBeginPeriod для настройки таймера и всё
Y_Mur Зачем мне ее использовать ? У меня есть прога которая ставится как сервис и выставляет таймер,она почемуто не работает на 2003 servere, На крайняк могу и mplayer поставить он идет в комплекте с k-lite кодеками. Мне нужно патчить dll для работы винды всегда в режиме с ммтаймером который правильно выставлен
vertox Зачем извращаться с сервисом или плеером когда один вызов timeBeginPeriod с нужным числом даёт тот же самый эффект либо до её следующего вызова с другим значением, либо до перезагрузки винды ) Завершение проги вызвавшей timeBeginPeriod значения не имеет.