Код (Text): invoke GetCommandLine mov ebx,eax @@: cmp byte [ebx],NULL je sh cmp byte [ebx],' ' je @f inc ebx jmp @r @@: inc ebx cmp byte [ebx],' ' je @r sh: invoke PathGetArgs,ebx mov [u],eax invoke lstrlen,[u] ;invoke wsprintf,b,'%d',eax ;invoke MessageBoxTimeout,HWND_DESKTOP,[u],b,MB_TOPMOST,LANG_NEUTRAL,5000 ;add ebx,eax invoke StrCpy,c,ebx,[u] invoke wsprintf,b,'%s,%s',c,[u] invoke MessageBoxTimeout,HWND_DESKTOP,b,'',MB_TOPMOST,LANG_NEUTRAL,5000 ;invoke ShellExecute,NULL,NULL,a,ebx,NULL,SW_NORMAL exit: invoke ExitProcess,NULL Столько времени убил, и упёрся в то что StrCpyN и StrNCpy не поддерживается в Win8.1? Кстати, как можно самому импортировать список из всяких DLL? Тупо хотел при помощи api разделить строку на аргументы path1 и path2, может кто поможет любой способ? Я просто хочу сделать себе утилиту invoke CreateSymbolicLink,path1,path2,NULL или даже с переменной папка/файл invoke CreateSymbolicLink,path1,path2,1 У меня mklink не работает почему-то и давно) Небось .NET должен быть, а может PowerShell
Может инклюды неправильные, а я привык к ним) Вписывал туда, всёравно ругалось. Да чё-то и CommandLineToArgvW пришлось ипортировать. import shell32,GetCommandLineW,'GetCommandLineW',CommandLineToArgvW,'CommandLineToArgvW' До сих пор include '%fasm%/api/shell32.inc' хватало. Кстати, как самому сделать список реальных api своих shell32.dll и других? Я даже fasm.zip скачал, думал я сам инклюды испортил, но там есть StrCpyN и StrNCpy. Кстати, из масм стал переделывать и тоже напоролся "!=", "||", "==" не поддерживается? ne, not, equale что ли? )) Я чуть потёр, вроде заработало)
Кладете в папку к fasm.exe или прописываете путь к нему в переменных PATH или FASM (в последней надо прописывать строго имя файла). После просто перетаскивайте dll файл на cmd и на выходе получаете include со всеми API из этой DLL.
Semiono, так как не работает апи? Не пойму. Нигде не нашел чтобы они удалены с вин8, да депрекейтед, ну так lstrcpy тем более депрекейдет, но не удаляется.
Надо проверить, сам не понял --- Сообщение объединено, 2 июн 2025 --- Может что-то не то делаю, ум за разум зашёл) --- Сообщение объединено, 2 июн 2025 --- Кстати, обычно должно DLL в окне ошибки быть. 0_0 --- Сообщение объединено, 2 июн 2025 --- import shell32,StrNCpy,'StrNCpyA' так тоже самое
а чо вы пытаетесь делать то, тут же просто .\symlink.exe "test_file.txt" "test_file_link.txt" 0 .\symlink.exe "test_dir" "test_dir_link" 1
Он же вам ясно и четко пишет, что вы пытаетесь экспортировать функцию StrNCpyA из 1.exe --- Сообщение объединено, 2 июн 2025 --- Нельзя дважды использовать макрос import с одной меткой shell32. Метка shell32 уже использована в api\shell32.inc. Повторное использование просто сгенерирует массивы импорта функции, которые не будут привязаны к dll. Именно поэтому я изменил стандартные макросы library и import у себя, чтобы нельзя было сделать дважды одно и тоже. Но и синтаксис их изменился. Теперь в library у меня просто перечисляются имена меток, а в import сначала идет пара "метка = имя файла" и затем уже список из "метка = имя функции". Собственно из-за этого я и сделал себе export.cmd, чтобы вручную не переписывать все api/include
Код (Text): ;include '%fasm%/api/shell32.inc' ;include '%fasm%/api/shlwapi.inc' import shlwapi,StrCpyN,'StrCpyNW' Так получилось) --- Сообщение объединено, 2 июн 2025 --- Я пробовал переписать на Fasm. Надо будет masm скампилить чтоб подредактировать. Хотелось бы окна убрать) Вот иногда чтонибудь спросишь и всегда консольный пример выкладывают, а тут наоборот хочется консоль, а тут окна)) Кстати, тут сразу же непонятное для меня Код (Text): start: ; Get command line arguments invoke GetCommandLineW invoke CommandLineToArgvW, eax, argc ; Check if we got valid arguments ; .if eax == 0 invoke MessageBoxA, NULL, 'addr szError', NULL, MB_ICONERROR cmp eax, NULL jz exit ; jnz exit - то же самое, почему? ; jmp exit ; .endif
Спасибо огромное!!! --- Сообщение объединено, 2 июн 2025 --- fasm Код (Text): ; Check argument count mov eax, [argc] cmp eax, 3 jb show_usage cmp eax, 4 ja show_usage jmp get_paths masm Код (Text): ; Check argument count mov eax, argc .if eax < 3 || eax > 4 invoke MessageBoxA, NULL, addr szUsage, NULL, MB_ICONINFORMATION jmp cleanup .endif Вот прикольно! А я ведь подключал макрос if.inc, но всёравно всякие != не работали)) Тут fasm более на дебаггер похож) --- Сообщение объединено, 2 июн 2025 --- Класс! Даже %SystemRoot% можно вводить! Хм. а можно вместо MsgBox вывод в CMD сделать? Всмысле если охота и время есть
Код (ASM): macro library [name] { common label import.data ; предотвращает повторное использование library forward if defined name#.used dd RVA name#.look, 0, 0, RVA name#.name, RVA name#.addr end if label name#.refs ; предотвращает повторяющиеся name common if $ > import.data dd 5 dup (0) end if } struc import from*, [fnc] { common rb (- RVA $) and 7 if definite .refs .look: forward match proc==text, fnc \{ if used proc label proc qword at .\#\.\#proc end if if used .\#_\#proc label .\#_\#proc qword at .\#\.\#proc end if if used .\#\.\#proc if text eqtype '' dq RVA .\#\.\#proc\#\.name else dq 0x8000000000000000 + text end if end if \} common if $ > .look dq 0 label .used at 1 end if .addr: forward match proc==text, fnc \{ if used .\#\.\#proc if text eqtype '' .\#\.\#proc dq RVA .\#\.\#proc\#\.name else .\#\.\#proc dq 0x8000000000000000 + text end if end if \} common if $ > .addr dq 0 .name db from, 0 end if forward match proc==text, fnc \{ if used .\#\.\#proc & text eqtype '' rb RVA $ and 1 .\#\.\#proc\#\.name db 0, 0, text, 0 end if \} common end if } Потратил некоторое время, чтобы вспомнить что я такого делал, чтобы нельзя было использовать повторные вызовы. Оказалось я просто использовал struc, которая не допускает двух экземпляров с одной меткой. Я выше описал, что у меня было Но на самом деле тут уже использована struc и имя библиотеки задано сначала, а первым аргументом идет имя файла и только потом список из "метка = имя функции". Выглядит примерно так Код (ASM): library kernel32.dll, shell32.dll kernel32.dll import "KERNEL32.DLL",\ GetCommandLineW = "GetCommandLineW",\ GetModuleHandleW = "GetModuleHandleW" shell32.dll import "shell32",\ CommandLineToArgvW = "CommandLineToArgvW" Еще в моей версии допускается импорт функций с одинаковыми именами из разных библиотек. Тогда вы должны будете обращаться к функции по полному имени с именем метки библиотеки Код (Text): call [kernel32.dll_GetModuleHandleW] call [GetModuleHandleW] ; Все еще возможен, но при двух одинаковых функциях в двух библиотеках даст конфликт в объявлениях
Код (Text): push [dwFlags] ; dwFlags (0 for file, 1 for directory) push [targetPath] ; lpTargetFileName push [linkPath] ; lpSymlinkFileName call [lpCreateSymbolicLinkW] Код (Text): mov r9d,NULL lea r8,[dwFlags] lea rbx,[targetPath] lea rdx,[linkPath] mov rcx,NULL call [lpCreateSymbolicLinkW] Вот тут у меня затык произошёл 'win64ax.inc', как push обойти? )) где-то подсмотрел примерно чё-то
https://learn.microsoft.com/en-us/cpp/build/x64-calling-convention?view=msvc-170 Макросы fasm для x64 умеют правильно раскладывать аргументы. Используйте fastcall/ccall вместо call или invoke для WinAPI. Чтобы постоянно не происходило выделение теневого буфера для вызовов API в рамках блока (процедуры) кода используйте макросы frame / endf --- Сообщение объединено, 2 июн 2025 --- Код (ASM): ; OpenGL programming example format PE64 GUI 5.0 entry start include 'win64a.inc' include '..\..\opengl\opengl.inc' section '.text' code readable executable start: sub rsp,8 ; Make stack dqword aligned invoke GetModuleHandle,0 mov [wc.hInstance],rax invoke LoadIcon,0,IDI_APPLICATION mov [wc.hIcon],rax invoke LoadCursor,0,IDC_ARROW mov [wc.hCursor],rax invoke RegisterClass,wc invoke CreateWindowEx,0,_class,_title,WS_VISIBLE+WS_OVERLAPPEDWINDOW+WS_CLIPCHILDREN+WS_CLIPSIBLINGS,16,16,432,432,NULL,NULL,[wc.hInstance],NULL msg_loop: invoke GetMessage,addr msg,NULL,0,0 cmp eax,1 jb end_loop jne msg_loop invoke TranslateMessage,addr msg invoke DispatchMessage,addr msg jmp msg_loop end_loop: invoke ExitProcess,[msg.wParam] proc WindowProc uses rbx rsi rdi, hwnd,wmsg,wparam,lparam mov [hwnd],rcx frame cmp edx,WM_CREATE je .wmcreate cmp edx,WM_SIZE je .wmsize cmp edx,WM_PAINT je .wmpaint cmp edx,WM_KEYDOWN je .wmkeydown cmp edx,WM_DESTROY je .wmdestroy .defwndproc: invoke DefWindowProc,rcx,rdx,r8,r9 jmp .finish .wmcreate: invoke GetDC,rcx mov [hdc],rax lea rdi,[pfd] mov rcx,sizeof.PIXELFORMATDESCRIPTOR shr 3 xor eax,eax rep stosq mov [pfd.nSize],sizeof.PIXELFORMATDESCRIPTOR mov [pfd.nVersion],1 mov [pfd.dwFlags],PFD_SUPPORT_OPENGL+PFD_DOUBLEBUFFER+PFD_DRAW_TO_WINDOW mov [pfd.iLayerType],PFD_MAIN_PLANE mov [pfd.iPixelType],PFD_TYPE_RGBA mov [pfd.cColorBits],16 mov [pfd.cDepthBits],16 mov [pfd.cAccumBits],0 mov [pfd.cStencilBits],0 invoke ChoosePixelFormat,[hdc],addr pfd invoke SetPixelFormat,[hdc],eax,addr pfd invoke wglCreateContext,[hdc] mov [hrc],rax invoke wglMakeCurrent,[hdc],[hrc] invoke GetClientRect,[hwnd],addr rc invoke glViewport,0,0,[rc.right],[rc.bottom] invoke GetTickCount mov [clock],eax xor eax,eax jmp .finish .wmsize: invoke GetClientRect,[hwnd],addr rc invoke glViewport,0,0,[rc.right],[rc.bottom] xor eax,eax jmp .finish .wmpaint: invoke GetTickCount sub eax,[clock] cmp eax,10 jb .animation_ok add [clock],eax invoke glRotatef,float [theta],float dword 0.0,float dword 0.0,float dword 1.0 .animation_ok: invoke glClear,GL_COLOR_BUFFER_BIT invoke glBegin,GL_QUADS invoke glColor3f,float dword 1.0,float dword 0.1,float dword 0.1 invoke glVertex3d,float -0.6,float -0.6,float 0.0 invoke glColor3f,float dword 0.1,float dword 0.1,float dword 0.1 invoke glVertex3d,float 0.6,float -0.6,float 0.0 invoke glColor3f,float dword 0.1,float dword 0.1,float dword 1.0 invoke glVertex3d,float 0.6,float 0.6,float 0.0 invoke glColor3f,float dword 1.0,float dword 0.1,float dword 1.0 invoke glVertex3d,float -0.6,float 0.6,float 0.0 invoke glEnd invoke SwapBuffers,[hdc] xor eax,eax jmp .finish .wmkeydown: cmp r8d,VK_ESCAPE jne .defwndproc .wmdestroy: invoke wglMakeCurrent,0,0 invoke wglDeleteContext,[hrc] invoke ReleaseDC,[hwnd],[hdc] invoke PostQuitMessage,0 xor eax,eax .finish: endf ret endp section '.data' data readable writeable _title db 'OpenGL example',0 _class db 'FASMOPENGL32',0 theta GLfloat 0.6 wc WNDCLASS 0,WindowProc,0,0,NULL,NULL,NULL,NULL,NULL,_class hdc dq ? hrc dq ? msg MSG rc RECT pfd PIXELFORMATDESCRIPTOR clock dd ? section '.idata' import data readable writeable library kernel,'KERNEL32.DLL',\ user,'USER32.DLL',\ gdi,'GDI32.DLL',\ opengl,'OPENGL32.DLL',\ glu,'GLU32.DLL' import kernel,\ GetModuleHandle,'GetModuleHandleA',\ GetTickCount,'GetTickCount',\ ExitProcess,'ExitProcess' import user,\ RegisterClass,'RegisterClassA',\ CreateWindowEx,'CreateWindowExA',\ DefWindowProc,'DefWindowProcA',\ GetMessage,'GetMessageA',\ TranslateMessage,'TranslateMessage',\ DispatchMessage,'DispatchMessageA',\ LoadCursor,'LoadCursorA',\ LoadIcon,'LoadIconA',\ GetClientRect,'GetClientRect',\ GetDC,'GetDC',\ ReleaseDC,'ReleaseDC',\ PostQuitMessage,'PostQuitMessage' import gdi,\ ChoosePixelFormat,'ChoosePixelFormat',\ SetPixelFormat,'SetPixelFormat',\ SwapBuffers,'SwapBuffers' import opengl,\ glAccum,'glAccum',\ glAlphaFunc,'glAlphaFunc',\ glAreTexturesResident,'glAreTexturesResident',\ glArrayElement,'glArrayElement',\ glBegin,'glBegin',\ glBindTexture,'glBindTexture',\ glBitmap,'glBitmap',\ glBlendFunc,'glBlendFunc',\ glCallList,'glCallList',\ glCallLists,'glCallLists',\ glClear,'glClear',\ glClearAccum,'glClearAccum',\ glClearColor,'glClearColor',\ glClearDepth,'glClearDepth',\ glClearIndex,'glClearIndex',\ glClearStencil,'glClearStencil',\ glClipPlane,'glClipPlane',\ glColor3b,'glColor3b',\ glColor3bv,'glColor3bv',\ glColor3d,'glColor3d',\ glColor3dv,'glColor3dv',\ glColor3f,'glColor3f',\ glColor3fv,'glColor3fv',\ glColor3i,'glColor3i',\ glColor3iv,'glColor3iv',\ glColor3s,'glColor3s',\ glColor3sv,'glColor3sv',\ glColor3ub,'glColor3ub',\ glColor3ubv,'glColor3ubv',\ glColor3ui,'glColor3ui',\ glColor3uiv,'glColor3uiv',\ glColor3us,'glColor3us',\ glColor3usv,'glColor3usv',\ glColor4b,'glColor4b',\ glColor4bv,'glColor4bv',\ glColor4d,'glColor4d',\ glColor4dv,'glColor4dv',\ glColor4f,'glColor4f',\ glColor4fv,'glColor4fv',\ glColor4i,'glColor4i',\ glColor4iv,'glColor4iv',\ glColor4s,'glColor4s',\ glColor4sv,'glColor4sv',\ glColor4ub,'glColor4ub',\ glColor4ubv,'glColor4ubv',\ glColor4ui,'glColor4ui',\ glColor4uiv,'glColor4uiv',\ glColor4us,'glColor4us',\ glColor4usv,'glColor4usv',\ glColorMask,'glColorMask',\ glColorMaterial,'glColorMaterial',\ glColorPointer,'glColorPointer',\ glCopyPixels,'glCopyPixels',\ glCopyTexImage1D,'glCopyTexImage1D',\ glCopyTexImage2D,'glCopyTexImage2D',\ glCopyTexSubImage1D,'glCopyTexSubImage1D',\ glCopyTexSubImage2D,'glCopyTexSubImage2D',\ glCullFace,'glCullFace',\ glDeleteLists,'glDeleteLists',\ glDeleteTextures,'glDeleteTextures',\ glDepthFunc,'glDepthFunc',\ glDepthMask,'glDepthMask',\ glDepthRange,'glDepthRange',\ glDisable,'glDisable',\ glDisableClientState,'glDisableClientState',\ glDrawArrays,'glDrawArrays',\ glDrawBuffer,'glDrawBuffer',\ glDrawElements,'glDrawElements',\ glDrawPixels,'glDrawPixels',\ glEdgeFlag,'glEdgeFlag',\ glEdgeFlagPointer,'glEdgeFlagPointer',\ glEdgeFlagv,'glEdgeFlagv',\ glEnable,'glEnable',\ glEnableClientState,'glEnableClientState',\ glEnd,'glEnd',\ glEndList,'glEndList',\ glEvalCoord1d,'glEvalCoord1d',\ glEvalCoord1dv,'glEvalCoord1dv',\ glEvalCoord1f,'glEvalCoord1f',\ glEvalCoord1fv,'glEvalCoord1fv',\ glEvalCoord2d,'glEvalCoord2d',\ glEvalCoord2dv,'glEvalCoord2dv',\ glEvalCoord2f,'glEvalCoord2f',\ glEvalCoord2fv,'glEvalCoord2fv',\ glEvalMesh1,'glEvalMesh1',\ glEvalMesh2,'glEvalMesh2',\ glEvalPoint1,'glEvalPoint1',\ glEvalPoint2,'glEvalPoint2',\ glFeedbackBuffer,'glFeedbackBuffer',\ glFinish,'glFinish',\ glFlush,'glFlush',\ glFogf,'glFogf',\ glFogfv,'glFogfv',\ glFogi,'glFogi',\ glFogiv,'glFogiv',\ glFrontFace,'glFrontFace',\ glFrustum,'glFrustum',\ glGenLists,'glGenLists',\ glGenTextures,'glGenTextures',\ glGetBooleanv,'glGetBooleanv',\ glGetClipPlane,'glGetClipPlane',\ glGetDoublev,'glGetDoublev',\ glGetError,'glGetError',\ glGetFloatv,'glGetFloatv',\ glGetIntegerv,'glGetIntegerv',\ glGetLightfv,'glGetLightfv',\ glGetLightiv,'glGetLightiv',\ glGetMapdv,'glGetMapdv',\ glGetMapfv,'glGetMapfv',\ glGetMapiv,'glGetMapiv',\ glGetMaterialfv,'glGetMaterialfv',\ glGetMaterialiv,'glGetMaterialiv',\ glGetPixelMapfv,'glGetPixelMapfv',\ glGetPixelMapuiv,'glGetPixelMapuiv',\ glGetPixelMapusv,'glGetPixelMapusv',\ glGetPointerv,'glGetPointerv',\ glGetPolygonStipple,'glGetPolygonStipple',\ glGetString,'glGetString',\ glGetTexEnvfv,'glGetTexEnvfv',\ glGetTexEnviv,'glGetTexEnviv',\ glGetTexGendv,'glGetTexGendv',\ glGetTexGenfv,'glGetTexGenfv',\ glGetTexGeniv,'glGetTexGeniv',\ glGetTexImage,'glGetTexImage',\ glGetTexLevelParameterfv,'glGetTexLevelParameterfv',\ glGetTexLevelParameteriv,'glGetTexLevelParameteriv',\ glGetTexParameterfv,'glGetTexParameterfv',\ glGetTexParameteriv,'glGetTexParameteriv',\ glHint,'glHint',\ glIndexMask,'glIndexMask',\ glIndexPointer,'glIndexPointer',\ glIndexd,'glIndexd',\ glIndexdv,'glIndexdv',\ glIndexf,'glIndexf',\ glIndexfv,'glIndexfv',\ glIndexi,'glIndexi',\ glIndexiv,'glIndexiv',\ glIndexs,'glIndexs',\ glIndexsv,'glIndexsv',\ glIndexub,'glIndexub',\ glIndexubv,'glIndexubv',\ glInitNames,'glInitNames',\ glInterleavedArrays,'glInterleavedArrays',\ glIsEnabled,'glIsEnabled',\ glIsList,'glIsList',\ glIsTexture,'glIsTexture',\ glLightModelf,'glLightModelf',\ glLightModelfv,'glLightModelfv',\ glLightModeli,'glLightModeli',\ glLightModeliv,'glLightModeliv',\ glLightf,'glLightf',\ glLightfv,'glLightfv',\ glLighti,'glLighti',\ glLightiv,'glLightiv',\ glLineStipple,'glLineStipple',\ glLineWidth,'glLineWidth',\ glListBase,'glListBase',\ glLoadIdentity,'glLoadIdentity',\ glLoadMatrixd,'glLoadMatrixd',\ glLoadMatrixf,'glLoadMatrixf',\ glLoadName,'glLoadName',\ glLogicOp,'glLogicOp',\ glMap1d,'glMap1d',\ glMap1f,'glMap1f',\ glMap2d,'glMap2d',\ glMap2f,'glMap2f',\ glMapGrid1d,'glMapGrid1d',\ glMapGrid1f,'glMapGrid1f',\ glMapGrid2d,'glMapGrid2d',\ glMapGrid2f,'glMapGrid2f',\ glMaterialf,'glMaterialf',\ glMaterialfv,'glMaterialfv',\ glMateriali,'glMateriali',\ glMaterialiv,'glMaterialiv',\ glMatrixMode,'glMatrixMode',\ glMultMatrixd,'glMultMatrixd',\ glMultMatrixf,'glMultMatrixf',\ glNewList,'glNewList',\ glNormal3b,'glNormal3b',\ glNormal3bv,'glNormal3bv',\ glNormal3d,'glNormal3d',\ glNormal3dv,'glNormal3dv',\ glNormal3f,'glNormal3f',\ glNormal3fv,'glNormal3fv',\ glNormal3i,'glNormal3i',\ glNormal3iv,'glNormal3iv',\ glNormal3s,'glNormal3s',\ glNormal3sv,'glNormal3sv',\ glNormalPointer,'glNormalPointer',\ glOrtho,'glOrtho',\ glPassThrough,'glPassThrough',\ glPixelMapfv,'glPixelMapfv',\ glPixelMapuiv,'glPixelMapuiv',\ glPixelMapusv,'glPixelMapusv',\ glPixelStoref,'glPixelStoref',\ glPixelStorei,'glPixelStorei',\ glPixelTransferf,'glPixelTransferf',\ glPixelTransferi,'glPixelTransferi',\ glPixelZoom,'glPixelZoom',\ glPointSize,'glPointSize',\ glPolygonMode,'glPolygonMode',\ glPolygonOffset,'glPolygonOffset',\ glPolygonStipple,'glPolygonStipple',\ glPopAttrib,'glPopAttrib',\ glPopClientAttrib,'glPopClientAttrib',\ glPopMatrix,'glPopMatrix',\ glPopName,'glPopName',\ glPrioritizeTextures,'glPrioritizeTextures',\ glPushAttrib,'glPushAttrib',\ glPushClientAttrib,'glPushClientAttrib',\ glPushMatrix,'glPushMatrix',\ glPushName,'glPushName',\ glRasterPos2d,'glRasterPos2d',\ glRasterPos2dv,'glRasterPos2dv',\ glRasterPos2f,'glRasterPos2f',\ glRasterPos2fv,'glRasterPos2fv',\ glRasterPos2i,'glRasterPos2i',\ glRasterPos2iv,'glRasterPos2iv',\ glRasterPos2s,'glRasterPos2s',\ glRasterPos2sv,'glRasterPos2sv',\ glRasterPos3d,'glRasterPos3d',\ glRasterPos3dv,'glRasterPos3dv',\ glRasterPos3f,'glRasterPos3f',\ glRasterPos3fv,'glRasterPos3fv',\ glRasterPos3i,'glRasterPos3i',\ glRasterPos3iv,'glRasterPos3iv',\ glRasterPos3s,'glRasterPos3s',\ glRasterPos3sv,'glRasterPos3sv',\ glRasterPos4d,'glRasterPos4d',\ glRasterPos4dv,'glRasterPos4dv',\ glRasterPos4f,'glRasterPos4f',\ glRasterPos4fv,'glRasterPos4fv',\ glRasterPos4i,'glRasterPos4i',\ glRasterPos4iv,'glRasterPos4iv',\ glRasterPos4s,'glRasterPos4s',\ glRasterPos4sv,'glRasterPos4sv',\ glReadBuffer,'glReadBuffer',\ glReadPixels,'glReadPixels',\ glRectd,'glRectd',\ glRectdv,'glRectdv',\ glRectf,'glRectf',\ glRectfv,'glRectfv',\ glRecti,'glRecti',\ glRectiv,'glRectiv',\ glRects,'glRects',\ glRectsv,'glRectsv',\ glRenderMode,'glRenderMode',\ glRotated,'glRotated',\ glRotatef,'glRotatef',\ glScaled,'glScaled',\ glScalef,'glScalef',\ glScissor,'glScissor',\ glSelectBuffer,'glSelectBuffer',\ glShadeModel,'glShadeModel',\ glStencilFunc,'glStencilFunc',\ glStencilMask,'glStencilMask',\ glStencilOp,'glStencilOp',\ glTexCoord1d,'glTexCoord1d',\ glTexCoord1dv,'glTexCoord1dv',\ glTexCoord1f,'glTexCoord1f',\ glTexCoord1fv,'glTexCoord1fv',\ glTexCoord1i,'glTexCoord1i',\ glTexCoord1iv,'glTexCoord1iv',\ glTexCoord1s,'glTexCoord1s',\ glTexCoord1sv,'glTexCoord1sv',\ glTexCoord2d,'glTexCoord2d',\ glTexCoord2dv,'glTexCoord2dv',\ glTexCoord2f,'glTexCoord2f',\ glTexCoord2fv,'glTexCoord2fv',\ glTexCoord2i,'glTexCoord2i',\ glTexCoord2iv,'glTexCoord2iv',\ glTexCoord2s,'glTexCoord2s',\ glTexCoord2sv,'glTexCoord2sv',\ glTexCoord3d,'glTexCoord3d',\ glTexCoord3dv,'glTexCoord3dv',\ glTexCoord3f,'glTexCoord3f',\ glTexCoord3fv,'glTexCoord3fv',\ glTexCoord3i,'glTexCoord3i',\ glTexCoord3iv,'glTexCoord3iv',\ glTexCoord3s,'glTexCoord3s',\ glTexCoord3sv,'glTexCoord3sv',\ glTexCoord4d,'glTexCoord4d',\ glTexCoord4dv,'glTexCoord4dv',\ glTexCoord4f,'glTexCoord4f',\ glTexCoord4fv,'glTexCoord4fv',\ glTexCoord4i,'glTexCoord4i',\ glTexCoord4iv,'glTexCoord4iv',\ glTexCoord4s,'glTexCoord4s',\ glTexCoord4sv,'glTexCoord4sv',\ glTexCoordPointer,'glTexCoordPointer',\ glTexEnvf,'glTexEnvf',\ glTexEnvfv,'glTexEnvfv',\ glTexEnvi,'glTexEnvi',\ glTexEnviv,'glTexEnviv',\ glTexGend,'glTexGend',\ glTexGendv,'glTexGendv',\ glTexGenf,'glTexGenf',\ glTexGenfv,'glTexGenfv',\ glTexGeni,'glTexGeni',\ glTexGeniv,'glTexGeniv',\ glTexImage1D,'glTexImage1D',\ glTexImage2D,'glTexImage2D',\ glTexParameterf,'glTexParameterf',\ glTexParameterfv,'glTexParameterfv',\ glTexParameteri,'glTexParameteri',\ glTexParameteriv,'glTexParameteriv',\ glTexSubImage1D,'glTexSubImage1D',\ glTexSubImage2D,'glTexSubImage2D',\ glTranslated,'glTranslated',\ glTranslatef,'glTranslatef',\ glVertex2d,'glVertex2d',\ glVertex2dv,'glVertex2dv',\ glVertex2f,'glVertex2f',\ glVertex2fv,'glVertex2fv',\ glVertex2i,'glVertex2i',\ glVertex2iv,'glVertex2iv',\ glVertex2s,'glVertex2s',\ glVertex2sv,'glVertex2sv',\ glVertex3d,'glVertex3d',\ glVertex3dv,'glVertex3dv',\ glVertex3f,'glVertex3f',\ glVertex3fv,'glVertex3fv',\ glVertex3i,'glVertex3i',\ glVertex3iv,'glVertex3iv',\ glVertex3s,'glVertex3s',\ glVertex3sv,'glVertex3sv',\ glVertex4d,'glVertex4d',\ glVertex4dv,'glVertex4dv',\ glVertex4f,'glVertex4f',\ glVertex4fv,'glVertex4fv',\ glVertex4i,'glVertex4i',\ glVertex4iv,'glVertex4iv',\ glVertex4s,'glVertex4s',\ glVertex4sv,'glVertex4sv',\ glVertexPointer,'glVertexPointer',\ glViewport,'glViewport',\ wglGetProcAddress,'wglGetProcAddress',\ wglCopyContext,'wglCopyContext',\ wglCreateContext,'wglCreateContext',\ wglCreateLayerContext,'wglCreateLayerContext',\ wglDeleteContext,'wglDeleteContext',\ wglDescribeLayerPlane,'wglDescribeLayerPlane',\ wglGetCurrentContext,'wglGetCurrentContext',\ wglGetCurrentDC,'wglGetCurrentDC',\ wglGetLayerPaletteEntries,'wglGetLayerPaletteEntries',\ wglMakeCurrent,'wglMakeCurrent',\ wglRealizeLayerPalette,'wglRealizeLayerPalette',\ wglSetLayerPaletteEntries,'wglSetLayerPaletteEntries',\ wglShareLists,'wglShareLists',\ wglSwapLayerBuffers,'wglSwapLayerBuffers',\ wglSwapMultipleBuffers,'wglSwapMultipleBuffers',\ wglUseFontBitmapsA,'wglUseFontBitmapsA',\ wglUseFontOutlinesA,'wglUseFontOutlinesA',\ wglUseFontBitmapsW,'wglUseFontBitmapsW',\ wglUseFontOutlinesW,'wglUseFontOutlinesW',\ glDrawRangeElements,'glDrawRangeElements',\ glTexImage3D,'glTexImage3D',\ glBlendColor,'glBlendColor',\ glBlendEquation,'glBlendEquation',\ glColorSubTable,'glColorSubTable',\ glCopyColorSubTable,'glCopyColorSubTable',\ glColorTable,'glColorTable',\ glCopyColorTable,'glCopyColorTable',\ glColorTableParameteriv,'glColorTableParameteriv',\ glColorTableParameterfv,'glColorTableParameterfv',\ glGetColorTable,'glGetColorTable',\ glGetColorTableParameteriv,'glGetColorTableParameteriv',\ glGetColorTableParameterfv,'glGetColorTableParameterfv',\ glConvolutionFilter1D,'glConvolutionFilter1D',\ glConvolutionFilter2D,'glConvolutionFilter2D',\ glCopyConvolutionFilter1D,'glCopyConvolutionFilter1D',\ glCopyConvolutionFilter2D,'glCopyConvolutionFilter2D',\ glGetConvolutionFilter,'glGetConvolutionFilter',\ glSeparableFilter2D,'glSeparableFilter2D',\ glGetSeparableFilter,'glGetSeparableFilter',\ glConvolutionParameteri,'glConvolutionParameteri',\ glConvolutionParameteriv,'glConvolutionParameteriv',\ glConvolutionParameterf,'glConvolutionParameterf',\ glConvolutionParameterfv,'glConvolutionParameterfv',\ glGetConvolutionParameteriv,'glGetConvolutionParameteriv',\ glGetConvolutionParameterfv,'glGetConvolutionParameterfv',\ glHistogram,'glHistogram',\ glResetHistogram,'glResetHistogram',\ glGetHistogram,'glGetHistogram',\ glGetHistogramParameteriv,'glGetHistogramParameteriv',\ glGetHistogramParameterfv,'glGetHistogramParameterfv',\ glMinmax,'glMinmax',\ glResetMinmax,'glResetMinmax',\ glGetMinmax,'glGetMinmax',\ glGetMinmaxParameteriv,'glGetMinmaxParameteriv',\ glGetMinmaxParameterfv,'glGetMinmaxParameterfv' import glu,\ gluBeginCurve,'gluBeginCurve',\ gluBeginPolygon,'gluBeginPolygon',\ gluBeginSurface,'gluBeginSurface',\ gluBeginTrim,'gluBeginTrim',\ gluBuild1DMipmaps,'gluBuild1DMipmaps',\ gluBuild2DMipmaps,'gluBuild2DMipmaps',\ gluCylinder,'gluCylinder',\ gluDeleteNurbsRenderer,'gluDeleteNurbsRenderer',\ gluDeleteQuadric,'gluDeleteQuadric',\ gluDeleteTess,'gluDeleteTess',\ gluDisk,'gluDisk',\ gluEndCurve,'gluEndCurve',\ gluEndPolygon,'gluEndPolygon',\ gluEndSurface,'gluEndSurface',\ gluEndTrim,'gluEndTrim',\ gluErrorString,'gluErrorString',\ gluGetNurbsProperty,'gluGetNurbsProperty',\ gluGetString,'gluGetString',\ gluGetTessProperty,'gluGetTessProperty',\ gluLoadSamplingMatrices,'gluLoadSamplingMatrices',\ gluLookAt,'gluLookAt',\ gluNewNurbsRenderer,'gluNewNurbsRenderer',\ gluNewQuadric,'gluNewQuadric',\ gluNewTess,'gluNewTess',\ gluNextContour,'gluNextContour',\ gluNurbsCallback,'gluNurbsCallback',\ gluNurbsCurve,'gluNurbsCurve',\ gluNurbsProperty,'gluNurbsProperty',\ gluNurbsSurface,'gluNurbsSurface',\ gluOrtho2D,'gluOrtho2D',\ gluPartialDisk,'gluPartialDisk',\ gluPerspective,'gluPerspective',\ gluPickMatrix,'gluPickMatrix',\ gluProject,'gluProject',\ gluPwlCurve,'gluPwlCurve',\ gluQuadricCallback,'gluQuadricCallback',\ gluQuadricDrawStyle,'gluQuadricDrawStyle',\ gluQuadricNormals,'gluQuadricNormals',\ gluQuadricOrientation,'gluQuadricOrientation',\ gluQuadricTexture,'gluQuadricTexture',\ gluScaleImage,'gluScaleImage',\ gluSphere,'gluSphere',\ gluTessBeginContour,'gluTessBeginContour',\ gluTessBeginPolygon,'gluTessBeginPolygon',\ gluTessCallback,'gluTessCallback',\ gluTessEndContour,'gluTessEndContour',\ gluTessEndPolygon,'gluTessEndPolygon',\ gluTessNormal,'gluTessNormal',\ gluTessProperty,'gluTessProperty',\ gluTessVertex,'gluTessVertex',\ gluUnProject,'gluUnProject' Вот стандартный OpenGL.ASM из примеров к fasmw-1.73.32 Тут как раз в WindowProc используется frame для предотвращения постоянного выделения теневого стека для первых 4 рагистровых аргументов.
Код (Text): show_usage: invoke GetStdHandle,STD_OUTPUT_HANDLE mov [i],eax invoke WriteConsole,[i],szUsage,44,NULL,NULL ;invoke MessageBoxA, NULL, szUsage, NULL, MB_ICONINFORMATION jmp cleanup Немного напряг ум и вывел в консоль! Думал это сложно) Однако, похоже что szError db 'Error parsing command line arguments' никогда не обрабатывается, да и другие error(ы) тоже молчат. galenkane, Check if we got valid arguments вроде бы игнорируется. --- Сообщение объединено, 2 июн 2025 --- format PE Console - Жаль тут нельзя напрямую писать (value out of range) интересно почему? Код (Text): invoke WriteConsole,'Usage: symlink.exe <target> <linkname> [0|1]',44,NULL,NULL --- Сообщение объединено, 2 июн 2025 ---
Код (Text): format PE64 Console include '%fasm%/win64ax.inc' section '.code' executable start: sub rsp,8 ; Get command line arguments invoke GetCommandLine invoke CommandLineToArgv,eax,argc ; Check if we got valid arguments test eax,eax jnz @f invoke GetStdHandle,STD_OUTPUT_HANDLE mov [i],eax invoke WriteConsole,[i],szError,36,NULL,NULL jmp exit @@: mov [argv],eax ; Check argument count mov eax,[argc] cmp eax,3 jb show_usage cmp eax,4 ja show_usage jmp get_paths show_usage: invoke GetStdHandle,STD_OUTPUT_HANDLE mov [i],eax invoke WriteConsole,[i],szUsage,74,NULL,NULL jmp cleanup get_paths: ; Get target path (argv[1]) and link name (argv[2]) mov eax,[argv] mov ebx,[eax+4] ; argv[1] - target mov ecx,[eax+8] ; argv[2] - link name mov [targetPath],rbx mov [linkPath],rcx ; Parse directory flag - default to 0 (file link) mov [dwFlags],NULL cmp [argc],4 jne load_library mov eax,[argv] mov eax,[eax+12] ; argv[3] - pointer to wide string ; Check first wide character (2 bytes) movzx edx, word [eax] ; Get first wide character cmp edx,'1' jne @f mov [dwFlags],1 ; SYMBOLIC_LINK_FLAG_DIRECTORY jmp load_library @@: cmp edx,'0' je load_library mov [dwFlags],NULL ; Default to file link load_library: ; Dynamically load CreateSymbolicLinkW invoke LoadLibrary,szKernel32 mov [hKernel32],eax test eax,eax jnz @f invoke GetStdHandle,STD_OUTPUT_HANDLE mov [i],eax invoke WriteConsole,[i],szError,36,NULL,NULL jmp cleanup @@: invoke GetProcAddress, [hKernel32], szCreateSymbolicLinkW mov [lpCreateSymbolicLinkW],rax test eax,eax jnz @f invoke GetStdHandle,STD_OUTPUT_HANDLE mov [i],eax invoke WriteConsole,[i],szFuncNotFound,55,NULL,NULL jmp release_library @@: ; Call CreateSymbolicLinkW with correct parameter order: ; CreateSymbolicLinkW(lpSymlinkFileName, lpTargetFileName, dwFlags) ;push [dwFlags] ; dwFlags (0 for file, 1 for directory) ;push [targetPath] ; lpTargetFileName ;push [linkPath] ; lpSymlinkFileName ;call [lpCreateSymbolicLinkW] mov [dwFlags],rcx mov [targetPath],rdx mov [linkPath],r8 call [lpCreateSymbolicLinkW] ; Check result test eax,eax jnz @f invoke GetLastError invoke GetStdHandle,STD_OUTPUT_HANDLE mov [i],eax invoke WriteConsole,[i],szFailed,30,NULL,NULL jmp release_library @@: invoke GetStdHandle,STD_OUTPUT_HANDLE mov [i],eax invoke WriteConsole,[i],szSuccess,34,NULL,NULL release_library: ; Free the loaded library cmp [hKernel32],NULL je cleanup invoke FreeLibrary,[hKernel32] cleanup: ; Free memory allocated by CommandLineToArgvW cmp [argv],NULL je exit invoke LocalFree,[argv] exit: invoke ExitProcess,NULL section '.data' data readable szError db 'Error parsing command line arguments',NULL szUsage db 'Usage: ln.exe <target> <linkname> [0|1]',13,10 db '0 = file link, 1 = directory link',NULL szSuccess db 'Symbolic link created successfully',NULL szFailed db 'Failed to create symbolic link',NULL szKernel32 db 'kernel32.dll',NULL szCreateSymbolicLinkW db 'CreateSymbolicLinkW',NULL szFuncNotFound db 'CreateSymbolicLinkW function not found or not supported',NULL section '.data' readable writeable argc dd NULL argv dd NULL hKernel32 dd NULL lpCreateSymbolicLinkW dq NULL targetPath dq NULL linkPath dq NULL dwFlags dq NULL i dd NULL section '.idata' import readable library kernel32,'KERNEL32.DLL',shell32,'SHELL32.DLL' import kernel32,GetCommandLine,'GetCommandLineW',GetStdHandle,'GetStdHandle',WriteConsole,'WriteConsoleA',LoadLibrary,'LoadLibraryA',GetProcAddress,'GetProcAddress',GetLastError,'GetLastError',FreeLibrary,'FreeLibrary',LocalFree,'LocalFree',ExitProcess,'ExitProcess' import shell32,CommandLineToArgv,'CommandLineToArgvW' Что-то пошло не так, но без ошибок) --- Сообщение объединено, 3 июн 2025 --- Интересно, что перенаправление здесь не работает ln %WinDir%\system32 z 1 Корректоно создаёт линк на system32, а не SysWOW64. То-есть можно 32bit использовать код)
У функции CommandLineToArgvW есть только W вариант. А у вас тут '%fasm%/win64ax.inc' и invoke CommandLineToArgv,eax,argc попытка вызвать A вариант функции.