Резервирование данных...

Тема в разделе "WASM.BEGINNERS", создана пользователем Semiono, 19 дек 2010.

  1. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    793
    1. Что лучше определять в начале - структуры или одиночные куски?
    2. Как можно избавиться от нехватки длинны буффера или же наоборот от затирания одних данных другими? Кстати что такое выравнивание, только не грузите сильно, в двух словах, что это практически?
    3. Нужно ли для msdn api при однотипных вызовах резервировать разные переменные, или же можно
    одну использовать многократно, напр. phkResult, lpcbData итп. ?
    Надеюсь, что что-то общее здесь имеет место? Надоело всякие неожиданные грабли.

    Вот немного примера, есть ли здесь лажа и много ли я тут криво написал?

    Код (Text):
    1.         mov [lpFileOp.wFunc],0x0003
    2.         mov [lpFileOp.fFlags],0x0014
    3.  
    4.         invoke GetEnvironmentVariable,'SystemDrive',cmpi64,3
    5.         invoke lstrcat,cmpi64,'\Program Files'
    6.         mov [lpFileOp.pFrom],cmpi64
    7.  
    8.         invoke RegOpenKeyEx,HKEY_LOCAL_MACHINE,'Software\Microsoft\Windows\CurrentVersion',NULL,KEY_READ,phkResult
    9.         invoke RegQueryValueEx,[phkResult],'ProgramFilesDir',NULL,NULL,FilesDir64,cb64
    10.         invoke RegCloseKey,[phkResult]
    11.  
    12.         cmp [FilesDir64],NULL
    13.         jz @f
    14.         invoke lstrcmpi,cmpi64,FilesDir64
    15.         cmp rax,NULL
    16.         jz @f
    17.         invoke SHFileOperation,lpFileOp
    18. @@:
    19.         invoke GetEnvironmentVariable,'SystemDrive',cmpi86,3
    20.         invoke lstrcat,cmpi86,'\Program Files (x86)'
    21.         mov [lpFileOp.pFrom],cmpi86
    22.  
    23.         invoke RegOpenKeyEx,HKEY_LOCAL_MACHINE,'Software\Microsoft\Windows\CurrentVersion',NULL,KEY_READ,phkResult
    24.         invoke RegQueryValueEx,[phkResult],'ProgramFilesDir (x86)',NULL,NULL,FilesDir86,cb86
    25.         invoke RegCloseKey,[phkResult]
    26.  
    27.         cmp [FilesDir86],NULL
    28.         jz exit
    29.         invoke lstrcmpi,cmpi86,FilesDir86
    30.         cmp rax,NULL
    31.         jz exit
    32.         invoke SHFileOperation,lpFileOp
    33. exit:
    34.         invoke ExitProcess,NULL
    35.  
    36. section '.data' readable writeable
    37.  
    38.         struct LPSHFILEOPSTRUCT
    39.         hwnd dq NULL
    40.         wFunc dq NULL
    41.         pFrom dq NULL
    42.         pTo dq NULL
    43.         fFlags dq NULL
    44.         fAnyOperationsAborted dq NULL
    45.         hNameMappings dq NULL
    46.         lpszProgressTitle dq NULL
    47.         ends
    48.  
    49.         lpFileOp LPSHFILEOPSTRUCT
    50.  
    51.         cmpi64 rd MAX_PATH
    52.         cmpi86 rd MAX_PATH
    53.         FilesDir64 rd MAX_PATH
    54.         FilesDir86 rd MAX_PATH
    55.         cb64 dq MAX_PATH
    56.         cb86 dq MAX_PATH
    57.  
    58.         phkResult dq NULL
     
  2. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    1)Сейчас, по-моему, всё равно. Это раньше нужно было стараться впихнуть данные в секции.
    2)Первый вопрос не понял. Выравнивание - отступ от определённого адреса.
    3)Во первых нет MSDN API, есть WinAPI, переменные, как ты понимаешь, могут называться хоть ВасяПупкин, главное чтобы ты не затирал используемые данные. Это просто функции, не более.
     
  3. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    В коде вроде бы всё нормально, но я сонный, так что твёрдо утверждать не берусь.
     
  4. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    793
    Вот это точно нельзя вторично использовать - lpcbData, вообще этот параметр меня всегда раздражает,
    практически нигде не нужен тем более при чтении, дык он ещё и сохраняется хоть вручную вычищай!
    Хорошо проверил код, сначала как будто бы всё правильно, но при различной длинне данных в реестре
    косяк вышел, поэтому lpcb1 lpcb2 надёжнее.

    2. Недавно был вопрос со структурой под win64ax, мне посоветовали align 8 кажись,
    но потом всё просто квордами разрешилось в данных структуры.
     
  5. Clyde

    Clyde New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    154
    Semiono старайтесь вместо глобальных переменных использовать локальные.
    Это и будет экономить вам место, а не использование одной переменной под разные нужды.
     
  6. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    Semiono,

    Правильное выравнивание полей структур (и правильный размер самой структуры, кратный её выравниванию) — это важно. Большинство элементов структуры выравнивается на их размер (исключение навскидку: 80-битные long double равняются на 8 байт; это указано в Intel SDM, см. #AC). Выравнивание самой структуры должно равняться наибольшему из выравниваний — мня, как коряво звучит — её полей (чтобы сами поля были адекватно выровнены). И, как уже сказано выше, размер структуры должен быть кратен её выравниванию (чтобы каждое поле элемента массива структур тоже было правильно выровнено). Примерно так.

    Для компилятора с языка высокого уровня учитывать эти факторы проще простого, а вот вручную — нужны хитрые макросы. Ну и при размещении переменных в стэке неплохо бы. :derisive: