Вопросик по RASAPI

Тема в разделе "WASM.ASSEMBLER", создана пользователем MrMiXeR, 15 ноя 2008.

  1. MrMiXeR

    MrMiXeR New Member

    Публикаций:
    0
    Регистрация:
    27 июн 2008
    Сообщения:
    97
    Приветствую, товарищи знатоки!

    Есть код:


    .data
    strPhoneBookPath db "C:\Documents and Settings\All Users\Application Data\Microsoft\Network\Connections\Pbk\rasphone.pbk", 0

    dwCount dword ?

    .code

    start:
    invoke GlobalAlloc, GPTR, sizeof RasEntry + 1
    assume eax:ptr RASENTRYNAME
    mov [eax].dwSize, sizeof RasEntry
    invoke RasEnumEntries, NULL, offset strPhoneBookPath, addr [eax].szEntryName, eax, offset dwCount
    assume eax:nothing
    .IF (eax == ERROR_BUFFER_TOO_SMALL) || (!eax)
    mov eax, dwCount
    .ELSE
    xor eax, eax
    .ENDIF
    invoke ExitProcess, NULL
    end start

    RasEnumEntries почему-то возвращает ERROR_INVALID_SIZE

    В чём ошибся, подскажите, мозги уже вскипели :)
     
  2. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    MrMiXeR
    наверно из-за выранивания
    sizeof RasEntry даёт не правильный размер из-за того что поля не выронены
     
  3. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    MrMiXeR
    посмотри в сишных хедерах какое правильное выравнивание должно быть
     
  4. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    MrMiXeR
    выравнивать можно .align или
    вводить фмктивные выравнивающии поля
     
  5. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    MrMiXeR
    вот в черновичках нашёл :)
    но это при WINVER >= 0x500
    Код (Text):
    1. myRASENTRYNAME struct
    2.     dwSize              dd ?
    3.     szEntryName          db RAS_MaxEntryName + 1 dup(?);RAS_MaxEntryName 256+1
    4.     x1align              db 3 dup(?)
    5.     dwFlags             dd ?
    6.     szPhonebookPath        db MAX_PATH + 1 dup(?); MAX_PATH 260+1
    7.     x2align              db 3 dup(?)
    8. myRASENTRYNAME ends
     
  6. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    MrMiXeR
    В третьем параметре RasEnumEntries ты передал указатель на RASENTRYNAME.szEntryName, а необходимо передавать указатель на буфер, первое двойное слово которого содержит размер одной структуры RASENTRYNAME. ОС использует этот размер для определения версии структуры, которую ты хочешь получить. В твоем случае это параметр должен быть равен EAX.
    Четвертый параметр RasEnumEntries - это адрес, по которому записан размер буфера, адрес которого передан в третьем параметре. На выходе из RasEnumEntries по этому адресу ОС запишет количество байтов, которые она поместила в буфер. Передач указателя на буфер вполне допустима, пока ты запрашиваешь по одной записи.
    + будет неплохо если перед вызовом RasEnumEntries ты обнулишь dwCount.
     
  7. MrMiXeR

    MrMiXeR New Member

    Публикаций:
    0
    Регистрация:
    27 июн 2008
    Сообщения:
    97
    Вообщем чуть подправил сорец. Только всё равно та же ошибка...


     
  8. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    MrMiXeR
    > подправил сорец
    Это шутка?
    Вижу только mov dwCount, 0, которое было указано факультативно.
    Где ты учел: "В третьем параметре ... необходимо передавать указатель на буфер, первое двойное слово которого содержит размер одной структуры RASENTRYNAME"?
    Было:
    Код (Text):
    1. ;; EAX := адрес буфера
    2. invoke RasEnumEntries, NULL, offset strPhoneBookPath, addr [eax].szEntryName, eax, offset dwCount
    стало
    Код (Text):
    1. ;; ESI := адрес буфера
    2. lea ebx, [esi].szEntryName ;; EBX := адрес RASENTRYNAME.szEntryName
    3. invoke RasEnumEntries, NULL, offset strPhoneBookPath, ebx, esi, offset dwCount
     
  9. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    q_q
    дизасм расапи на размер параметров rasenumentriesA
    Код (Text):
    1. .text:76ED6D87                 mov     edi, 214h
    2. .text:76ED6D8C                 cmp     eax, edi
    3. .text:76ED6D8E                 jz      short loc_76ED6DA0
    4. .text:76ED6D90                 [b]cmp     eax, 108h[/b]
    5. .text:76ED6D95                 jz      short loc_76ED6DA0
    6. .text:76ED6D97                 cmp     eax, 1Ch
    7. .text:76ED6D9A                 jnz     loc_76ED706A
    посмотри ваши размеры и ожидаемые
     
  10. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    q_q
    ну ты понял, что выравнивать надо?
     
  11. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    wsd
    > посмотри ваши размеры и ожидаемые
    Ты сам смотрел на "наши" размеры? Специально для тебя разбираю код ТС:
    1) имеем зануленный (потому что GPTR) буфер;
    2) в первое двойное слово вписали sizeof RASENTRYNAME, допустим 0x105 - неправильное значение;
    3) в функцию передали указатель на _второе_ (потому что addr [eax].szEntryName или lea ebx, [esi].szEntryName) двойное слово в котором ноль.
    Итого: до обсуждения "какой правильный размер RASENTRYNAME" мы еще не добрались.

    > ну ты понял
    А ты?
     
  12. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    q_q
    перепутать параметры это мелочи и легко находятся :)
    а вот насчёт выравнивания - дело не очевидное и голову сломать можно
     
  13. MrMiXeR

    MrMiXeR New Member

    Публикаций:
    0
    Регистрация:
    27 июн 2008
    Сообщения:
    97
    я так понимаю ты меня подталкиваешь к тому что бы получилось так ?

    invoke RasEnumEntries, NULL, offset strPhoneBookPath, esi, esi, offset dwCount

    так как В третьем параметре ... необходимо передавать указатель на буфер, первое двойное слово которого содержит размер одной структуры RASENTRYNAME
     
  14. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    MrMiXeR
    invoke RasEnumEntries, ..., ..., esi, esi, ...
    Да.
    Обязательно обрати внимание на настойчивое замечание wsd по поводу размера RASENTRYNAME.

    wsd
    > перепутать параметры ... легко находятся
    Почему же тогда ты, так настойчиво, указывал на правильный размер RASENTRYNAME?

    > выравнивания - дело не очевидное и голову сломать можно
    Ты же не думаешь, что у тебя одного хватило ума глянуть rasapi32.dll?
     
  15. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    q_q
    потому что раньше сталкивался с неправильно выравненными
    структурами в RAS, их там не одна такая.
    код толком не смотрел, не ожидал просто, что он с параметрами ляпнул
    я что чем-то рисовался, орал про переизбыток ума?
    а когда всё расжованно, часто очень хитромудрые люди, говорят всегда
    что и сами бы сделали , но только это говорят после того как им расжуёш :)))
     
  16. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    wsd
    > код толком не смотрел
    :dntknw:

    я что чем-то рисовался
    Imho ты был избыточно настойчив.
     
  17. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Соорудил маленький пример

    p.s. кито на q_q будет бочку катить, укушу :)
     
  18. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    Flasher
    у тебя структура RASENTRYNAME не правильно описана и поэтому случайно выравнилась
    код у тебя
    Код (Text):
    1. RASENTRYNAME_ struct
    2.     dwSize      dd ?
    3.     szEntryName db MAX_PATH dup(?)
    4. RASENTRYNAME_ ends
    у тебя из-за этого и получился размер 0108h
    а должно во втором поле по докам быть не MAX_PATH,как у тебя, а так RAS_MaxEntryName
    в асмовсих хидерах
    Код (Text):
    1. RASENTRYNAMEA STRUCT
    2.     dwSize dd ?
    3.     szEntryName db RAS_MaxEntryName + 1 dup(?)
    4. RASENTRYNAMEA ENDS
    по мсдн
    Код (Text):
    1. typedef struct _RASENTRYNAME {
    2.   DWORD  dwSize;
    3.   TCHAR  szEntryName[RAS_MaxEntryName + 1];
    4. #if (WINVER >= 0x500)
    5.   DWORD dwFlags;
    6.   TCHAR  szPhonebookPath[MAX_PATH + 1];
    7. #endif
    8. } RASENTRYNAME;
    т.е. фактически ты выровнял структуру используя MAX_PATH за место RAS_MaxEntryName
     
  19. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    wsd, подай в меня суд :))
     
  20. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    Flasher
    все ошибаются ;)