Каким образом можно узнать время работы системы?

Тема в разделе "WASM.WIN32", создана пользователем gevara, 21 янв 2007.

  1. gevara

    gevara максим

    Публикаций:
    0
    Регистрация:
    10 ноя 2006
    Сообщения:
    112
    Адрес:
    г. Пермь
    знаю что эту инфу показывает systeminfo. вот только дизасмить не охота.
     
  2. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    А зачем дизасмить, когда мсдн существует:
     
  3. gevara

    gevara максим

    Публикаций:
    0
    Регистрация:
    10 ноя 2006
    Сообщения:
    112
    Адрес:
    г. Пермь
    Y_Mur
    я тут ещё кое что накопал

    void main()
    {SYSTEM_TIME_OF_DAY_INFORMATION stodi;
    ULONG a;
    ZwQuerySystemInformation(SystemTimeOfDayInformation,&stodi,sizeof(stodi),0);
    a = stodi.CurrentTime.HighPart - stodi.BootTime.HighPart;
    printf("%d\r\n",a);
    }

    тема закрыта
     
  4. khv_test

    khv_test New Member

    Публикаций:
    0
    Регистрация:
    30 июн 2004
    Сообщения:
    135
    см. src
     
  5. Cr4sh

    Cr4sh New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2006
    Сообщения:
    668
    GetTickConunt() - возвращает кол-во миллисекунд, прошедших с момента старта системы
     
  6. Scratch

    Scratch New Member

    Публикаций:
    0
    Регистрация:
    1 янв 2005
    Сообщения:
    161
    .. и обнуляется как только достигает 2^32.. вот код на дельфи который реальный аптайм показывает, хотя наверное можно и попроще :)

    Код (Text):
    1. function GetSystemUpTimeNt(): Int64;
    2. {$IFDEF WIN32}
    3. type
    4.   PPerfDataBlock = ^TPerfDataBlock;
    5.   TPerfDataBlock = packed record
    6.     Signature: array[0..3] of WCHAR;
    7.     LittleEndian: DWORD;
    8.     Version: DWORD;
    9.     Revision: DWORD;
    10.     TotalByteLength: DWORD;
    11.     HeaderLength: DWORD;
    12.     NumObjectTypes: DWORD;
    13.     DefaultObject: DWORD;
    14.     SystemTime: SYSTEMTIME;
    15.     PerfTime: LARGE_INTEGER;
    16.     PerfFreq: LARGE_INTEGER;
    17.     PerfTime100nSec: LARGE_INTEGER;
    18.     SystemNameLength: DWORD;
    19.     SystemNameOffset: DWORD;
    20.   end;
    21.   PPerfObjectType = ^TPerfObjectType;
    22.   TPerfObjectType = packed record
    23.     TotalByteLength: DWORD;
    24.     DefinitionLength: DWORD;
    25.     HeaderLength: DWORD;
    26.     ObjectNameTitleIndex: DWORD;
    27.     ObjectNameTitle: LPWSTR;
    28.     ObjectHelpTitleIndex: DWORD;
    29.     ObjectHelpTitle: LPWSTR;
    30.     DetailLevel: DWORD;
    31.     NumCounters: DWORD;
    32.     DefaultCounter: DWORD;
    33.     NumInstances: DWORD;
    34.     CodePage: DWORD;
    35.     PerfTime: LARGE_INTEGER;
    36.     PerfFreq: LARGE_INTEGER;
    37.   end;
    38.   PPerfCounterDefinition = ^TPerfCounterDefinition;
    39.   TPerfCounterDefinition = packed record
    40.     ByteLength: DWORD;
    41.     CounterNameTitleIndex: DWORD;
    42.     CounterNameTitle: LPWSTR;
    43.     CounterHelpTitleIndex: DWORD;
    44.     CounterHelpTitle: LPWSTR;
    45.     DefaultScale: DWORD;
    46.     DetailLevel: DWORD;
    47.     CounterType: DWORD;
    48.     CounterSize: DWORD;
    49.     CounterOffset: DWORD;
    50.   end;
    51.   PPerfInstanceDefinition = ^TPerfInstanceDefinition;
    52.   TPerfInstanceDefinition = packed record
    53.     ByteLength: DWORD;
    54.     ParentObjectTitleIndex: DWORD;
    55.     ParentObjectInstance: DWORD;
    56.     UniqueID: DWORD;
    57.     NameOffset: DWORD;
    58.     NameLength: DWORD;
    59.   end;
    60.   PLARGE_INTEGER = ^LARGE_INTEGER;
    61. const
    62.   PERF_SIZE_LARGE = $00000100;
    63.   PERF_TYPE_COUNTER = $00000400;
    64.   PERF_COUNTER_ELAPSED = $00040000;
    65.   PERF_OBJECT_TIMER = $00200000;
    66.   PERF_DISPLAY_SECONDS = $30000000;
    67.   PERF_ELAPSED_TIME = PERF_SIZE_LARGE or PERF_TYPE_COUNTER or
    68.     PERF_COUNTER_ELAPSED or PERF_OBJECT_TIMER or
    69.     PERF_DISPLAY_SECONDS;
    70.   PERF_NO_INSTANCES = DWORD(-1);
    71. var
    72.   ValSize: DWORD;
    73.   Counter: PChar;
    74.   CurrIdx: PChar;
    75.   CurrStr: PChar;
    76.   CntrStr: PChar;
    77.   CntrSys: DWORD;
    78.   CntrSUT: DWORD;
    79.   QrySize: DWORD;
    80.   QryData: PPerfDataBlock;
    81.   CurrObj: PPerfObjectType;
    82.   ObjLoop: DWORD;
    83.   CurrDef: PPerfCounterDefinition;
    84.   DefLoop: DWORD;
    85.   ObjInst: PPerfInstanceDefinition;
    86.   CntrVal: PLARGE_INTEGER;
    87. {$ENDIF}
    88. begin
    89.   Result := 0; // indicates failure
    90.  
    91.   ValSize := 0;
    92.   if (RegQueryValueEx(HKEY_PERFORMANCE_DATA, 'Counter 009', nil, nil, nil,
    93.     @ValSize) = ERROR_SUCCESS) then
    94.   begin
    95.     Inc(ValSize, 1024);
    96.     Counter := GetMemory(ValSize);
    97.     if (Counter <> nil) then
    98.     begin
    99.       if (RegQueryValueEx(HKEY_PERFORMANCE_DATA, 'Counter 009', nil, nil,
    100.         PByte(Counter), @ValSize) = ERROR_SUCCESS) then
    101.       begin
    102.         CntrStr := nil;
    103.         CntrSys := 0;
    104.         CntrSUT := 0;
    105.         CurrIdx := Counter;
    106.         while (CurrIdx[0] <> #0) do
    107.         begin
    108.           CurrStr := PChar(@CurrIdx[StrLen(CurrIdx) + 1]);
    109.           if ((CntrSys = 0) and (StrComp(CurrStr, 'System') = 0)) then
    110.           begin
    111.             CntrStr := CurrIdx;
    112.             CntrSys := StrToInt(string(CurrIdx));
    113.             if (CntrSUT <> 0) then
    114.               Break;
    115.           end;
    116.           if ((CntrSUT = 0) and (StrComp(CurrStr, 'System Up Time') = 0)) then
    117.           begin
    118.             CntrSUT := StrToInt(string(CurrIdx));
    119.             if (CntrSys <> 0) then
    120.               Break;
    121.           end;
    122.           CurrIdx := PChar(@CurrStr[StrLen(CurrStr) + 1]);
    123.         end;
    124.         if ((CntrStr <> nil) and (CntrSys <> 0) and (CntrSUT <> 0)) then
    125.         begin
    126.           QrySize := 0;
    127.           QryData := nil;
    128.           begin
    129.             repeat
    130.               Inc(QrySize, 4096);
    131.               QryData := ReallocMemory(QryData, QrySize);
    132.               if (QryData = nil) then
    133.                 Break;
    134.               ValSize := QrySize;
    135.             until (RegQueryValueEx(HKEY_PERFORMANCE_DATA, CntrStr, nil, nil,
    136.               PByte(QryData), @ValSize) <> ERROR_MORE_DATA);
    137.             if ((ValSize > 0) and (QryData <> nil)) then
    138.               if (QryData.Signature = 'PERF') then
    139.               begin
    140.                 CurrObj := PPerfObjectType(Cardinal(QryData) +
    141.                   QryData.HeaderLength);
    142.                 for ObjLoop := 1 to QryData.NumObjectTypes do
    143.                 begin
    144.                   if ((CurrObj.ObjectNameTitleIndex = CntrSys) and
    145.                     (CurrObj.NumInstances > 0) and
    146.                     (CurrObj.PerfFreq.QuadPart >= 1000)) then
    147.                   begin
    148.                     CurrDef := PPerfCounterDefinition(Cardinal(CurrObj) +
    149.                       CurrObj.HeaderLength);
    150.                     for DefLoop := 1 to CurrObj.NumCounters do
    151.                     begin
    152.                       if (CurrDef.CounterNameTitleIndex = CntrSUT) and
    153.                         (CurrDef.CounterType = PERF_ELAPSED_TIME) then
    154.                       begin
    155.                         if (CurrObj.NumInstances = PERF_NO_INSTANCES) then
    156.                           CntrVal := PLARGE_INTEGER(Cardinal(CurrObj) +
    157.                             CurrObj.DefinitionLength + CurrDef.CounterOffset)
    158.                         else
    159.                         begin
    160.                           // first instance
    161.                           ObjInst := PPerfInstanceDefinition(Cardinal(CurrObj) +
    162.                             CurrObj.DefinitionLength);
    163.                           CntrVal := PLARGE_INTEGER(Cardinal(ObjInst) +
    164.                             ObjInst.ByteLength + CurrDef.CounterOffset);
    165.                         end;
    166.                         Result :=
    167.                           (CurrObj.PerfTime.QuadPart - CntrVal.QuadPart) div
    168.                           (CurrObj.PerfFreq.QuadPart div 1000); // milliseconds
    169.                         Break;
    170.                       end;
    171.                       CurrDef := PPerfCounterDefinition(Cardinal(CurrDef) +
    172.                         CurrDef.ByteLength);
    173.                     end;
    174.                     Break;
    175.                   end;
    176.                   CurrObj := PPerfObjectType(Cardinal(CurrObj) +
    177.                     CurrObj.TotalByteLength);
    178.                 end;
    179.               end;
    180.           end;
    181.           if (QryData <> nil) then
    182.             FreeMemory(QryData);
    183.         end;
    184.         FreeMemory(Counter);
    185.       end;
    186.     end;
    187.     RegCloseKey(HKEY_PERFORMANCE_DATA);
    188.   end;
    189.  
    190. end;
     
  7. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    дайте мне переводчик pascal->c!.. ))
     
  8. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Scratch
    Это будет почти через 50 дней, не так мало.
     
  9. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    поиск в гугле по
    QueryPerformanceCounter+example
    если нужен high resolution timer
     
  10. Scratch

    Scratch New Member

    Публикаций:
    0
    Регистрация:
    1 янв 2005
    Сообщения:
    161
    .. Я конечно понимаю, что жить с виндой не перегружая её 47 дней сложновато, но некоторым удается )
    к тому же всегда есть выбор..
     
  11. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    Код (Text):
    1. LARGE_INTEGER NtGetTickCount (){
    2.  SYSTEM_TIME_INFORMATION STI;
    3.  ZwQuerySystemInformation (3, &STI, sizeof (STI), 0);
    4.  return STI.liKeSystemTime.QuadPart - STI.liKeBootTime.QuadPart;
    5. }
    ЗЫ: может где-то есть синтаксические ошибки - звиняйте, писал по памяти.