У кого Виндовс, отличная от ХП СП2 просьба проверить, что возвращает lstrcpyA в регистре edx, На ХП в еdx - указатель на конец результирующей строки. Чтобы программу можно было переносить, мне нужно узнать, это особенность конкретной реализации либо во всех виндах функция ведет себя подобным образом, т.е. хочу узнать, стоит ли после копирования самостоятельно искать конец строки, либо можно положиться на АПИшку.
имхо не стоит, лучше написать пару лишних строк кода upd: под xp sp1 x64 (wow) в еdx там адрес конца строки (следующего за нулевым символом байта) w2k3 sp1 -- то-же самое w2k sp4 -- длина строки вместе с нулевым символом
rain Поясните, в чем не прав. А, Вы наверное подумали, ... Короче, я имел ввиду компилятор, которым систему собирали.
сожелею мой друг но компиляторы тут не при чём. всё дело в так называемых соглашениях вызова (поиск по "calling conventions") в частности о __stdcall (х64 родную архитектуру не в счёт). Компилятор которым собирает M$ систему один, поэтому в данном случа результат (edx) будет зависеть только от него, а он в праве менять edx как угодно, так что тут от звёзд все зависит
rain отнюдь не от звезд а от того, как компилятор (!), которым собирали систему, собрал функцию lstrcpy. А именно как он юзал регистр EDX.
хм... ну конечно я же написал (компилятора) видать коряво изъяснился, естественно всё зависит _только от него_, но перёд зать что там будет (в edx), какие опции оптимизации выстявят, что нового в нём понапридумают MS это могут знать только звёзды
Ну там специальный компилятор - зачем он часто вставляет в начало функции MOV EDI,EDI. А вообще EDX может принимать любое значение - он ведь считается временным и не сохраняется. лучше добавляй длину от lstrlenA или от просто strlen. Между прочим выгодней использовать strcpy & strlen чем win32 API функции - 80% они будут встроены (в cl)в виде: Код (Text): mov edi, [string] or ecx, -1 xor eax, eax repne scasb not ecx и в ECX длина строки
Между прочим, в Delphi в исходнике Source\System.pas много хороших готовых методов на asm'е. Например, процедуру Move можно и в asm'е использовать, если немного переделать: Код (Text): Move proc USES EDI ESI ECX, Source:DWORD, Dest:DWORD, Count:DWORD MOV ESI, Source MOV EDI, Dest MOV ECX, Count CMP EDI, ESI JA @1 JE @2 SAR ECX, 2 JS @2 REP MOVSD MOV ECX, Count AND ECX, 03H REP MOVSB JMP @2 @1: LEA ESI, [ESI+ECX-4] LEA EDI, [EDI+ECX-4] SAR ECX, 2 JS @2 STD REP MOVSD MOV ECX, Count AND ECX, 03H ADD ESI, 4-1 ADD EDI, 4-1 REP MOVSB CLD @2: RET Move Endp Использовать для перемещений ВЕЗДЕ! : Код (Text): invoke lstrlenA, pszStrSource inc eax invoke Move, pszStrSource, pszStrDest, EAX
KeSqueer Нет, вот цитата по поводу возвращаемого значения If the function succeeds, the return value is a pointer to the buffer.
Советую вообще не использовать эту тупые C строки - они вечно вызывают ошибки переполнения. Намного круче сделать как в pascale и в win ядре - длину в начало.
Запись длины в начале позволит очень легко контролировать строки (точнее их размер). И не надо постояно 'считать' символы до нуля. (трата времени)
Great Просто в UNICODE_STRING - есть поле "размер", а есть поле "максимальный размер". Вот в таких строках переполнить сложнее, потому как явное ограничение размера буфера, и забота по обработке ложиться на функцию обрабатывающую строку, а не на программиста, из-за которого обычно и происходят переполнения.