Реализация MultiByteToWideChar

Тема в разделе "WASM.BEGINNERS", создана пользователем piligmindo, 22 фев 2019.

  1. piligmindo

    piligmindo Member

    Публикаций:
    0
    Регистрация:
    31 дек 2018
    Сообщения:
    69
    Приветствую, форумчане. Есть ли возможность реализовать аналог MultiByteToWideChar без использования CRT и WinAPI ? Если у кого то есть готовый код - буду очень признателен.
     
  2. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.549
    Адрес:
    Russia
    piligmindo нравится это.
  3. im.

    im. Active Member

    Публикаций:
    0
    Регистрация:
    16 сен 2017
    Сообщения:
    310
    piligmindo нравится это.
  4. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.955
    Я просто оставлю это здесь (реализация MultiByteToWideChar с XPSP2, чтоб не казалось что это просто) :whistle:
     

    Вложения:

    SadKo и piligmindo нравится это.
  5. piligmindo

    piligmindo Member

    Публикаций:
    0
    Регистрация:
    31 дек 2018
    Сообщения:
    69
    Спасибо) Еще не знаю, буду тестировать:)

    Вообще я не думал, что это настолько сложная задача. Изначально моя задача была вот в чем. Я беду заполненную структуру

    Код (Text):
    1.  
    2. typedef struct _LDR_MODULE {
    3.  
    4.  
    5.   LIST_ENTRY              InLoadOrderModuleList;
    6.   LIST_ENTRY              InMemoryOrderModuleList;
    7.   LIST_ENTRY              InInitializationOrderModuleList;
    8.   PVOID                   BaseAddress;
    9.   PVOID                   EntryPoint;
    10.   ULONG                   SizeOfImage;
    11.   UNICODE_STRING          FullDllName;
    12.   UNICODE_STRING          BaseDllName;
    13.   ULONG                   Flags;
    14.   SHORT                   LoadCount;
    15.   SHORT                   TlsIndex;
    16.   LIST_ENTRY              HashTableEntry;
    17.   ULONG                   TimeDateStamp;
    18.  
    19.  
    20. } LDR_MODULE, *PLDR_MODULE;
    21.  
    22.  

    Получаю ее так:
    Код (Text):
    1.  
    2.  
    3.     INT_PTR mdllist = *(INT_PTR*)(peb + ModuleList);
    4.     INT_PTR mlink = *(INT_PTR*)(mdllist + ModuleListFlink);
    5.     INT_PTR krnbase = *(INT_PTR*)(mlink + KernelBaseAddr);
    6.     LDR_MODULE *mdl = (LDR_MODULE*)mlink;
    7.  
    [FONT=Georgia, Times New Roman, Times, serif]
    В итоге здесь юникод-строка.
    Код (Text):
    1.  
    2.  
    3.  
    4. mdl = (LDR_MODULE*)mdl->e[0].Flink;
    5.  
    6.  
    7. mdl->dllname.Buffer     <--- юникод(
    8.  
    9.  

    Может кто знает, как получить эти данные, только не в юникод-формате, что бы не замораиваться с конвертацией строк? Просто весь остальной код на мультибайтовых строках.[/FONT]
     
  6. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    Конвертация UTF-16 -> UTF-8:
    https://github.com/sadko4u/lsp-plug...3bde538a57cd2a86/src/core/io/charset.cpp#L673

    Конвертация UTF-8 -> UTF-16:
    https://github.com/sadko4u/lsp-plug...3bde538a57cd2a86/src/core/io/charset.cpp#L735

    Вообще, задача становится весьма нетривиальной, если нужно поддерживать ВСЕ кодировки, и сводится к тому дереву вызовов, которое представил f13nd .
     
  7. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.549
    Адрес:
    Russia
    piligmindo, да если вы уверены что там будет только ASCII то можно и ручками конвертнуть. Без монструозных вызовов.