Установить скрытый файл, не меняя другие атрибуты (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
Объяснение кода листинга программы
FileName
- это переменная, которая содержит имя файла, который необходимо сделать скрытым.GetFileAttributes
- это функция, которая возвращает атрибуты файла, указанные в переменнойeax
.FILE_ATTRIBUTE_HIDDEN
- это константа, которая обозначает атрибутскрытый
для файла.SetFileAttributes
- это функция, которая устанавливает атрибуты файла, указанные в переменнойeax
, на основе имени файла, указанного в переменнойFileName
.- В данном коде сначала мы получаем атрибуты файла с помощью функции
GetFileAttributes
и сохраняем их вeax
. - Затем мы устанавливаем атрибут
скрытый
с помощью константыFILE_ATTRIBUTE_HIDDEN
, используя операторor
для добавления этого атрибута к уже полученным атрибутам файла. - После этого мы используем функцию
SetFileAttributes
, чтобы установить полученные атрибуты для файла, указанного в переменнойFileName
.