запись и поиск в таблице

Тема в разделе "WASM.BEGINNERS", создана пользователем arrrg, 11 дек 2009.

  1. arrrg

    arrrg New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2009
    Сообщения:
    124
    имеется два куска кода
    первый должен заполнить строку таблицы переданными ему параметрами,другой должен ориентируясь на значение счётчика(Connectionn.CV_LSTRING) и после записи увеличить его значение на 1,второй должен найти нужную строку по ключевому значению(элемент key) таблицы и в eax вернуть индекс строки таблицы
    первый кусок:
    Код (Text):
    1. mov esi,2
    2. sub esi,Connectionn.CV_LSTRING
    3. inc esi
    4.  
    5. invoke GetOFFSET,type CL_LongString_VAR,esi,addr CSVvarbuf
    6. mov eax,CLVvarbuf
    7. lea esi,Connectionn.V_LSTRING[0]
    8. lea ebx,(CL_LongString_VAR ptr [esi+eax]).key
    9. invoke lstrcpy,ebx,hkey
    10. invoke CreateEvent,NULL,TRUE,FALSE,NULL
    11. push eax
    12. mov eax,2
    13. sub eax,Connectionn.CV_LSTRING
    14. inc eax
    15. mov ebx,eax
    16. invoke GetOFFSET,type CL_LongString_VAR,ebx,addr CLVvarbuf
    17. mov esi,CLVvarbuf
    18. lea ebx,Connectionn.V_LSTRING[0]
    19. lea edi,(CL_LongString_VAR ptr [esi+ebx]).updateEVENT
    20. pop [edi]
    21. dec Connectionn.CV_LSTRING
    22. lea edi,(CL_LongString_VAR ptr [esi+ebx]).VType
    23. mov eax,VUM
    24. mov [edi],eax
    второй кусок
    Код (Text):
    1. SBK1:
    2. .if num<101
    3. inc num
    4. mov eax,num
    5. .if eax<3
    6. xor eax,eax
    7. mov eax,num
    8. mov edi,__hkey
    9.  
    10. mov ebx,num
    11. invoke GetOFFSET,type CL_LongString_VAR,ebx,addr SBKbuf1
    12. mov esi,SBKbuf1
    13. lea ebx,Connectionn.V_LSTRING[0]
    14.  
    15. lea esi,(CL_LongString_VAR ptr [esi+ebx]).key
    16. invoke lstrcmp,edi,esi
    17. .if eax==0
    18. mov esi,2
    19. jmp SBK2
    20. .endif
    21. .endif
    22. .if eax<6
    23. xor eax,eax
    24. mov eax,num
    25. mov edi,__hkey
    26.  
    27. mov ebx,num
    28. invoke GetOFFSET,type CL_ShortString_VAR,ebx,addr SBKbuf1
    29. mov esi,SBKbuf1
    30. lea ebx,Connectionn.V_SSTRING[0]
    31.  
    32. lea esi,(CL_ShortString_VAR ptr [esi+ebx]).key
    33. invoke lstrcmp,edi,esi
    34. .if eax==0
    35. mov esi,1
    36. jmp SBK2
    37. .endif
    38. .endif
    39. .if eax<101
    40.  
    41. mov eax,num
    42. mov edi,__hkey
    43. lea esi,Connectionn.V_INT[eax].key
    44. invoke lstrcmp,edi,esi
    45. .if eax==0
    46. mov esi,3
    47. jmp SBK2
    48. .endif
    49. .endif
    50. .if eax<101
    51. mov eax,num
    52. mov edi,__hkey
    53. lea esi,Connectionn.V_DOUBLE[eax].key
    54. invoke lstrcmp,edi,esi
    55. .if eax==0
    56. mov esi,4
    57. jmp SBK2
    58. .endif
    59. .endif
    60. jmp SBK1
    61. SBK2:
    62. mov eax,num
    63. jmp SBKend
    64. .endif
    65. mov eax,-1
    66. SBK3:
    67. SBKend:
    уже больше недели немогу найти ошибку
    как видно из кода,в случае,если ничего не найдено,то он возвращает -1 в eax
    проблема в том,что в eax значение позвращается всегда.т.е. я или произвожу запись не туда,или же я ищу не там
    пробовал в ollydb смотреть содержимое адресов,по которым обращаются обе процедуры,но ollydb с настойчивостью броненосца утверждает что такой адрес не существует,хотя AV не происходит
     
  2. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    Трассируй в SoftIce или может в IDA даже - или возьми трейсер который может выводить в execution_log адреса команд обращающихся к памяти.
     
  3. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Команд там немного, т.ч. кроме трассировки нет другого метода и нет никаких проблем сделать это.
    1) Раз olly утверждает, что адрес не существует - что мешает проверить что он не существует по карте памяти?
    2) Раз AV нет - значит обращение идет по другому адресу, опять же трассировка поможет увидеть.
    3) Возможно проблема в подпрограмме, ты почему-то на 100% в ней уверен.
     
  4. gEnIuS_99

    gEnIuS_99 New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2009
    Сообщения:
    28
    1. Разбейте код по логическим блокам.
    2. Внятно прокомментируйте каждую комманду. Ошибка сама исчезнет.