如何在ASM中找出文件的年龄?

问题描述 投票:0回答:1

昨天的任务还在议程上:“使用GetOpenFileName函数选择一个文件。检查该文件是否小于3天,则执行它。否则,显示一个对话框,要求删除该文件。如果用户需要,擦拭。” (注意:如果任务被告知使用结构,则必须将其放置在动态分配的内存中)”

我弄清楚了如何打开文件,现在一切都像瑞士手表一样工作。但另一个麻烦又出现了。 如何确定文件的年龄?

总的来说,我首先想到使用 GetFileTime 提取有关文件时间的所有数据,然后使用 FileTimeToLocalFileTime 将其转换为本地时间,并使用 FileTimeToSystemTime - 转换为系统时间。然后根据任务使用 sub 从另一个中减去一个,依此类推。

这里,FileTimeToLocalFileTime函数需要一个带有以下参数的FILETIME结构:

DWORD dwLowDateTime;
DWORD dwHighDateTime;

FileTimeToSystemTime 函数需要一个带有以下参数的 SYSTEMTIME 结构:

WORD wYear;
WORD wMonth;
WORD wDayOfWeek;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSecond;
WORD wMilliseconds;

那该怎么办呢?如何查找文件的年龄?还有其他方法吗?如果我的方法有效,那么我到底应该从什么方面采取它?

文件.inc

include WINDOWS.inc

include user32.inc
include kernel32.inc
include comdlg32.inc

includelib user32.lib
includelib kernel32.lib
includelib comdlg32.lib

.data

    Time_title  db ' Lab_3',0
    format db 'More than 3 days. Delete file?', 0
    buf db 255 dup(0)   
    hFile dd 0
    readed dd 0
    hmem dd 0

文件.asm

.386
.model flat,STDCALL
option casemap :none  ;case sensitive
include Third.inc
include RADbg.inc

Mem_Alloc PROC Buf_Size:DWORD
    add Buf_Size,4  
    invoke GlobalAlloc,GMEM_MOVEABLE or GMEM_ZEROINIT,Buf_Size
    push eax 
    invoke GlobalLock,eax 
    pop [eax]
    add eax,4
Mem_Alloc endp


Mem_Free PROC DATA:DWORD
    mov eax,DATA
    sub eax,4   
    mov eax,[eax]   
    push eax        
    push eax
    call GlobalUnlock   
    call GlobalFree 
Mem_Free endp


.code
Begin:
    call main
    invoke ExitProcess,NULL

main proc
    LOCAL ftCreate, ftLocale: FILETIME;
    LOCAL stUTC, stLocal: SYSTEMTIME;

    invoke Mem_Alloc, 1000h
    mov hmem, eax
    invoke Mem_Alloc, sizeof OPENFILENAME
    mov edi, eax
    assume edi: ptr OPENFILENAME
    xor eax, eax
    mov [edi].lStructSize, sizeof OPENFILENAME
    mov [edi].lpstrFile, offset buf
    mov [edi].nMaxFile, 255
    invoke GetOpenFileName, edi
    invoke CreateFile, [edi].lpstrFile, GENERIC_READ,\
        FILE_SHARE_READ, NULL, OPEN_EXISTING,\
        FILE_ATTRIBUTE_NORMAL, NULL
    mov hFile,eax           ;
    invoke GetFileTime, hFile, addr ftCreate, NULL, NULL
    invoke FileTimeToLocalFileTime, addr ftCreate, addr ftLocale
    invoke FileTimeToSystemTime, addr ftCreate, addr stUTC

    cmp eax, 1
    jz l1
    invoke ReadFile, hFile, hmem, 1000h, addr readed, 0
    invoke MessageBox, 0, hmem, addr Time_title, MB_OKCANCEL

    jmp l2

l1:
    invoke MessageBox, 0, addr format, addr Time_title, MB_OKCANCEL
    cmp eax, IDOK
    jne l2
    invoke DeleteFile, addr [edi].lpstrFile

l2:

    assume edi: dword
    invoke CloseHandle, hFile
    invoke Mem_Free, hmem
    invoke Mem_Free, edi

    ret

main endp   
end Begin
windows assembly winapi x86 masm
1个回答
0
投票

正如FILETIMERtlTimeToSecondsSince1970所说,您应该将文件时间的低位和高位部分复制到ULARGE_INTEGER结构中,对QuadPart成员执行64位算术。
因此,用当前系统时间初始化的 ULARGE_INTEGER 结构体的 64 位值减去用文件时间初始化的 ULARGE_INTEGER 结构体中的 64 位值。

© www.soinside.com 2019 - 2024. All rights reserved.