имеется два куска кода первый должен заполнить строку таблицы переданными ему параметрами,другой должен ориентируясь на значение счётчика(Connectionn.CV_LSTRING) и после записи увеличить его значение на 1,второй должен найти нужную строку по ключевому значению(элемент key) таблицы и в eax вернуть индекс строки таблицы первый кусок: Код (Text): mov esi,2 sub esi,Connectionn.CV_LSTRING inc esi invoke GetOFFSET,type CL_LongString_VAR,esi,addr CSVvarbuf mov eax,CLVvarbuf lea esi,Connectionn.V_LSTRING[0] lea ebx,(CL_LongString_VAR ptr [esi+eax]).key invoke lstrcpy,ebx,hkey invoke CreateEvent,NULL,TRUE,FALSE,NULL push eax mov eax,2 sub eax,Connectionn.CV_LSTRING inc eax mov ebx,eax invoke GetOFFSET,type CL_LongString_VAR,ebx,addr CLVvarbuf mov esi,CLVvarbuf lea ebx,Connectionn.V_LSTRING[0] lea edi,(CL_LongString_VAR ptr [esi+ebx]).updateEVENT pop [edi] dec Connectionn.CV_LSTRING lea edi,(CL_LongString_VAR ptr [esi+ebx]).VType mov eax,VUM mov [edi],eax второй кусок Код (Text): SBK1: .if num<101 inc num mov eax,num .if eax<3 xor eax,eax mov eax,num mov edi,__hkey mov ebx,num invoke GetOFFSET,type CL_LongString_VAR,ebx,addr SBKbuf1 mov esi,SBKbuf1 lea ebx,Connectionn.V_LSTRING[0] lea esi,(CL_LongString_VAR ptr [esi+ebx]).key invoke lstrcmp,edi,esi .if eax==0 mov esi,2 jmp SBK2 .endif .endif .if eax<6 xor eax,eax mov eax,num mov edi,__hkey mov ebx,num invoke GetOFFSET,type CL_ShortString_VAR,ebx,addr SBKbuf1 mov esi,SBKbuf1 lea ebx,Connectionn.V_SSTRING[0] lea esi,(CL_ShortString_VAR ptr [esi+ebx]).key invoke lstrcmp,edi,esi .if eax==0 mov esi,1 jmp SBK2 .endif .endif .if eax<101 mov eax,num mov edi,__hkey lea esi,Connectionn.V_INT[eax].key invoke lstrcmp,edi,esi .if eax==0 mov esi,3 jmp SBK2 .endif .endif .if eax<101 mov eax,num mov edi,__hkey lea esi,Connectionn.V_DOUBLE[eax].key invoke lstrcmp,edi,esi .if eax==0 mov esi,4 jmp SBK2 .endif .endif jmp SBK1 SBK2: mov eax,num jmp SBKend .endif mov eax,-1 SBK3: SBKend: уже больше недели немогу найти ошибку как видно из кода,в случае,если ничего не найдено,то он возвращает -1 в eax проблема в том,что в eax значение позвращается всегда.т.е. я или произвожу запись не туда,или же я ищу не там пробовал в ollydb смотреть содержимое адресов,по которым обращаются обе процедуры,но ollydb с настойчивостью броненосца утверждает что такой адрес не существует,хотя AV не происходит
Трассируй в SoftIce или может в IDA даже - или возьми трейсер который может выводить в execution_log адреса команд обращающихся к памяти.
Команд там немного, т.ч. кроме трассировки нет другого метода и нет никаких проблем сделать это. 1) Раз olly утверждает, что адрес не существует - что мешает проверить что он не существует по карте памяти? 2) Раз AV нет - значит обращение идет по другому адресу, опять же трассировка поможет увидеть. 3) Возможно проблема в подпрограмме, ты почему-то на 100% в ней уверен.
1. Разбейте код по логическим блокам. 2. Внятно прокомментируйте каждую комманду. Ошибка сама исчезнет.