UNICODE runtime

Discussion in 'WASM.WIN32' started by malex, Jan 8, 2025.

  1. k3rnl

    k3rnl Member

    Blog Posts:
    0
    Joined:
    Jan 28, 2021
    Messages:
    68
    Если говорить "грубо" - в ядре нет никаких 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.
     
    Last edited: Jan 10, 2025
    malex, Mikl___ and Ahimov like this.
  2. Ahimov

    Ahimov Active Member

    Blog Posts:
    0
    Joined:
    Oct 14, 2024
    Messages:
    138
    Пример.

    Code (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 and k3rnl like this.
  3. aa_dav

    aa_dav Active Member

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

    alex_dz Active Member

    Blog Posts:
    0
    Joined:
    Jul 26, 2006
    Messages:
    530
    ядро НТ юникодное?
    с какой версии если да
     
  5. aa_dav

    aa_dav Active Member

    Blog Posts:
    0
    Joined:
    Dec 24, 2008
    Messages:
    525
    С самых первых. Вот в Win 9x как то сложнее было, нараскоряку, но NT-шка сразу стояла на прямых ногах.
     
  6. Ahimov

    Ahimov Active Member

    Blog Posts:
    0
    Joined:
    Oct 14, 2024
    Messages:
    138
    Сервисные апи вот. Одно из свойств обьекта это его имя, оно задается как OBJECT_ATTRIBUTES.ObjectName:PUNICODE_STRING
     
  7. malex

    malex New Member

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

    Ahimov Active Member

    Blog Posts:
    0
    Joined:
    Oct 14, 2024
    Messages:
    138
    Это все компиляторные нюансы, пример выше:

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