на С есть код(использование RasServise) Код (Text): RASCONN ras[20]; DWORD dSize,dNumber; ras[0].dwSize = sizeof(RASCONN); dSize = sizeof( ras ); int ret=RasEnumConnections( ras, &dSize, &dNumber ) работает нормально с кодом завершения 0 перевод(MASM32) Код (Text): .data dSize dd 0 rasCon RASCONN 20 dup(<0>) dNumber dd 0 ... .code mov rasCon[0].dwSize, sizeof RASCONN mov dSize, sizeof rasCon invoke RasEnumConnections, addr rasCon, addr dSize, addr dNumber ASM вариант почемуто возвращает ERROR_INVALID_SIZE.... Какой сайз я сделал инвалидом?
Нашёл! Смотрел сишные хидеры, а там оказывается структура RASCONN меняется в размере от версии винды. А в масме хедере нет...
Изменение размера структуры в новых версиях не должно повлиять на работу старых программ. Это называется совместимостью, для этого и передается размер структуры. А отладчик нужен в первую очередь для отладки своих программ.
GMax Но в стандартных масмовских версиях хидера описана очень ранняя версия этой структуры. Пришлось руками свою по сишным хидерам делать. Спасибо за участие!
GMax Тут ситуация прояснилась! Сначала я просто чисто текстуально искал проблему. А так как текстуально проблемы не было , я воспринял Ваш намёк на отладчик как призыв к реверсу rasapi32.dll потому что в моей как...ке повторяюсь текстуально проблем не было. И всё-таки мне эта проблема стала глубоко интересна. Я нашёл наконец время и реверснул маленько rasapi32.dll. Хорошо что там быстро нашёл свечу(.text:76ED6931) на выбор размеров вариантов структуры. Обычно прибегаю к реверсу крайне редко, потому как неизвестно заранее сколько это займёт время. Там действительно полная совместимость как Вы и говорили! 5 вариантов структур! Всё дело оказалось в том что в ras.h в начале идут включения других хидеров а в них прагмами задаётся выравнивания и я это дело сразу непросёк!!!! А мой случай последнего варианта этой структуры просто совпал с выровненным размером чисто случайно.И поэтому чисто случайно и работало!!! И всётаки непонимаю составителей хидеров масма... Почему они сами не включили в структуру фиктивное выравнивающее поле? GMax большое спасибо за намёк! И извиняюсь что не так его понял))
wsd Я рад, что оказался полезен. Когда писал по отладчик имел ввиду проверить передаваемые функции параметры. Запустить работающую версию программы (С) и не работающую (ASM) под отладчиком и сравнить передаваемый размер структуры. А составителям хидеров MASM32 надо сказать спасибо за то что не приходится все делать с нуля.
К как вот это перевести с С на АСМ: Код (Text): static char szStr[256]; ZeroMemory(szStr, sizeof(szStr)); static char szText[256]; strcpy(szText, "0123456789"); static unsigned char buffer[256]; ZeroMemory(buffer, sizeof(buffer)); int i = 0, k = 0; while (TRUE) { buffer[k] = (unsigned char)szText[i]; if (!szText[i]) break; k = (unsigned char)szText[i]; i++; }
ASM: Код (Text): .data szText db "0123456789",0 szStr db 256 dup (0) buffer db 256 dup (0) .code xor ecx,ecx xor edi,edi loop: mov al, BYTE PTR szText[ecx] mov BYTE PTR buffer[edi],al .if al!=0 jmp exitloop .endif mov dl,al inc ecx jmp loop exitloop: IMHO: В данном коде обнуление массивов не нужно. И вообще странный (не оптимальный) алгоритм. add: Сори сразу не разобрался. Поправил код.
Код (Text): #include "stdio.h" #include "conio.h" #include "windows.h" int main(int argc, char* argv[]) { static char szPassword[256]; ZeroMemory(szPassword, sizeof(szPassword)); static char szAlphabet[256]; strcpy(szAlphabet, "ABC"); static unsigned char bAlphabet[256]; ZeroMemory(bAlphabet, sizeof(bAlphabet)); int i = 0, k = 0; while (TRUE) { bAlphabet[k] = (unsigned char)szAlphabet[i]; if (!szAlphabet[i]) break; k = (unsigned char)szAlphabet[i]; i++; } while (TRUE) { __asm { nop nop pushad mov edi,offset szPassword mov ebx,offset bAlphabet L1: movzx eax,byte ptr [edi] xlat cmp al,0 je L3 mov [edi],al jmp L5 L3: xlat stosb jmp L1 L5: popad nop nop } printf("%s\n", szPassword); } return 0; } Я зацепился за xlat Не пойму как она работает. в Олли: xlat byte ptr [ebx+al]. или вот что у меня в АСМБУКЕ: al=31 [ebx] -> 0123 то есть буквально: xlat byte ptr [адрес 30 + смещение 31] но ведь адрес [0+31] , будет гдето 0123...................................61 или я тормоз...
01478520 Забей на xlat, если не важен размер кода. Код (Text): ;<< buildLmABCTable buildLmABCTable: push ebx esi edi ebp mov esi,bLmAlphabet mov edi,bLmAbcTable mov ebp,[nLmAlphabet] shr ebp,2 adc ebp,0 ; минимум 1 проход ; очистка таблицы mov edx,edi mov ecx,nAlphabetLen/4 xor eax,eax rep stosd mov edi,edx align ALIGN_CYCLES @@: movzx eax,byte[esi] ; 1й символ movzx edx,byte[esi+1] ; 2й символ movzx ecx,byte[esi+2] ; 3й символ movzx ebx,byte[esi+3] ; 4й символ mov [edi+eax],dl ; 2й по адресу 1го mov [edi+edx],cl ; 3й по адресу 2го movzx edx,byte[esi+4] ; 5й символ mov [edi+ecx],bl ; 4й по адресу 3го mov [edi+ebx],dl ; 5й по адресу 4го add esi,4 sub ebp,1 jnz @B mov al,[bLmAlphabet] mov [edi],ax ; 1й символ по адресу 0 pop ebp edi esi ebx ret ;>>
угу. посмотрим. спасибо. [megaofftop] а movzx обнуляет и заносит? или как? и где почитать про инструкции (как можно полный список) в таком виде: MOVZX это - ................ Признаки ........ Команда: MOVZX ............ Логика: ................... Описание ........................... ------------------------------------------------------------- Операнды Такты Обращения Байты Пример ............. ..... ...... .... ...... ------------------------------------------------------------- Примечания: Пример: PS: buildLmABCTable из какогото брута реверснул?