Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
Dimarik__
21 / 21 / 3
Регистрация: 29.04.2010
Сообщений: 444
1

удаление файла

23.06.2011, 16:26. Просмотров 2424. Ответов 16
Метки нет (Все метки)

Необходимо удалить файл. То есть. Нужно щёлкнуть правой кнопкой мыши по файлу и чтобы высветилось в контекстном меню УДАЛИТЬ. Ну и затем передать адрес файла в программу, производящую удаление.
Имеется 2 вопроса:
1. Что в реестре надо сделать, чтобы поместить в контекстное меню возможность вызова моей программы?
2. Каким образом необходимо передать параметры (адрес файла) в программу?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.06.2011, 16:26
Ответы с готовыми решениями:

Удаление файла
Всем доброго времени суток!!! Народ у меня проблема: у меня не работает процедура удаления файла в...

Удаление файла
Напишите пожалуйста код удаления файла по указанному пути

Запрет на удаление файла
Задача: Резидентная программа по горячей клавише выводит окно, в котором с помощью клавиш 'стрелка...

Удаление файла, введённого в командной строке (Ассемблер)
Товарищи! Помогите пожалуйста решить задачу. Текст задачи: Написать программу ,которая удаляет...

Удаление комментариев из текстового файла
Доброго времени суток) Необходимо задать в исходном тексте программы имя некоторого файла с...

16
vital792
2004 / 1276 / 60
Регистрация: 05.06.2010
Сообщений: 2,213
23.06.2011, 17:14 2
Dimarik__, интересное задание. Я сделал так:
1. создал reg файл:
REGEDIT4

[HKEY_CLASSES_ROOT\*\shell\test_del]
@="Удалить файл"

[HKEY_CLASSES_ROOT\*\shell\test_del\command]
@="C:\asm_d\masm32prg\test.exe %1"
Но у меня почему то параметр HKEY_CLASSES_ROOT\*\shell\test_del\command не создается - я вручную его вписал regeditom (параметр "по умолчанию")
C:\asm_d\masm32prg\test.exe %1
2. Написал прогу с именем test.exe (не забудь правильно указать путь к ней)
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
.686
.model flat, stdcall
option casemap :none
 
    include \masm32\include\windows.inc
    include \masm32\include\kernel32.inc
    include \masm32\include\shell32.inc
    includelib \masm32\lib\kernel32.lib
    includelib \masm32\lib\shell32.lib
 
.data?
nArgs dd ?
.code
Main proc
 
call GetCommandLineW
invoke CommandLineToArgvW, eax, addr nArgs
or eax, eax
jz @q
cmp nArgs, 1
jz @q
mov ebx, eax
mov eax, [ebx+4]
invoke DeleteFileW, eax
 
@q:
invoke ExitProcess,0
 
Main endp
end Main
1
Dimarik__
21 / 21 / 3
Регистрация: 29.04.2010
Сообщений: 444
23.06.2011, 17:59  [ТС] 3
@="C:\asm_d\masm32prg\test.exe %1"
а зачем %1 там нужен?
0
vital792
2004 / 1276 / 60
Регистрация: 05.06.2010
Сообщений: 2,213
23.06.2011, 20:56 4
Цитата Сообщение от Dimarik__ Посмотреть сообщение
а зачем %1 там нужен?
ну типа аргумент командной строки
0
Dimarik__
21 / 21 / 3
Регистрация: 29.04.2010
Сообщений: 444
24.06.2011, 16:44  [ТС] 5
[HKEY_CLASSES_ROOT\*\shell\test_del]
я такого не нашёл. У тебя какая OC? У меня 7ка.
0
Миниатюры
удаление файла  
Dimarik__
21 / 21 / 3
Регистрация: 29.04.2010
Сообщений: 444
24.06.2011, 18:28  [ТС] 6
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
.586P
;плоская модель памяти
.MODEL FLAT, stdcall
extern DeleteFile@1: near
extern WriteFile@6: near
;подключаем библиотеки
includelib C:\masm32\lib\kernel32.lib;здесь содержатся функции уравления памятью, приложениями, ресурсами, файлами и т.д.
 
;сегмент данных
_DATA segment
    DB_fileAdress DB 'C:/file.txt',0 ;адрес файла
