CreateFileA в Windows API в NASM 64: неверный параметр, но какой? - PullRequest
0 голосов
/ 03 апреля 2019

Я создаю файл с помощью 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

Я внимательно посмотрел на параметры параметра, но в сообщении об ошибке говорится только «неверный параметр».Это не говорит, какой параметр.

Мой вопрос: какой параметр или параметры выше являются неверными?Параметры в стеке переданы правильно?

Спасибо за любую помощь.

1 Ответ

0 голосов
/ 05 апреля 2019

Я решил эту проблему, и вот решение. Обработка стека в моем исходном вопросе была неверной. Правильный способ обработки стека показан ниже.

Значения для каждого из параметров (таких как DesiredAccess, ShareMode и Security Attributes) могут отличаться в зависимости от конкретных потребностей проекта, но параметры передаются, как в коде ниже:

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

Большое спасибо всем, кто откликнулся.

...