Форум программистов, компьютерный форум, киберфорум
Assembler: MASM64, х64/long mode
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 21.09.2019
Сообщений: 17
MASM64

Получение даты создания файла

12.10.2020, 21:07. Показов 3340. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, мне надо получить дату создания файла, но я не знаю как это делать. Я вроде как сумел получить дату создания файла с помощью функции GetFileTime, которая дала мне результат в каких-то уберсекундах. Но как преобразовать её в человеческий вид, я не знаю. Подскажите, пожалуйста.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
include \masm64\include64\masm64rt.inc  ; подключение библиотеки
 
.data               ; секция переменных
    fileName db "lab3-1info.exe",0    ; название файла для получения информации   
 
    title1 db "Лабораторная работа 3_2. Работа с файлами",0     ; заголовок окна вывода
    ; txt1 db "Результат: ",10,10,
    ; "Автор: Момот Р.Е.",0
    buf1 dq 1 dup(0),0
    
    hFile         dd     ?
    dwFileSize    dd     ?
    Buffer        db     128 dup (?)
 
    fCRTime FILETIME <> ; время создания файла
    fACTime FILETIME <> ; время доступа к файлу
    fWRTime FILETIME <> ; время записи файла
 
    ; szMsgBoxTitle db     "Открытие файла", 0
    szError       db     "Ошибка при работе с файлом.", 0
 
.code           ; директива сегмента кода
entry_point proc
    xor eax,eax
    invoke CreateFile, addr fileName, GENERIC_WRITE, 0, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0
    cmp    eax, INVALID_HANDLE_VALUE    
    je     ErrorMsg
    mov    hFile, eax
    invoke GetFileTime, hFile, addr fCRTime, addr fACTime, addr fWRTime
    mov rbx,fCRTime
    invoke CloseHandle, hFile
    
    invoke MessageBox, NULL, addr Buffer, addr title1, MB_OK
    jmp    Exit
 
ErrorMsg:
    invoke MessageBox, NULL, addr szError, addr title1, MB_OK or MB_ICONSTOP
 
Exit:
    invoke ExitProcess, NULL
 
entry_point endp        ; точка выхода
end
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.10.2020, 21:07
Ответы с готовыми решениями:

нахождение размера файла и даты создания. нужны коменты...
есть прога на асм PRINT MACRO param push dx mov dx,offset param mov ah,09h int 21h pop dx ENDM INIT MACRO

Получение даты создания файла
Добрый день. Подскажите пожалуйста как в VBA получить дату именно создания файла (показываю на скриншоте). В сети море примеров, но все...

Получение последне даты создания файла опреденного разрешения
Файлы определенного разрешения циклически записываются на локальный диск на нескольких компьютерах. имя и буква диска и путь могут разными...

4
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8644 / 4479 / 1669
Регистрация: 01.02.2015
Сообщений: 13,883
Записей в блоге: 11
12.10.2020, 21:13
Судя по описанию примера в msdn нужно вызвать серию преобразований
https://docs.microsoft.com/en-... write-time
C
1
2
3
4
5
6
7
8
9
10
11
12
13
    // Retrieve the file times for the file.
    if (!GetFileTime(hFile, &ftCreate, &ftAccess, &ftWrite))
        return FALSE;
 
    // Convert the last-write time to local time.
    FileTimeToSystemTime(&ftWrite, &stUTC);
    SystemTimeToTzSpecificLocalTime(NULL, &stUTC, &stLocal);
 
    // Build a string showing the date and time.
    dwRet = StringCchPrintf(lpszString, dwSize, 
        TEXT("%02d/%02d/%d  %02d:%02d"),
        stLocal.wMonth, stLocal.wDay, stLocal.wYear,
        stLocal.wHour, stLocal.wMinute);
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8644 / 4479 / 1669
Регистрация: 01.02.2015
Сообщений: 13,883
Записей в блоге: 11
15.10.2020, 09:17
Как витеевато программирование для masm64!..
Попробовал перенести исходник из msdn на ассемблер - всё время получаю зависание программы при вызовах WinAPI