_DATA ends 
 
;сегмент кода
_TEXT segment
    start:
        push DB_fileAdress
        call DeleteFile@1
    end start
_TEXT ends
во время линковки выскочили ошибки:



c:\masm32\bin>ml /c delete.asm
Microsoft (R) Macro Assembler Version 6.14.8444
Copyright (C) Microsoft Corp 1981-1997. All rights reserved.

Assembling: delete.asm

c:\masm32\bin>link delete.obj
Microsoft (R) Incremental Linker Version 5.12.8078
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

delete.obj : warning LNK4033: converting object format from OMF to COFF
LINK : fatal error LNK1561: entry point must be defined

P.S. пишу в MASM. Если не трудно, подскажите, пожалуйста, зачем нужно писать
_TEXT segment - ведь слово _TEXT не зарезервировано (ведь так?) и название определяется пользователем, а компилятор всё равно не понимает что здесь будет находиться именно код?
Или эти сегменты для читабельности программы указываются?
Или же дело немножко иначе состоит. допустим мы хотим в сегменте A объявить переменную lala и в сегменте B объявить переменную lala, то чтобы обратиться из сегмента B к переменной из A, нужно написать:
A:[lala]
и, допустим сделать так (если надо загрузить переменную в eax
mov eax, A:[lala]
подскажите, пожалуйста.
0
vital792
2004 / 1276 / 60
Регистрация: 05.06.2010
Сообщений: 2,213
24.06.2011, 19:57 7
Цитата Сообщение от Dimarik__ Посмотреть сообщение
я такого не нашёл. У тебя какая OC? У меня 7ка.
у меня XP. А ветки такой у меня тоже не было, даже просто shell не было, я же писал
Цитата Сообщение от vital792 Посмотреть сообщение
1. создал reg файл:
я как раз и создаю эту ветку, назвал test_del, ты можешь назвать по другому

Цитата Сообщение от Dimarik__ Посмотреть сообщение
допустим мы хотим в сегменте A объявить переменную lala и в сегменте B объявить переменную lala
в windows нет сегментов. Точнее есть один размером в 4 гб Но есть секции в PE формате Попробуй изменить свой код так:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
.686
.model flat, stdcall
option casemap :none
 
include \masm32\include\windows.inc
 
DeleteFileA PROTO :DWORD
ExitProcess PROTO :DWORD
 
;подключаем библиотеки
includelib \masm32\lib\kernel32.lib;здесь содержатся функции уравления памятью, приложениями, ресурсами, файлами и т.д.
 
.data
        DB_fileAdress DB 'C:\file.txt',0 ;адрес файла
 
.code
start:
    push offset DB_fileAdress
    call DeleteFileA
    push 0
    call ExitProcess
end start
У меня все линкуется и работает
1
Dimarik__
21 / 21 / 3
Регистрация: 29.04.2010
Сообщений: 444
24.06.2011, 21:02  [ТС] 8
странно. у меня опять эти 2 ошибки. может быть я как-то не правильно линкую?
я в cmd пишу:
ml /c delete.asm
затем link delete.obj
0
vital792
2004 / 1276 / 60
Регистрация: 05.06.2010
Сообщений: 2,213
24.06.2011, 23:02 9
Dimarik__, попробуй скомпилировать так:
\masm32\bin\ml /c /coff del.asm
\masm32\bin\Link /SUBSYSTEM:WINDOWS del.obj
а вообще в масм32 должны быть готовые батники для компиляции, посмотри внимательнее, че то типа built.bat
1
Dimarik__
21 / 21 / 3
Регистрация: 29.04.2010
Сообщений: 444
25.06.2011, 14:31  [ТС] 10
Спасибо большое. Твой вариант работает! Только ты можешь сказать, почему у меня косячил?
У нас присутствует принципиальная разница вот в этих строках:

Assembler
1
2
3
4
5
option casemap :none;такого я никогда не встречал
 
include \masm32\include\windows.inc;зачем? если всё уже подключено в kernel32.lib
 
DeleteFileA PROTO :DWORD
DeleteFileA - а по этому поводу я читал книгу Пирогова, в которой он написал, что если вызов stdcall, тогда нужно перед именем функции поставить пробел и после его нужно написать @N, где N - количество байтов, отправляемых в стек. В данном случае - это 1. Это автор писал про согласование имён. Это автор писал про согласование имён.
Или я что-то перепутал тут?

Добавлено через 1 час 44 минуты
Assembler
1
2
call GetCommandLineW
invoke CommandLineToArgvW, eax, addr nArgs
насколько я понял, все функции, которые возвращают значение, записывают его в EAX (в winApi), так?
Только зачем тогда нужна вторая строка с Invoke? Если у нас уже получен путь к файлу? и почему после названия функции сразу же стоит запятая? Ведь запятыми разделяются аргументы. Или я что-то не так говорю?
Assembler
1
2
3
4
5
6
7
8
or eax, eax
jz @q
cmp nArgs, 1
jz @q
mov ebx, eax
mov eax, [ebx+4]
 
Если не труд
как я понял, это идёт обработка ошибки? Если не трудно, прокоменнтируйте этот участок кода
0
vital792
2004 / 1276 / 60
Регистрация: 05.06.2010
Сообщений: 2,213
25.06.2011, 20:04 11
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
...
option casemap :none    ; после этой команды masm начинает различать регистр
; если транслятор выдает ошибку, можно использовать опцию транслятора /Cp внесто нее
 
include \masm32\include\windows.inc ; определение основных типов, констант и структур windows
 
DeleteFileA PROTO :DWORD
ExitProcess PROTO :DWORD    ; определение прототипа функций.
                            ; вообще прототипы обычно собраны в inc файлы и достаточно подключить соответствующий файл
                            ; в данном примере 
                            ; include \masm32\include\kernel32.inc
...
Цитата Сообщение от Dimarik__ Посмотреть сообщение
DeleteFileA - а по этому поводу я читал книгу Пирогова, в которой он написал, что если вызов stdcall, тогда нужно перед именем функции поставить пробел и после его нужно написать @N, где N - количество байтов, отправляемых в стек. В данном случае - это 1. Это автор писал про согласование имён. Это автор писал про согласование имён.
Или я что-то перепутал тут?
Действительно, имена stdcall функций искажены - перед именем стоит "_" и после имени @кол-во_байт_занимаемых_параметрами_в_стеке. Но все это не должно тебя беспокоить если ты подключаешь lib файлы - они как раз и есть таблицы с переходниками на DLL. И не @1 байт а @4, так как параметр DWORD занимает 4 байта.

Цитата Сообщение от Dimarik__ Посмотреть сообщение
насколько я понял, все функции, которые возвращают значение, записывают его в EAX (в winApi), так?
Функции, которые возвращают целочисленный результат, возвращают его в регистрах eax\ax\al в зависимости от размерности значения, для вещественных значений результат на вершине стека сопроцессора (это для наиболее распространенных соглашений о вызовах).

Цитата Сообщение от Dimarik__ Посмотреть сообщение
как я понял, это идёт обработка ошибки? Если не трудно, прокоменнтируйте этот участок кода
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
...
Main proc
 
call GetCommandLineW    ; получаем адрес командной строки
                        ; на выходе в eax искомый адрес
invoke CommandLineToArgvW, eax, addr nArgs ; парсинг, получение параметров из командной строки в юникоде
or eax, eax ; на выходе список указателей на аргументы командной строки в eax и кол-во аргументов в переменной nArgs
jz @q       ; если 0 - ошибка, выходим
cmp nArgs, 1 ; первый аргумент - сама программа, значит если 1 то программа была вызвана без аргументов
jz @q       ; выходим
mov ebx, eax 
mov eax, [ebx+4] ; получаем указатель на второй(!) аргумент
invoke DeleteFileW, eax ; и пробуем удалить
 
@q:
invoke ExitProcess,0
 
Main endp
end Main
1
Dimarik__
21 / 21 / 3
Регистрация: 29.04.2010
Сообщений: 444
26.06.2011, 08:29  [ТС] 12
vital792, спасибо тебе большое за помощь!!!!

Добавлено через 10 часов 39 минут
Только вот один вопрос. Подскажите, пожалуйста.
ведь GetCommandLineW возвращает адрес файла. Или нет? Зачем тогда нужен
Assembler
1
invoke CommandLineToArgvW, eax, addr nArgs ; парсинг, получение параметров из командной строки в юникоде
Хотя.. очень странно получилось. я чтобы разобраться, сделал так
call GetCommandLineW ; получаем адрес командной строки
; на выходе в eax искомый адрес
Assembler
1
invoke MessageBox, 0,  eax, eax,1
и выплыло окошко не с адресом проги, а с ". Вот и всё что там было!
Но самое удивительное, вот на такое написание компилятор стал ой как ругаться:
Assembler
1
invoke MessageBox, 0, offset eax, offset eax,1
Assembler
1
2
mov eax, [ebx+4] ; получаем указатель на второй(!) аргумент
invoke DeleteFileW, eax ; и пробуем удалить
насколько я понял, результатом функции CommandLineToArgvW будет массив, причём в [0] не путь к файлу, а что-то другое. а что?
в [1] будет как раз путь к этому файлу.
И ещё. Если нетрудно, скажите, пожалуйста, почему мы пишем:
invoke DeleteFileW, eax
а не так:
invoke DeleteFileW, eax
Ведь мы же с указателями работаем....
0
vital792
2004 / 1276 / 60
Регистрация: 05.06.2010
Сообщений: 2,213
26.06.2011, 20:59 13
Цитата Сообщение от Dimarik__ Посмотреть сообщение
ведь GetCommandLineW возвращает адрес файла. Или нет? Зачем тогда нужен
похоже ты не понял основного смысла. Имя файла, который нужно удалить передается как параметр командной строки, и все что делает мой код - парсит командную строку, ищет в ней имя файла и передает его функции DeleteFile. Парсить строку можно и без функции CommandLineToArgvW (которая всего лишь собирает параметры в список) а вручную, например так:
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
.686
.model flat, stdcall
option casemap :none
 
    include \masm32\include\windows.inc
    include \masm32\include\kernel32.inc
    includelib \masm32\lib\kernel32.lib
 
.code
start:
 
call GetCommandLineA
mov edi, eax
push edi
xor al, al
mov ecx, -1
repnz scasb
not ecx
dec ecx
pop edi
mov al, 20h
repnz scasb
test ecx, ecx
jz @q
invoke DeleteFileA, edi
 
@q:
invoke ExitProcess,0
 
end start
Путь к удаляемому файлу будет вторым параметром, а первым путь к самой вызываемой программе. Программа же не должна удалять сама себя, верно?

Цитата Сообщение от Dimarik__ Посмотреть сообщение
причём в [0] не путь к файлу, а что-то другое.
путь к самому себе) Например если программа c:\masm32\test.exe а удалить надо файл c:\1.txt, то
командная строка будет выглядеть так:
"c:\masm32\test.exe" c:\1.txt
Цитата Сообщение от Dimarik__ Посмотреть сообщение
почему мы пишем:
invoke DeleteFileW, eax
а не так:
invoke DeleteFileW, eax
Ведь мы же с указателями работаем....
эээээ .... че?
Ну в eax и будет адрес строки - чем не указатель?
1
Dimarik__
21 / 21 / 3
Регистрация: 29.04.2010
Сообщений: 444
02.07.2011, 17:18  [ТС] 14
попробовал сделать откладку
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
.686
.model flat, stdcall
option casemap :none; теперь MASM32 начнёт различать регистры
 
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\shell32.inc
include \masm32\include\user32.inc
;подключаем библиотеки
includelib \masm32\lib\kernel32.lib;includelib \masm32\lib\shell32.lib
includelib \masm32\lib\user32.lib
 
