#windows #winapi #nasm
#Windows #winapi #nasm
Вопрос:
Я создаю файл, используя CreateFileA из Windows API в 64-разрядной версии NASM (см.https://learn.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-createfilea ). При следующих параметрах файл не создается, и он возвращает ошибку 87 («параметр неверен») из GetLastError (см. https://learn.microsoft.com/en-us/windows/desktop/debug/system-error-codes—0-499 —)
Вот параметры:
rcx — lpFileName
;dwDesiredAccess
mov rdx,2 Я выбрал FILE_WRITE_DATA из https://learn.microsoft.com/en-us/windows/desktop/FileIO/file-access-rights-constants
; dwShareMode
mov r8,0
Согласно https://learn.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-createfilea : Если этот параметр равен нулю и CreateFile выполняется успешно, файл или устройство не могут быть совместно использованы. Согласно https://learn.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-createfilea , значение должно быть нулевым для отсутствия совместного использования.
; Атрибуты lpSecurityAttributes
перемещение r9,const_inf; (Указатель на нулевое значение dq 0xFFFFFFFF) Или перемещение r9,const_0 в соответствии с https://learn.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-createfilea : «Если этот параметр равен НУЛЮ, дескриптор, возвращаемый CreateFile, не может быть унаследован никакими дочерними процессами, которые может создать приложение, и файл или устройство, связанные с возвращенным дескриптором, получают дескриптор безопасности по умолчанию».
дополнительный rsp, 24 ; пространство стека
; dwCreationDisposition
перемещение rax, 2 (CREATE_ALWAYS)
mov [rsp 16], rax
; dwFlagsAndAttribute
mov rax, 128
mov [rsp 8], rax
Значение 128 взято из https://learn.microsoft.com/en-us/windows/desktop/FileIO/file-attribute-constants
; hTemplateFile
перемещение rax,[const_inf]
mov [rsp 0], rax
Вот полный код создания файла:
CreateAuditFile:
push r10
mov r10,rax ; Core #
mov rdi,FileHandles
mov rbx,[rdi r10]
cmp rbx,0 ; has file been created
jne file_next
mov rcx,FileName_1
mov rdx,2 ;dwDesiredAccess ;0x40000000
push r8
push r9
mov r8,0 ; dwShareMode
mov r9,const_0 ; lpSecurityAttributes
;OR: mov r9,const_inf ; lpSecurityAttributes
; CREATE STACK SPACE FOR REMAINING PARAMETERS:
sub rsp,24
mov rax,2 ; dwCreationDisposition (CREATE_ALWAYS)
mov [rsp 16],rax
mov rax,128
mov [rsp 8],rax ; dwFlagsAndAttributes
mov rax,[const_inf]
mov [rsp 0],rax ; hTemplateFile
push r10
call CreateFileA
pop r10
mov rdi,FileHandles
call GetLastError
mov [rdi],rax
add rsp,24
pop r9
pop r8
pop r10
file_next:
ret
Я внимательно просмотрел параметры параметра, но в сообщении об ошибке говорится только «недопустимый параметр». В нем не указано, какой параметр.
Мой вопрос: какой параметр или параметры выше неверны? Правильно ли переданы параметры в стеке?
Спасибо за любую помощь.
Комментарии:
1. вы неправильно манипулируете с пространством стека, и параметры начинаются с #5 — это должно быть в [rsp 20h] и так далее.
2. Есть ли причина, по которой вы используете сборку?
3. @RbMn — спасибо за ответ, я изменю его и отправлю обратно.
4. параметр 5 должен быть в [rsp 32] (если вы хотите в форме dec), параметр 6 в [rsp 40] и так далее. это общий 64-разрядный abi
5. обычно мы уменьшаем rsp при запуске функции один раз, чтобы выделить пространство стека для локальных переменных 32 байта. вам также не нужно сохранять энергозависимые регистры. но вы должны сохранить энергонезависимый (например, rdi ) — таким образом, вы сохраняете то, что не нужно сохранять, и не сохраняете то, что должно. весь код неправильный от начала до конца
Ответ №1:
Я решил эту проблему, и вот решение. Обработка стека в моем первоначальном вопросе была неверной. Правильный способ обработки стека показан ниже.
Значения для каждого из параметров (таких как DesiredAccess, ShareMode и атрибуты безопасности) могут отличаться в зависимости от конкретных потребностей проекта, но параметры передаются, как в приведенном ниже коде:
CreateAuditFile:
mov rcx,FileName_1
sub rsp,56 ; 38h
xor eax,eax
mov qword [rsp 48],rax ; 30h
mov eax,80
mov dword [rsp 40],eax ; 28h
mov eax,2
mov dword [rsp 32],eax ; 20h
xor r9,r9
xor r8d,r8d
mov edx,40000000
call CreateFileA
mov rdi,OutputFileHandle
mov [rdi r15],rax
xor eax,eax
add rsp,56 ;38h
ret
Большое спасибо всем, кто откликнулся.