In the source there are no errors, but when running it crashes when GetOpenFileName calls lstrlen.
I suppose this is because the alignment of the structure is bad, I tried with a buffer too the result is the same.
.X64
option casemap:none
option frame:auto ;generate SEH-compatible prologues and epilogues
option PROCALIGN:16
OPTION WIN64:1
OPTION FIELDALIGN:4
; porc64 /v "Test.rc"
; jwasm -win64 -Zp4 -W4 -Sn -Sg -Sa -Zlf -Zlp -Zls -IC:\JWAsm\Include -Fl=Test.lst Test.asm
; jwlink.exe format windows pe runtime windows file Test.obj LibPath c:\JWasm\Lib64 op MAP, quiet, res=Test.res
WINVER EQU 0a00h
INCLUDE C:\JWAsm\Include\windows.inc
INCLUDE C:\JWAsm\Include\commdlg.inc
INCLUDE Test.inc
; libraries
; ~~~~~~~~~
; ------------------------------------------
; import libraries for Windows API functions
; ------------------------------------------
INCLUDELIB C:\JWAsm\Lib64\gdi32.lib
INCLUDELIB C:\JWAsm\Lib64\user32.lib
INCLUDELIB C:\JWAsm\Lib64\kernel32.lib
INCLUDELIB C:\JWAsm\Lib64\Comctl32.lib
INCLUDELIB C:\JWAsm\Lib64\comdlg32.lib
INCLUDELIB C:\JWAsm\Lib64\shell32.lib
INCLUDELIB C:\JWAsm\Lib64\oleaut32.lib
INCLUDELIB C:\JWAsm\Lib64\ole32.lib
INCLUDELIB C:\JWAsm\Lib64\MSVCRT.lib
INCLUDELIB C:\JWAsm\Lib64\Shlwapi.lib
INCLUDELIB libad64.lib
WPARAM TYPEDEF QWORD
UINT TYPEDEF DWORD
NULL EQU 0
WS_OVERLAPPEDWINDOW EQU 0CF0000h
CW_USEDEFAULT EQU 80000000h
SW_SHOWDEFAULT EQU 10
SW_SHOWNORMAL EQU 1
IDC_ARROW EQU 32512
IDI_APPLICATION EQU 32512
WM_DESTROY EQU 0002h
WM_COMMAND EQU 0111h
CS_VREDRAW EQU 1
CS_HREDRAW EQU 2
COLOR_WINDOW EQU 5
MAX_PATH EQU 260
IDM_FILE_OPEN EQU 10002
IDM_FILE_EXIT EQU 10006
WNDPROC TYPEDEF ptr proto_WNDPROC
comment @
OPENFILENAMEA STRUCT
lStructSize DWORD ?
hwndOwner HWND ?
hInstance HINSTANCE ?
lpstrFilter LPSTR ?
lpstrCustomFilter LPSTR ?
nMaxCustFilter DWORD ?
nFilterIndex DWORD ?
lpstrFile LPSTR ?
nMaxFile DWORD ?
lpstrFileTitle LPSTR ?
nMaxFileTitle DWORD ?
lpstrInitialDir LPSTR ?
lpstrTitle LPSTR ?
Flags DWORD ?
nFileOffset WORD ?
nFileExtension WORD ?
lpstrDefExt LPSTR ?
lCustData LPARAM ?
lpfnHook LPOFNHOOKPROC ?
lpTemplateName LPSTR ?
pvReserved DWORD ?
dwReserved DWORD ?
FlagsEx DWORD ?
OPENFILENAMEA ENDS
OPENFILENAME typedef OPENFILENAMEA
LPOPENFILENAME typedef LPOPENFILENAMEA
@
WNDCLASSEXA STRUCT 8
cbSize DWORD ?
style DWORD ?
lpfnWndProc WNDPROC ?
cbClsExtra DWORD ?
cbWndExtra DWORD ?
hInstance HINSTANCE ?
hIcon HICON ?
hCursor HCURSOR ?
hbrBackground HBRUSH ?
lpszMenuName LPSTR ?
lpszClassName LPSTR ?
hIconSm HICON ?
WNDCLASSEXA ENDS
WNDCLASSEX typedef WNDCLASSEXA
POINT STRUCT
x SDWORD ?
y SDWORD ?
POINT ENDS
WinMain PROTO :HINSTANCE,:HINSTANCE,:LPSTR,:UINT
GetModuleHandle EQU <GetModuleHandleA>
GetModuleFileName EQU <GetModuleFileNameA>
GetCommandLine EQU <GetCommandLineA>
PathRemoveBackslash EQU <PathRemoveBackslashA>
PathFindFileName EQU <PathFindFileNameA>
PathRemoveBackslash EQU <PathRemoveBackslashA>
LoadIcon EQU <LoadIconA>
LoadCursor EQU <LoadCursorA>
RegisterClassEx EQU <RegisterClassExA>
CreateWindowEx EQU <CreateWindowExA>
GetMessage EQU <GetMessageA>
DispatchMessage EQU <DispatchMessageA>
DefWindowProc EQU <DefWindowProcA>
LoadMenu EQU <LoadMenuA>
.Data
szClassName Byte "SimpleWinClass",0
szAppName Byte "Our First Window",0
szFilters Byte "Images",0,"*.jpg;*.png;*.gif;*.bmp",0,"All Files",0,"*.*",0,0
szDefExt Byte "jpg",0
.Data?
hInstance HINSTANCE ?
lpszCommandLine LPSTR ?
szPgmDirectory Byte MAX_PATH dup(?)
szPgmFileName Byte MAX_PATH dup(?)
szCurrentFile Byte MAX_PATH dup(?)
.Code
WinMainCRTStartup PROC FRAME
INVOKE GetModuleHandle,NULL
mov hInstance,rax
INVOKE GetModuleFileName,rax,ADDR szPgmFileName,MAX_PATH
INVOKE lstrcpy,ADDR szPgmDirectory,ADDR szPgmFileName
INVOKE lstrlen,rax
lea rcx,OFFSET szPgmDirectory
add rcx,rax
@Loop :
cmp Byte Ptr [rcx],'\'
je @EndLoop
sub rcx,1
sub rax,1
jnz @Loop
@EndLoop :
mov Byte Ptr [rcx],0
call GetCommandLine
mov lpszCommandLine,rax
INVOKE WinMain,hInstance,NULL,lpszCommandLine,SW_SHOWDEFAULT
INVOKE ExitProcess,eax
WinMainCRTStartup ENDP
WinMain PROC FRAME __hInst:HINSTANCE,__hPrevInst:HINSTANCE,__lpszCmdLine:LPSTR,__nCmdShow:UINT
LOCAL _Wc:WNDCLASSEX
mov _Wc.hInstance,rcx
sub rsp,32
xor rcx,rcx
mov rdx,IDC_ARROW
call LoadCursor
mov _Wc.hCursor,rax
xor rcx,rcx
mov rdx,IDI_APPLICATION
call LoadIcon
lea rcx,_Wc
mov [rcx].WNDCLASSEX.hIcon,rax
mov [rcx].WNDCLASSEX.hIconSm,rax
mov [rcx].WNDCLASSEX.cbSize,SIZEOF WNDCLASSEXA
mov [rcx].WNDCLASSEX.style,CS_HREDRAW or CS_VREDRAW
lea rax,[WndProc]
mov [rcx].WNDCLASSEX.lpfnWndProc,rax
lea rax,szClassName
mov [rcx].WNDCLASSEX.lpszClassName,rax
xor rax,rax
mov [rcx].WNDCLASSEX.cbClsExtra,eax
mov [rcx].WNDCLASSEX.cbWndExtra,eax
mov [rcx].WNDCLASSEX.lpszMenuName,IDM_MENU
mov [rcx].WNDCLASSEX.hbrBackground,COLOR_WINDOW + 1
call RegisterClassEx
add rsp,32
INVOKE CreateWindowEx,NULL,ADDR szClassName,ADDR szAppName,WS_OVERLAPPEDWINDOW,\
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,_Wc.hInstance,NULL
test rax,rax
jnz @DisplayWindow
ret
@DisplayWindow :
mov rcx,rax
sub rsp,32
mov _Wc,rax
mov edx,SW_SHOWNORMAL
call ShowWindow
mov rcx,_Wc
call UpdateWindow
add rsp,32
@MsgLoop :
lea rcx,_Wc ;_Msg
push rcx
INVOKE GetMessage,rcx,NULL,0,0
pop rcx
test rax,rax
jnz @DecodeMsg
mov rax,_Wc + 10h
ret
@DecodeMsg :
sub rsp,32
push rcx
call TranslateMessage
pop rcx
call DispatchMessage
add rsp,32
jmp @MsgLoop
WinMain ENDP
File_Select PROC FRAME __hWnd:HWND
LOCAL _Ofn:OPENFILENAME
push rcx
INVOKE RtlZeroMemory,ADDR _Ofn,SIZEOF OPENFILENAME
lea rcx,_Ofn
pop [rcx].OPENFILENAME.hwndOwner
mov [rcx].OPENFILENAME.lStructSize,SIZEOF OPENFILENAME
mov [rcx].OPENFILENAME.nFilterIndex,1
mov [rcx].OPENFILENAME.Flags,OFN_ENABLESIZING + OFN_EXPLORER + OFN_FILEMUSTEXIST + OFN_PATHMUSTEXIST + OFN_HIDEREADONLY + OFN_NONETWORKBUTTON
mov [rcx].OPENFILENAME.nMaxFile,MAX_PATH
lea rdx,szFilters
mov [rcx].OPENFILENAME.lpstrFilter,rdx
lea rdx,szDefExt
mov [rcx].OPENFILENAME.lpstrDefExt,rdx
lea rdx,szCurrentFile
mov [rcx].OPENFILENAME.lpstrFile,rdx
INVOKE GetOpenFileName,rcx
ret
File_Select ENDP
Proceed_WmCommand PROC FRAME __hWnd:HWND,__wParam:WPARAM,__lParam:LPARAM
mov rax,rdx
and rax,0000ffffh
cmp eax,IDM_FILE_OPEN
jne @L1
INVOKE File_Select,rcx
xor rax,rax
ret
@L1 :
cmp eax,IDM_FILE_EXIT
jne @Default
INVOKE DestroyWindow,rcx
xor rax,rax
ret
@Default :
mov r9,r8
mov r8,rdx
mov edx,WM_COMMAND
INVOKE DefWindowProc,rcx,edx,r8,r9
ret
Proceed_WmCommand ENDP
WndProc PROC FRAME __hWnd:HWND,__uMsg:UINT,__wParam:WPARAM,__lParam:LPARAM
cmp edx,WM_COMMAND
jne @L1
INVOKE Proceed_WmCommand,rcx,r8,r9
ret
@L1 :
cmp edx,WM_DESTROY
jne @Default
@WmDestroy :
INVOKE PostQuitMessage,NULL
xor eax,eax
ret
@Default :
INVOKE DefWindowProc,rcx,edx,r8,r9
ret
WndProc ENDP
END WinMainCRTStartup
It seems the problem is at offset of lCustData, to this place there is no string.
In the flag I dont want any custom data.
Any help is necessary. Thanks in advance.