.data
       nArgs DD ?;число аргументов
       DD_fileSize DD ?;размер файла
       DB_fileAdress DD ?;адрес файла
       DB_zero DB 0;чтобы заполнить файл нулями
       DD_all_written_bytes DD 0;сюда запишем количество записанных байт
       hFile DD ?;хэндл открытого файла
       hHeap dd ?; указатель на выделенную память
       db_Count DB 20;
       
       
       
       ard DB "C:\AES.txt",0
.code
start:
 
    mov DB_fileAdress, offset ard
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;узнаём размер файла и заполнить его нулями
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;    
    
    ;открываем файл
    invoke CreateFileW, DB_fileAdress, GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0
    cmp EAX,-1;если ошибка
        jz @q
    mov hFile, EAX;
 
    ;узнаём размер файла
    invoke GetFileSize, EAX, offset DD_fileSize
    cmp EAX,-1;если ошибка
        jz @q
    mov DD_fileSize, EAX
    
    call GetProcessHeap; 
    invoke HeapAlloc, DD_fileSize, HEAP_ZERO_MEMORY, DD_fileSize; 
    mov hHeap, EAX; 
    cmp EAX,0; 
        jz @q
    
    ;цикл из 20 повторений 
        Label_Write_antiMicro:
            invoke WriteFile, hFile, hHeap, DD_fileSize, offset DD_all_written_bytes, 0
            ;переместить указатель файла
            invoke SetFilePointer, hFile, 0, 0, FILE_BEGIN;переместить в начало файла
            dec db_Count
            cmp db_Count,0
                jnz Label_Write_antiMicro
        invoke CloseHandle, hFile; закрываем файл
 
    
 
    call GetProcessHeap
    invoke HeapFree, eax, 0, hHeap
 
    push DB_fileAdress
    call DeleteFileW
    
    
     
    @q:
    invoke ExitProcess,0
 
