Приветствую, товарищи знатоки! Есть код: .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 В чём ошибся, подскажите, мозги уже вскипели
MrMiXeR наверно из-за выранивания sizeof RasEntry даёт не правильный размер из-за того что поля не выронены
MrMiXeR вот в черновичках нашёл но это при WINVER >= 0x500 Code (Text): myRASENTRYNAME struct dwSize dd ? szEntryName db RAS_MaxEntryName + 1 dup(?);RAS_MaxEntryName 256+1 x1align db 3 dup(?) dwFlags dd ? szPhonebookPath db MAX_PATH + 1 dup(?); MAX_PATH 260+1 x2align db 3 dup(?) myRASENTRYNAME ends
MrMiXeR В третьем параметре RasEnumEntries ты передал указатель на RASENTRYNAME.szEntryName, а необходимо передавать указатель на буфер, первое двойное слово которого содержит размер одной структуры RASENTRYNAME. ОС использует этот размер для определения версии структуры, которую ты хочешь получить. В твоем случае это параметр должен быть равен EAX. Четвертый параметр RasEnumEntries - это адрес, по которому записан размер буфера, адрес которого передан в третьем параметре. На выходе из RasEnumEntries по этому адресу ОС запишет количество байтов, которые она поместила в буфер. Передач указателя на буфер вполне допустима, пока ты запрашиваешь по одной записи. + будет неплохо если перед вызовом RasEnumEntries ты обнулишь dwCount.
MrMiXeR > подправил сорец Это шутка? Вижу только mov dwCount, 0, которое было указано факультативно. Где ты учел: "В третьем параметре ... необходимо передавать указатель на буфер, первое двойное слово которого содержит размер одной структуры RASENTRYNAME"? Было: Code (Text): ;; EAX := адрес буфера invoke RasEnumEntries, NULL, offset strPhoneBookPath, addr [eax].szEntryName, eax, offset dwCount стало Code (Text): ;; ESI := адрес буфера lea ebx, [esi].szEntryName ;; EBX := адрес RASENTRYNAME.szEntryName invoke RasEnumEntries, NULL, offset strPhoneBookPath, ebx, esi, offset dwCount
q_q дизасм расапи на размер параметров rasenumentriesA Code (Text): .text:76ED6D87 mov edi, 214h .text:76ED6D8C cmp eax, edi .text:76ED6D8E jz short loc_76ED6DA0 .text:76ED6D90 [b]cmp eax, 108h[/b] .text:76ED6D95 jz short loc_76ED6DA0 .text:76ED6D97 cmp eax, 1Ch .text:76ED6D9A jnz loc_76ED706A посмотри ваши размеры и ожидаемые
wsd > посмотри ваши размеры и ожидаемые Ты сам смотрел на "наши" размеры? Специально для тебя разбираю код ТС: 1) имеем зануленный (потому что GPTR) буфер; 2) в первое двойное слово вписали sizeof RASENTRYNAME, допустим 0x105 - неправильное значение; 3) в функцию передали указатель на _второе_ (потому что addr [eax].szEntryName или lea ebx, [esi].szEntryName) двойное слово в котором ноль. Итого: до обсуждения "какой правильный размер RASENTRYNAME" мы еще не добрались. > ну ты понял А ты?
q_q перепутать параметры это мелочи и легко находятся а вот насчёт выравнивания - дело не очевидное и голову сломать можно
я так понимаю ты меня подталкиваешь к тому что бы получилось так ? invoke RasEnumEntries, NULL, offset strPhoneBookPath, esi, esi, offset dwCount так как В третьем параметре ... необходимо передавать указатель на буфер, первое двойное слово которого содержит размер одной структуры RASENTRYNAME
MrMiXeR invoke RasEnumEntries, ..., ..., esi, esi, ... Да. Обязательно обрати внимание на настойчивое замечание wsd по поводу размера RASENTRYNAME. wsd > перепутать параметры ... легко находятся Почему же тогда ты, так настойчиво, указывал на правильный размер RASENTRYNAME? > выравнивания - дело не очевидное и голову сломать можно Ты же не думаешь, что у тебя одного хватило ума глянуть rasapi32.dll?
q_q потому что раньше сталкивался с неправильно выравненными структурами в RAS, их там не одна такая. код толком не смотрел, не ожидал просто, что он с параметрами ляпнул я что чем-то рисовался, орал про переизбыток ума? а когда всё расжованно, часто очень хитромудрые люди, говорят всегда что и сами бы сделали , но только это говорят после того как им расжуёш ))
Flasher у тебя структура RASENTRYNAME не правильно описана и поэтому случайно выравнилась код у тебя Code (Text): RASENTRYNAME_ struct dwSize dd ? szEntryName db MAX_PATH dup(?) RASENTRYNAME_ ends у тебя из-за этого и получился размер 0108h а должно во втором поле по докам быть не MAX_PATH,как у тебя, а так RAS_MaxEntryName в асмовсих хидерах Code (Text): RASENTRYNAMEA STRUCT dwSize dd ? szEntryName db RAS_MaxEntryName + 1 dup(?) RASENTRYNAMEA ENDS по мсдн Code (Text): typedef struct _RASENTRYNAME { DWORD dwSize; TCHAR szEntryName[RAS_MaxEntryName + 1]; #if (WINVER >= 0x500) DWORD dwFlags; TCHAR szPhonebookPath[MAX_PATH + 1]; #endif } RASENTRYNAME; т.е. фактически ты выровнял структуру используя MAX_PATH за место RAS_MaxEntryName