StrCpyNW

Тема в разделе "WASM.BEGINNERS", создана пользователем Semiono, 31 май 2025.

  1. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    848
    Код (Text):
    1.  
    2.         invoke GetCommandLine
    3.         mov ebx,eax
    4. @@:
    5.         cmp byte [ebx],NULL
    6.         je  sh
    7.         cmp byte [ebx],' '
    8.         je  @f
    9.         inc ebx
    10.         jmp @r
    11. @@:
    12.         inc ebx
    13.         cmp byte [ebx],' '
    14.         je  @r
    15. sh:
    16.         invoke PathGetArgs,ebx
    17.         mov [u],eax
    18.         invoke lstrlen,[u]
    19.  
    20.         ;invoke wsprintf,b,'%d',eax
    21.         ;invoke MessageBoxTimeout,HWND_DESKTOP,[u],b,MB_TOPMOST,LANG_NEUTRAL,5000
    22.         ;add ebx,eax
    23.         invoke StrCpy,c,ebx,[u]
    24.         invoke wsprintf,b,'%s,%s',c,[u]
    25.         invoke MessageBoxTimeout,HWND_DESKTOP,b,'',MB_TOPMOST,LANG_NEUTRAL,5000
    26.         ;invoke ShellExecute,NULL,NULL,a,ebx,NULL,SW_NORMAL
    27. exit:
    28.         invoke ExitProcess,NULL
    Столько времени убил, и упёрся в то что StrCpyN и StrNCpy не поддерживается в Win8.1?
    Кстати, как можно самому импортировать список из всяких DLL?

    Тупо хотел при помощи api разделить строку на аргументы path1 и path2, может кто поможет любой способ?
    Я просто хочу сделать себе утилиту
    invoke CreateSymbolicLink,path1,path2,NULL
    или даже с переменной папка/файл
    invoke CreateSymbolicLink,path1,path2,1

    У меня mklink не работает почему-то и давно) Небось .NET должен быть, а может PowerShell
     
  2. MaKsIm

    MaKsIm Active Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    223
  3. galenkane

    galenkane Active Member

    Публикаций:
    1
    Регистрация:
    13 янв 2017
    Сообщения:
    453
    ezy
     

    Вложения:

    • Code XXXXXX.zip
      Размер файла:
      4,4 КБ
      Просмотров:
      442
    Semiono нравится это.
  4. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.649
    Это как?
     
  5. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    848
    Может инклюды неправильные, а я привык к ним) Вписывал туда, всёравно ругалось. Да чё-то и CommandLineToArgvW пришлось ипортировать.
    import shell32,GetCommandLineW,'GetCommandLineW',CommandLineToArgvW,'CommandLineToArgvW'
    До сих пор include '%fasm%/api/shell32.inc' хватало. Кстати, как самому сделать список реальных api своих shell32.dll и других?
    Я даже fasm.zip скачал, думал я сам инклюды испортил, но там есть StrCpyN и StrNCpy.
    Кстати, из масм стал переделывать и тоже напоролся "!=", "||", "==" не поддерживается? ne, not, equale что ли? )) Я чуть потёр, вроде заработало)
     
  6. MaKsIm

    MaKsIm Active Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    223
    Кладете в папку к fasm.exe или прописываете путь к нему в переменных PATH или FASM (в последней надо прописывать строго имя файла). После просто перетаскивайте dll файл на cmd и на выходе получаете include со всеми API из этой DLL.
     

    Вложения:

    • EXPORT.zip
      Размер файла:
      3,5 КБ
      Просмотров:
      463
    Semiono нравится это.
  7. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.649
    Semiono, так как не работает апи? Не пойму. Нигде не нашел чтобы они удалены с вин8, да депрекейтед, ну так lstrcpy тем более депрекейдет, но не удаляется.
     
  8. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    848
    Надо проверить, сам не понял
    --- Сообщение объединено, 2 июн 2025 ---
    [​IMG] [​IMG]
    Может что-то не то делаю, ум за разум зашёл)
    --- Сообщение объединено, 2 июн 2025 ---
    Кстати, обычно должно DLL в окне ошибки быть. 0_0
    --- Сообщение объединено, 2 июн 2025 ---
    import shell32,StrNCpy,'StrNCpyA' так тоже самое
     
  9. galenkane

    galenkane Active Member

    Публикаций:
    1
    Регистрация:
    13 янв 2017
    Сообщения:
    453
    а чо вы пытаетесь делать то, тут же просто

    .\symlink.exe "test_file.txt" "test_file_link.txt" 0

    .\symlink.exe "test_dir" "test_dir_link" 1
     

    Вложения:

    • fasm linker.zip
      Размер файла:
      5,8 КБ
      Просмотров:
      436
    Semiono нравится это.
  10. MaKsIm

    MaKsIm Active Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    223
    Он же вам ясно и четко пишет, что вы пытаетесь экспортировать функцию StrNCpyA из 1.exe
    --- Сообщение объединено, 2 июн 2025 ---
    Нельзя дважды использовать макрос import с одной меткой shell32. Метка shell32 уже использована в api\shell32.inc. Повторное использование просто сгенерирует массивы импорта функции, которые не будут привязаны к dll. Именно поэтому я изменил стандартные макросы library и import у себя, чтобы нельзя было сделать дважды одно и тоже. Но и синтаксис их изменился. Теперь в library у меня просто перечисляются имена меток, а в import сначала идет пара "метка = имя файла" и затем уже список из "метка = имя функции". Собственно из-за этого я и сделал себе export.cmd, чтобы вручную не переписывать все api/include
     
    Semiono нравится это.
  11. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    848
    Код (Text):
    1.         ;include '%fasm%/api/shell32.inc'
    2.         ;include '%fasm%/api/shlwapi.inc'
    3.         import shlwapi,StrCpyN,'StrCpyNW'
    Так получилось)
    --- Сообщение объединено, 2 июн 2025 ---
    Я пробовал переписать на Fasm. Надо будет masm скампилить чтоб подредактировать. Хотелось бы окна убрать) Вот иногда чтонибудь спросишь и всегда консольный пример выкладывают, а тут наоборот хочется консоль, а тут окна))

    Кстати, тут сразу же непонятное для меня
    Код (Text):
    1. start:
    2.     ; Get command line arguments
    3.     invoke GetCommandLineW
    4.     invoke CommandLineToArgvW, eax, argc
    5.    
    6.     ; Check if we got valid arguments
    7.     ; .if eax == 0
    8.         invoke MessageBoxA, NULL, 'addr szError', NULL, MB_ICONERROR
    9.         cmp eax, NULL
    10.        jz exit ; jnz exit - то же самое, почему?
    11.         ; jmp exit
    12.     ; .endif
    :)
     
  12. galenkane

    galenkane Active Member

    Публикаций:
    1
    Регистрация:
    13 янв 2017
    Сообщения:
    453
    ну фасмверсию выложил выше
     
    Semiono нравится это.
  13. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    848
    Спасибо огромное!!!
    --- Сообщение объединено, 2 июн 2025 ---
    fasm
    Код (Text):
    1.  
    2.     ; Check argument count
    3.     mov eax, [argc]
    4.     cmp eax, 3
    5.     jb show_usage
    6.     cmp eax, 4
    7.     ja show_usage
    8.     jmp get_paths
    masm
    Код (Text):
    1.     ; Check argument count
    2.     mov eax, argc
    3.     .if eax < 3 || eax > 4
    4.         invoke MessageBoxA, NULL, addr szUsage, NULL, MB_ICONINFORMATION
    5.         jmp cleanup
    6.     .endif
    Вот прикольно! А я ведь подключал макрос if.inc, но всёравно всякие != не работали))
    Тут fasm более на дебаггер похож)
    --- Сообщение объединено, 2 июн 2025 ---
    Класс! Даже %SystemRoot% можно вводить! Хм. а можно вместо MsgBox вывод в CMD сделать? Всмысле если охота и время есть
     
    Последнее редактирование: 2 июн 2025
  14. MaKsIm

    MaKsIm Active Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    223
    Код (ASM):
    1. macro library [name] { common label import.data ; предотвращает повторное использование library
    2.     forward if defined name#.used
    3.                 dd RVA name#.look, 0, 0, RVA name#.name, RVA name#.addr
    4.         end if
    5.         label name#.refs ; предотвращает повторяющиеся name
    6.     common  if $ > import.data
    7.                 dd 5 dup (0)
    8.         end if }
    9. struc import from*, [fnc] {
    10.     common  rb (- RVA $) and 7
    11.         if definite .refs
    12.         .look:
    13.     forward match proc==text, fnc \{
    14.         if used proc
    15.             label proc qword at .\#\.\#proc
    16.         end if
    17.         if used .\#_\#proc
    18.             label .\#_\#proc qword at .\#\.\#proc
    19.         end if
    20.         if used .\#\.\#proc
    21.             if text eqtype ''
    22.                 dq RVA .\#\.\#proc\#\.name
    23.             else
    24.                 dq 0x8000000000000000 + text
    25.             end if
    26.         end if \}
    27.     common  if $ > .look
    28.                 dq 0
    29.         label .used at 1
    30.         end if
    31.         .addr:
    32.     forward match proc==text, fnc \{
    33.         if used .\#\.\#proc
    34.             if text eqtype ''
    35.                 .\#\.\#proc dq RVA .\#\.\#proc\#\.name
    36.             else
    37.                 .\#\.\#proc dq 0x8000000000000000 + text
    38.             end if
    39.         end if \}
    40.     common  if $ > .addr
    41.                 dq 0
    42.         .name   db from, 0
    43.         end if
    44.     forward match proc==text, fnc \{
    45.         if used .\#\.\#proc & text eqtype ''
    46.                 rb RVA $ and 1
    47.             .\#\.\#proc\#\.name db 0, 0, text, 0
    48.         end if \}
    49.     common  end if }
    Потратил некоторое время, чтобы вспомнить что я такого делал, чтобы нельзя было использовать повторные вызовы. Оказалось я просто использовал struc, которая не допускает двух экземпляров с одной меткой. Я выше описал, что у меня было
    Но на самом деле тут уже использована struc и имя библиотеки задано сначала, а первым аргументом идет имя файла и только потом список из "метка = имя функции".

    Выглядит примерно так
    Код (ASM):
    1. library kernel32.dll, shell32.dll
    2. kernel32.dll import "KERNEL32.DLL",\
    3.     GetCommandLineW = "GetCommandLineW",\
    4.     GetModuleHandleW = "GetModuleHandleW"
    5. shell32.dll import "shell32",\
    6.     CommandLineToArgvW = "CommandLineToArgvW"
    Еще в моей версии допускается импорт функций с одинаковыми именами из разных библиотек. Тогда вы должны будете обращаться к функции по полному имени с именем метки библиотеки
    Код (Text):
    1. call [kernel32.dll_GetModuleHandleW]
    2. call [GetModuleHandleW] ; Все еще возможен, но при двух одинаковых функциях в двух библиотеках даст конфликт в объявлениях
     
    Последнее редактирование: 2 июн 2025
    Semiono нравится это.
  15. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    848
    Код (Text):
    1.     push [dwFlags]        ; dwFlags (0 for file, 1 for directory)
    2.     push [targetPath]     ; lpTargetFileName
    3.     push [linkPath]       ; lpSymlinkFileName
    4.     call [lpCreateSymbolicLinkW]
    Код (Text):
    1.         mov r9d,NULL
    2.         lea r8,[dwFlags]
    3.         lea rbx,[targetPath]
    4.         lea rdx,[linkPath]
    5.         mov rcx,NULL
    6.  
    7.         call [lpCreateSymbolicLinkW]
    Вот тут у меня затык произошёл 'win64ax.inc', как push обойти? )) где-то подсмотрел примерно чё-то
     
  16. MaKsIm

    MaKsIm Active Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    223
    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):
    1. ; OpenGL programming example
    2. format PE64 GUI 5.0
    3. entry start
    4. include 'win64a.inc'
    5. include '..\..\opengl\opengl.inc'
    6. section '.text' code readable executable
    7.   start:
    8. sub rsp,8 ; Make stack dqword aligned
    9. invoke GetModuleHandle,0
    10. mov [wc.hInstance],rax
    11. invoke LoadIcon,0,IDI_APPLICATION
    12. mov [wc.hIcon],rax
    13. invoke LoadCursor,0,IDC_ARROW
    14. mov [wc.hCursor],rax
    15. invoke RegisterClass,wc
    16. invoke CreateWindowEx,0,_class,_title,WS_VISIBLE+WS_OVERLAPPEDWINDOW+WS_CLIPCHILDREN+WS_CLIPSIBLINGS,16,16,432,432,NULL,NULL,[wc.hInstance],NULL
    17.   msg_loop:
    18. invoke GetMessage,addr msg,NULL,0,0
    19. cmp eax,1
    20. jb end_loop
    21. jne msg_loop
    22. invoke TranslateMessage,addr msg
    23. invoke DispatchMessage,addr msg
    24. jmp msg_loop
    25.   end_loop:
    26. invoke ExitProcess,[msg.wParam]
    27. proc WindowProc uses rbx rsi rdi, hwnd,wmsg,wparam,lparam
    28. mov [hwnd],rcx
    29. frame
    30. cmp edx,WM_CREATE
    31. je .wmcreate
    32. cmp edx,WM_SIZE
    33. je .wmsize
    34. cmp edx,WM_PAINT
    35. je .wmpaint
    36. cmp edx,WM_KEYDOWN
    37. je .wmkeydown
    38. cmp edx,WM_DESTROY
    39. je .wmdestroy
    40.   .defwndproc:
    41. invoke DefWindowProc,rcx,rdx,r8,r9
    42. jmp .finish
    43.   .wmcreate:
    44. invoke GetDC,rcx
    45. mov [hdc],rax
    46. lea rdi,[pfd]
    47. mov rcx,sizeof.PIXELFORMATDESCRIPTOR shr 3
    48. xor eax,eax
    49. rep stosq
    50. mov [pfd.nSize],sizeof.PIXELFORMATDESCRIPTOR
    51. mov [pfd.nVersion],1
    52. mov [pfd.dwFlags],PFD_SUPPORT_OPENGL+PFD_DOUBLEBUFFER+PFD_DRAW_TO_WINDOW
    53. mov [pfd.iLayerType],PFD_MAIN_PLANE
    54. mov [pfd.iPixelType],PFD_TYPE_RGBA
    55. mov [pfd.cColorBits],16
    56. mov [pfd.cDepthBits],16
    57. mov [pfd.cAccumBits],0
    58. mov [pfd.cStencilBits],0
    59. invoke ChoosePixelFormat,[hdc],addr pfd
    60. invoke SetPixelFormat,[hdc],eax,addr pfd
    61. invoke wglCreateContext,[hdc]
    62. mov [hrc],rax
    63. invoke wglMakeCurrent,[hdc],[hrc]
    64. invoke GetClientRect,[hwnd],addr rc
    65. invoke glViewport,0,0,[rc.right],[rc.bottom]
    66. invoke GetTickCount
    67. mov [clock],eax
    68. xor eax,eax
    69. jmp .finish
    70.   .wmsize:
    71. invoke GetClientRect,[hwnd],addr rc
    72. invoke glViewport,0,0,[rc.right],[rc.bottom]
    73. xor eax,eax
    74. jmp .finish
    75.   .wmpaint:
    76. invoke GetTickCount
    77. sub eax,[clock]
    78. cmp eax,10
    79. jb .animation_ok
    80. add [clock],eax
    81. invoke glRotatef,float [theta],float dword 0.0,float dword 0.0,float dword 1.0
    82.       .animation_ok:
    83. invoke glClear,GL_COLOR_BUFFER_BIT
    84. invoke glBegin,GL_QUADS
    85. invoke glColor3f,float dword 1.0,float dword 0.1,float dword 0.1
    86. invoke glVertex3d,float -0.6,float -0.6,float 0.0
    87. invoke glColor3f,float dword 0.1,float dword 0.1,float dword 0.1
    88. invoke glVertex3d,float 0.6,float -0.6,float 0.0
    89. invoke glColor3f,float dword 0.1,float dword 0.1,float dword 1.0
    90. invoke glVertex3d,float 0.6,float 0.6,float 0.0
    91. invoke glColor3f,float dword 1.0,float dword 0.1,float dword 1.0
    92. invoke glVertex3d,float -0.6,float 0.6,float 0.0
    93. invoke glEnd
    94. invoke SwapBuffers,[hdc]
    95. xor eax,eax
    96. jmp .finish
    97.   .wmkeydown:
    98. cmp r8d,VK_ESCAPE
    99. jne .defwndproc
    100.   .wmdestroy:
    101. invoke wglMakeCurrent,0,0
    102. invoke wglDeleteContext,[hrc]
    103. invoke ReleaseDC,[hwnd],[hdc]
    104. invoke PostQuitMessage,0
    105. xor eax,eax
    106.   .finish:
    107. endf
    108. ret
    109. endp
    110. section '.data' data readable writeable
    111.   _title db 'OpenGL example',0
    112.   _class db 'FASMOPENGL32',0
    113.   theta GLfloat 0.6
    114.   wc WNDCLASS 0,WindowProc,0,0,NULL,NULL,NULL,NULL,NULL,_class
    115.   hdc dq ?
    116.   hrc dq ?
    117.   msg MSG
    118.   rc RECT
    119.   pfd PIXELFORMATDESCRIPTOR
    120.   clock dd ?
    121. section '.idata' import data readable writeable
    122.   library kernel,'KERNEL32.DLL',\
    123.   user,'USER32.DLL',\
    124.   gdi,'GDI32.DLL',\
    125.   opengl,'OPENGL32.DLL',\
    126.   glu,'GLU32.DLL'
    127.   import kernel,\
    128. GetModuleHandle,'GetModuleHandleA',\
    129. GetTickCount,'GetTickCount',\
    130. ExitProcess,'ExitProcess'
    131.   import user,\
    132. RegisterClass,'RegisterClassA',\
    133. CreateWindowEx,'CreateWindowExA',\
    134. DefWindowProc,'DefWindowProcA',\
    135. GetMessage,'GetMessageA',\
    136. TranslateMessage,'TranslateMessage',\
    137. DispatchMessage,'DispatchMessageA',\
    138. LoadCursor,'LoadCursorA',\
    139. LoadIcon,'LoadIconA',\
    140. GetClientRect,'GetClientRect',\
    141. GetDC,'GetDC',\
    142. ReleaseDC,'ReleaseDC',\
    143. PostQuitMessage,'PostQuitMessage'
    144.   import gdi,\
    145. ChoosePixelFormat,'ChoosePixelFormat',\
    146. SetPixelFormat,'SetPixelFormat',\
    147. SwapBuffers,'SwapBuffers'
    148.   import opengl,\
    149. glAccum,'glAccum',\
    150. glAlphaFunc,'glAlphaFunc',\
    151. glAreTexturesResident,'glAreTexturesResident',\
    152. glArrayElement,'glArrayElement',\
    153. glBegin,'glBegin',\
    154. glBindTexture,'glBindTexture',\
    155. glBitmap,'glBitmap',\
    156. glBlendFunc,'glBlendFunc',\
    157. glCallList,'glCallList',\
    158. glCallLists,'glCallLists',\
    159. glClear,'glClear',\
    160. glClearAccum,'glClearAccum',\
    161. glClearColor,'glClearColor',\
    162. glClearDepth,'glClearDepth',\
    163. glClearIndex,'glClearIndex',\
    164. glClearStencil,'glClearStencil',\
    165. glClipPlane,'glClipPlane',\
    166. glColor3b,'glColor3b',\
    167. glColor3bv,'glColor3bv',\
    168. glColor3d,'glColor3d',\
    169. glColor3dv,'glColor3dv',\
    170. glColor3f,'glColor3f',\
    171. glColor3fv,'glColor3fv',\
    172. glColor3i,'glColor3i',\
    173. glColor3iv,'glColor3iv',\
    174. glColor3s,'glColor3s',\
    175. glColor3sv,'glColor3sv',\
    176. glColor3ub,'glColor3ub',\
    177. glColor3ubv,'glColor3ubv',\
    178. glColor3ui,'glColor3ui',\
    179. glColor3uiv,'glColor3uiv',\
    180. glColor3us,'glColor3us',\
    181. glColor3usv,'glColor3usv',\
    182. glColor4b,'glColor4b',\
    183. glColor4bv,'glColor4bv',\
    184. glColor4d,'glColor4d',\
    185. glColor4dv,'glColor4dv',\
    186. glColor4f,'glColor4f',\
    187. glColor4fv,'glColor4fv',\
    188. glColor4i,'glColor4i',\
    189. glColor4iv,'glColor4iv',\
    190. glColor4s,'glColor4s',\
    191. glColor4sv,'glColor4sv',\
    192. glColor4ub,'glColor4ub',\
    193. glColor4ubv,'glColor4ubv',\
    194. glColor4ui,'glColor4ui',\
    195. glColor4uiv,'glColor4uiv',\
    196. glColor4us,'glColor4us',\
    197. glColor4usv,'glColor4usv',\
    198. glColorMask,'glColorMask',\
    199. glColorMaterial,'glColorMaterial',\
    200. glColorPointer,'glColorPointer',\
    201. glCopyPixels,'glCopyPixels',\
    202. glCopyTexImage1D,'glCopyTexImage1D',\
    203. glCopyTexImage2D,'glCopyTexImage2D',\
    204. glCopyTexSubImage1D,'glCopyTexSubImage1D',\
    205. glCopyTexSubImage2D,'glCopyTexSubImage2D',\
    206. glCullFace,'glCullFace',\
    207. glDeleteLists,'glDeleteLists',\
    208. glDeleteTextures,'glDeleteTextures',\
    209. glDepthFunc,'glDepthFunc',\
    210. glDepthMask,'glDepthMask',\
    211. glDepthRange,'glDepthRange',\
    212. glDisable,'glDisable',\
    213. glDisableClientState,'glDisableClientState',\
    214. glDrawArrays,'glDrawArrays',\
    215. glDrawBuffer,'glDrawBuffer',\
    216. glDrawElements,'glDrawElements',\
    217. glDrawPixels,'glDrawPixels',\
    218. glEdgeFlag,'glEdgeFlag',\
    219. glEdgeFlagPointer,'glEdgeFlagPointer',\
    220. glEdgeFlagv,'glEdgeFlagv',\
    221. glEnable,'glEnable',\
    222. glEnableClientState,'glEnableClientState',\
    223. glEnd,'glEnd',\
    224. glEndList,'glEndList',\
    225. glEvalCoord1d,'glEvalCoord1d',\
    226. glEvalCoord1dv,'glEvalCoord1dv',\
    227. glEvalCoord1f,'glEvalCoord1f',\
    228. glEvalCoord1fv,'glEvalCoord1fv',\
    229. glEvalCoord2d,'glEvalCoord2d',\
    230. glEvalCoord2dv,'glEvalCoord2dv',\
    231. glEvalCoord2f,'glEvalCoord2f',\
    232. glEvalCoord2fv,'glEvalCoord2fv',\
    233. glEvalMesh1,'glEvalMesh1',\
    234. glEvalMesh2,'glEvalMesh2',\
    235. glEvalPoint1,'glEvalPoint1',\
    236. glEvalPoint2,'glEvalPoint2',\
    237. glFeedbackBuffer,'glFeedbackBuffer',\
    238. glFinish,'glFinish',\
    239. glFlush,'glFlush',\
    240. glFogf,'glFogf',\
    241. glFogfv,'glFogfv',\
    242. glFogi,'glFogi',\
    243. glFogiv,'glFogiv',\
    244. glFrontFace,'glFrontFace',\
    245. glFrustum,'glFrustum',\
    246. glGenLists,'glGenLists',\
    247. glGenTextures,'glGenTextures',\
    248. glGetBooleanv,'glGetBooleanv',\
    249. glGetClipPlane,'glGetClipPlane',\
    250. glGetDoublev,'glGetDoublev',\
    251. glGetError,'glGetError',\
    252. glGetFloatv,'glGetFloatv',\
    253. glGetIntegerv,'glGetIntegerv',\
    254. glGetLightfv,'glGetLightfv',\
    255. glGetLightiv,'glGetLightiv',\
    256. glGetMapdv,'glGetMapdv',\
    257. glGetMapfv,'glGetMapfv',\
    258. glGetMapiv,'glGetMapiv',\
    259. glGetMaterialfv,'glGetMaterialfv',\
    260. glGetMaterialiv,'glGetMaterialiv',\
    261. glGetPixelMapfv,'glGetPixelMapfv',\
    262. glGetPixelMapuiv,'glGetPixelMapuiv',\
    263. glGetPixelMapusv,'glGetPixelMapusv',\
    264. glGetPointerv,'glGetPointerv',\
    265. glGetPolygonStipple,'glGetPolygonStipple',\
    266. glGetString,'glGetString',\
    267. glGetTexEnvfv,'glGetTexEnvfv',\
    268. glGetTexEnviv,'glGetTexEnviv',\
    269. glGetTexGendv,'glGetTexGendv',\
    270. glGetTexGenfv,'glGetTexGenfv',\
    271. glGetTexGeniv,'glGetTexGeniv',\
    272. glGetTexImage,'glGetTexImage',\
    273. glGetTexLevelParameterfv,'glGetTexLevelParameterfv',\
    274. glGetTexLevelParameteriv,'glGetTexLevelParameteriv',\
    275. glGetTexParameterfv,'glGetTexParameterfv',\
    276. glGetTexParameteriv,'glGetTexParameteriv',\
    277. glHint,'glHint',\
    278. glIndexMask,'glIndexMask',\
    279. glIndexPointer,'glIndexPointer',\
    280. glIndexd,'glIndexd',\
    281. glIndexdv,'glIndexdv',\
    282. glIndexf,'glIndexf',\
    283. glIndexfv,'glIndexfv',\
    284. glIndexi,'glIndexi',\
    285. glIndexiv,'glIndexiv',\
    286. glIndexs,'glIndexs',\
    287. glIndexsv,'glIndexsv',\
    288. glIndexub,'glIndexub',\
    289. glIndexubv,'glIndexubv',\
    290. glInitNames,'glInitNames',\
    291. glInterleavedArrays,'glInterleavedArrays',\
    292. glIsEnabled,'glIsEnabled',\
    293. glIsList,'glIsList',\
    294. glIsTexture,'glIsTexture',\
    295. glLightModelf,'glLightModelf',\
    296. glLightModelfv,'glLightModelfv',\
    297. glLightModeli,'glLightModeli',\
    298. glLightModeliv,'glLightModeliv',\
    299. glLightf,'glLightf',\
    300. glLightfv,'glLightfv',\
    301. glLighti,'glLighti',\
    302. glLightiv,'glLightiv',\
    303. glLineStipple,'glLineStipple',\
    304. glLineWidth,'glLineWidth',\
    305. glListBase,'glListBase',\
    306. glLoadIdentity,'glLoadIdentity',\
    307. glLoadMatrixd,'glLoadMatrixd',\
    308. glLoadMatrixf,'glLoadMatrixf',\
    309. glLoadName,'glLoadName',\
    310. glLogicOp,'glLogicOp',\
    311. glMap1d,'glMap1d',\
    312. glMap1f,'glMap1f',\
    313. glMap2d,'glMap2d',\
    314. glMap2f,'glMap2f',\
    315. glMapGrid1d,'glMapGrid1d',\
    316. glMapGrid1f,'glMapGrid1f',\
    317. glMapGrid2d,'glMapGrid2d',\
    318. glMapGrid2f,'glMapGrid2f',\
    319. glMaterialf,'glMaterialf',\
    320. glMaterialfv,'glMaterialfv',\
    321. glMateriali,'glMateriali',\
    322. glMaterialiv,'glMaterialiv',\
    323. glMatrixMode,'glMatrixMode',\
    324. glMultMatrixd,'glMultMatrixd',\
    325. glMultMatrixf,'glMultMatrixf',\
    326. glNewList,'glNewList',\
    327. glNormal3b,'glNormal3b',\
    328. glNormal3bv,'glNormal3bv',\
    329. glNormal3d,'glNormal3d',\
    330. glNormal3dv,'glNormal3dv',\
    331. glNormal3f,'glNormal3f',\
    332. glNormal3fv,'glNormal3fv',\
    333. glNormal3i,'glNormal3i',\
    334. glNormal3iv,'glNormal3iv',\
    335. glNormal3s,'glNormal3s',\
    336. glNormal3sv,'glNormal3sv',\
    337. glNormalPointer,'glNormalPointer',\
    338. glOrtho,'glOrtho',\
    339. glPassThrough,'glPassThrough',\
    340. glPixelMapfv,'glPixelMapfv',\
    341. glPixelMapuiv,'glPixelMapuiv',\
    342. glPixelMapusv,'glPixelMapusv',\
    343. glPixelStoref,'glPixelStoref',\
    344. glPixelStorei,'glPixelStorei',\
    345. glPixelTransferf,'glPixelTransferf',\
    346. glPixelTransferi,'glPixelTransferi',\
    347. glPixelZoom,'glPixelZoom',\
    348. glPointSize,'glPointSize',\
    349. glPolygonMode,'glPolygonMode',\
    350. glPolygonOffset,'glPolygonOffset',\
    351. glPolygonStipple,'glPolygonStipple',\
    352. glPopAttrib,'glPopAttrib',\
    353. glPopClientAttrib,'glPopClientAttrib',\
    354. glPopMatrix,'glPopMatrix',\
    355. glPopName,'glPopName',\
    356. glPrioritizeTextures,'glPrioritizeTextures',\
    357. glPushAttrib,'glPushAttrib',\
    358. glPushClientAttrib,'glPushClientAttrib',\
    359. glPushMatrix,'glPushMatrix',\
    360. glPushName,'glPushName',\
    361. glRasterPos2d,'glRasterPos2d',\
    362. glRasterPos2dv,'glRasterPos2dv',\
    363. glRasterPos2f,'glRasterPos2f',\
    364. glRasterPos2fv,'glRasterPos2fv',\
    365. glRasterPos2i,'glRasterPos2i',\
    366. glRasterPos2iv,'glRasterPos2iv',\
    367. glRasterPos2s,'glRasterPos2s',\
    368. glRasterPos2sv,'glRasterPos2sv',\
    369. glRasterPos3d,'glRasterPos3d',\
    370. glRasterPos3dv,'glRasterPos3dv',\
    371. glRasterPos3f,'glRasterPos3f',\
    372. glRasterPos3fv,'glRasterPos3fv',\
    373. glRasterPos3i,'glRasterPos3i',\
    374. glRasterPos3iv,'glRasterPos3iv',\
    375. glRasterPos3s,'glRasterPos3s',\
    376. glRasterPos3sv,'glRasterPos3sv',\
    377. glRasterPos4d,'glRasterPos4d',\
    378. glRasterPos4dv,'glRasterPos4dv',\
    379. glRasterPos4f,'glRasterPos4f',\
    380. glRasterPos4fv,'glRasterPos4fv',\
    381. glRasterPos4i,'glRasterPos4i',\
    382. glRasterPos4iv,'glRasterPos4iv',\
    383. glRasterPos4s,'glRasterPos4s',\
    384. glRasterPos4sv,'glRasterPos4sv',\
    385. glReadBuffer,'glReadBuffer',\
    386. glReadPixels,'glReadPixels',\
    387. glRectd,'glRectd',\
    388. glRectdv,'glRectdv',\
    389. glRectf,'glRectf',\
    390. glRectfv,'glRectfv',\
    391. glRecti,'glRecti',\
    392. glRectiv,'glRectiv',\
    393. glRects,'glRects',\
    394. glRectsv,'glRectsv',\
    395. glRenderMode,'glRenderMode',\
    396. glRotated,'glRotated',\
    397. glRotatef,'glRotatef',\
    398. glScaled,'glScaled',\
    399. glScalef,'glScalef',\
    400. glScissor,'glScissor',\
    401. glSelectBuffer,'glSelectBuffer',\
    402. glShadeModel,'glShadeModel',\
    403. glStencilFunc,'glStencilFunc',\
    404. glStencilMask,'glStencilMask',\
    405. glStencilOp,'glStencilOp',\
    406. glTexCoord1d,'glTexCoord1d',\
    407. glTexCoord1dv,'glTexCoord1dv',\
    408. glTexCoord1f,'glTexCoord1f',\
    409. glTexCoord1fv,'glTexCoord1fv',\
    410. glTexCoord1i,'glTexCoord1i',\
    411. glTexCoord1iv,'glTexCoord1iv',\
    412. glTexCoord1s,'glTexCoord1s',\
    413. glTexCoord1sv,'glTexCoord1sv',\
    414. glTexCoord2d,'glTexCoord2d',\
    415. glTexCoord2dv,'glTexCoord2dv',\
    416. glTexCoord2f,'glTexCoord2f',\
    417. glTexCoord2fv,'glTexCoord2fv',\
    418. glTexCoord2i,'glTexCoord2i',\
    419. glTexCoord2iv,'glTexCoord2iv',\
    420. glTexCoord2s,'glTexCoord2s',\
    421. glTexCoord2sv,'glTexCoord2sv',\
    422. glTexCoord3d,'glTexCoord3d',\
    423. glTexCoord3dv,'glTexCoord3dv',\
    424. glTexCoord3f,'glTexCoord3f',\
    425. glTexCoord3fv,'glTexCoord3fv',\
    426. glTexCoord3i,'glTexCoord3i',\
    427. glTexCoord3iv,'glTexCoord3iv',\
    428. glTexCoord3s,'glTexCoord3s',\
    429. glTexCoord3sv,'glTexCoord3sv',\
    430. glTexCoord4d,'glTexCoord4d',\
    431. glTexCoord4dv,'glTexCoord4dv',\
    432. glTexCoord4f,'glTexCoord4f',\
    433. glTexCoord4fv,'glTexCoord4fv',\
    434. glTexCoord4i,'glTexCoord4i',\
    435. glTexCoord4iv,'glTexCoord4iv',\
    436. glTexCoord4s,'glTexCoord4s',\
    437. glTexCoord4sv,'glTexCoord4sv',\
    438. glTexCoordPointer,'glTexCoordPointer',\
    439. glTexEnvf,'glTexEnvf',\
    440. glTexEnvfv,'glTexEnvfv',\
    441. glTexEnvi,'glTexEnvi',\
    442. glTexEnviv,'glTexEnviv',\
    443. glTexGend,'glTexGend',\
    444. glTexGendv,'glTexGendv',\
    445. glTexGenf,'glTexGenf',\
    446. glTexGenfv,'glTexGenfv',\
    447. glTexGeni,'glTexGeni',\
    448. glTexGeniv,'glTexGeniv',\
    449. glTexImage1D,'glTexImage1D',\
    450. glTexImage2D,'glTexImage2D',\
    451. glTexParameterf,'glTexParameterf',\
    452. glTexParameterfv,'glTexParameterfv',\
    453. glTexParameteri,'glTexParameteri',\
    454. glTexParameteriv,'glTexParameteriv',\
    455. glTexSubImage1D,'glTexSubImage1D',\
    456. glTexSubImage2D,'glTexSubImage2D',\
    457. glTranslated,'glTranslated',\
    458. glTranslatef,'glTranslatef',\
    459. glVertex2d,'glVertex2d',\
    460. glVertex2dv,'glVertex2dv',\
    461. glVertex2f,'glVertex2f',\
    462. glVertex2fv,'glVertex2fv',\
    463. glVertex2i,'glVertex2i',\
    464. glVertex2iv,'glVertex2iv',\
    465. glVertex2s,'glVertex2s',\
    466. glVertex2sv,'glVertex2sv',\
    467. glVertex3d,'glVertex3d',\
    468. glVertex3dv,'glVertex3dv',\
    469. glVertex3f,'glVertex3f',\
    470. glVertex3fv,'glVertex3fv',\
    471. glVertex3i,'glVertex3i',\
    472. glVertex3iv,'glVertex3iv',\
    473. glVertex3s,'glVertex3s',\
    474. glVertex3sv,'glVertex3sv',\
    475. glVertex4d,'glVertex4d',\
    476. glVertex4dv,'glVertex4dv',\
    477. glVertex4f,'glVertex4f',\
    478. glVertex4fv,'glVertex4fv',\
    479. glVertex4i,'glVertex4i',\
    480. glVertex4iv,'glVertex4iv',\
    481. glVertex4s,'glVertex4s',\
    482. glVertex4sv,'glVertex4sv',\
    483. glVertexPointer,'glVertexPointer',\
    484. glViewport,'glViewport',\
    485. wglGetProcAddress,'wglGetProcAddress',\
    486. wglCopyContext,'wglCopyContext',\
    487. wglCreateContext,'wglCreateContext',\
    488. wglCreateLayerContext,'wglCreateLayerContext',\
    489. wglDeleteContext,'wglDeleteContext',\
    490. wglDescribeLayerPlane,'wglDescribeLayerPlane',\
    491. wglGetCurrentContext,'wglGetCurrentContext',\
    492. wglGetCurrentDC,'wglGetCurrentDC',\
    493. wglGetLayerPaletteEntries,'wglGetLayerPaletteEntries',\
    494. wglMakeCurrent,'wglMakeCurrent',\
    495. wglRealizeLayerPalette,'wglRealizeLayerPalette',\
    496. wglSetLayerPaletteEntries,'wglSetLayerPaletteEntries',\
    497. wglShareLists,'wglShareLists',\
    498. wglSwapLayerBuffers,'wglSwapLayerBuffers',\
    499. wglSwapMultipleBuffers,'wglSwapMultipleBuffers',\
    500. wglUseFontBitmapsA,'wglUseFontBitmapsA',\
    501. wglUseFontOutlinesA,'wglUseFontOutlinesA',\
    502. wglUseFontBitmapsW,'wglUseFontBitmapsW',\
    503. wglUseFontOutlinesW,'wglUseFontOutlinesW',\
    504. glDrawRangeElements,'glDrawRangeElements',\
    505. glTexImage3D,'glTexImage3D',\
    506. glBlendColor,'glBlendColor',\
    507. glBlendEquation,'glBlendEquation',\
    508. glColorSubTable,'glColorSubTable',\
    509. glCopyColorSubTable,'glCopyColorSubTable',\
    510. glColorTable,'glColorTable',\
    511. glCopyColorTable,'glCopyColorTable',\
    512. glColorTableParameteriv,'glColorTableParameteriv',\
    513. glColorTableParameterfv,'glColorTableParameterfv',\
    514. glGetColorTable,'glGetColorTable',\
    515. glGetColorTableParameteriv,'glGetColorTableParameteriv',\
    516. glGetColorTableParameterfv,'glGetColorTableParameterfv',\
    517. glConvolutionFilter1D,'glConvolutionFilter1D',\
    518. glConvolutionFilter2D,'glConvolutionFilter2D',\
    519. glCopyConvolutionFilter1D,'glCopyConvolutionFilter1D',\
    520. glCopyConvolutionFilter2D,'glCopyConvolutionFilter2D',\
    521. glGetConvolutionFilter,'glGetConvolutionFilter',\
    522. glSeparableFilter2D,'glSeparableFilter2D',\
    523. glGetSeparableFilter,'glGetSeparableFilter',\
    524. glConvolutionParameteri,'glConvolutionParameteri',\
    525. glConvolutionParameteriv,'glConvolutionParameteriv',\
    526. glConvolutionParameterf,'glConvolutionParameterf',\
    527. glConvolutionParameterfv,'glConvolutionParameterfv',\
    528. glGetConvolutionParameteriv,'glGetConvolutionParameteriv',\
    529. glGetConvolutionParameterfv,'glGetConvolutionParameterfv',\
    530. glHistogram,'glHistogram',\
    531. glResetHistogram,'glResetHistogram',\
    532. glGetHistogram,'glGetHistogram',\
    533. glGetHistogramParameteriv,'glGetHistogramParameteriv',\
    534. glGetHistogramParameterfv,'glGetHistogramParameterfv',\
    535. glMinmax,'glMinmax',\
    536. glResetMinmax,'glResetMinmax',\
    537. glGetMinmax,'glGetMinmax',\
    538. glGetMinmaxParameteriv,'glGetMinmaxParameteriv',\
    539. glGetMinmaxParameterfv,'glGetMinmaxParameterfv'
    540.   import glu,\
    541. gluBeginCurve,'gluBeginCurve',\
    542. gluBeginPolygon,'gluBeginPolygon',\
    543. gluBeginSurface,'gluBeginSurface',\
    544. gluBeginTrim,'gluBeginTrim',\
    545. gluBuild1DMipmaps,'gluBuild1DMipmaps',\
    546. gluBuild2DMipmaps,'gluBuild2DMipmaps',\
    547. gluCylinder,'gluCylinder',\
    548. gluDeleteNurbsRenderer,'gluDeleteNurbsRenderer',\
    549. gluDeleteQuadric,'gluDeleteQuadric',\
    550. gluDeleteTess,'gluDeleteTess',\
    551. gluDisk,'gluDisk',\
    552. gluEndCurve,'gluEndCurve',\
    553. gluEndPolygon,'gluEndPolygon',\
    554. gluEndSurface,'gluEndSurface',\
    555. gluEndTrim,'gluEndTrim',\
    556. gluErrorString,'gluErrorString',\
    557. gluGetNurbsProperty,'gluGetNurbsProperty',\
    558. gluGetString,'gluGetString',\
    559. gluGetTessProperty,'gluGetTessProperty',\
    560. gluLoadSamplingMatrices,'gluLoadSamplingMatrices',\
    561. gluLookAt,'gluLookAt',\
    562. gluNewNurbsRenderer,'gluNewNurbsRenderer',\
    563. gluNewQuadric,'gluNewQuadric',\
    564. gluNewTess,'gluNewTess',\
    565. gluNextContour,'gluNextContour',\
    566. gluNurbsCallback,'gluNurbsCallback',\
    567. gluNurbsCurve,'gluNurbsCurve',\
    568. gluNurbsProperty,'gluNurbsProperty',\
    569. gluNurbsSurface,'gluNurbsSurface',\
    570. gluOrtho2D,'gluOrtho2D',\
    571. gluPartialDisk,'gluPartialDisk',\
    572. gluPerspective,'gluPerspective',\
    573. gluPickMatrix,'gluPickMatrix',\
    574. gluProject,'gluProject',\
    575. gluPwlCurve,'gluPwlCurve',\
    576. gluQuadricCallback,'gluQuadricCallback',\
    577. gluQuadricDrawStyle,'gluQuadricDrawStyle',\
    578. gluQuadricNormals,'gluQuadricNormals',\
    579. gluQuadricOrientation,'gluQuadricOrientation',\
    580. gluQuadricTexture,'gluQuadricTexture',\
    581. gluScaleImage,'gluScaleImage',\
    582. gluSphere,'gluSphere',\
    583. gluTessBeginContour,'gluTessBeginContour',\
    584. gluTessBeginPolygon,'gluTessBeginPolygon',\
    585. gluTessCallback,'gluTessCallback',\
    586. gluTessEndContour,'gluTessEndContour',\
    587. gluTessEndPolygon,'gluTessEndPolygon',\
    588. gluTessNormal,'gluTessNormal',\
    589. gluTessProperty,'gluTessProperty',\
    590. gluTessVertex,'gluTessVertex',\
    591. gluUnProject,'gluUnProject'
    Вот стандартный OpenGL.ASM из примеров к fasmw-1.73.32
    Тут как раз в WindowProc используется frame для предотвращения постоянного выделения теневого стека для первых 4 рагистровых аргументов.
     
    Semiono нравится это.
  17. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    848
    Код (Text):
    1. show_usage:
    2.  
    3.         invoke GetStdHandle,STD_OUTPUT_HANDLE
    4.         mov [i],eax
    5.         invoke WriteConsole,[i],szUsage,44,NULL,NULL
    6.  
    7.     ;invoke MessageBoxA, NULL, szUsage, NULL, MB_ICONINFORMATION
    8.     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):
    1. invoke WriteConsole,'Usage: symlink.exe <target> <linkname> [0|1]',44,NULL,NULL
    --- Сообщение объединено, 2 июн 2025 ---
    [​IMG]

    :)
     
  18. galenkane

    galenkane Active Member

    Публикаций:
    1
    Регистрация:
    13 янв 2017
    Сообщения:
    453
    я elden ring стрим щас смотрю
     

    Вложения:

    • sym cmd.zip
      Размер файла:
      2,5 КБ
      Просмотров:
      464
    Semiono нравится это.
  19. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    848
    Код (Text):
    1. format PE64 Console
    2. include '%fasm%/win64ax.inc'
    3. section '.code' executable
    4. start:
    5.         sub rsp,8
    6.  
    7.         ; Get command line arguments
    8.         invoke GetCommandLine
    9.         invoke CommandLineToArgv,eax,argc
    10.        
    11.         ; Check if we got valid arguments
    12.         test eax,eax
    13.         jnz @f
    14.  
    15.         invoke GetStdHandle,STD_OUTPUT_HANDLE
    16.         mov [i],eax
    17.         invoke WriteConsole,[i],szError,36,NULL,NULL
    18.         jmp exit
    19. @@:
    20.         mov [argv],eax
    21.        
    22.         ; Check argument count
    23.         mov eax,[argc]
    24.         cmp eax,3
    25.         jb show_usage
    26.         cmp eax,4
    27.         ja show_usage
    28.         jmp get_paths
    29.  
    30. show_usage:
    31.  
    32.         invoke GetStdHandle,STD_OUTPUT_HANDLE
    33.         mov [i],eax
    34.         invoke WriteConsole,[i],szUsage,74,NULL,NULL
    35.         jmp cleanup
    36.  
    37. get_paths:
    38.         ; Get target path (argv[1]) and link name (argv[2])
    39.         mov eax,[argv]
    40.         mov ebx,[eax+4] ; argv[1] - target
    41.         mov ecx,[eax+8] ; argv[2] - link name
    42.         mov [targetPath],rbx
    43.         mov [linkPath],rcx
    44.        
    45.         ; Parse directory flag - default to 0 (file link)
    46.         mov [dwFlags],NULL
    47.         cmp [argc],4
    48.         jne load_library
    49.        
    50.         mov eax,[argv]
    51.         mov eax,[eax+12] ; argv[3] - pointer to wide string
    52.        
    53.         ; Check first wide character (2 bytes)
    54.         movzx edx, word [eax] ; Get first wide character
    55.         cmp edx,'1'
    56.         jne @f
    57.         mov [dwFlags],1 ; SYMBOLIC_LINK_FLAG_DIRECTORY
    58.         jmp load_library
    59. @@:
    60.         cmp edx,'0'
    61.         je load_library
    62.         mov [dwFlags],NULL ; Default to file link
    63.  
    64. load_library:
    65.         ; Dynamically load CreateSymbolicLinkW
    66.         invoke LoadLibrary,szKernel32
    67.         mov [hKernel32],eax
    68.         test eax,eax
    69.         jnz @f
    70.  
    71.         invoke GetStdHandle,STD_OUTPUT_HANDLE
    72.         mov [i],eax
    73.         invoke WriteConsole,[i],szError,36,NULL,NULL
    74.         jmp cleanup
    75. @@:
    76.         invoke GetProcAddress, [hKernel32], szCreateSymbolicLinkW
    77.         mov [lpCreateSymbolicLinkW],rax
    78.         test eax,eax
    79.         jnz @f
    80.  
    81.         invoke GetStdHandle,STD_OUTPUT_HANDLE
    82.         mov [i],eax
    83.         invoke WriteConsole,[i],szFuncNotFound,55,NULL,NULL
    84.         jmp release_library
    85. @@:
    86.         ; Call CreateSymbolicLinkW with correct parameter order:
    87.         ; CreateSymbolicLinkW(lpSymlinkFileName, lpTargetFileName, dwFlags)
    88.         ;push [dwFlags] ; dwFlags (0 for file, 1 for directory)
    89.         ;push [targetPath] ; lpTargetFileName
    90.         ;push [linkPath] ; lpSymlinkFileName
    91.         ;call [lpCreateSymbolicLinkW]
    92.  
    93.         mov [dwFlags],rcx
    94.         mov [targetPath],rdx
    95.         mov [linkPath],r8
    96.         call [lpCreateSymbolicLinkW]
    97.  
    98.         ; Check result
    99.         test eax,eax
    100.         jnz @f
    101.         invoke GetLastError
    102.  
    103.         invoke GetStdHandle,STD_OUTPUT_HANDLE
    104.         mov [i],eax
    105.         invoke WriteConsole,[i],szFailed,30,NULL,NULL
    106.         jmp release_library
    107. @@:
    108.  
    109.         invoke GetStdHandle,STD_OUTPUT_HANDLE
    110.         mov [i],eax
    111.         invoke WriteConsole,[i],szSuccess,34,NULL,NULL
    112.  
    113. release_library:
    114.         ; Free the loaded library
    115.         cmp [hKernel32],NULL
    116.         je cleanup
    117.         invoke FreeLibrary,[hKernel32]
    118.  
    119. cleanup:
    120.         ; Free memory allocated by CommandLineToArgvW
    121.         cmp [argv],NULL
    122.         je exit
    123.         invoke LocalFree,[argv]
    124.  
    125. exit:
    126.         invoke ExitProcess,NULL
    127.  
    128. section '.data' data readable
    129.  
    130.         szError db 'Error parsing command line arguments',NULL
    131.         szUsage db 'Usage: ln.exe <target> <linkname> [0|1]',13,10
    132.                         db '0 = file link, 1 = directory link',NULL
    133.         szSuccess db 'Symbolic link created successfully',NULL
    134.         szFailed db 'Failed to create symbolic link',NULL
    135.         szKernel32 db 'kernel32.dll',NULL
    136.         szCreateSymbolicLinkW db 'CreateSymbolicLinkW',NULL
    137.         szFuncNotFound db 'CreateSymbolicLinkW function not found or not supported',NULL
    138.  
    139. section '.data' readable writeable
    140.  
    141.         argc dd NULL
    142.         argv dd NULL
    143.         hKernel32 dd NULL
    144.         lpCreateSymbolicLinkW dq NULL
    145.         targetPath dq NULL
    146.         linkPath dq NULL
    147.         dwFlags dq NULL
    148.         i dd NULL
    149.  
    150. section '.idata' import readable
    151.  
    152.         library kernel32,'KERNEL32.DLL',shell32,'SHELL32.DLL'
    153.         import kernel32,GetCommandLine,'GetCommandLineW',GetStdHandle,'GetStdHandle',WriteConsole,'WriteConsoleA',LoadLibrary,'LoadLibraryA',GetProcAddress,'GetProcAddress',GetLastError,'GetLastError',FreeLibrary,'FreeLibrary',LocalFree,'LocalFree',ExitProcess,'ExitProcess'
    154.         import shell32,CommandLineToArgv,'CommandLineToArgvW'
    Что-то пошло не так, но без ошибок)
    --- Сообщение объединено, 3 июн 2025 ---
    Интересно, что перенаправление здесь не работает
    ln %WinDir%\system32 z 1
    Корректоно создаёт линк на system32, а не SysWOW64. То-есть можно 32bit использовать код)
     
  20. MaKsIm

    MaKsIm Active Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    223
    У функции CommandLineToArgvW есть только W вариант. А у вас тут '%fasm%/win64ax.inc' и invoke CommandLineToArgv,eax,argc попытка вызвать A вариант функции.
    Снимок экрана_20250603_071451.png