如何在 UASM 中使用 WinAPI 结构而不编写它及其成员

问题描述 投票:0回答:1

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 变量?

assembly winapi struct extern masm64
1个回答
0
投票

你让事情变得比需要的更复杂。 -> 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
© www.soinside.com 2019 - 2024. All rights reserved.