Windows 中的 GENERIC_WRITE 常量十六进制值是多少?

SPF*_*ort 1 windows 64-bit assembly

我正在尝试使用 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
Run Code Online (Sandbox Code Playgroud)

Dav*_*erd 6

将评论转化为答案,这样就可以结束这个问题。

正如 Michael 指出的,构成访问掩码的位在此处定义。

使用它我们可以看到 GENERIC_READ 是 0x80000000,GENERIC_WRITE 是 0x40000000。

一般来说,您可能应该查看 Windows 标头以获得所有 Windows 常量的明确且最新的值。这个位于 Winnt.h 中。

解决后续问题时,加载要传递给 WriteFile 的句柄的汇编代码不正确。您正在保存从 CreateFile 返回的值

mov FD2, rax
Run Code Online (Sandbox Code Playgroud)

但是然后你使用它加载回来

lea rcx, FD2
Run Code Online (Sandbox Code Playgroud)

lea将返回一个指向句柄的指针,而不是句柄本身。

因此,这一次,Windows 在返回“句柄无效”错误消息时确实很有帮助。(暗示)它告诉了哪个参数是问题的根源,以及(大致)问题是什么。