UNICODE runtime

Тема в разделе "WASM.WIN32", создана пользователем malex, 8 янв 2025.

  1. k3rnl

    k3rnl Member

    Публикаций:
    0
    Регистрация:
    28 янв 2021
    Сообщения:
    62
    Если говорить "грубо" - в ядре нет никаких ANSI строк, есть только Юникод. То есть любая функция, имеющая префикс А, конвертируется в функцию с префиксом W.
    Делается это простыми Rtl функциями https://learn.microsoft.com/en-us/w...s/ddi/wdm/nf-wdm-rtlunicodestringtoansistring и https://learn.microsoft.com/en-us/w...s/ddi/wdm/nf-wdm-rtlansistringtounicodestring

    Можно даже посмотреть на примере. Возьмите любую А-функцию и посмотрите что в конечном итоге будет вызвано.
    Уже упомянутая CreateProcessInternalW:
    предположим, мы вызываем CreateProcessA
    1.png
    как и следовало ожидать это переопределенный стаб на внутреннюю не экспортируемую функцию CreateProcessInternalA.

    Затем, переходим к внутренностям CreateProcessInternalA и смотрим что там происходит.
    2.png
    А в конечном итоге там происходит преобразование ANSI в строку Юникод (с помощью функции RtlAnsiStringToUnicodeString) и... вызов CreateProcessInternalW.
     
    Последнее редактирование: 10 янв 2025
    malex, Mikl___ и Ahimov нравится это.
  2. Ahimov

    Ahimov Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    71
    Пример.

    Код (Text):
    1. LoadLibraryExA(
    2.     LPCSTR lpLibFileName,
    3.     HANDLE hFile,
    4.     DWORD dwFlags
    5.     )
    6.  
    7. /*++
    8.  
    9. Routine Description:
    10.  
    11.     ANSI thunk to LoadLibraryExW
    12.  
    13. --*/
    14.  
    15. {
    16.     PUNICODE_STRING Unicode;
    17.  
    18.     Unicode = Basep8BitStringToStaticUnicodeString( lpLibFileName );
    19.     if (Unicode == NULL) {
    20.         return NULL;
    21.     }
    22.  
    23.     return LoadLibraryExW( Unicode->Buffer, hFile, dwFlags);
    24. }
    k3rnl

    Примерно тут.
     
    malex и k3rnl нравится это.
  3. aa_dav

    aa_dav Active Member

    Публикаций:
    0
    Регистрация:
    24 дек 2008
    Сообщения:
    479
    "Настоящие" функции WinAPI имеют суффикс W. Функции с суффиксом A конвертируют строки из текущего charset системных настроек в двухбайтовую кодировку винды и вызывают *W.
    Все функции без префикса это просто макросы которые путём анализа #ifdef _UNICODE выставляются либо на имя *A либо на имя *W.
    Но можно без стеснений напрямую тягать имя *W и не парится с тем какой там выставлен макрос _UNICODE при компиляции.
    Вся эта петрушка с TCHAR и _tmain (или как там его) была затеяна MS чтобы облегчить переход с однобайтовых кодировок на свою двухбайтовую, но ныне уже полностью себя изжила - пользоваться однобайтовым режимом компиляции просто уже незачем. А если охота с ним быть совместимым, то можно просто вызывать нужный вариант функций без макросов-обёрток.
    Поэтому проблемы никакой скорее всего и не было.
     
    Последнее редактирование: 10 янв 2025
  4. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    490
    ядро НТ юникодное?
    с какой версии если да
     
  5. aa_dav

    aa_dav Active Member

    Публикаций:
    0
    Регистрация:
    24 дек 2008
    Сообщения:
    479
    С самых первых. Вот в Win 9x как то сложнее было, нараскоряку, но NT-шка сразу стояла на прямых ногах.
     
  6. Ahimov

    Ahimov Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    71
    Сервисные апи вот. Одно из свойств обьекта это его имя, оно задается как OBJECT_ATTRIBUTES.ObjectName:PUNICODE_STRING
     
  7. malex

    malex New Member

    Публикаций:
    0
    Регистрация:
    8 янв 2025
    Сообщения:
    20
    Так в итоге и сделал, завел в библиотеке две функции, а какую вызывать решает клиент, исходя из своей кодировки. Неудобство в том что надо вместо одной лепить пару функций - этакая плата за совместимость.
     
  8. Ahimov

    Ahimov Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    71
    Это все компиляторные нюансы, пример выше:

    Код (C):
    1. CreateProcess%(
    2.     IN LPCTSTR% lpApplicationName,
    3.     IN LPTSTR% lpCommandLine,
    - A/W за раз :preved: