Работа с памятью

Тема в разделе "WASM.BEGINNERS", создана пользователем OFFSIDE, 7 фев 2007.

  1. OFFSIDE

    OFFSIDE New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2006
    Сообщения:
    106
    Как заставить функцию вернуть в еах результат?

    Код (Text):
    1. regREAD proc subnod :dword, opt:dword, def:dword
    2. LOCAL Result:dword
    3. LOCAL lData :dword
    4. LOCAL lensub :dword
    5. LOCAL cic :dword
    6. invoke lstrlen,addr subnod
    7. mov lensub,eax
    8. invoke lstrlen,addr RegKey
    9. add eax,lensub
    10. mov lensub,eax
    11. invoke GlobalAlloc,GMEM_FIXED or GMEM_MOVEABLE or GMEM_ZEROINIT,[lensub+1]
    12. mov lData,eax
    13. invoke lstrcpy, lData,addr RegKey
    14. invoke lstrcat, lData, subnod
    15. invoke lstrlen, lData
    16. invoke RegOpenKey,HKEY_LOCAL_MACHINE,lData,addr Result
    17. .If Result == 0
    18. invoke RegCreateKey,HKEY_LOCAL_MACHINE,lData,addr Result
    19.         .If Result == 0
    20.             fn MessageBox,0,"Error while creating the Key!!","Ошибка",MB_OK
    21.             invoke GlobalFree,lData
    22.             ret
    23.         .EndIf
    24. .EndIf
    25. invoke RtlZeroMemory,lData,lensub
    26. invoke GlobalFree,lData
    27. invoke GlobalAlloc,GMEM_FIXED or GMEM_MOVEABLE or GMEM_ZEROINIT,1024
    28. mov lData,eax
    29. mov cic,1024
    30. invoke RegQueryValueEx,Result,opt,NULL,addr lValueType,lData,addr cic
    31. .If eax == 0
    32. .else
    33. invoke lstrlen,def
    34.     invoke RegSetValueEx,Result,opt,0,REG_SZ,def,eax
    35.         .If Result == 0
    36.             fn MessageBox,0,"Error while creating the Key!!","Ошибка",MB_OK
    37.             invoke GlobalFree,lData
    38.             ret
    39.         .EndIf
    40. .EndIf
    41. invoke RegCloseKey,Result
    42. invoke RtlZeroMemory,lData,1024
    43. invoke GlobalFree,lData
    44. mov eax,lData
    45. ret
    46. regREAD endp
     
  2. trash_master

    trash_master New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2006
    Сообщения:
    319
    Адрес:
    Україна
    интересна логика вышеописаних действий :)
    Код (Text):
    1. invoke RtlZeroMemory,lData,1024
    2. invoke GlobalFree,lData
    3. mov eax,lData
    4. ret
    <br>
    .....ах да, совсем забыл, а что она тебе вернуть то должна ?
     
  3. OFFSIDE

    OFFSIDE New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2006
    Сообщения:
    106
    lData - Должна вернуть. А обнуление и освобождение делаю по привычке. А может винда сама за меня это сделает? Или данную операцию придеться все равно производить где-то после обращения к данной функции?
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    какой результат?
     
  5. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    OFFSIDE
    1) Убери из GlobalAlloc флаг GMEM_MOVEABLE. Иначе ты получаешь не указатель на выделенный блок, а его хэндл - тоже указатель, но на отдельный 8-байтный дескриптор, который в итоге засир-ся при lstrcpy. Если нужно непременно MOVEABLE, то не забывай про GlobalLock\Unlock
    2) вызов RtlZeroMemory перед GlobalFree не имеет смысла
    3) возвращать в eax инвалидный указатель на освобожденный блок lData - тоже бессмысленно. Если функция должна возвращать данные в lData, то ес-но нельзя освобождать блок внутри самой функции - придется делать это "самому в другом месте" ;)
     
  6. trash_master

    trash_master New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2006
    Сообщения:
    319
    Адрес:
    Україна
    ппц, а предпоследняя инструкция что по твоему делает ?