Дополнительно пробовал получить окошко с диагностическим сообщением GetLastError, поэтому некоторые проверки корректного завершения функций WinAPI могут быть инверсными, по отношению к правильному условию перехода.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
.nolist
option dotname
option casemap: none
        include d:\masm64\Include\temphls.inc
        include d:\masm64\Include\win64.inc
        include d:\masm64\Include\kernel32.inc
        include d:\masm64\Include\user32.inc
        include d:\masm64\Include\msvcrt.inc
 
        includelib d:\masm64\Lib\kernel32.lib
        includelib d:\masm64\Lib\user32.lib
        includelib d:\masm64\Lib\msvcrt.lib
 
option prologue: none
option epilogue: none
 
.list
 
.data
FILETIME        struc
        dwLowDateTime   DWORD   ?
        dwHighDateTime  DWORD   ?
FILETIME        ends
SYSTEMTIME      struc
        wYear           WORD    ?
        wMonth          WORD    ?
        wDayOfWeek      WORD    ?
        wDay            WORD    ?
        wHour           WORD    ?
        wMinute         WORD    ?
        wSecond         WORD    ?
        wMilliseconds   WORD    ?
SYSTEMTIME      ends
        szErrorMessage  db      "%s failed with error %d: %s", 0
        szMBError       db      "Error", 0
        szFail          db      "CreateFile", 0
        szFmtDateTime   db      "%02d/%02d/%d  %02d:%02d", 0
        szFileName      db      "hello.asm", 0
        szFmtLastWrite  db      "Last write time is: %s", 0Dh, 0Ah, 0
.data?
        szBuffer        db      MAX_PATH dup(?)
        hFile           HANDLE  ?
.code
 
DisplayErrorBox proc    lpszFunction:LPVOID
        local   lpMsgBuf        :LPVOID
        local   lpDisplayBuf    :LPVOID
        local   LastError       :DWORD
 
        LocalsSize      =       3*(SIZEOF FILETIME)+2*(SIZEOF SYSTEMTIME)+1*8
 
        push    rbp
        mov     rbp,    rsp
        sub     rsp,    LocalsSize
        mov     [rbp+10h],      rcx
        mov     [rbp+18h],      rdx
        mov     [rbp+20h],      r8
 
        sub     rsp,    20h     ;резервируем 32 байта на нужды вызываемой функции
        ;Retrieve the system error message for the last-error code
        invoke  GetLastError
        mov     LastError,      eax
 
        invoke  FormatMessage,\
                FORMAT_MESSAGE_ALLOCATE_BUFFER OR FORMAT_MESSAGE_FROM_SYSTEM OR FORMAT_MESSAGE_IGNORE_INSERTS,\
                NULL,\
                LastError,\
                LANG_NEUTRAL OR (SUBLANG_DEFAULT SHL 10),\
                ADDR lpMsgBuf,\
                0,\
                NULL
        ;Display the error message and clean up
 
        ;lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT,
        ;  (lstrlen((LPCTSTR)lpMsgBuf)+lstrlen((LPCTSTR)lpszFunction)+40)*sizeof(TCHAR));
        mov     rbx,    rax     ;ebx=lstrlen((LPCTSTR)lpMsgBuf)
        invoke  lstrlen,        lpszFunction
        add     rbx,    rax
        add     rbx,    40
        invoke  LocalAlloc,     LMEM_ZEROINIT, rbx
        mov     lpDisplayBuf,   rax
        ;
        invoke  wsprintf,       lpDisplayBuf, \
                ADDR szErrorMessage, lpszFunction,\
                LastError, lpMsgBuf
        ;
        invoke  MessageBox,     NULL, lpDisplayBuf, ADDR szMBError, MB_OK
 
        invoke  LocalFree,      lpMsgBuf
        invoke  LocalFree,      lpDisplayBuf
        add     rsp,    20h
        add     rsp,    LocalsSize
        pop     rbp
        ret
DisplayErrorBox endp
 
;// GetLastWriteTime - Retrieves the last-write time and converts
;//                    the time to a string
;//
;// Return value - TRUE if successful, FALSE otherwise
;// @hFile     - Valid file handle
;// lpszString - Pointer to buffer to receive string
GetLastWriteTime        proc    @hFile:HANDLE, lpszString:LPTSTR, dwSize:DWORD
        LOCAL   ftCreate:       FILETIME
        LOCAL   ftAccess:       FILETIME
        LOCAL   ftWrite:        FILETIME
        LOCAL   stUTC:          SYSTEMTIME
        LOCAL   stLocal:        SYSTEMTIME
        LOCAL   dwRet:          DWORD
 
        LocalsSize      =       3*(SIZEOF FILETIME)+2*(SIZEOF SYSTEMTIME)+1*8
 
        push    rbp
        mov     rbp,    rsp
        sub     rsp,    LocalsSize
 
 
        mov     [rbp+10h],      rcx
        mov     [rbp+18h],      rdx
        mov     [rbp+20h],      r8
 
        sub     rsp,    20h     ;резервируем 32 байта на нужды вызываемой функции
 
        ;// Retrieve the file times for the file.
        invoke  GetFileTime,    @hFile, ADDR ftCreate, ADDR ftAccess, ADDR ftWrite
        test    rax,    rax
        jnz     @@Exit
 
        ;// Convert the last-write time to local time.
        invoke  FileTimeToSystemTime, ADDR ftWrite, ADDR stUTC
        invoke  SystemTimeToTzSpecificLocalTime, NULL, ADDR stUTC, ADDR stLocal
 
        ;// Build a string showing the date and time.
        invoke  wsprintf,       lpszString, dwSize, ADDR szFmtDateTime,\
                                stLocal.wMonth, stLocal.wDay, stLocal.wYear,\
                                stLocal.wHour, stLocal.wMinute
        mov     dwRet,  eax
 
        cmp     eax,    S_OK
        mov     ebx,    TRUE
        cmove   eax,    ebx
        mov     ebx,    FALSE
        cmovne  eax,    ebx
@@Exit:
        add     rsp,    20h
        add     rsp,    LocalsSize
        pop     rbp
        ret
GetLastWriteTime        endp
 
WinMain proc
        sub     rsp,    28h
        mov     rbp,    rsp
 
        invoke  CreateFile,     ADDR szFileName, GENERIC_READ, FILE_SHARE_READ, NULL,\
                                OPEN_EXISTING, 0, NULL
        mov     [hFile],        rax
 
        cmp     rax,    INVALID_HANDLE_VALUE
        je      @f
                invoke  DisplayErrorBox,        ADDR szFail
                jmp     @@Exit
        @@:
 
        invoke  GetLastWriteTime,       hFile, ADDR szBuffer, MAX_PATH
        invoke  __imp_printf,   ADDR szFmtLastWrite, ADDR szBuffer
 
        ;завершение программы
@@Exit:
        invoke  __imp__getch
        invoke  ExitProcess,    0
WinMain endp
 
end
Компилирую
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@echo off
 
@set AsmSourceName=main
@if [%1]==[] goto :EXIST
@set AsmSourceName=%~dpn1
 
:EXIST
@del %AsmSourceName%.obj > NUL
@del %AsmSourceName%.exe > NUL
@del %AsmSourceName%.com > NUL
@echo on
 
@set mlpath="C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.20.27508\bin\Hostx64\x64\"
%mlpath%\ml64 /Cp /Fl %AsmSourceName%.asm /link /subsystem:console /entry:WinMain /OUT:%AsmSourceName%.exe
@pause
Всё "падает" на вызове SystemTimeToTzSpecificLocalTime и FormatMessage.
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8644 / 4479 / 1669
Регистрация: 01.02.2015
Сообщений: 13,883
Записей в блоге: 11
29.08.2021, 22:25
Думаю, что ошибка разделилась между мной и составителем макроса invoke (в temphls.inc).

