Реализация MultiByteToWideChar

Discussion in 'WASM.BEGINNERS' started by piligmindo, Feb 22, 2019.

  1. piligmindo

    piligmindo Member

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

    TermoSINteZ Синоби даоса Staff Member

    Blog Posts:
    2
    Joined:
    Jun 11, 2004
    Messages:
    3,568
    Location:
    Russia
    piligmindo likes this.
  3. im.

    im. Active Member

    Blog Posts:
    0
    Joined:
    Sep 16, 2017
    Messages:
    310
    piligmindo likes this.
  4. f13nd

    f13nd Well-Known Member

    Blog Posts:
    0
    Joined:
    Jun 22, 2009
    Messages:
    2,020
    Я просто оставлю это здесь (реализация MultiByteToWideChar с XPSP2, чтоб не казалось что это просто) :whistle:
     

    Attached Files:

    SadKo and piligmindo like this.
  5. piligmindo

    piligmindo Member

    Blog Posts:
    0
    Joined:
    Dec 31, 2018
    Messages:
    69
    Спасибо) Еще не знаю, буду тестировать:)

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

    Code (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.  

    Получаю ее так:
    Code (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]
    В итоге здесь юникод-строка.
    Code (Text):
    1.  
    2.  
    3.  
    4. mdl = (LDR_MODULE*)mdl->e[0].Flink;
    5.  
    6.  
    7. mdl->dllname.Buffer     <--- юникод(
    8.  
    9.  

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

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

    Blog Posts:
    8
    Joined:
    Jun 4, 2007
    Messages:
    1,610
    Location:
    г. Санкт-Петербург
    Конвертация 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 Синоби даоса Staff Member

    Blog Posts:
    2
    Joined:
    Jun 11, 2004
    Messages:
    3,568
    Location:
    Russia
    piligmindo, да если вы уверены что там будет только ASCII то можно и ручками конвертнуть. Без монструозных вызовов.