UASM(MASM 克隆)64 位 Visual Studio 2022 解决方案,带有 ICC。 我想使用 WinAPI 中定义的 CONSOLE_CURSOR_INFO 结构。 我知道如何通过从Documentation复制它的声明来使用它。
这是一个部分UASM程序,没有主要功能,并且可以工作。
.CODE
USE64
INCLUDELIB Kernel32.lib
EXTERNDEF __imp_SetConsoleCursorInfo :QWORD
.CONST
ALIGN 4
; Cursor size.
CONSOLE_CURSOR_INFO STRUCT
dwSize DWORD 100 ; Fully filled.
bVisible BOOL 1 ; Visible. BOOL is defined as DWORD in another file.
CONSOLE_CURSOR_INFO ENDS
.DATA
ALIGN 4
MyCursorD CONSOLE_CURSOR_INFO {}
.CODE
mov rcx, rax ; rax already have handle from GetStdHandle of STD_OUTPUT_HANDLE.
lea rdx, MyCursorD ; *lpConsoleCursorInfo.
call __imp_SetConsoleCursorInfo
如何访问 WinAPI CONSOLE_CURSOR_INFO 结构,而不将其及其成员显式复制到我的程序中,就像我使用 EXTERNDEF 访问 WinAPI 函数一样? 有我可以使用的 EXTERN 或 EXTERNDEF 吗?
我尝试了 EXTERN 和 EXTERNDEF 的多种组合,甚至尝试了 Windows 11 Copilot。 它总是因 MyCursorD 语法错误而失败。
由于该结构体是在 .CONST 部分中定义的并且已经具有我需要的值,有没有办法将其用作 const 而无需在 .DATA 部分中创建 MyCursorD 变量?
你让事情变得比需要的更复杂。 -> UASM 有一个内置指令“INVOKE”,它允许您调用过程、win32 api 等,而无需担心自己为给定的调用约定设置所有寄存器。 -> 根据文档,USE64 用于 FLAT 二进制输出。对于 Windows 可执行文件或 DLL,您应该适当地设置汇编器选项。 -> UASM 随 WinInc 一起提供,其中包括与 SDK 中的 win32 api 头文件相对应的汇编语言 INC 文件。
考虑到这些点,一个最小的例子是:
option casemap:none
option frame:auto
option STACKBASE:RSP
option win64:15
.nolist
.nocref
WIN32_LEAN_AND_MEAN equ 1
;UNICODE EQU 1
_WIN64 EQU 1
include C:\jwasm\wininc\Include\windows.inc
.list
.cref
includelib <kernel32.lib>
.DATA
ALIGN 4
MyCursorD CONSOLE_CURSOR_INFO {}
.CODE
start:
; rax already have handle from GetStdHandle of STD_OUTPUT_HANDLE.
invoke SetConsoleCursorInfo, rax, ADDR MyCursorD
end start