Особенность пакета masm64 (комплект в нескольких закреплённых темах) в том, что он оформлен, как дополнение masm32 - в файлах исходников библиотеки прописан путь через masm32 и при отдельной установке в папку \masm64 для компиляции нужно приложить некоторые усилия по массовой замене подстроки "masm32" на "masm64".
А я скопировал все требуемые файлы в папку \masm64 - наделал себе проблем - и не смог использовать masm64rt.inc и m64lib.lib. А это, в частности, макрос invoke.

Но нет худа без добра, смог лучше разобраться с фреймами при вызове подпрограмм.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
.nolist
option dotname
option casemap: none
        include \masm64\Include64\win64.inc
        include \masm64\Include64\kernel32.inc
        include \masm64\Include64\user32.inc
        include \masm64\Include64\msvcrt.inc
 
        includelib \masm64\Lib64\kernel32.lib
        includelib \masm64\Lib64\user32.lib
        includelib \masm64\Lib64\msvcrt.lib
 
option prologue: none
option epilogue: none
 
.list
 
.data
FILETIME        struc
        dwLowDateTime   DWORD   ?
        dwHighDateTime  DWORD   ?
FILETIME        ends
SYSTEMTIME      struc
        wYear           WORD    ?
        wMonth          WORD    ?
        wDayOfWeek      WORD    ?
        wDay            WORD    ?
        wHour           WORD    ?
        wMinute         WORD    ?
        wSecond         WORD    ?
        wMilliseconds   WORD    ?
SYSTEMTIME      ends
        szErrorMessage  db      "%s failed with error %d: %s", 0
        szMBError       db      "Error", 0
        szFail          db      "CreateFile", 0
        szFmtDateTime   db      "%02d/%02d/%d  %02d:%02d", 0
        szFileName      db      "hello.asm", 0
        szFmtLastWrite  db      "Last write time is: %s", 0Dh, 0Ah, 0
.data?
        szBuffer        db      MAX_PATH dup(?)
        hFile           HANDLE  ?
.code
 
DisplayErrorBox proc    lpszFunction:LPVOID
        local   lpMsgBuf        :LPVOID
        local   lpDisplayBuf    :LPVOID
        local   LastError       :QWORD
 
        ;т.к. в опциях задано отсутствие эпилога и пролога,
        ;то вычисления выполняем в коде
        ;вычисляем размер фрейма стека - он состоит из
        ; - локальных переменных (округляем до 8 байт)
        LocalsSize      =       ((2*(SIZEOF LPVOID)+1*(SIZEOF QWORD)+7)/8)*8
        ; - фрейма для вызываемых функций (максимальное число параметров у функции FormatMessage - 7 шт.)
        ;размер округляем до 16, т.к. перед вызовом стек был выровнен на границу 16, потом в стек
        ;поместили 8 байт адреса возврата, а при формировании фрейма будет помещён rbp (8 байт)
        FrameSize       =       (((LocalsSize+7*8)+15)/16)*16
        ;и самостоятельно формируем фрейм
        push    rbp
        mov     rbp,    rsp
        sub     rsp,    FrameSize
        ;сохраняем контекст в месте, предоставленном вызывающим кодом
        mov     [rbp+10h],      rcx
        mov     [rbp+18h],      rdx
        mov     [rbp+20h],      r8
        mov     [rbp+28h],      r9
 
        ;Retrieve the system error message for the last-error code
        call    GetLastError
        mov     LastError,      rax
        comment*
        -------------------------------------------------------------------------------------------------------
        invoke  FormatMessage,\
                FORMAT_MESSAGE_ALLOCATE_BUFFER OR FORMAT_MESSAGE_FROM_SYSTEM OR FORMAT_MESSAGE_IGNORE_INSERTS,\
                NULL,\
                LastError,\
                LANG_NEUTRAL OR (SUBLANG_DEFAULT SHL 10),\
                ADDR lpMsgBuf,\
                0,\
                NULL
        -------------------------------------------------------------------------------------------------------
        *
        mov     rcx,    FORMAT_MESSAGE_ALLOCATE_BUFFER OR FORMAT_MESSAGE_FROM_SYSTEM OR FORMAT_MESSAGE_IGNORE_INSERTS
        xor     edx,    edx
        mov     r8,     rax
        mov     r9d,    LANG_NEUTRAL OR (SUBLANG_DEFAULT SHL 10)
        lea     rax,    lpMsgBuf
        mov     [rsp+20h],      rax
        xor     eax,    eax
        mov     [rsp+28h],      rax
        mov     [rsp+30h],      rax
        call    FormatMessage
        ;Display the error message and clean up
        ;lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT,
        ;  (lstrlen((LPCTSTR)lpMsgBuf)+lstrlen((LPCTSTR)lpszFunction)+40)*sizeof(TCHAR));
        mov     rbx,    rax     ;rbx=lstrlen((LPCTSTR)lpMsgBuf)
        lea     ecx,    lpszFunction
        call    lstrlen
        add     rbx,    rax
        add     rbx,    40
        mov     ecx,    LMEM_ZEROINIT
        mov     edx,    ebx
        call    LocalAlloc
        mov     lpDisplayBuf,   rax
        ;
        mov     rcx,    lpDisplayBuf
        lea     rdx,    [szErrorMessage]
        mov     r8,     lpszFunction
        mov     r9,     LastError
        mov     rax,    lpMsgBuf
        mov     [rsp+20h],      rax
        call    wsprintf
        ;invoke  MessageBox,     NULL, lpDisplayBuf, ADDR szMBError, MB_OK
        xor     ecx,    ecx
        mov     rdx,    lpDisplayBuf
        lea     r8,     szMBError
        mov     r9d,    MB_OK
        call    MessageBox
 
        mov     rcx,    lpMsgBuf
        call    LocalFree
        mov     rcx,    lpDisplayBuf
        call    LocalFree
 
        add     rsp,    FrameSize
        pop     rbp
        ret
DisplayErrorBox endp
 
;// GetLastWriteTime - Retrieves the last-write time and converts
;//                    the time to a string
;//
;// Return value - TRUE if successful, FALSE otherwise
;// @hFile     - Valid file handle
;// lpszString - Pointer to buffer to receive string
GetLastWriteTime        proc    @hFile:HANDLE, lpszString:LPTSTR, dwSize:DWORD
        LOCAL   ftCreate:       FILETIME
        LOCAL   ftAccess:       FILETIME
        LOCAL   ftWrite:        FILETIME
        LOCAL   stUTC:          SYSTEMTIME
        LOCAL   stLocal:        SYSTEMTIME
        LOCAL   dwRet:          QWORD
 
        ;т.к. в опциях задано отсутствие эпилога и пролога,
        ;то вычисления выполняем в коде
        ;вычисляем размер фрейма стека - он состоит из
        ; - локальных переменных (округляем до 8 байт)
        LocalsSize      =       ((3*(SIZEOF FILETIME)+2*(SIZEOF SYSTEMTIME)+1*(SIZEOF QWORD)+7)/8)*8
        ; - фрейма для вызываемых функций (максимальное число параметров у функции FormatMessage - 7 шт.)
        ;размер округляем до 16, т.к. перед вызовом стек был выровнен на границу 16, потом в стек
        ;поместили 8 байт адреса возврата, а при формировании фрейма будет помещён rbp (8 байт)
        FrameSize       =       (((LocalsSize+7*8)+15)/16)*16
        ;и самостоятельно формируем фрейм
        push    rbp
        mov     rbp,    rsp
        sub     rsp,    FrameSize
        ;сохраняем контекст в месте, предоставленном вызывающим кодом
        mov     [rbp+10h],      rcx
        mov     [rbp+18h],      rdx
        mov     [rbp+20h],      r8
        mov     [rbp+28h],      r9
 
        ;// Retrieve the file times for the file.
        ;invoke  GetFileTime,    @hFile, ADDR ftCreate, ADDR ftAccess, ADDR ftWrite
        mov     rcx,    @hFile
        lea     rdx,    ftCreate
        lea     r8,     ftAccess
        lea     r9,     ftWrite
        call    GetFileTime
        test    rax,    rax
        jz      @@Exit
 
        ;// Convert the last-write time to local time.
        ;invoke  FileTimeToSystemTime, ADDR ftWrite, ADDR stUTC
        lea     rcx,    ftWrite
        lea     rdx,    stUTC
        call    FileTimeToSystemTime
        ;invoke  SystemTimeToTzSpecificLocalTime, NULL, ADDR stUTC, ADDR stLocal
        xor     ecx,    ecx
        lea     rdx,    stUTC
        lea     r8,     stLocal
        call    SystemTimeToTzSpecificLocalTime
 
        ;// Build a string showing the date and time.
        ;invoke  wsprintf,       lpszString, ADDR szFmtDateTime,\
        ;                        stLocal.wMonth, stLocal.wDay, stLocal.wYear,\
        ;                        stLocal.wHour, stLocal.wMinute
        mov     rcx,    lpszString
        lea     rdx,    szFmtDateTime
        movzx   r8,     stLocal.wDay
        movzx   r9,     stLocal.wMonth
        movzx   rax,    stLocal.wYear
        mov     [rsp+20h],      rax
        movzx   rax,    stLocal.wHour
        mov     [rsp+28h],      rax
        movzx   rax,    stLocal.wMinute
        mov     [rsp+30h],      rax
        xor     eax,    eax
        call    wsprintf