end start
в и тоге OllyDbg показала что CreateFile не сработал
0
vital792
2004 / 1276 / 60
Регистрация: 05.06.2010
Сообщений: 2,213
03.07.2011, 18:34 15
Цитата Сообщение от Dimarik__ Посмотреть сообщение
в и тоге OllyDbg показала что CreateFile не сработал
У тебя не CreateFile а CreateFileW, а значит строка должна передаваться в юникоде. Попробуй
Цитата Сообщение от Dimarik__ Посмотреть сообщение
ard DB "C:\AES.txt",0
заменить на
Assembler
1
ard DB 'C', 0, ':', 0, '\', 0, 'A', 0, 'E',0, 'S', 0, '.', 0, 't', 0, 'x', 0, 't', 0, 0
должно сработать(не проверял). Или можно перевести предварительно строку в юникод:
Assembler
1
2
3
4
5
6
7
8
           ard DB "C:\AES.txt",0
           Unicode_buf dw 50 dup(?)
           cchWideChar dd ?
.code
start:
        invoke MultiByteToWideChar,0,0,addr ard,-1,addr Unicode_buf,addr cchWideChar
        ;открываем файл      
        invoke CreateFileW, addr Unicode_buf, GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0
но проще всего просто убрать W, чтоб не мучиться с этим юникодом
1
Dimarik__
21 / 21 / 3
Регистрация: 29.04.2010
Сообщений: 444
05.07.2011, 16:36  [ТС] 16
Нужно сделать как invoke CommandLineToArgvW, eax, addr nArgs
только для ASCII. Что тут я неправильно сделал? Ведь разделены строки '\n', ведь так?
Assembler
1
2
3
4
5
6
7
call GetCommandLineA
  ;жедим строку на 2 части
  label_str_parse:
  inc EAX; EAX++
  cmp EAX, '\n'
    jnz label_str_parse
  inc EAX
0
vital792
2004 / 1276 / 60
Регистрация: 05.06.2010
Сообщений: 2,213
05.07.2011, 19:04 17
Цитата Сообщение от Dimarik__ Посмотреть сообщение
Ведь разделены строки '\n', ведь так?
нет. Там одна строка, а аргументы в ней разделены пробелами. Я же писал выше код который парсит строку аналогично CommandLineToArgvW (точнее в коде устанавливается указатель на второй параметр)
Цитата Сообщение от vital792 Посмотреть сообщение
Парсить строку можно и без функции CommandLineToArgvW (которая всего лишь собирает параметры в список) а вручную, например так:
...
А '\n' ассемблер распознает как строку, т.е. коды символов '\' и 'n'
1
05.07.2011, 19:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.07.2011, 19:04

Мягкое удаление файла
Как я понял ,мне нужно найти запись о файле и пометить 1 байт ,как E5 и со всем доп. записями также...

Удаление файла, путь к которому задан с клавиатуры
Доброго всем времени суток, у меня следующий вопрос: Как удалить файл, путь и имя которого нужно...

Удаление строки из файла\либо удаление самого файла.
День добрый, вот функция(используемые переменные объявленны ранее): void delete_cruise() { FILE...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru