Witam.
Może nie rozwiążę do końca Twojego problem, jednak postaram się pomóc. Po pierwsze strukturę, którą pobieramy traktujemy jako kolejne bajty w pamięci. W odnośniku do strony, którą podałeś jest opisana ta struktura, jednak w moim przypadku jest ona nieco odmienna. Oto ona:
Kod:
struct stat {
unsigned long st_dev;
unsigned long st_ino;
unsigned short st_mode;
unsigned short st_nlink;
unsigned short st_uid;
unsigned short st_gid;
unsigned long st_rdev;
unsigned long st_size;
unsigned long st_blksize;
unsigned long st_blocks;
unsigned long st_atime;
unsigned long st_atime_nsec;
unsigned long st_mtime;
unsigned long st_mtime_nsec;
unsigned long st_ctime;
unsigned long st_ctime_nsec;
unsigned long __unused4;
unsigned long __unused5;
};
Jak widać zawiera ona kilka dodatkowych pól. Cała struktura zajmuje 64 bajty więc tyle powinniśmy zarezerwować pamięci dla niej. Sam czas modyfikacji pliku zajmuje 4 bajty i znajduje się (według moich obliczeń) 40 bajtów od początku. Dodatkowo zarezerwujemy 4 bajty dla samego czasu modyfikacji (mtime). Załóżmy, że mamy taki kod:
Kod:
mov eax, 108 ; pobranie statusu pliku
mov ebx, [fileDescriptor]
mov ecx, fStat ; struktura 'stat'
int 80h
mov eax, [fStat + 40] ; kopiuj czas modyfikacji
mov dword [mtime], eax ; i zapisz w zmiennej
breaking_point:
.
.
section .data
fStat times 64 db 0
mtime dd 0
.
.
Teraz używając debuggera można sprawdzić czy dobrze pobraliśmy czas modyfikacji. Oto listing z sesji debuggera:
Kod:
(gdb) break breaking_point
Breakpoint 1 at 0x80480b7
(gdb) r
Starting program
(no debugging symbols found)
Breakpoint 1, 0x080480b7 in breaking_point ()
(gdb) p &fStat
$1 = (<data variable, no debug info> *) 0x80490c0
(gdb) x/64b 0x80490c0
0x80490c0 <fStat>: 0x05 0x03 0x00 0x00 0xad 0x7b 0x06 0x00
0x80490c8 <fStat+8>: 0xa4 0x81 0x01 0x00 0xe8 0x03 0x64 0x00
0x80490d0 <fStat+16>: 0x00 0x00 0x00 0x00 0x0b 0x00 0x00 0x00
0x80490d8 <fStat+24>: 0x00 0x10 0x00 0x00 0x08 0x00 0x00 0x00
0x80490e0 <fStat+32>: 0x75 0x27 0xed 0x47 0x00 0x00 0x00 0x00
0x80490e8 <fStat+40>: 0x9b 0x21 0xed 0x47 0x00 0x00 0x00 0x00
0x80490f0 <fStat+48>: 0x9b 0x21 0xed 0x47 0x00 0x00 0x00 0x00
0x80490f8 <fStat+56>: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
Otrzymany wynik (0x47ed219b) można przekształcić w bardziej czytelny sposób używając C (funkcja ctime) lub Perla
Kod:
$ perl -le 'print scalar localtime 0x47ed219b'
Fri Mar 28 16:49:31 2008
Następnie ten wynik sprawdzamy czy rzeczywiście odpowiada czasu modyfikacji danego pliku np. przez polecenie 'ls -l'
Jeżeli wszystko będzie w porządku, można dalej przekształcać ten czas (korzystając już z samego czasu w zmiennej mtime) do odpowiedniej postaci. Niestety tutaj trzeba będzie napisać jakieś własne makro lub poszukać gotowego rozwiązania.