Установить скрытый файл, не меняя другие атрибуты (WIN32) - Assembler

Узнай цену своей работы

Формулировка задачи:

Установить скрытый файл, не меняя другие атрибуты (WIN32). Сейчас программа работает след образом: файл из ReadOnly превращается в скрытый. Надо сделать так, чтобы файл превращался в скрытый, но при этом оставался ReadOnly. (возможно через GetFileAttributes).
includelib  kernel32.lib
    extrn   GetCommandLineA:near
    extrn   ExitProcess:near
    extrn   GetStdHandle:near
    extrn   WriteConsoleA:near
    extrn   SetFileAttributesA:near
    extrn   GetFileAttributes:near
    extrn   CreateFileA:near
    extrn   WriteFile:near
    GetCommandLine              equ GetCommandLineA
    WriteConsole                equ WriteConsoleA
    SetFileAttributes           equ SetFileAttributesA
    GetFileAttributes           equ GetFileAttributesA
    CreateFile                  equ CreateFileA
    
    STD_OUTPUT_HANDLE           equ -11
    FILE_ATTRIBUTE_READ_ONLY    equ 01h
    FILE_ATTRIBUTE_HIDDEN       equ 02h
    GENERIC_READ                equ 80000000h
    GENERIC_WRITE               equ 40000000h
    OPEN_EXISTING               equ 3
 
.data
    real_num    dq 0
    StrFirstMsg db 'Set Hidden',10,13,0
    FileNamePtr dq ?
    StrFileName db '1.txt',0
    StrError    db 'Something wrong',10,13,0
    StrSuccess  db 'Success!',10,13,0
    numw        dq ?
    hcons       dq ?
    nameout     db 'CONOUT$',0

.code
start       proc
            sub     rsp, 72     
            mov     rcx, offset nameout
            mov     rdx,GENERIC_READ+GENERIC_WRITE
            mov     r8,0
            mov     r9,0
            mov     qword ptr [rsp+32],OPEN_EXISTING
            mov     qword ptr [rsp+40],0
            mov     qword ptr [rsp+48],0
            call    CreateFile
            cmp     rax,0
            je      Errorr
            mov     hcons,rax
            call    GetCommandLine
            
NextChar:   cmp     byte ptr[rax], 0
            je      StopSkip
            cmp     byte ptr[rax], ' '
            je      NextWord
            inc     rax
            jmp     NextChar
            
NextWord:   cmp     byte ptr[rax], 0
            je      StopSkip
            cmp     byte ptr[rax], ' '
            jne     StopSkip
            inc     rax
            jmp     NextWord
            
StopSkip:   mov     rcx, offset StrFileName
            mov     rcx, rax
            call    SetAttribute
            jmp     Exit
            
Errorr:     mov     rcx, hcons
            mov     rdx, offset StrError
            mov     r8, 17
            mov     r9, offset real_num
            mov     qword ptr [rsp+32],0
            call    WriteFile
            
Exit:       call    ExitProcess

SetAttribute proc
            sub     rsp, 40     ;выделение места в стеке
            mov     FileNamePtr, rcx
            mov     rcx, FileNamePtr
            mov     rdx, FILE_ATTRIBUTE_HIDDEN
            call    SetFileAttributes
            cmp     rax,0
            je      Wrong
            
            mov     rcx,hcons
            mov     rdx,offset StrSuccess
            mov     r8, 10
            mov     r9, offset real_num
            mov     qword ptr [rsp+32],0
            call    WriteFile
            jmp     ExitProc
            
Wrong:      mov     rcx, hcons
            mov     rdx, offset StrError
            mov     r8, 17
            mov     r9, offset real_num
            mov     qword ptr [rsp+32],0
            call    WriteFile
            
ExitProc:   add     rsp, 40
            ret
 
SetAttribute endp
start       endp
end

Решение задачи: «Установить скрытый файл, не меняя другие атрибуты (WIN32)»

textual
Листинг программы
push	offset FileName
		call	GetFileAttributes
		or	eax, FILE_ATTRIBUTE_HIDDEN
		push	eax
		push	offset FileName
		call	SetFileAttributes

Объяснение кода листинга программы

  1. FileName - это переменная, которая содержит имя файла, который необходимо сделать скрытым.
  2. GetFileAttributes - это функция, которая возвращает атрибуты файла, указанные в переменной eax.
  3. FILE_ATTRIBUTE_HIDDEN - это константа, которая обозначает атрибут скрытый для файла.
  4. SetFileAttributes - это функция, которая устанавливает атрибуты файла, указанные в переменной eax, на основе имени файла, указанного в переменной FileName.
  5. В данном коде сначала мы получаем атрибуты файла с помощью функции GetFileAttributes и сохраняем их в eax.
  6. Затем мы устанавливаем атрибут скрытый с помощью константы FILE_ATTRIBUTE_HIDDEN, используя оператор or для добавления этого атрибута к уже полученным атрибутам файла.
  7. После этого мы используем функцию SetFileAttributes, чтобы установить полученные атрибуты для файла, указанного в переменной FileName.

Оцени полезность:

9   голосов , оценка 3.778 из 5
Похожие ответы