@@Exit:
        add     rsp,    FrameSize
        pop     rbp
        ret
GetLastWriteTime        endp
 
WinMain proc
        ;формирование фрейма стека на весь код основной программы
        ;с учётом максимального количества параметров среди вызываемых функций
        sub     rsp,    48h
        mov     rbp,    rsp
        ;открытие файла на чтение
        ;invoke  CreateFile,     ADDR szFileName, GENERIC_READ, FILE_SHARE_READ, NULL,\
        ;                        OPEN_EXISTING, 0, NULL
        lea     rcx,    szFileName
        mov     edx,    GENERIC_READ
        mov     r8d,    FILE_SHARE_READ
        xor     r9d,    r9d
        mov     eax,    OPEN_EXISTING
        mov     [rsp+20h],      rax
        xor     eax,    eax
        mov     [rsp+28h],      rax
        mov     [rsp+30h],      rax
        call    CreateFile
        mov     [hFile],        rax
        ;проверка отсутствия ошибок при открытии файла
        cmp     rax,    INVALID_HANDLE_VALUE
        jne     @f
                ;вывод диагностического сообщения об ошибке и завершение программы
                ;invoke  DisplayErrorBox,        ADDR szFail
                lea     rcx,    szFail
                call    DisplayErrorBox
                jmp     @@Exit
        @@:
        ;вывод времени последней записи в файл
        ;invoke  GetLastWriteTime,       hFile, ADDR szBuffer, MAX_PATH
        mov     rcx,    hFile
        lea     rdx,    szBuffer
        mov     r8d,    MAX_PATH
        call    GetLastWriteTime
        ;invoke  __imp_printf,   ADDR szFmtLastWrite, ADDR szBuffer
        lea     rcx,    szFmtLastWrite
        lea     rdx,    szBuffer
        xor     eax,    eax
        call    __imp_printf
        ;завершение программы
        call    __imp__getch
@@Exit:
        xor     ecx,    ecx
        call    ExitProcess
WinMain endp
 
end
Компилировал пакетным файлом
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@echo off
 
@set AsmSourceName=main
@if [%1]==[] goto :EXIST
@set AsmSourceName=%~dpn1
 
:EXIST
@del %AsmSourceName%.obj > NUL
@del %AsmSourceName%.exe > NUL
@del %AsmSourceName%.com > NUL
@echo on
 
@set INCLUDE=c:\masm64\Include64
@set LIB=c:\masm64\Lib64
 
