winapi - Problemer med CommandLineToArgvW Windows Funktion i Assembly

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger bare at udskrive værdien af ​​ argc ved hjælp af CommandLineToArgvW -vinduets API-funktion i NASM. Det følgende er, hvad jeg har:


extern \_ExitProcess@4
extern \_GetCommandLineA@0
extern \_CommandLineToArgvW@8
extern printf

global \_start
section .code

Format:
    db "\%d",10,0
FormatS:
    db "\%s",10,0
\_start:
    push ebp
    mov ebp, esp
    sub esp, 4 ; Create empty space for ArgC
    call \_GetCommandLineA@0
    push eax; Push value beneath ArgC
    mov ebx, ebp ; Set ebx to ebp
    sub ebx, 4
    push dword ebx ; pushes ArgC address onto stack
    push dword [ebp - 8] ; pushes pointer to Command Line String
    call \_CommandLineToArgvW@8
    push dword [ebp - 4]
    push Format
    call printf
    push dword 0
    call \_ExitProcess@4


Uanset hvad jeg gør, er værdien for argc 1. Hvad gør jeg forkert?


Jeg samler og forbinder med disse kommandoer:


nasm -fwin32 FunctionTests.asm
golink FunctionTests.obj kernel32.dll msvcrt.dll shell32.dll /console /entry \_start
FunctionTests.exe hi asdf asdf asdf asdf


Som du kan se, skal du fra den sidste linje være 6.

Bedste reference


Skift \_GetCommandLineA til \_GetCommandLine * W * CommandLineToArgv forventer en pointer til en UNICODE-streng.


MASM men kun om det samme:


start:
    push    ebp
    mov     ebp, esp
    sub     esp, 4

    call    GetCommandLineW

    lea     ecx, dword ptr[ebp - 4] ; need the address of local
    push    ecx                     ; address of local
    push    eax                     ; pointer to unicode string
    call    CommandLineToArgvW

    push    dword ptr [ebp - 4]     ; value of local
    push    offset Format
    call    crt\_printf
    add     esp, 8

    ; this is all?  Then we don't have to restore stack.
    push    0
    call    ExitProcess
end start


og dette er output:


D: \ Projekter> ConTest.exe boo boo Jeg kan se dig


6


D: \ Projekter>

Andre referencer 1


Indstil et breakpoint lige før du ringer til CommandLineToArgvW og inspicer de parametre, du vil passere. Vær opmærksom på, at den første parameter du passerer ikke er en pointer til en streng. Det er en pointer til en peger på en streng.

Andre referencer 2


Du skal bruge GetCommandLineW i stedet for GetCommandLineA .

Andre referencer 3


Du bruger CommandLineToArgvW med en ANSI streng, brug GetCommandLineW for at få kommandolinjen i unicode.


Du fjerner heller ikke markøren til kommandolinjen:


push ebx ; pushes ArgC address onto stack