Открываю файл PETools,смотрю в FileHeader->DateTimeStamp - 422C240Ch,что PETools переводит как 9:51:08 7 марта 2005г, а Windows показывает дату создания файла 1:51:06 7 марта 2005 Написал свою програмку меня получается 13:51:08 5 марта 2005г. Посмотрите кто прав,интуитивно понимаю что не я ,посмотрите код что неправильно,может у кого нибудь есть другие идеи.
Если DateTimeStamp это число секунд с 0 часов 1 янв.1970-го, то правильный рез-т - первый На код взглянул, но ошибки искать как-то лень Посему предлагаю свой вариантик Код (Text): proc DateTimeStampToSysTime dwTimeStamp, lpSystemTime smin = 60; shour = smin*60; sday = shour*24; syear = sday*365; push ebx push edi push esi mov eax,[dwTimeStamp] mov esi,[lpSystemTime] mov ecx,syear xor edx,edx mov [esi+SYSTEMTIME.wDayOfWeek],dx mov [esi+SYSTEMTIME.wMilliseconds],dx div ecx ;eax - полных лет по 365 дней, edx - остаток секунд mov ebx,eax mov edi,eax sub ebx,3 shr ebx,2 inc ebx ;число добавляемых високосных дней mov eax,edx xor edx,edx mov ecx,sday div ecx ;eax - число дней сверх лет по 365 дней ;edx - остаток секунд sub eax,ebx ;вычитаем число високосных дней sbb ebx,ebx ;коррекция года в сл. перескока add edi,ebx lea ecx,[edi+1970] mov [esi+SYSTEMTIME.wYear],cx and ebx,365 ;коррекция дней в сл.перескока add eax,ebx ;число полных дней с начала года xor ebx,ebx add edi,2 test edi,3 setz bl ;год - високосный shl ebx,2 add ebx,0EEFBB3h ;двухбитовые добавки к числу дней по месяцам отн.28 xor ecx,ecx ;счетчик месяцев @@: inc ecx mov edi,ebx and edi,3 shr ebx,2 add edi,28 sub eax,edi jge @B lea eax,[eax+edi+1] mov [esi+SYSTEMTIME.wMonth],cx mov [esi+SYSTEMTIME.wDay],ax mov eax,edx xor edx,edx mov ecx,shour div ecx mov [esi+SYSTEMTIME.wHour],ax mov eax,edx xor edx,edx mov ecx,smin div ecx mov [esi+SYSTEMTIME.wMinute],ax mov [esi+SYSTEMTIME.wSecond],dx pop esi pop edi pop ebx ret endp А еще проще конвертнуть время в FileTime и вызвать FileTimeToSystemTime ) Код (Text): proc DateTimeStampToSysTime dwTimeStamp, lpSystemTime sub esp,8 mov eax,[dwTimeStamp] mov ecx,10000000 mul ecx add eax,0D53E8000h adc edx,019DB1DEh mov [esp],eax mov [esp+4],edx mov eax,esp invoke FileTimeToSystemTime, eax, [lpSystemTime] add esp,8 ret endp
Leo tnx. С первым алгоритмом разобрался, а вот со вторым объясни, что обозначают константы: 10000000,0D53E8000h,019DB1DEh,0EEFBB3h И еще один интересный момент, компилю программу МОСКОВСКОЕ ВРЕМЯ 24 декабря 2006 г., 0:06:16 FileHeader->DateTimeStamp = 458D9A48 = 1166907976 Windows корректно отображает время, секунда в секунду. ReTools и lordpe 23 декабря 2006 г 21:06:16. Так что врут они на 3 часа. А на файлах созданных в 2004 разница еще больше. Кстати ReTools переводит секунды по твоему второму варианту, но я там с этими константами запутался. А lordpe вызывает функцию gmtime из библиотеки MSVCRT.
0x19DB1DE 0xD53E8000 это 116444736000000000 а это число 100 наносекундных интервалов между 1 Января , 1601 и первым явваря 1, 1970. т.к. The FILETIME structure is a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601. для того чтоб перевести в SYSTEMTIME надо long long ft=uTime*10000000.0+116444736000000000.0; остальное в аттаче в примере где показывается дата инсталяции винды..
Есть одна идея .Плз. люди с Востока или с другого часового пояса кроме МОСКВЫ, приатачьте файл с компиленый вами. Не важно HelloWorld или еще что, напишите время создания файла и разницу времени с МОСКВОЙ.
в моем архиве WindowsInstallDate.exe раельная дата как в зипе показывает а LordPE и PE Tools кажет 458E10DF в GMT 5:32:15 разница у мня GMT+10 в москве GMT+3 на 7 часов разница.. так что все ок
Denis__ Чтобы не привязываться к часовым поясам и летнему\зимнему времени все даты записываются в GMT\UTC и GetSystemTime тоже выдает GMT. Для перевода GMT в местное время можно использовать ф-и FileTimeToLocalFileTime или GetTimeZoneInformation + SystemTimeToTzSpecificLocalTime. Подробности см. в msdn - многие вопросы отпадут сами собой PS: насчет констант khv_test уже объяснил - множитель 10^7 это перевод из секунд в 0.1 мкс = 100 нс, а прибавляемая константа это смещение начала отсчета дат, получить ее легко - заполни структуру SystemTime для 00:00:00 1.01.1970 и вызови SystemTimeToFileTime Что касается 0EEFBB3h из первого варианта, то в двоичном виде это 111011101111101110110011b, где каждые два бита это разница между числом дней в месяце и 28, т.е. янв 31-28=3=11b, фев 28-28=0=00b, март 31-28=3=11b и т.д.