@set mlpath="C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.20.27508\bin\Hostx64\x64\"
%mlpath%\ml64 /Cp /Fl %AsmSourceName%.asm /link /subsystem:console /entry:WinMain /OUT:%AsmSourceName%.exe
@pause
1
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6206 / 2441 / 402
Регистрация: 29.07.2014
Сообщений: 3,174
Записей в блоге: 4
01.09.2021, 03:52
Цитата Сообщение от RomarioM Посмотреть сообщение
Но как преобразовать её в человеческий вид, я не знаю.
Более исчерпывающую инфу о файле можно получить чз GetFileInformationByHandle().
Помимо времени создания/доступа/изменения, она возвращает ещё и сл.данные:

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
struct BY_HANDLE_FILE_INFORMATION
  dwFileAttributes     dd  0      ;// атрибуты
  ftCreationTime       FILETIME   ;// время создания
  ftLastAccessTime     FILETIME   ;// последний доступ
  ftLastWriteTime      FILETIME   ;// время изменения
  dwVolumeSerialNumber dd  0      ;// серийник тома
  nFileSizeHigh        dd  0      ;// размер файла
  nFileSizeLow         dd  0      ;// ^^^^
  nNumberOfLinks       dd  0      ;// число ссылок на файл
  nFileIndexHigh       dd  0      ;// идентификатор связи 
  nFileIndexLow        dd  0      ;// ^^^^
ends
Если действия с файлом элементарные (типа: открыть/создать/записать/закрыть и т.п), то вместо тяжеловеса CreateFile() лучше использовать функции-обёртки из класса _lopen() (два аргумента вместо семи). В конечном итоге она всё-равно вызывает CreateFile(), но с дефолтными параметрами.

При вызове SystemTimeToTzSpecificLocalTime() для коррекции времени, можно/нужно указывать ту-же структуру SYSTEMTIME. Тогда вариант получения времени-создания файла примет такой вид (fasm 32-бит):

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
format   pe gui
include 'win32ax.inc'
;entry    start
;//----------
.data
fName    db  'FileTime.exe',0
fTime    FILETIME
sTime    SYSTEMTIME
buff     db  0      ;//<---- буфер до конца 4Кб секции-данных
;//----------
.code
start:
 
;// Открыть файл и считать с него время
       invoke  _lopen,fName,OF_READ
       invoke  GetFileTime,eax,fTime,0,0
 
;// Преобразовать время в системное с коррекцией
       invoke  FileTimeToSystemTime,fTime,sTime
       invoke  SystemTimeToTzSpecificLocalTime,0,sTime,sTime
 
;// Получить из числа строку (приёмник = буфер)
       movzx   eax,[sTime.wYear]
       movzx   ebx,[sTime.wMonth]
       movzx   ecx,[sTime.wDay]
       movzx   edx,[sTime.wHour]
       movzx   esi,[sTime.wMinute]
      cinvoke  wsprintf,buff,<'Время создания: %d.%02d.%02d  %02d:%02d',0>,\
                               eax,ebx,ecx,edx,esi
 
;// Показать время в форточке
       invoke  MessageBox,0,buff,<'File Time',0>,0
 
       invoke  ExitProcess,0
.end start
3
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.09.2021, 03:52
Помогаю со студенческими работами здесь

Получение размера, даты создания, даты последнего доступа файлов
Прошу помощи. С помощью каких фунций / процедур можно получить размер, дату создания, дату последнего доступа (и т.д. стандартные...

Получение даты создания папки
у меня получается вывести полную дату, как из неё можно получить только год? только его 4 цифры и всё? возможно ли такое вообще? DateTime...

Изменение времени создания файла на минус Х дней от текущей даты создания
День добрый, ветераны форума. Помогите пожалуйста следующую задачу: Есть папка в ней вложеные папки и файлы (более 20к штук),...

Изменить даты и время создания файла, взяв информацию из имени файла
Привет! Есть файл &quot;Call@recording@005_20150216113542.mp3&quot; В его имени после &quot;_&quot; идёт дата &quot;20150216&quot; и время &quot;113542&quot; создания...

Получение атрибутов файла (а именно дату создания файла) без WinApi
Здравствуйте, есть задача &quot;получить дату создания файла&quot;, как это реализовать без WinApi с использованием консольного приложения на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru