### Author Topic: how do i change the 32 bit udw2str into 64 bit udw2str?  (Read 750 times)

#### six_L

• Member
• Posts: 132
##### how do i change the 32 bit udw2str into 64 bit udw2str?
« on: December 22, 2017, 03:48:00 PM »
Code: [Select]
`udw2str proc dwNumber:DWORD, pszString:DWORD    push ebx    push esi    push edi    mov     eax, [dwNumber]    mov     esi, [pszString]    mov     edi, [pszString]    mov ecx,429496730  @@redo:    mov ebx,eax    mul ecx    mov eax,edx    lea edx,[edx*4+edx]    add edx,edx    sub ebx,edx    add bl,'0'    mov [esi],bl    inc esi    test    eax, eax    jnz     @@redo    jmp     @@chks  @@invs:     dec     esi    mov     al, [edi]    xchg    [esi], al    mov     [edi], al    inc     edi  @@chks:    cmp     edi, esi    jb      @@invs    pop edi    pop esi    pop ebx    retudw2str endp`error changed:
Code: [Select]
`udw2str proc dwNumber:QWORD, pszString:QWORD push rbx push rsi push rdi mov     rax,dwNumber mov     rsi,pszString mov     rdi,pszString mov rcx,0199999999999999Ah@@redo: mov rbx,rax mul rcx mov rax,rdx lea rdx,[rdx*4+rdx] add rdx,rdx sub rbx,rdx add bl,'0' mov [rsi],bl inc rsi test    rax, rax jnz     @@redo jmp     @@chks@@invs: dec     rsi mov     al, [rdi] xchg    [rsi], al mov     [rdi], al inc     rdi@@chks: cmp     rdi, rsi jb      @@invs pop rdi pop rsi pop rbx retudw2str endp`

#### AW

• Member
• Posts: 1357
• Let's Make ASM Great Again!
##### Re: how do i change the 32 bit udw2str into 64 bit udw2str?
« Reply #1 on: December 25, 2017, 01:04:08 AM »
This is a recursive variation, which supports radix and can be easily changed to support qwords as well:

Code: [Select]
`includelib \masm32\lib64\kernel32.libExitProcess PROTO :dwordincludelib \masm32\lib64\msvcrt.libprintf PROTO :ptr, :varargRADIX=16.data value dd 0AA773145h ;value dd 2859938117 result db 32 dup (0).codeutostr64 proc pValue:dword, pStr:PTR, itCount:dword LOCAL locValue : DWORD and rsp, -16 mov r9, rdx mov locValue, 0 cmp r8,0 jnz @F mov r10d, ecx@@: cmp ecx, RADIX jb L0 mov rax, rcx mov ecx, RADIX xor rdx, rdx div ecx mov locValue, eax mov rdx, r9 mov ecx, eax inc r8 call utostr64L0: xor rdx, rdx mov eax, locValue mov ecx, RADIX div ecx cmp edx, 10 jb @F add edx, 55 jmp short L1@@: add edx, 48L1: mov byte ptr [r9], dl inc r9 mov rdx, r9 mov ecx, locValue cmp r8,0 jnz @F mov locValue, r10d dec r8 jmp short L0@@: dec r8 retutostr64 endpmain   proc sub rsp, 28h mov r8, 0 mov ecx, value mov rdx, OFFSET result call utostr64 mov rcx, OFFSET result call printf mov ecx,0 call ExitProcessmain   endpend`
So it prints:
0AA773145

#### six_L

• Member
• Posts: 132
##### Re: how do i change the 32 bit udw2str into 64 bit udw2str?
« Reply #2 on: December 25, 2017, 10:42:41 PM »
hi,aw27
thanks you very much.
the following codes is being crashed. i don't know that's why.
Quote
\UASM64\bin\uasm64 -c -win64 %name%.asm
\UASM64\bin\rc %name%.rc
\UASM64\bin\link /ENTRY:start /SUBSYSTEM:windows /MACHINE:X64 %name%.obj %name%.res

UASM v2.46, Dec  4 2017, Masm-compatible assembler.
Source code is available under the Sybase Open Watcom Public License.

gdiType_3.asm: 162 lines, 3 passes, 170 ms, 0 warnings, 0 errors
Microsoft (R) Windows (R) Resource Compiler Version 6.3.9600.17336

Microsoft (R) Incremental Linker Version 10.00.40219.01
Code: [Select]
`option casemap:noneoption win64:7include \UASM64\include\windows.incinclude \UASM64\include\gdiplus.incincludelib \UASM\UASM64\Lib\user32.libincludelib \UASM\UASM64\Lib\kernel32.libincludelib \UASM\UASM64\Lib\gdiplus.libincludelib \UASM\UASM64\Lib\Ole32.libincludelib \UASM\UASM64\Lib\NtosKrnl.lib ICO_MAIN equ 1000 DLG_MAIN equ 100 IDC_CLEAR equ 101 IDC_START equ 102 IDC_OUTPUT equ 103comment #ImageCodecInfo struct ;public: Clsid CLSID <> FormatID GUID <> CodecName DWORD ? DllName DWORD ? FormatDescription DWORD ? FilenameExtension DWORD ? MimeType DWORD ? Flags DWORD ? Version DWORD ? SigCount DWORD ? SigSize DWORD ? SigPattern DWORD ? SigMask DWORD ?ImageCodecInfo ends#.data? hInstance dq ? hWinMain dq ?       m_gdiplusToken dd ? @gdis GdiplusStartupInput <?> num dd ? _size dd ? pImageCodecInfo dq ?.data swTest dw "1","2","3","A","B","C",0,0.codeUnicodeStrAscii PROC USES rsi rbx src:QWORD,dest:QWORD mov     rsi,src mov     rbx,1 mov     rdx,dest xor     rax,rax sub     rax,rbx@@: add     rax,rbx movzx   rcx, WORD PTR [rsi+rax*2] mov     BYTE PTR [rdx+rax],cl test    rcx,rcx jnz     @b retUnicodeStrAscii  ENDPGetEncoderClsids proc uses rbx rsi rdi _hWnd:qword LOCAL strGuid[2048]:BYTE LOCAL _szBuffer[256]:BYTE LOCAL ansiTxt[128]:BYTE LOCAL ansiTxt1[256]:BYTE invoke RtlZeroMemory,ADDR strGuid, sizeof strGuid invoke GdipGetImageEncodersSize, addr num ,addr _size xor edi,edi mov ecx,_size .if ecx invoke GlobalAlloc,GPTR,_size mov pImageCodecInfo,rax invoke GdipGetImageEncoders,num, _size,pImageCodecInfo mov rsi,pImageCodecInfo@@: invoke RtlZeroMemory,ADDR ansiTxt, sizeof ansiTxt invoke StringFromGUID2,rsi,addr _szBuffer,sizeof _szBuffer invoke WideCharToMultiByte,CP_ACP,0,addr _szBuffer,-1,addr ansiTxt,sizeof ansiTxt,0,0 invoke RtlZeroMemory,ADDR ansiTxt1, sizeof ansiTxt1;int 3 xor rbx,rbx mov rbx,qword ptr[rsi].ImageCodecInfo.MimeType ;invoke UnicodeStrAscii,rbx, addr ansiTxt1 ;--》called at second , crashed. invoke UnicodeStrAscii,addr swTest, addr ansiTxt1 invoke lstrcat,addr strGuid,CStr("Type: ") invoke lstrcat,addr strGuid,addr ansiTxt1 invoke lstrcat,addr strGuid,CStr(", GUID: ") invoke lstrcat,addr strGuid,addr ansiTxt invoke lstrcat,addr strGuid,CStr(13,10) invoke SetDlgItemText,_hWnd,IDC_OUTPUT,addr strGuid add rsi, sizeof ImageCodecInfo inc edi cmp edi,num jne @B      invoke GlobalFree,pImageCodecInfo .endif retGetEncoderClsids endp_ProcDlgMain proc uses rbx rsi rdi hWnd:qword,wMsg:dword,wParam:qword,lParam:qword mov eax,wMsg .if eax == WM_INITDIALOG push hWnd pop hWinMain invoke LoadIcon,hInstance,ICO_MAIN invoke SendMessage,hWnd,WM_SETICON,ICON_BIG,eax .elseif eax == WM_COMMAND mov rax,wParam .if ax == IDC_CLEAR invoke SetDlgItemText,hWnd,IDC_OUTPUT,NULL .elseif ax == IDC_START invoke GetEncoderClsids,hWinMain .endif .elseif eax == WM_CLOSE invoke EndDialog,hWnd,NULL .else mov rax,FALSE ret .endif mov rax,TRUE ret_ProcDlgMain endpstart Proc invoke GetModuleHandle,NULL mov hInstance,rax mov @gdis.GdiplusVersion, 1 mov @gdis.DebugEventCallback, 0 mov @gdis.SuppressBackgroundThread, 0 mov @gdis.SuppressExternalCodecs, 0 invoke GdiplusStartup,ADDR m_gdiplusToken,ADDR @gdis,0 invoke DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlgMain,NULL invoke GdiplusShutdown,m_gdiplusToken        invoke ExitProcess,NULL start Endpend`
Code: [Select]
`#include <\UASM64\include\resource.h>#define ICO_MAIN 1000#define DLG_MAIN 100#define IDC_CLEAR 101#define IDC_START 102#define IDC_OUTPUT 103DLG_MAIN DIALOG 210, 108, 288, 150STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAMECAPTION "Test_GetEncoderClsids"FONT 11, "Calibri"{ EDITTEXT IDC_OUTPUT, 7, 2, 274, 125,ES_MULTILINE | ES_AUTOVSCROLL | WS_BORDER | WS_TABSTOP | WS_VSCROLL  PUSHBUTTON "Clear(&C)", IDC_CLEAR,202, 131, 40, 14 PUSHBUTTON "Get(&G)", IDC_START, 243, 131, 40, 14, WS_TABSTOP}`

#### AW

• Member
• Posts: 1357
• Let's Make ASM Great Again!
##### Re: how do i change the 32 bit udw2str into 64 bit udw2str?
« Reply #3 on: December 26, 2017, 05:38:36 AM »
six_L,

The structure ImageCodecInfo is not correctly defined for 64-bit.
This is not a rare event.

#### mabdelouahab

• Member
• Posts: 364
##### Re: how do i change the 32 bit udw2str into 64 bit udw2str?
« Reply #4 on: December 26, 2017, 07:10:51 AM »

ImageCodecInfo   struct
ClassID       CLSID   <>
FormatID      GUID   <>
CodecName      QWORD   ?
DllName         QWORD   ?
FormatDescription   QWORD   ?
FilenameExtension   QWORD   ?
MimeType      QWORD   ?
Flags         DWORD   ?
Version         DWORD   ?
SigCount      DWORD   ?
SigSize         DWORD   ?
SigPattern      QWORD   ?
ImageCodecInfo   ends

ImageCodecInfo

#### six_L

• Member
• Posts: 132
##### Re: how do i change the 32 bit udw2str into 64 bit udw2str?
« Reply #5 on: December 26, 2017, 03:53:18 PM »
hi: aw27,mabdelouahab.

it has worked at last.
thanks for yours guidance.