uptime in Windows XP

otvertka07

как узнать?

Coffin

время system idle process

otvertka07

по моему, это через жопу, и не уверен что верно, может как нибудь еще можно?

sergey_m

5 баллов.
А если у меня запущен например dnetc, то у меня uptime по жизни
равен 0, так что ли?
Спроси у leo, он узнавал uptime на NT 4.0

tokuchu

там ещё где-то должно сохраняться время создания процесса - файрвол у меня по крайней мере берёт её откуда-то

spirtus

плагином к мирке ебта

ol4a21

Йоу, МСДН на запрос "uptime" выдает это первой ссылкой

bobking

А ты думаешь я знаю наизусть этот URL? Просто видел у хардкорных маздайщиков эту прогу.

shlyumper

Little magic


#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);
}

ol4a21

А если логи со времени последней загрузки чистились?

shlyumper

Тогда только один вариант (AFAIK) - включить сервис SNMP и делать так:


#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

bobking

Маздай! Другого слова нет!

ol4a21

Наш ответ атцам



//--- 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;
}

Landstreicher

Народ, вы чего? Проги тут какие-то страшные пишите
Поставьте ConfigNT (\\LORIEN\install\other\confignt.cpl) - он все показывает.

ol4a21

Компилировать с ntdll.lib

zsn66

Мощный ответ.
Не забудь три тома документации только

oleg701

Windows Commander

shlyumper

Ну, в DDK мы лезть вроде не договаривались, а без него работать не будет Не оказалось его у меня под рукой...

ol4a21

Маза никаких DDK
Чистый юзер-моде

shlyumper

Эй эй эй, NtQuerySystemInformation относится уже к вызовам из DDK (хотя и работает в user mode - так их половина в user mode работает). ntdll.lib относится к DDKшным библиотекам. Сама функция задокументированна только в DDK. Кроме того, я не уверен что твой код будет работать не из под админского аккаунта (надо бы проверить - лень).

ol4a21

Ты не прав
ntdll - это не DDKшная библиотека, она загружается всеми виндовыми процессами
большая часть ее функций - это тонкие оболочки к соответствующим сисколлам
другой вопрос, что .lib к ней поставляется в DDK, но можно и без него обойтись
Не из под админского эккаунта работать скорее всего будет, я бы проверил, но у меня, стыдно признаться, их нету

shlyumper

К ней поставляется только в DDK не только lib. К ней и документация и хэдеры поставляется только в DDK, поэтому относится она к DDK. А так - вообще говоря я могу к любой dll'ке написать свой import library, и свои заголовки (посмотреть на тот же MinGW32 но это же еще ничего не значит... Так что все же DDK это...

sergey_m

Линковать

ol4a21

это был ответ на
>Компилировать с snmpapi.lib
не надо придираться к словам

bobking

Обработать редактором связей, блин.

ol4a21

Заголовков и документации к функциям native api в ddk нет
Тама есть заголовки и документация к их кернел-моде аналогам, притом далеко не ко всем
Что, впрочем, не спасает от любителей отладчиков

ol4a21

Да, и еще
Настоящие виндоуз-программисты никогда не используют грязные хаки типа


days = Uptime/(24*60*60);
Uptime %= 24*60*60;
hours = Uptime/(60*60);
Uptime %= 60*60;
minutes = Uptime/60;
Uptime %= 60;
seconds = Uptime;


Надо использовать API функции для работы со временем
Тогда при изменении кол-ва секунд в минуте или часов в сутках программу не надо будет переделывать

shlyumper

Не надо. Внимательно читаем help по SnmpGetSvcUptime: The function returns a DWORD value that is the number of centiseconds the SNMP service has been running. Сотые доли секудны есть, были и будут есть :-)

ol4a21

Маза я про перевод в нормальные единицы
Это типа шутка юмора была

kerkpirr

На sysinternals.com есть прога uptime.exe, которая и показывает тебе то, что надо!

Beshlan

А что-то вроде GetTickCount не оно разве?

bobking

Это с 1970 года.

Beshlan

ржалъ...

CapitanJack

да бля - в ХР есть systeminfo.exe консольная прога аптайм показывает в частности

ol4a21

Ну вот, пришел и все опошлил

bobking

Круто ты атцов посрамил.

CapitanJack

это кто же тут отец то ?

bobking

типа.

CapitanJack

ГГЫ

sergey_m

Windows очень интересная система. Ответ на такой простой
вопрос как "как узнать uptime" выливается в интереснейшую дискуссию и спор, когда спорящие узнают много нового о
любимой операционной системе, а также друг о друге.
Если бы машина просто хранила ticks на момент старта, и была
бы простая команда, носящая название uptime (а ни что-то иное
которая бы умела выводить разницу между текущими ticks и сохраненными в момент старта в читаемом формате, то не было бы этой интереснейшей дискуссии, где люди закопались в DDK (Driver Development Kit, если я не ошибаюсь). По логике
не понятно зачем здесь DDK, драйвер аптайма писать что ли будем?

bobking

По логике [UNIX] не понятно зачем здесь DDK.

shlyumper

Если UNIX API перегруппировать так как это сделано в windows (то есть на SDK и DDK то просто напросто <sys/sysctl.h> которым вы читаете uptime на unix окажется в DDK

zsn66

А у нас аптайм из /proc/uptime читают
Это в какую группу попадёт?

bobking

А ни хера. Смотри Solaris и другие коммерческие UNIX.

shlyumper

"Ще? Хто-то назвал пингвинукс 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 туда же попал бы

zsn66

Права на (tm) как известно нет ни там ни там
Как это - /proc в DDK? Типа не поставил библиотеки - нет procfs? Так вот же оно, без всякой библиотеки Не, нам такого счастья не надо

shlyumper

Нет, не так. procfs есть всегда. Но не поставил библиотеки - не можешь сам писать программы которые будут с ним работать Или можешь, но через жопу.

bobking

> можешь сам писать программы которые будут с ним работать
/bin/cat?

bobking

В смысле read и write без DDK не лапать?

ol4a21

Маза волне реально сделать аналог procfs под винду
Просто это никому не надо

2
интересно ведь не то, какая прикладная программа показывает аптайм (хотя ахтох бы этим удовольствовался)
а как такая программа работает
простейший споспоб - это юзать GetTickCount про который вспомнили далеко не сразу
но другие способы не менее интересны

shlyumper

Ты не понял. /bin/cat тут не при чем. Это просто концепция такая.
Попробую попроще объяснить.
Ну представь себе что у тебя все файлы в /proc называются скажем /proc/zhopa_s_ruchkoi_12_2323_a22f_12332 а не по-нормальному, а на самом деле в них полезная инфа. А вот в каком именно какая - есть в заголовках от DDK. Но можно конечно и самому поковыряться и выяснить в каком какая...

zsn66

> Просто это никому не надо
Правильно, Windows нужна для работы, а не мерянья аптаймами

shlyumper

Вообще говоря, GetTickCount тебе не выдаст нормальной информации. Если внимательно прочитать MSDN, то там даже об этом написано:
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.

bobking

ln -s /proc/zhopa_s_ruchkoi_12_2323_a22f_12332 /proc/uptime?

shlyumper

а вот это как раз и есть то о чем я говорил - "можно и самому, но придется извращаться." Под Windows без DDK так тоже можно.

bobking

Маза ты гонишь. DDK существуют только в системах с закрытыми исходниками.

shlyumper

Просто в системах с открытыми исходниками их так не называют :-)

bobking

Если животное ходит как собака, лает как собака, машет хвостом как собака, то это - собака?

shlyumper

Маза это пингвин :-

Filan

А у меня нигде на фре нет procfs. А uptime работает. Так что /proc/uptime - это лажа.

Filan

>а вот это как раз и есть то о чем я говорил - "можно и самому, но придется извращаться." Под Windows без DDK так тоже можно.
А почему сразу по человечески не сделать? При установке тот самый "ln -s /proc/huyo_moyo_ /proc/uptime" запустить - и всё! И что самое уебанское в мастдае - это то, что такой он весь - всё зделано через то самое место.

P.S. И даже не пытайся меня переубедить.

bonnyboo

Хуево она что то показывает:
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>

ol4a21

Дай мне ее посмотреть

bonnyboo

Microsoft рулит
где бы сорцы поглядеть

C:\Downloads\psuptime\by_Microsoft>uptime.exe
\\AHTOH has been up for: 2 day(s 22 hour(s 12 minute(s 25 second(s)

ppplva

Винда простояла почти трое суток? Дааа, это повод для гордости.

ruler

Распространённое заблуждение

Ramin

Да ладно... у меня на работе более 40 дней. И ничё, работала нормально. И дольше б работала, если б электричество не вырубили.

ppplva

Это ты о чем? Я знаю, что если ее не трогать, то она простоит и дольше. Если, конечно, не 98-я.

gopnik1994

у меня XP живет месяцами

ruler

вопрос прямых рук всегда стоит особенно остро

ppplva

Да. Науке известны еще и не такие случаи.
Вообще, винда на каждом компе ведет себя по-разному.
Иногда стоит как скала, а иногда - хоть в лепешку разбейся: глючит, падает, сегфолты какие-то...

bonnyboo

она бы и больше простояла, просто у нас на этаже проблемы с электричеством, да и проги иногда хотят перегруз после установки

shlyumper

Упрощенные сырцы я сюда уже постил. Просто читается System Log и все. :-)

bonnyboo

откуда ты знаешь, что используется именно этот метод?

Dasar

SnmpSvcGetUptime тоже возвращает время в DWORD-е, поэтому тоже может переполнится
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.

shlyumper

Элементарно
strings uptime.exe
И depends uptime.exe
Там может использоваться два метода - heartbeat и system log. Но heartbeat включен не на всех системах, и вообще включать его не лучшая идея.

shlyumper

Согласен. Сразу не заметил. Похоже единственный "правильный" метод (который не использует вызовы из ntdll напрямую) - через system log.

bonnyboo

я удалил System Event Log, но uptime.exe все равно работает
а использует она system log, когда статистику считает типа System Availability и прочее (uptime.exe /s)

ol4a21

>Согласен. Сразу не заметил. Похоже единственный "правильный" метод (который не использует вызовы из ntdll напрямую) - через system log.
ИМХО это не так
По крайней мере, вот ента Руссиновическая прога юзает PDH для performance counters, которые вовсе не обязательно работают через логи (как раз в данном случае, похоже, это так)
22
Дай поглядеть

bonnyboo

там же зашарено (\\\psuptime\by_Microsoft)

ol4a21

У меня она показывает чушь - отключены логи
tdump подтверждает слова
Итого - в ацтой

bonnyboo

и что делать?

ol4a21

В смысле?
Оставить комментарий
Имя или ник:
Комментарий: