Поиск:

Ответ в темуСоздание новой темы Создание опроса
> GetCommandLine, непонятки 
:(
    Опции темы
oleg1973
Дата 23.7.2003, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: 7
Всего: 34



вот возникла проблема
делаю GetCommandLine
если передавать параметры из консоли или батника видим это:
myfile.exe somesux
если из експлорера, windows commandera или в дебугере видим
"с:\myfile.exe" somesux
----
возникла проблема с определением параметра
естественно строка asciiz
какбы параметр выловить чтоб и там и там работало?


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
Chingachguk
Дата 24.7.2003, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



Есть такой код ... ммм... как бы его назвать-то... В общем, это из уроков Айселона (есть на wasm.ru). Подпрограмма определения параметров командной строки. Я сам ею часто пользуюсь:

Цитата

; #########################################################################

      .386                      ; force 32 bit code
      .model flat, stdcall      ; memory model & calling convention
      option casemap :none      ; case sensitive

      include \masm32\include\kernel32.inc

      GetCL PROTO :DWORD,:DWORD

    .code

; #########################################################################

GetCL proc ArgNum:DWORD, ItemBuffer:DWORD

  ; -------------------------------------------------
  ; arguments returned in "ItemBuffer"
  ;
  ; arg 0 = program name
  ; arg 1 = 1st arg
  ; arg 2 = 2nd arg etc....
  ; -------------------------------------------------
  ; Return values in eax
  ;
  ; 1 = successful operation
  ; 2 = no argument exists at specified arg number
  ; 3 = non matching quotation marks
  ; 4 = empty quotation marks
  ; -------------------------------------------------

    LOCAL lpCmdLine      :DWORD
    LOCAL cmdBuffer[192] :BYTE
    LOCAL tmpBuffer[192] :BYTE

    push esi
    push edi

    invoke GetCommandLine
    mov lpCmdLine, eax        ; address command line

  ; -------------------------------------------------
  ; count quotation marks to see if pairs are matched
  ; -------------------------------------------------
    xor ecx, ecx            ; zero ecx & use as counter
    mov esi, lpCmdLine
   
    @@:
      lodsb
      cmp al, 0
      je @F
      cmp al, 34            ; [ " ] character
      jne @B
      inc ecx              ; increment counter
      jmp @B
    @@:

    push ecx                ; save count

    shr ecx, 1              ; integer divide ecx by 2
    shl ecx, 1              ; multiply ecx by 2 to get dividend

    pop eax                ; put count in eax
    cmp eax, ecx            ; check if they are the same
    je @F
      pop edi
      pop esi
      mov eax, 3            ; return 3 in eax = non matching quotation marks
      ret
    @@:

  ; ------------------------
  ; replace tabs with spaces
  ; ------------------------
    mov esi, lpCmdLine
    lea edi, cmdBuffer

    @@:
      lodsb
      cmp al, 0
      je rtOut
      cmp al, 9    ; tab
      jne rtIn
      mov al, 32
    rtIn:
      stosb
      jmp @B
    rtOut:
      stosb        ; write last byte

  ; -----------------------------------------------------------
  ; substitute spaces in quoted text with replacement character
  ; -----------------------------------------------------------
    lea eax, cmdBuffer
    mov esi, eax
    mov edi, eax

    subSt:
      lodsb
      cmp al, 0
      jne @F
      jmp subOut
    @@:
      cmp al, 34
      jne subNxt
      stosb
      jmp subSl    ; goto subloop
    subNxt:
      stosb
      jmp subSt

    subSl:
      lodsb
      cmp al, 32    ; space
      jne @F
        mov al, 254 ; substitute character
      @@:
      cmp al, 34
      jne @F
        stosb
        jmp subSt
      @@:
      stosb
      jmp subSl

    subOut:
      stosb        ; write last byte

  ; ----------------------------------------------------
  ; the following code determines the correct arg number
  ; and writes the arg into the destination buffer
  ; ----------------------------------------------------
    lea eax, cmdBuffer
    mov esi, eax
    lea edi, tmpBuffer

    mov ecx, 0          ; use ecx as counter

  ; ---------------------------
  ; strip leading spaces if any
  ; ---------------------------
    @@:
      lodsb
      cmp al, 32
      je @B

    l2St:
      cmp ecx, ArgNum    ; the number of the required cmdline arg
      je clSubLp2
      lodsb
      cmp al, 0
      je cl2Out
      cmp al, 32
      jne cl2Ovr          ; if not space

    @@:
      lodsb
      cmp al, 32          ; catch consecutive spaces
      je @B

      inc ecx            ; increment arg count
      cmp al, 0
      je cl2Out

    cl2Ovr:
      jmp l2St

    clSubLp2:
      stosb
    @@:
      lodsb
      cmp al, 32
      je cl2Out
      cmp al, 0
      je cl2Out
      stosb
      jmp @B

    cl2Out:
      mov al, 0
      stosb

  ; ------------------------------
  ; exit if arg number not reached
  ; ------------------------------
    .if ecx < ArgNum
      mov edi, ItemBuffer
      mov al, 0
      stosb
      mov eax, 2  ; return value of 2 means arg did not exist
      pop edi
      pop esi
      ret
    .endif

  ; -------------------------------------------------------------
  ; remove quotation marks and replace the substitution character
  ; -------------------------------------------------------------
    lea eax, tmpBuffer
    mov esi, eax
    mov edi, ItemBuffer

    rqStart:
      lodsb
      cmp al, 0
      je rqOut
      cmp al, 34    ; dont write [ " ] mark
      je rqStart
      cmp al, 254
      jne @F
      mov al, 32    ; substitute space
    @@:
      stosb
      jmp rqStart

  rqOut:
      stosb        ; write zero terminator

  ; ------------------
  ; handle empty quote
  ; ------------------
    mov esi, ItemBuffer
    lodsb
    cmp al, 0
    jne @F
    pop edi
    pop esi
    mov eax, 4  ; return value for empty quote
    ret
  @@:

    mov eax, 1  ; return value success

    pop edi
    pop esi

    ret

GetCL endp

; #########################################################################



--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
oleg1973
Дата 24.7.2003, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: 7
Всего: 34



ну это понятно (ужасное нагромождение кода smile.gif))) )
я думал может есть цивильный способ через АПИ
парсер я тоже написал вот :
коротко и элегантно smile.gif
--------------------------------------
format PE GUI 4.0
include '%include%\win32a.inc'
entry start
start:
invoke GetCommandLine
push eax
pop esi
cmp [esi],byte 22h
jz somesux
somesux2:
inc esi
cmp [esi],byte 20h
jz somesux1
jmp somesux2
somesux:
inc esi
cmp [esi],byte 22h
jz somesux1
jmp somesux
somesux1:
inc esi
msg:
invoke MessageBox,0,esi,caption,MB_OK
invoke ExitProcess,0
caption:
db 'CommandLine Parser smile.gif)))))',0
data import
library kernel32,'KERNEL32.DLL',\
user32,'USER32.DLL'
import kernel32,\
ExitProcess,'ExitProcess',\
GetCommandLine,'GetCommandLineA'
import user32,\
MessageBox,'MessageBoxA'
end data
-----------------------------------------------


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
Гость_cully
Дата 24.7.2003, 20:07 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











