uptime in Windows XP
время system idle process
по моему, это через жопу, и не уверен что верно, может как нибудь еще можно?
А если у меня запущен например dnetc, то у меня uptime по жизни
равен 0, так что ли?
Спроси у leo, он узнавал uptime на NT 4.0
там ещё где-то должно сохраняться время создания процесса - файрвол у меня по крайней мере берёт её откуда-то
плагином к мирке ебта
Йоу, МСДН на запрос "uptime" выдает это первой ссылкой
А ты думаешь я знаю наизусть этот URL? Просто видел у хардкорных маздайщиков эту прогу.
#include <stdio.h>
#include <windows.h>
void main
{
char buffer[1024];
EVENTLOGRECORD* r = (EVENTLOGRECORD *) &buffer;
DWORD dwRead, dwNeeded, dwThisRecord;
HANDLE hLog = OpenEventLog(NULL, "System");
int days, hours, minutes, seconds, Uptime;
if(hLog == NULL) { printf("Cannot open log: %d\n", GetLastError; }
while (ReadEventLog(hLog,EVENTLOG_FORWARDS_READ|EVENTLOG_SEQUENTIAL_READ, 0, buffer, 1024, &dwRead, &dwNeeded
{
while (dwRead > 0)
{
if(r->EventID == 0x80001779) Uptime = time(NULL) - r->TimeGenerated;
dwRead -= r->Length;
r = (EVENTLOGRECORD *) LPBYTE) r + r->Length);
}
r = (EVENTLOGRECORD *) &buffer;
}
days = Uptime/(24*60*60);
Uptime %= 24*60*60;
hours = Uptime/(60*60);
Uptime %= 60*60;
minutes = Uptime/60;
Uptime %= 60;
seconds = Uptime;
printf("System uptime is %d days %2.2d:%2.2d:%2.2d\n", days, hours, minutes, seconds);
}
А если логи со времени последней загрузки чистились?
#include <windows.h>
#include <snmp.h>
#include <stdio.h>
void main
{
long Uptime = SnmpSvcGetUptime;
int days, hours, minutes, seconds, centiseconds;
centiseconds = Uptime % 100;
Uptime /= 100;
days = Uptime/(24*60*60);
Uptime %= 24*60*60;
hours = Uptime/(60*60);
Uptime %= 60*60;
minutes = Uptime/60;
Uptime %= 60;
seconds = Uptime;
printf("System Uptime is %d days %2.2d:%2.2d:%2.2d.%2.2d\n",
days, hours, minutes, seconds, centiseconds);
}
Компилировать с snmpapi.lib
Маздай! Другого слова нет!
//--- uptime.c -----------------------------------------------------------
//------------------------------------------------------------------------
#define UNICODE
#define _UNICODE
#include<windows.h>
#include<winnt.h>
//------------------------------------------------------------------------
extern "C"
{
ULONG __stdcall NtQuerySystemInformation(IN ULONG, IN OUT PVOID, IN ULONG, OUT PULONG);
}
//------------------------------------------------------------------------
#define SystemTimeOfDayInformation 0x03
typedef struct SYSTEM_TIME_OF_DAY_INFORMATION
{
LARGE_INTEGER BootTime;
LARGE_INTEGER CurrentTime;
LARGE_INTEGER TimeZone;
ULONG CurrentTimeZoneId;
} *PSYSTEM_TIME_OF_DAY_INFORMATION;
//------------------------------------------------------------------------
int wmain(int, wchar_t**)
{
SYSTEM_TIME_OF_DAY_INFORMATION info;
NtQuerySystemInformation(SystemTimeOfDayInformation,
&info,
sizeof(SYSTEM_TIME_OF_DAY_INFORMATION
NULL);
// TO DO: compute difference between
// info.CurrentTime.QuadPart and info.BootTime.QuadPart,
// convert it to human-readable form and present it to the user
return 0;
}
Поставьте ConfigNT (\\LORIEN\install\other\confignt.cpl) - он все показывает.
Компилировать с ntdll.lib
Не забудь три тома документации только
Windows Commander
Ну, в DDK мы лезть вроде не договаривались, а без него работать не будет Не оказалось его у меня под рукой...
Чистый юзер-моде
Эй эй эй, NtQuerySystemInformation относится уже к вызовам из DDK (хотя и работает в user mode - так их половина в user mode работает). ntdll.lib относится к DDKшным библиотекам. Сама функция задокументированна только в DDK. Кроме того, я не уверен что твой код будет работать не из под админского аккаунта (надо бы проверить - лень).
ntdll - это не DDKшная библиотека, она загружается всеми виндовыми процессами
большая часть ее функций - это тонкие оболочки к соответствующим сисколлам
другой вопрос, что .lib к ней поставляется в DDK, но можно и без него обойтись
Не из под админского эккаунта работать скорее всего будет, я бы проверил, но у меня, стыдно признаться, их нету
К ней поставляется только в DDK не только lib. К ней и документация и хэдеры поставляется только в DDK, поэтому относится она к DDK. А так - вообще говоря я могу к любой dll'ке написать свой import library, и свои заголовки (посмотреть на тот же MinGW32 но это же еще ничего не значит... Так что все же DDK это...
Линковать
>Компилировать с snmpapi.lib
не надо придираться к словам
Обработать редактором связей, блин.
Тама есть заголовки и документация к их кернел-моде аналогам, притом далеко не ко всем
Что, впрочем, не спасает от любителей отладчиков
Настоящие виндоуз-программисты никогда не используют грязные хаки типа
days = Uptime/(24*60*60);
Uptime %= 24*60*60;
hours = Uptime/(60*60);
Uptime %= 60*60;
minutes = Uptime/60;
Uptime %= 60;
seconds = Uptime;
Надо использовать API функции для работы со временем
Тогда при изменении кол-ва секунд в минуте или часов в сутках программу не надо будет переделывать
Не надо. Внимательно читаем help по SnmpGetSvcUptime: The function returns a DWORD value that is the number of centiseconds the SNMP service has been running. Сотые доли секудны есть, были и будут есть :-)
Это типа шутка юмора была
На sysinternals.com есть прога uptime.exe, которая и показывает тебе то, что надо!
А что-то вроде GetTickCount не оно разве?
Это с 1970 года.
ржалъ...
да бля - в ХР есть systeminfo.exe консольная прога аптайм показывает в частности
Ну вот, пришел и все опошлил
Круто ты атцов посрамил.
это кто же тут отец то ?
типа.
ГГЫ
вопрос как "как узнать uptime" выливается в интереснейшую дискуссию и спор, когда спорящие узнают много нового о
любимой операционной системе, а также друг о друге.
Если бы машина просто хранила ticks на момент старта, и была
бы простая команда, носящая название uptime (а ни что-то иное
которая бы умела выводить разницу между текущими ticks и сохраненными в момент старта в читаемом формате, то не было бы этой интереснейшей дискуссии, где люди закопались в DDK (Driver Development Kit, если я не ошибаюсь). По логике
не понятно зачем здесь DDK, драйвер аптайма писать что ли будем?
По логике [UNIX] не понятно зачем здесь DDK.
Если UNIX API перегруппировать так как это сделано в windows (то есть на SDK и DDK то просто напросто <sys/sysctl.h> которым вы читаете uptime на unix окажется в DDK
Это в какую группу попадёт?
А ни хера. Смотри Solaris и другие коммерческие UNIX.
morannon ~ $ ls -l /proc/uptime
ls: /proc/uptime: No such file or directory
morannon ~ $ uname -a
FreeBSD morannon.v.ru 4.7-STABLE FreeBSD 4.7-STABLE Mon Dec 16 23:53:32 MSK 2002 morannon.v.ru:/usr/obj/usr/src/sys/MORANNON i386
шучу.
На самомо деле почти весь /proc туда же попал бы
Как это - /proc в DDK? Типа не поставил библиотеки - нет procfs? Так вот же оно, без всякой библиотеки Не, нам такого счастья не надо
Нет, не так. procfs есть всегда. Но не поставил библиотеки - не можешь сам писать программы которые будут с ним работать Или можешь, но через жопу.
/bin/cat?
В смысле read и write без DDK не лапать?
Просто это никому не надо
2
интересно ведь не то, какая прикладная программа показывает аптайм (хотя ахтох бы этим удовольствовался)
а как такая программа работает
простейший споспоб - это юзать GetTickCount про который вспомнили далеко не сразу
но другие способы не менее интересны
Попробую попроще объяснить.
Ну представь себе что у тебя все файлы в /proc называются скажем /proc/zhopa_s_ruchkoi_12_2323_a22f_12332 а не по-нормальному, а на самом деле в них полезная инфа. А вот в каком именно какая - есть в заголовках от DDK. Но можно конечно и самому поковыряться и выяснить в каком какая...
Правильно, Windows нужна для работы, а не мерянья аптаймами
The elapsed time is stored as a DWORD value. Therefore, the time will wrap around to zero if the system is run continuously for 49.7 days.то есть на нормально работающем сервере GetTickCount вернет тебе лажу...
А правильное значение надо читать либо как в примерах выше, либо через HKEY_PERFORMANCE_DATA.
ln -s /proc/zhopa_s_ruchkoi_12_2323_a22f_12332 /proc/uptime?
а вот это как раз и есть то о чем я говорил - "можно и самому, но придется извращаться." Под Windows без DDK так тоже можно.
Маза ты гонишь. DDK существуют только в системах с закрытыми исходниками.
Просто в системах с открытыми исходниками их так не называют :-)
Если животное ходит как собака, лает как собака, машет хвостом как собака, то это - собака?
Маза это пингвин :-
А у меня нигде на фре нет procfs. А uptime работает. Так что /proc/uptime - это лажа.
А почему сразу по человечески не сделать? При установке тот самый "ln -s /proc/huyo_moyo_ /proc/uptime" запустить - и всё! И что самое уебанское в мастдае - это то, что такой он весь - всё зделано через то самое место.
P.S. И даже не пытайся меня переубедить.
C:\Downloads\psuptime>psuptime.exe
PsUptime v1.1 - system uptime utility for Windows NT/2K
by Mark Russinovich
Sysinternals - www.sysinternals.com
Unable to query uptime for this system
C:\Downloads\psuptime>
Дай мне ее посмотреть
где бы сорцы поглядеть
C:\Downloads\psuptime\by_Microsoft>uptime.exe
\\AHTOH has been up for: 2 day(s 22 hour(s 12 minute(s 25 second(s)
Винда простояла почти трое суток? Дааа, это повод для гордости.
Распространённое заблуждение
Да ладно... у меня на работе более 40 дней. И ничё, работала нормально. И дольше б работала, если б электричество не вырубили.
Это ты о чем? Я знаю, что если ее не трогать, то она простоит и дольше. Если, конечно, не 98-я.
у меня XP живет месяцами
вопрос прямых рук всегда стоит особенно остро
Вообще, винда на каждом компе ведет себя по-разному.
Иногда стоит как скала, а иногда - хоть в лепешку разбейся: глючит, падает, сегфолты какие-то...
она бы и больше простояла, просто у нас на этаже проблемы с электричеством, да и проги иногда хотят перегруз после установки
Упрощенные сырцы я сюда уже постил. Просто читается System Log и все. :-)
откуда ты знаешь, что используется именно этот метод?
DWORD SnmpSvcGetUptime;
Because the dwUptimeReference parameter stores the elapsed time as a DWORD value in milliseconds, the time can wrap to zero and reflect an inaccurate time interval.
strings uptime.exe
И depends uptime.exe
Там может использоваться два метода - heartbeat и system log. Но heartbeat включен не на всех системах, и вообще включать его не лучшая идея.
Согласен. Сразу не заметил. Похоже единственный "правильный" метод (который не использует вызовы из ntdll напрямую) - через system log.
а использует она system log, когда статистику считает типа System Availability и прочее (uptime.exe /s)
ИМХО это не так
По крайней мере, вот ента Руссиновическая прога юзает PDH для performance counters, которые вовсе не обязательно работают через логи (как раз в данном случае, похоже, это так)
22
Дай поглядеть
там же зашарено (\\\psuptime\by_Microsoft)
tdump подтверждает слова
Итого - в ацтой
и что делать?
В смысле?
Оставить комментарий
otvertka07
как узнать?