CommandLineToArgvW

Тема в разделе "WASM.BEGINNERS", создана пользователем La_plaza, 26 ноя 2008.

  1. La_plaza

    La_plaza New Member

    Публикаций:
    0
    Регистрация:
    20 авг 2008
    Сообщения:
    95
    в общем не могу понять что же я делаю неправильно, да и у меня возникает мысль что я непонимаю что передавать вторым аргументом в эту функцию:

    Код (Text):
    1. section '.code' code readable writable executable
    2. entry $
    3. __start:
    4.             mov ebp,esp
    5.             invoke GetCommandLineW
    6.             invoke CommandLineToArgvW,eax,getcommand
    7.             mov eax,getcommand
    я знаю что это избитая тема, но никак немогу сообразить как правильно работать с оной функой
     
  2. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    а в MSDN смотрел? Там четко написано возвращает массив строк, во второй параметр записывается количество элементов в массиве
    http://msdn.microsoft.com/en-us/library/bb776391(VS.85).aspx
     
  3. La_plaza

    La_plaza New Member

    Публикаций:
    0
    Регистрация:
    20 авг 2008
    Сообщения:
    95
    ну а зачем она тогда ? если допустим GetCommandLineW возвращает в eax всю строку, то можно просканить на наличие пробелов массив и выбирать вручную параметры и передавать куда угодно. Нет, хотелось бы не вручную этим заниматься, а на автомате использовать какие-то апишки.Какие только ?
    да и вообще парсить вручную массив - это глупо я думаю. Как выкрутиться с помощью каких-то апишек ?
     
  4. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    La_plaza
    сам понял что сказал?
     
  5. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    La_plaza
    А чем в ручную не устраивает ?
    Всегото посчитать пробелы и кавычки.
     
  6. La_plaza

    La_plaza New Member

    Публикаций:
    0
    Регистрация:
    20 авг 2008
    Сообщения:
    95
    ну смотри алгоритм таков:
    1)сканим всю строку, находим в ней пробел(т.е параметр будет через пробел.Получаем указатель на начало параметра
    2)находим размер параметра
    3) mov esi,начало строки
    mov edi,куда будем записывать
    repemovsb
    4)как поубирать после каждого символа 00 ? т.е
    00438952 75 00 73 00 65 00 72 00 33 00 32 00 2E 00 64 00 u.s.e.r.3.2...d.
    00438962 6C 00 6C 00 00 00 00 00 00 00 00 00 00 00 00 l.l............
    сложность заключается еще в том, что конец строки должен потом заканчиваться нолем, потому что когда мы будем передавать параметр например в LoadLibrary, то он полюбому должен быть нолем, что мне вручную после удаления всех нолей вручную опять находить конец строки и дописывать вручную его чтоли ? или как ?
     
  7. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    Строка формируется иначе. Если в имени есть хоть один пробел, то имя заключается в кавычки.
    > Проверяем первый символ строки. Если это " то число кавычек должно быть чётным и если за ним пробел - то это конец имени.
     
  8. La_plaza

    La_plaza New Member

    Публикаций:
    0
    Регистрация:
    20 авг 2008
    Сообщения:
    95
    дайте блин, какой-то пример использования параметров коммандной строки(только пример несвязанный с окнами)
     
  9. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    Код (Text):
    1. ; #########################################################################
    2.  
    3.       .386                      ; force 32 bit code
    4.       .model flat, stdcall      ; memory model & calling convention
    5.       option casemap :none      ; case sensitive
    6.  
    7.       include \masm32\include\kernel32.inc
    8.  
    9.       GetCL PROTO :DWORD,:DWORD
    10.  
    11.     .code
    12.  
    13. ; #########################################################################
    14.  
    15. GetCL proc ArgNum:DWORD, ItemBuffer:DWORD
    16.  
    17.   ; -------------------------------------------------
    18.   ; arguments returned in "ItemBuffer"
    19.   ;
    20.   ; arg 0 = program name
    21.   ; arg 1 = 1st arg
    22.   ; arg 2 = 2nd arg etc....
    23.   ; -------------------------------------------------
    24.   ; Return values in eax
    25.   ;
    26.   ; 1 = successful operation
    27.   ; 2 = no argument exists at specified arg number
    28.   ; 3 = non matching quotation marks
    29.   ; 4 = empty quotation marks
    30.   ; -------------------------------------------------
    31.  
    32.     LOCAL lpCmdLine      :DWORD
    33.     LOCAL cmdBuffer[192] :BYTE
    34.     LOCAL tmpBuffer[192] :BYTE
    35.  
    36.     push esi
    37.     push edi
    38.  
    39.     invoke GetCommandLine
    40.     mov lpCmdLine, eax        ; address command line
    41.  
    42.   ; -------------------------------------------------
    43.   ; count quotation marks to see if pairs are matched
    44.   ; -------------------------------------------------
    45.     xor ecx, ecx            ; zero ecx & use as counter
    46.     mov esi, lpCmdLine
    47.    
    48.     @@:
    49.       lodsb
    50.       cmp al, 0
    51.       je @F
    52.       cmp al, 34            ; [ " ] character
    53.       jne @B
    54.       inc ecx               ; increment counter
    55.       jmp @B
    56.     @@:
    57.  
    58.     push ecx                ; save count
    59.  
    60.     shr ecx, 1              ; integer divide ecx by 2
    61.     shl ecx, 1              ; multiply ecx by 2 to get dividend
    62.  
    63.     pop eax                 ; put count in eax
    64.     cmp eax, ecx            ; check if they are the same
    65.     je @F
    66.       pop edi
    67.       pop esi
    68.       mov eax, 3            ; return 3 in eax = non matching quotation marks
    69.       ret
    70.     @@:
    71.  
    72.   ; ------------------------
    73.   ; replace tabs with spaces
    74.   ; ------------------------
    75.     mov esi, lpCmdLine
    76.     lea edi, cmdBuffer
    77.  
    78.     @@:
    79.       lodsb
    80.       cmp al, 0
    81.       je rtOut
    82.       cmp al, 9     ; tab
    83.       jne rtIn
    84.       mov al, 32
    85.     rtIn:
    86.       stosb
    87.       jmp @B
    88.     rtOut:
    89.       stosb         ; write last byte
    90.  
    91.   ; -----------------------------------------------------------
    92.   ; substitute spaces in quoted text with replacement character
    93.   ; -----------------------------------------------------------
    94.     lea eax, cmdBuffer
    95.     mov esi, eax
    96.     mov edi, eax
    97.  
    98.     subSt:
    99.       lodsb
    100.       cmp al, 0
    101.       jne @F
    102.       jmp subOut
    103.     @@:
    104.       cmp al, 34
    105.       jne subNxt
    106.       stosb
    107.       jmp subSl     ; goto subloop
    108.     subNxt:
    109.       stosb
    110.       jmp subSt
    111.  
    112.     subSl:
    113.       lodsb
    114.       cmp al, 32    ; space
    115.       jne @F
    116.         mov al, 254 ; substitute character
    117.       @@:
    118.       cmp al, 34
    119.       jne @F
    120.         stosb
    121.         jmp subSt
    122.       @@:
    123.       stosb
    124.       jmp subSl
    125.  
    126.     subOut:
    127.       stosb         ; write last byte
    128.  
    129.   ; ----------------------------------------------------
    130.   ; the following code determines the correct arg number
    131.   ; and writes the arg into the destination buffer
    132.   ; ----------------------------------------------------
    133.     lea eax, cmdBuffer
    134.     mov esi, eax
    135.     lea edi, tmpBuffer
    136.  
    137.     mov ecx, 0          ; use ecx as counter
    138.  
    139.   ; ---------------------------
    140.   ; strip leading spaces if any
    141.   ; ---------------------------
    142.     @@:
    143.       lodsb
    144.       cmp al, 32
    145.       je @B
    146.  
    147.     l2St:
    148.       cmp ecx, ArgNum     ; the number of the required cmdline arg
    149.       je clSubLp2
    150.       lodsb
    151.       cmp al, 0
    152.       je cl2Out
    153.       cmp al, 32
    154.       jne cl2Ovr           ; if not space
    155.  
    156.     @@:
    157.       lodsb
    158.       cmp al, 32          ; catch consecutive spaces
    159.       je @B
    160.  
    161.       inc ecx             ; increment arg count
    162.       cmp al, 0
    163.       je cl2Out
    164.  
    165.     cl2Ovr:
    166.       jmp l2St
    167.  
    168.     clSubLp2:
    169.       stosb
    170.     @@:
    171.       lodsb
    172.       cmp al, 32
    173.       je cl2Out
    174.       cmp al, 0
    175.       je cl2Out
    176.       stosb
    177.       jmp @B
    178.  
    179.     cl2Out:
    180.       mov al, 0
    181.       stosb
    182.  
    183.   ; ------------------------------
    184.   ; exit if arg number not reached
    185.   ; ------------------------------
    186.     .if ecx < ArgNum
    187.       mov edi, ItemBuffer
    188.       mov al, 0
    189.       stosb
    190.       mov eax, 2  ; return value of 2 means arg did not exist
    191.       pop edi
    192.       pop esi
    193.       ret
    194.     .endif
    195.  
    196.   ; -------------------------------------------------------------
    197.   ; remove quotation marks and replace the substitution character
    198.   ; -------------------------------------------------------------
    199.     lea eax, tmpBuffer
    200.     mov esi, eax
    201.     mov edi, ItemBuffer
    202.  
    203.     rqStart:
    204.       lodsb
    205.       cmp al, 0
    206.       je rqOut
    207.       cmp al, 34    ; dont write [ " ] mark
    208.       je rqStart
    209.       cmp al, 254
    210.       jne @F
    211.       mov al, 32    ; substitute space
    212.     @@:
    213.       stosb
    214.       jmp rqStart
    215.  
    216.   rqOut:
    217.       stosb         ; write zero terminator
    218.  
    219.   ; ------------------
    220.   ; handle empty quote
    221.   ; ------------------
    222.     mov esi, ItemBuffer
    223.     lodsb
    224.     cmp al, 0
    225.     jne @F
    226.     pop edi
    227.     pop esi
    228.     mov eax, 4  ; return value for empty quote
    229.     ret
    230.   @@:
    231.  
    232.     mov eax, 1  ; return value success
    233.  
    234.     pop edi
    235.     pop esi
    236.  
    237.     ret
    238.  
    239. GetCL endp
    240.  
    241. ; #########################################################################
    242.  
    243. end
     
  10. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    чтобы в ручную не парсить =)))
     
  11. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    ололол =)))
    это UNICODE. там символы двухбайтовые. :lol:
     
  12. patolog

    patolog New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    49
    Код (Text):
    1.             invoke GetCommandLineA
    2.             invoke CommandLineToArgvA,eax,getcommand
    епта :lol:
    и будет тебе АСКИ
    окончание W - значит работа с вайдстринг
    окончание A - значит работа с аски
     
  13. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    patolog
    Проблема в том, что у CommandLineToArgv нет ASCII-варианта. Поэтому дальше надо либо конвертировать результат в аски (WideCharToMultiByte), либо юзать стороннюю (http://alter.org.ua/docs/win/args/), либо дергать LoadLibraryW вместо LoadLibraryA
     
  14. patolog

    patolog New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    49
    MBSTOWCS тогда)
     
  15. patolog

    patolog New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    49
    int Wc2Str( WCHAR* pwcBuf, char* pBuf, int BufLen ){
    if( pwcBuf == NULL || pBuf == NULL ) return -1;
    if( BufLen == 0 )BufLen = wcslen(pwcBuf)+1;
    if( WideCharToMultiByte(CP_ACP, 0, pwcBuf, -1, pBuf, BufLen, NULL, NULL) == 0 )return -1;
    pBuf[wcslen(pwcBuf)] = 0;
    return 0;
    }

    зиродей, нот фор дистрибуте)
     
  16. La_plaza

    La_plaza New Member

    Публикаций:
    0
    Регистрация:
    20 авг 2008
    Сообщения:
    95
    2patolog -> вроде ж проблемы в цэ этой нету, мы вообще-то про асм говорили;)
     
  17. patolog

    patolog New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    49
    а чем это реализация в цэ отличается от асма?
    тем что вместо func(1) пишетцо
    push 1
    call func ?
    или вам надо перевести фунцею и прокомментировать кодес?
     
  18. patolog

    patolog New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    49
    w2c proc pwide:lol: WORD, pchar:lol: WORD, len:lol: WORD
    cmp pwide, 0
    je exit
    cmp pchar, 0
    je exit
    cmp len, 0
    jne len_defined
    push pwide
    call wcslen
    sub esp, 4*1
    inc eax
    len_defined :
    mov eax, len
    xor ebx, ebx
    push ebx
    push ebx
    push eax
    push pchar
    push -1
    push pwide
    push ebx
    push CP_ACP // хз как она продефайнена
    call WideCharToMultiByte
    exit:
    ret
    w2c endp


    както так
     
  19. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    зачем такие заморочки, я всегда напрямую вызываю WideCharToMultiByte =\
     
  20. patolog

    patolog New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    49
    ятоже, но раз уж тут сказали про цэ vs асм, то я просто перевел