Многие наверное сталкивались с ошибкой в винде ERROR_NOACCESS из-за отсутствия выравнивания переменных. Собственно вопрос: Как выравнить все переменные в секции .data? У меня их 100 штук и перед каждой писать align 4 не серьезно.
Если переменные кратны 4м, то align 4 не нужен) А вообще - поступи как компилятор: сгруппируй переменные по размеру.
Сгрупировать это интересно, но хотелось бы что бы каждая новая переменная была выровнена автоматически.
Я что-то пропустил? Можно чуть подробнее - что за проблема? Я впервые о таком слышу и хотелось бы узнать побольше
Ну как же? Я на форуме ответ даже нашел. При вызове функции LookupPrivilegeValue и AdjustTokenPrivileges Последняя вылетает с кодом ошибки ERROR_NOACCESS если аргументы не выровнены по границе 4 байта. http://www.wasm.ru/forum/viewtopic.php?id=15071 http://www.wasm.ru/forum/viewtopic.php?id=15319 вот код: Код (Text): .data align 4 NtdllDLL db "ntdll.dll",0 align 4 Advapi32 db "Advapi32.dll",0 align 4 PrivTakeOwnership db "SeTakeOwnershipPrivilege",0 align 4 PrivTcb db "SeTcbPrivilege",0 align 4 PrivChangeNotify db "SeChangeNotifyPrivilege",0 align 4 PrivIncreaseQuota db "SeIncreaseQuotaPrivilege",0 align 4 PrivAssignPrimToken db "SeAssignPrimaryTokenPrivilege",0 align 4 PrivCreateToken db "SeCreateTokenPrivilege",0 align 4 PrivDebug db "SeDebugPrivilege",0 align 4 UserName db "Petya",0 align 4 startInfo STARTUPINFO <0> align 4 processInfo PROCESS_INFORMATION <0> align 4 temp dd 0 align 4 oa OBJECT_ATTRIBUTES <sizeof(OBJECT_ATTRIBUTES), 0, 0, 0, 0, 0> align 4 MyToken dd 0 .code main proc local CurrProcessHandle:DWORD local CurrProcessToken:DWORD local ntdllHandle:DWORD local advapi32Handle:DWORD ll: mov ecx,2 loop ll Если нужно выровнить все переменные в секции .data то приходиться писать align 4 перед каждой. Это очень не удобно. Задача такая: Нужно начальные адреса всех переменных, независимо от того кратны они по размеру 4 или нет, выровнить по границе 4 байта. В идеале код выглядел бы так: Код (Text): .data [b]ALIGN_ALL 4[/b] NtdllDLL db "ntdll.dll",0 Advapi32 db "Advapi32.dll",0 PrivTakeOwnership db "SeTakeOwnershipPrivilege",0 PrivTcb db "SeTcbPrivilege",0 PrivChangeNotify db "SeChangeNotifyPrivilege",0 PrivIncreaseQuota db "SeIncreaseQuotaPrivilege",0 PrivAssignPrimToken db "SeAssignPrimaryTokenPrivilege",0 PrivCreateToken db "SeCreateTokenPrivilege",0 PrivDebug db "SeDebugPrivilege",0 UserName db "Petya",0 startInfo STARTUPINFO <0> align 4 processInfo PROCESS_INFORMATION <0> ... Главное чтобы не нужно было перед каждой переменной писать align 4
netex Да, есть некоторые особые случаи, в которых выравнивание необходимо, но в основном никакие align'ы не нужны.