我正在尝试使用x64中的程序集中的CreatFileA系统调用打开文件进行写入,但是为了这样做,我需要指定所需的访问权限。我不知道GENERIC_WRITE的常量是什么,GENERIC_READ常量是80000000h。
; create the file
lea rcx, fileName
mov rdx, 40000000h
xor r8, r8
xor r9, r9
mov QWORD PTR [rsp+48h-28h], 2
mov QWORD PTR [rsp+48h-20h], 80h
mov QWORD PTR [rsp+48h-18h], 0
call CreateFileA
mov FD2, rax
; write to the new file
lea rcx, FD2
lea rdx, buffer
mov r8, len
lea r9, written
mov QWORD PTR [rsp+48h-28h], 0
call WriteFile
mov writeResult, rax
答案 0 :(得分:3)
将评论转换为答案,以便关闭。
正如迈克尔指出的那样,构成访问掩码的位被定义为here。
使用它我们看到GENERIC_READ是0x80000000而GENERIC_WRITE是0x40000000。
一般来说,你应该看看Windows'标头,以获取所有Windows常量的最终和最新值。这个在Winnt.h中。
解决后续问题,加载要传递给WriteFile的句柄的汇编程序代码不正确。您正在使用
保存从CreateFile返回的值mov FD2, rax
然后你用
加载它lea rcx, FD2
lea
将返回一个指向句柄的指针,而不是句柄本身。
因此,一旦Windows返回句柄无效错误消息,Windows真的很有帮助。 (暗示)它告诉哪个参数是问题的根源,(大致)问题是什么。