Пожалуйста, обратите внимание, что пользователь заблокирован
Столкнулся с прям таки мистической ошибкой. Есть прога, которая проверяет где она лежит, если не в temp - копирует себя в темп. Казалось бы, такой код напишет даже олигофрен, но тем не менее, он у меня дает очень странную ошибку.
А именно - при автозагрузке код пишет, что он НЕ в темп, пытается скопировать файл сам в себя и вылетает. Если же зайти вручную в темп, и запустить файл - то ошибки не будет. Т.е. она только при автозагрузке. Никакая отладка не помогает, при сравнении строк с именами папок lstrcmpi упорно возвращает единицу при автоматической загрузке, и 0 - при запуске вручную. Что это может быть, подскажите пожалуйста, я уже весь мозг сломал об этот говнокод. :angry:
Что за черт,почему постоянно не получается сделать как надо. Уже перечитал все мануалы, погуглил - и толку 0. :bang:
А именно - при автозагрузке код пишет, что он НЕ в темп, пытается скопировать файл сам в себя и вылетает. Если же зайти вручную в темп, и запустить файл - то ошибки не будет. Т.е. она только при автозагрузке. Никакая отладка не помогает, при сравнении строк с именами папок lstrcmpi упорно возвращает единицу при автоматической загрузке, и 0 - при запуске вручную. Что это может быть, подскажите пожалуйста, я уже весь мозг сломал об этот говнокод. :angry:
Код:
.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\macros\macros.asm
uselib kernel32,user32,masm32,advapi32
.data
curPath db MAX_PATH+1 dup (0)
newPath db MAX_PATH+1 dup (0)
.code
main proc
local hReg:dword;
call autoload
invoke GetTempPath,MAX_PATH,addr newPath;получаем путь к темп
invoke GetLongPathName,addr newPath,addr newPath,MAX_PATH;приводим к длинному варианту
invoke GetCurrentDirectory,MAX_PATH,addr curPath;путь к текущей папке
invoke lstrcat,addr curPath,chr$("\");добавляем слеш
invoke GetLongPathName,addr curPath,addr curPath,MAX_PATH;приводим к длинному пути
invoke lstrcmpi,addr newPath,addr curPath;сравниваем папки
pushad
fn MessageBox,0,str$(eax),"Test",MB_OK;0 - папки равны, -1 или 1 - не равны
popad
.if eax != 0 ;если не равны, скопировать себя в темп, тут и проявляется эта ошибка
invoke GetModuleFileName,0,addr curPath,MAX_PATH+1
invoke lstrcat,addr newPath,chr$("fileprot.exe")
invoke CopyFile,addr curPath,addr newPath,0;копируем с перезаписью
call autoload;автозагрузка
.if eax==0
fn MessageBox,0,LastError$(),"Last Error Text",MB_OK
.endif
.endif
exit
main endp
autoload proc
local hReg:dword
invoke GetModuleFileName,0,addr newPath,MAX_PATH
invoke RegCreateKey,HKEY_CURRENT_USER,chr$("Software\Microsoft\Windows\CurrentVersion\Run"),addr hReg
test eax,eax
jnz @err
invoke lstrlen,addr newPath
mov ebx,eax
inc ebx;длина с учетом нуллбайта
invoke RegSetValueEx,hReg,chr$("FileProtect"),0,REG_SZ,addr newPath,ebx
test eax,eax
jnz @err
invoke RegCloseKey,hReg
jmp @ret
@err:
fn MessageBox,0,LastError$(),"Last Error Text",MB_OK
@ret:
ret
autoload endp
end main
Что за черт,почему постоянно не получается сделать как надо. Уже перечитал все мануалы, погуглил - и толку 0. :bang: