Я создаю файл с помощью CreateFileA из Windows API в NASM 64-bit (см. https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-createfilea). При следующих параметрах не создается файл, и он возвращает ошибку 87 («параметр неверен»)из GetLastError (см. https://docs.microsoft.com/en-us/windows/desktop/debug/system-error-codes--0-499-)
Вот параметры:
rcx - lpFileName
; dwDesiredAccess
mov rdx, 2 Я выбрал FILE_WRITE_DATA из https://docs.microsoft.com/en-us/windows/desktop/FileIO/file-access-rights-constants
; dwShareMode
mov r8,0
Согласно https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-createfilea: Если этот параметр равен нулю и CreateFile завершается успешно, файл или устройство не могут быть общимиВ соответствии с https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-createfilea, значение должно быть равно нулю для отсутствия совместного использования.
; lpSecurityAttributes
mov r9, const_inf; (указатель на нулевое значение dq 0xFFFFFFFF) ИЛИ mov r9, const_0Согласно https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-createfilea: "Если этот параметр имеет значение NULL, дескриптор, возвращенный CreateFile, не может быть унаследован никакими дочерними процессами, которые может создать приложение, и файл или устройство, связанное с возвращенным дескриптором, получит дескриптор безопасности по умолчанию.riptor. "
sub rsp, 24;пространство стека
;dwCreationDisposition
mov rax, 2 (CREATE_ALWAYS)
mov [rsp + 16], rax
;dwFlagsAndAttribute
mov rax, 128
mov [rsp + 8], rax
Значение 128 от https://docs.microsoft.com/en-us/windows/desktop/FileIO/file-attribute-constants
;hTemplateFile
mov 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
Я внимательно посмотрел на параметры параметра, но в сообщении об ошибке говорится только «неверный параметр».Это не говорит, какой параметр.
Мой вопрос: какой параметр или параметры выше являются неверными?Параметры в стеке переданы правильно?
Спасибо за любую помощь.