Code: drvnameW dw "c",":","","t","m","p","D","r","v",".","s","y","s",0 drvname db 'c:\tmpDrv.sys',0 Как перевести строку динамически drvname в drvnameW , естественно оба буфера будут пустые до перевода и поиска файла ?
Код (Text): invoke lstrlen,drvname mov ecx,eax mov esi,drvname mov edi,drvnameW @@: movzx al,byte[esi] mov word[edi],ax add edi,2 inc esi dec ecx jnz @B Вроде так. Хотя что значит динамически я не понял.
Спсб =) это значит что в переменную drvname попадают разные имена, а потом переводятся в W уже =) и так далее
Код (Text): invoke lstrlen,addr adwInBuffer mov ecx,eax lea esi,adwInBuffer lea edi,adwInBufferW @@: mov al,byte ptr [esi] mov word ptr [edi],ax add edi,2 inc esi dec ecx jnz @B правленный вариант Ursus спсб за наводку
calidus Не всё так просто В макросе делаю так Код (Text): ;----------------------------------------------------------------------------- ; Определяет строку UNICODE заканчивающуюся нулём szUNICODE MACRO ANSI_String % IRPC A_Char, <ANSI_String> IFE ("&A_Char&" - 27h) ; <- игнорировать символы кавычек '' ELSEIFE ("&A_Char&" and 80h) ; <= 7Fh - цифры и латиница db "&A_Char&", 0h ELSEIFE (("&A_Char&" and 0C0h) - 0C0h) ; >= 0C0h Кириллица db ("&A_Char&" - 0B0h), 04h ELSEIFE ("&A_Char&" - 0A7h) ; § db 0A7h, 0h ELSEIFE ("&A_Char&" - 0A8h) ; Ё db 01h, 04h ELSEIFE ("&A_Char&" - 0A9h) ; © db 0A9h, 0h ELSEIFE ("&A_Char&" - 0B8h) ; ё db 051h, 04h ELSEIFE ("&A_Char&" - 0B9h) ; № db 016h, 21h ELSEIFE ("&A_Char&" - 0AEh) ; ® db 0AEh, 0h ELSEIFE ("&A_Char&" - 0B0h) ; ° db 0B0h, 0h ELSEIFE ("&A_Char&" - 0B1h) ; ± db 0B1h, 0h ENDIF ENDM dw 0h ; завершающий ноль ENDM хотя и это охватывет не все ньюансы... Так что динамически надёжнее будет MultiByteToWideChar()
Y_Mur Спасибо большое , под динамически я понимал то что в процессе получаю путь до какогонибудь файла , потом нужно перевести в такой вид например \\system32\\config\\ , а потом в уникод строку чтобы подать этот адрес драйверу. функу MultiByteToWideChar() я включил сделал , но осталось добавить второй слэш в полный путь полученный поиском допустим файлов. А макрос интересный =)
MSoft, имхо лучше использовать свои, заточенные под конкретную задачу, 'апи' мои 'пять копеек': Код (Text): unicode_to_Ansi proc uni_string :dword, receiver_Ansi :dword pushad mov esi, receiver_Ansi mov edi, uni_string edem: cmp word ptr[edi], 0 je done cmp byte ptr[edi], 0 je null mov al, byte ptr[edi] mov byte ptr[esi], al inc esi null: inc edi jmp edem done: inc esi mov byte ptr[esi], 0 popad ret unicode_to_Ansi endp
=) Спасибо ! У когонить есть идеи как лучше сделать из Код (Text): drvname db 'c:\xxx\tmpDrv.sys',0 вот так Код (Text): drvname db 'c:\\xxx\\tmpDrv.sys',0 MSoft не знаю , так как то больше нравится , да и привык не с юникодом работать.
Код (Text): ... make_unicide: ... cmp byte ptr[code_Ansi], 5ch jne make_unicide mov byte ptr[code_unicide], 5ch inc code_unicide mov byte ptr[code_unicide], 5ch jmp make_unicide ... что то типа такого помоему, тс, вы создали тему не в том разделе
litrovith Во первых задача обратная из анси в уникод А во вторых твои "5 коп" будут косячить даже на кириллице, не говоря уже о китайском и пр. так что если речь о вводе строки неизвестным юзером, то 5ю копейками не обойдёшся - придётся писать полный аналог апи, или использовать готовую calidus а здесь уже 5 коп прокатывает элементарно - копируешь посимвольно из строки в строку (почти как в #9, только обе строки анси) и встретив '\' добавляешь ещё один.
Немножко не в тему - в какой-то книжке попалось упоминание о функции, которая конвертирует текст в ртф, и обратно вроде тоже может. Забыл где читал и не могу найти...
Многовато кода вообще-то. И strlen() там зря: Код (Text): macro AnsiToUnicode dest, src { mov esi, src mov edi, dest xor eax, eax @@: lodsb stosw test eax, eax jnz @r } И не работает если попадётся multi-byte как и было замечено.
=) хмм .. тогда надо вручную всетаки , я апи функу использую уже , тогда переделают , кстати разницы между моим правленным для асма и апи функой я вроде не заметил .. хотя с 0 на конце еще не проверил. Спасибо )
Y_Mur во-вторых, я был пьян и, возможно, не понял что к чему , во-первых, никто не говорил что будет все так просто(см. подпись) Y_Mur, "5 коп" работает почему то
litrovith ага вот так: Y_Mur, "5 :>? " @01>B05B ?>G5<C B> )) calidus Для латиницы и не заметишь, но если делать профессионально, то имхо универсальность (многоязычность) лучше сомнительной "простоты" кода.
Код (Text): %macro UTEXT 1 %assign %%a 0 %assign %%b 0 %strlen %%b %1 %assign %%c 1 %assign %%d 0 %rep %%b %substr %%a %1 %%c %if %%d=0 %ifidn %%a, '/' %assign %%d 1 %elif %%a > 127 DB %%a-0B0h,4 %else DW %%a %endif %else %assign %%d 0 %ifidn %%a, '/' DW '/' %elifidn %%a, 'n' DW 0Dh, 0Ah %elifidn %%a, 'r' DW 0Dh %elifidn %%a, 'l' DW 0Ah %elifidn %%a, 's' DW 20h %elifidn %%a, 'c' DW 3Bh %elifidn %%a, 't' DW 09h %elifidn %%a, '0' DW 0 %elifidn %%a, '1' DW 1 %else DW '/', %%a %endif %endif %assign %%c %%c+1 %endrep DW 0 %endmacro Это в nasm, yasm. Код (Text): UTEXT "c:\\xxx\\tmpDrv.sys" нормально переведет в unicode с добавлением завершающего нуля и нормальной обработкой "\\", "\n", "\t" работает для латиницы и кириллицы, а для "китайского и пр." естественно не подойдет -- там свое подобие unicode (кодировка gb и big5)
Mikl___ заглючит на §Ё©ё№®°± и пр. спецсимволах Так что макрос не катит - я свой привёл только чтобы продемонстрировать, что уникод вообще-то не сводится к "5 коп" ТС нужна не "нормальная обработка" а "\" -> "\\" ЗЫ: не люблю когда проги начинают глючить от того что их помещают в каталог с русскими буквами, пробелами и т.п., и увы - такой прокол частенько встречается, причём как правило такие проги даже не соизволяют уведомить юзера, что же им собственно не нравится.