CommandLineToArgvW
  Вверх
oleg1973
Дата 26.7.2003, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: 7
Всего: 34



ересь и бред CommandLineToArgvW
ты сам то пробовал че выходит ?


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
stab
Дата 29.7.2003, 15:28 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: нет
Всего: 48



Код

   call    GetCommandLineW

   push    offset numArgs
   push    EAX
   call    CommandLineToArgvW

   mov     EDI, EAX
   push    EDI
   mov     ECX, numArgs

@showArgs:
   mov     EAX, [EDI]

   push    ECX
   push    0
   push    0
   push    EAX
   push    0
   call    MessageBoxW
   pop     ECX

   add     EDI, 4

   loop    @showArgs

   call    GlobalFree


и что тут ересь? и что бред?


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
semiono
Дата 17.8.2010, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 28.7.2007

Репутация: нет
Всего: нет



а можно весь код с CommandLineToArgvW выложить, ато я что-то скампилить не могу?
а нельзя смешивать GetCommandLineA c юникод CommandLineToArgvW ?

Это сообщение отредактировал(а) semiono - 17.8.2010, 23:23
PM MAIL ICQ Jabber   Вверх
Mikl_
Дата 18.8.2010, 03:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 9.11.2007

Репутация: 6
Всего: 14



semiono
а на дату предпоследнего сообщения не смотрел? и кто будет отвечать?
последнее посещение stab сайта http://forum.vingrad.ru/forum аж 24.1.2008, а oleg1973 7.1.2007. Некрофил блин  smile 

Это сообщение отредактировал(а) Mikl_ - 18.8.2010, 03:30
PM MAIL   Вверх
semiono
Дата 18.8.2010, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 28.7.2007

Репутация: нет
Всего: нет



Mikl_, а ты для чего?  smile 
зы наверное forum.vingrad.ru не гуглиться, то что мне надо было здесь как по заказу лежит, а я обыскался!

> и кто будет отвечать?
неужто stab уже забанили с тех пор? smile 

Это сообщение отредактировал(а) semiono - 18.8.2010, 10:57
PM MAIL ICQ Jabber   Вверх
semiono
Дата 18.8.2010, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 28.7.2007

Репутация: нет
Всего: нет



oleg1973, при пустом вводе у меня какой-то иероглиф стало выдавать... вчера вроде бы не выдавало 0_
я даже по новой скопипасил, думал может что-то я сам натворил.


Mikl_, если есть у тебя GetCommandLine или CommandLineToArgvW ?
Тут как раз айсзелона вон пример... Только не чт онибудь заумное. Мне нужен лишь параметр для ShellExecute(),
а парсинг чем больше, конечно, тем лучше. smile 

PM MAIL ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1472 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.