ShellExecute и реестр

Тема в разделе "WASM.X64", создана пользователем Mikl___, 14 июн 2017.

  1. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    Простейшая программа, которая запускает проигрывание видеофайла
    Код (ASM):
    1. include win64a.inc
    2. .code
    3. WinMain proc
    4. sub esp,7*8
    5. mov qword ptr [rsp+28h],SW_SHOWNORMAL
    6. xor ecx,ecx
    7. mov [rsp+20h],rcx
    8. xor r9d,r9d
    9. mov r8d,offset szFilm
    10. mov edx,offset szNoTxt
    11. invoke ShellExecute
    12.         invoke ExitProcess,0
    13. WinMain endp
    14. szFilm db 'movie3.wmv'
    15. szNoTxt db 0
    16. end
    внутри ShellExecute находится ShellExecuteEx, которой передается адрес структуры типа SHELLEXECUTEINFO
    Код (ASM):
    1. include win64a.inc
    2. .code
    3. WinMain proc
    4. sub esp,7*8
    5. mov ecx,offset sie
    6. invoke ShellExecuteEx
    7.         invoke ExitProcess,0
    8. WinMain endp
    9. sie dd 70h,1500h,0,0
    10.    dq szNoTxt
    11.    dq szFilm
    12.    dq 0,0
    13.    dd 1,0
    14.    dq 7 dup(0)
    15. szFilm db 'movie3.wmv'
    16. szNoTxt db 0
    17. end
    а вот ЧТО находится внутри ShellExecuteEx? Интуитивно понятно, что происходит
    1. чтение реестра, где программа узнает с каким приложением ассоциировано расширение ".wmv"
    2. далее из реестра же находим путь к приложению, которое будет воспроизводить видеофайл
    3. создается командная строка типа '"C:\Program Files (x86)\Windows Media Player\wmplayer.exe" "E:\Uncle Remus tales\37\37c\movie3.wmv"',0
    4. которая передается функции CreateProcess
    Подскажите какие ветки реестра мне нужно смотреть и анализировать, чтобы программа имела универсальное применение?
     
  2. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.329
    Сначала в HKEY_CLASSES_ROOT находим ключ wmv, дефолтовое значение которого определяет тип файла (например, wmvfile). Далее там же ищем ключ wmvfile, в подключе Shell\Open\Command которого хранится командная строка для открытия файлов данного типа (именем файла заменяем placeholder вида %0, %1, етц).
     
    Mikl___ нравится это.
  3. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    Еще раз огромное спасибо rmn!
    А это готовый продукт
    00.png
    asm-файл
    Код (ASM):
    1.  
    2. ; GUI #
    3. include win64a.inc
    4. include advapi32.inc
    5. includelib advapi32.lib
    6. MI_PROCESS_CREATE equ 0
    7. MI_PROCESS_TERMINATE equ 1
    8. MI_EXIT equ 2
    9. IDR_MAINMENU equ 30
    10. WM_FINISH equ WM_USER+100h
    11. MAX_KEY_LENGTH equ 255
    12. MAX_VALUE_NAME equ 16383
    13. .code
    14. WinMain proc
    15. local msg:MSG
    16.       xor ebx,ebx
    17. mov edi,offset ClassName
    18. mov esi,IMAGE_BASE
    19. mov ecx,offset FileName
    20. invoke LoadCursorFromFile
    21. push rax ;hIconSm
    22. push rdi ;lpszClassName
    23. push IDR_MAINMENU;lpszMenuName
    24. push COLOR_WINDOW;hbrBackground
    25. push 10003h ;hCursor
    26. push rax ;hIcon
    27. push rsi ;hInstance
    28. push rbx ;cbClsExtra & cbWndExtra
    29. pushaddr WndProc;lpfnWndProc
    30. push sizeof WNDCLASSEX;cbSize & style
    31. invoke RegisterClassEx,esp ;addr WNDCLASSEX
    32. push rbx
    33. push rsi ;rsi=400000h
    34. shl esi,9 ;rsi=CW_USEDEFAULT
    35. push rbx
    36. push rbx
    37. push 200
    38. push 300
    39. push rsi
    40. push rsi
    41. sub esp,20h
    42.     invoke CreateWindowEx,WS_EX_CLIENTEDGE,edi,edi,WS_OVERLAPPEDWINDOW or WS_VISIBLE
    43. invoke GetMenu,eax
    44. mov hMenu,rax
    45.     lea edi,msg
    46. @@:   invoke GetMessage,edi,0,0,0
    47. invoke DispatchMessage,edi
    48.       jmp @b
    49. WinMain endp
    50. WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    51. local progStartInfo:STARTUPINFO
    52. local hKey:qword
    53. local lpcbData:dword
    54. local hFile:qword
    55. local szBuff[MAX_PATH*4]:byte
    56. mov edi,offset processInfo
    57. mov esi,offset proExitCode
    58. mov hWnd,rcx
    59. mov wParam,r8
    60. mov lParam,r9
    61. cmp  edx,WM_DESTROY
    62. je   wmDESTROY
    63. cmp  edx,WM_CREATE
    64. je   wmCREATE
    65. cmp  edx,WM_COMMAND
    66. je   wmCOMMAND
    67. cmp  edx,WM_INITMENUPOPUP
    68. je   wmINITMENUPOPUP
    69. cmp  edx,WM_FINISH
    70. je   TERMINATE
    71. cmp  edx,WM_TIMER
    72. je   wmTIMER
    73. leave
    74. jmp DefWindowProc
    75. wmDESTROY:invoke GetExitCodeProcess,[rdi+PROCESS_INFORMATION.hProcess],esi;proExitCode
    76. cmp dword ptr [rsi],STILL_ACTIVE
    77. jne @f
    78. invoke TerminateProcess,[rdi+PROCESS_INFORMATION.hProcess],0
    79. @@: invoke CloseHandle,[rdi+PROCESS_INFORMATION.hProcess]
    80. mov [rdi+PROCESS_INFORMATION.hProcess],rbx
    81. invoke ExitProcess,NULL
    82. wmCREATE:
    83. ;Узнаем длительность проигрывания wmv-файла
    84. mov [rsp+30h],rbx ;hTemplateFile
    85. mov qword ptr [rsp+28h],FILE_ATTRIBUTE_ARCHIVE ;dwFlagsAndAttributes
    86. mov qword ptr [rsp+20h],OPEN_EXISTING ;dwCreationDisposition
    87. mov ecx,offset FileName1+1   ;lpFileName
    88. invoke CreateFile,,GENERIC_READ,\    ;dwDesiredAccess
    89. FILE_SHARE_READ or FILE_SHARE_WRITE,\;dwShareMode
    90. 0 ;lpSecurityAttributes
    91. mov hFile,rax;handle to file
    92. mov [rsp+20h],rbx
    93. lea r9d,lpcbData
    94. lea edi,szBuff
    95. invoke ReadFile,eax,edi,100h
    96. invoke CloseHandle,hFile
    97. mov rax,qword ptr szBuff[66h];duration in 100 nSec
    98. mov edx,3518437209
    99. mul edx
    100. shr edx,13
    101. mov duration,rdx;in mSec
    102. ;----------------------------------------------------
    103. mov edx,offset aWmv
    104. invoke RegOpenKeyEx,HKEY_CLASSES_ROOT,,0,KEY_READ,&hKey
    105. xor esi,esi
    106. @@:     mov lpcbData,MAX_VALUE_NAME
    107. invoke RegEnumValue,hKey,esi,edi,&lpcbData,NULL,NULL,NULL,NULL
    108. or eax,eax
    109. jnz @f
    110. mov lpcbData,100h
    111. mov r9d,offset szREGSZ
    112. invoke RegQueryValueEx,hKey,edi,0,,edi,&lpcbData
    113. add edi,lpcbData
    114. mov eax,[rdi-5]
    115. or eax,20202000h
    116. cmp eax,dword ptr aWmv;'vmw.'
    117. jz @f
    118. inc esi
    119. jmp @b
    120. @@:
    121. ;Получаем имя класса------------------------------------------
    122. lea edx,szBuff
    123. invoke RegOpenKeyEx,HKEY_CLASSES_ROOT,,0,KEY_READ,&hKey
    124. lea eax,szBuff
    125. add eax,lpcbData
    126. mov dword ptr [rax-1],'ehs\'
    127. mov dword ptr [rax+3],'ll'
    128. invoke RegCloseKey,hKey
    129. invoke RegOpenKeyEx,HKEY_CLASSES_ROOT,&szBuff,0,KEY_READ,&hKey
    130. lea eax,lpcbData
    131. mov [rsp+28h],rax
    132. lea eax,szBuff
    133. add eax,lpcbData
    134. mov edi,eax
    135. add edi,6
    136. mov [rsp+20h],rdi
    137. mov lpcbData,MAX_PATH
    138. invoke RegQueryValueEx,hKey,0,0,,,&lpcbData
    139. or word ptr [rdi-1],605Ch;\
    140. mov rax,'dnammoc\'
    141. mov [rdi+4],rax
    142. mov [rdi+12],rbx
    143. invoke RegCloseKey,hKey
    144. invoke RegOpenKeyEx,HKEY_CLASSES_ROOT,&szBuff,0,KEY_READ,&hKey
    145. mov lpcbData,MAX_PATH
    146. mov r9d,offset szREGEXPANDSZ
    147. invoke RegQueryValueEx,hKey,0,0,,&szBuff,&lpcbData
    148. invoke RegCloseKey,hKey
    149. lea edi,szBuff
    150. add edi,lpcbData
    151. sub edi,4
    152. invoke GetCurrentDirectory,MAX_PATH,edi
    153. lea edi,[rdi+rax]
    154. mov aWmv[4],'"'
    155. mov esi,offset FileName1
    156. mov ecx,sizeof FileName1+6
    157. rep movsb
    158. lea ecx,szBuff
    159. mov edx,offset szBuff1
    160. invoke ExpandEnvironmentStrings,,,MAX_PATH
    161. jmp wmBYE
    162. wmINITMENUPOPUP:invoke GetExitCodeProcess,[rdi+PROCESS_INFORMATION.hProcess],esi
    163. or eax,eax
    164. jz @f;GetExitCodeProcess_TRUE
    165. cmp dword ptr [rsi],STILL_ACTIVE ;cmp proExitCode,STILL_ACTIVE
    166. jne @f ;     GetExitCodeProcess_STILL_ACTIVE
    167. invoke EnableMenuItem,hMenu,MI_PROCESS_CREATE,MF_GRAYED
    168. xor r8,r8; mov r8d,MF_ENABLED=0
    169. jmp @0
    170. @@: invoke EnableMenuItem,hMenu,MI_PROCESS_CREATE,MF_ENABLED
    171. mov r8d,MF_GRAYED
    172. @0:     invoke EnableMenuItem,hMenu,MI_PROCESS_TERMINATE
    173. jmp wmBYE
    174. wmCOMMAND:movzx eax,word ptr wParam
    175. or r9,r9 ;cmp lParam,0
    176. jnz wmBYE
    177. cmp rax,MI_EXIT
    178. ja wmBYE
    179. jmp  [menu_handlers+rax*8]
    180. PROCESS_CREATE:cmp [rdi+PROCESS_INFORMATION.hProcess],rbx
    181. je pi_hProcess_IS_0
    182. invoke CloseHandle,[rdi+PROCESS_INFORMATION.hProcess]
    183. mov [rdi+PROCESS_INFORMATION.hProcess],rbx
    184. pi_hProcess_IS_0:lea esi,progStartInfo
    185. invoke GetStartupInfo,esi
    186. invoke CreateProcess,0,&szBuff1,\
    187. 0,\;process security attributes
    188. 0,\;primary thread security attributes
    189. 0,\;handles are inherited
    190. NORMAL_PRIORITY_CLASS,\;creation flags
    191. 0,\;use parent's environment
    192. 0,\;use parent's current directory
    193. rsi,\;STARTUPINFO pointer
    194. rdi ;receives PROCESS_INFORMATION
    195. invoke CloseHandle,[rdi+PROCESS_INFORMATION.hThread]
    196. invoke SetTimer,hWnd,1,duration,0
    197. jmp wmBYE
    198. TERMINATE:invoke GetExitCodeProcess,[rdi+PROCESS_INFORMATION.hProcess],esi;proExitCode
    199. cmp dword ptr [rsi],STILL_ACTIVE
    200. jne proExitCode_NOT_STILL_ACTIVE;a4;
    201. invoke TerminateProcess,[rdi+PROCESS_INFORMATION.hProcess],0
    202. proExitCode_NOT_STILL_ACTIVE:
    203. invoke CloseHandle,[rdi+PROCESS_INFORMATION.hProcess]
    204. mov [rdi+PROCESS_INFORMATION.hProcess],rbx;0
    205. invoke PostMessage,hWnd,WM_INITMENUPOPUP,NULL,NULL
    206. invoke KillTimer,hWnd,1
    207. jmp wmBYE
    208. wmTIMER:invoke PostMessage,,WM_FINISH,0,0
    209. jmp wmBYE
    210. EXIT: invoke DestroyWindow
    211. wmBYE:  leave
    212. retn
    213. menu_handlers dq PROCESS_CREATE, TERMINATE, EXIT
    214. WndProc endp
    215. ;---------------------------------------
    216. ClassName       db 'Uncle Remus tales:#14 Process',0
    217. hMenu dq ?
    218. proExitCode dq ?;process exit code
    219. FileName db "..\Images\br_Rabbit3.cur",0
    220. szREGSZ db 'REG_SZ',0
    221. szREGEXPANDSZ db 'REG_EXPAND_SZ',0
    222. FileName1 db '\movie3'
    223. aWmv db '.wmv',0,0
    224. processInfo PROCESS_INFORMATION <>
    225. szBuff1 db MAX_PATH dup(?)
    226. duration dq ?
    227. end
    228.  
    rc-файл
    Код (C):
    1. #define MI_PROCESS_CREATE 0
    2. #define MI_PROCESS_TERMINATE 1
    3. #define MI_EXIT 2
    4. #define IDR_MAINMENU 30
    5. IDR_MAINMENU MENU
    6. {
    7. POPUP "&Process"
    8.         {
    9.          MENUITEM "&Create Process",MI_PROCESS_CREATE
    10.          MENUITEM "&Terminate Process",MI_PROCESS_TERMINATE,GRAYED
    11.          MENUITEM SEPARATOR
    12.          MENUITEM "E&xit",MI_EXIT
    13.         }
    14. }
    bat-файл
    Код (Text):
    1. cls
    2. set masm64_path=\masm56\
    3. set filename=%~n1
    4. call :read_settings %filename%
    5. @echo %kind_of_file%
    6. goto %kind_of_file%
    7. :GUI
    8. if exist %filename%.exe del %filename%.exe
    9. if exist %filename%.obj del %filename%.obj
    10. if exist errors.txt del errors.txt
    11. %masm64_path%bin\ml64 /Cp /c /I"%masm64_path%Include" %filename%.asm >> errors.txt
    12. if errorlevel 1 exit
    13. if exist %1.rc (
    14. %masm64_path%\bin\RC /r /i"%masm64_path%\Include" %filename%.rc >> errors.txt
    15. %masm64_path%bin\link /SUBSYSTEM:WINDOWS /LIBPATH:"%masm64_path%Lib" ^
    16. /LARGEADDRESSAWARE:NO /BASE:0x400000 /STUB:%masm64_path%bin\stubby.exe ^
    17. /SECTION:.text,W /ALIGN:16 /entry:WinMain /MERGE:.rdata=.text ^
    18. /fixed /nocoffgrpinfo %filename%.obj %filename%.res >> errors.txt
    19. ) else (
    20. %masm64_path%bin\link /SUBSYSTEM:WINDOWS /LIBPATH:"%masm64_path%Lib" ^
    21. /LARGEADDRESSAWARE:NO /BASE:0x400000 /STUB:%masm64_path%bin\stubby.exe ^
    22. /SECTION:.text,W /ALIGN:16 /entry:WinMain /MERGE:.rdata=.text ^
    23. /fixed /nocoffgrpinfo %filename%.obj >> errors.txt
    24. )
    25. if errorlevel 1 exit
    26. if exist %1.res del %1.res
    27. del %filename%.obj
    28. del errors.txt
    29. exit
    30. :DLL
    31. if exist %filename%.dll del %filename%.dll
    32. %masm64_path%bin\ml64 /c /Cp /I %masm64_path%include %filename%.asm >> errors.txt
    33. if errorlevel 1 exit
    34. if exist %1.rc (
    35. %masm64_path%bin\RC /r  %filename%.rc >> errors.txt
    36. if errorlevel 1 exit
    37. %masm64_path%bin\link /SUBSYSTEM:WINDOWS /LIBPATH:%masm64_path%lib ^
    38. /ENTRY:DllMain /DLL /DLL /section:.bss,S /stub:%masm64_path%bin\stubby.exe  ^
    39. %filename%.obj %filename%.res /DEF:%filename%.def >> errors.txt
    40. ) else (
    41. %masm64_path%bin\link /SUBSYSTEM:WINDOWS /LIBPATH:%masm64_path%lib ^
    42. /ENTRY:DllMain /DLL /DLL /section:.bss,S /stub:%masm64_path%bin\stubby.exe  ^
    43. %filename%.obj /DEF:%filename%.def >> errors.txt
    44. )
    45. if errorlevel 1 exit
    46. if exist %1.res del %1.res
    47. del %filename%.obj
    48. del %filename%.exp
    49. del errors.txt
    50. exit
    51. :read_settings
    52. for /f "eol=# tokens=2-3" %%A in (%filename%.asm) do (
    53. set kind_of_file=%%A
    54. if %%B == # exit /b )
    55. exit /b
    Файл movie3.wmv должен быть в той же папке, что и ехе-файл. В аттаче исходные тексты и ехе-файл
     

    Вложения:

    • 14.zip
      Размер файла:
      6,1 КБ
      Просмотров:
      340
    rococo795 нравится это.
  4. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.329
    Mikl___,
    Зачем перебирать все подключи и значения? Можно просто взять расширение файла и использовать его в качестве имени ключа. Так же и с дефолтовым значением - в качестве имени используется пустая строка или NULL.

    И форматирование кода, конечно же, просто ужасное :)
     
  5. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    rmn,
    увы, дефолтное значение не всегда file.wmv Пришлось перебирать все значения и искать ".wmv" или ".WMV". А по поводу, форматирования, IMHO табуляция не отображается... :)
     
  6. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.329
    Не понял. У нас есть ключ HKEY_CLASSES_ROOT\.??? для всех ассоциированных расширений, просто берем расширение файла с точкой и используем его в качестве имени ключа в RegOpenKey(). Если ключ успешно открыт, читаем его дефолтовое значение (пустая строка в качестве имени) и используем прочитанный тип файла в качестве имени ключа: HKEY_CLASSES_ROOT\%FILETYPE%\Shell\Open\Command. Если ключ успешно открыт, читаем его дефолтовое значение (пустая строка в качестве имени) и используем прочитанную командную строку для запуска ассоциированной программы. Очевидно, тут надо написать функцию:
    Код (C):
    1.  
    2. BOOL RegQueryDefaultValue (HKEY key, LPCTSTR subKey, LPTSTR buffer)
    3. {
    4.     RegOpenKeyEx(...);
    5.     RegQueryValue (...);
    6.     RegCloseKey (...);
    7.    
    8.     return result;
    9. }
    10.  
    и решить задачу двумя ее вызовами, вместо перебора десятков тысяч ключей в HCR.
     
  7. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    rmn,
    попробую объяснить. На домашнем компе:
    1. открываю ветку HKEY_CLASSES_ROOT\.wmv
    2. получаю значение по умолчанию "VLC.wmv"
    3. открываю ветку HKEY_CLASSES_ROOT\VLC.wmv
    4. добавляю \shell от неё идет три ветки "AddToPlaylistVLC", "Open" и "PlayWithVLC"
    5. какую выбирать? HKEY_CLASSES_ROOT\VLC.wmv\shell содержит значение "Open"
    6. переходим на HKEY_CLASSES_ROOT\VLC.wmv\shell\Open
    7. добавляю \command
    8. читаю значение "C:\Program Files (x86)\VideoLAN\VLC\vlc.exe" --started-from-file "%1"
    Но это на домашнем компе, на работе программа не пошла, так как "значение по умолчанию" не имело вид file.wmv, но вот третье значение было WMP11.AssocFile.WMV поэтому и пришлось задействовать связку из RegEnumValue+RegQueryValueEx перебирать значения и искать среди них запись с расширением .wmv
     
  8. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.329
    А оно может быть произвольного вида. Что там было? И был ли подключ с таким же именем в HCR?

    Попробуй вот этим (расширение поменять на exe).
     

    Вложения:

  9. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    веткаимятипзначение
    HKEY_CLASS_ROOT\.wmvпо умолчаниюREG_SZWMP.PlayMedia
    HKEY_CLASS_ROOT\WMP.PlayMediaпо умолчаниюREG_SZзначение не присвоено
    HKEY_CLASS_ROOT\WMP.PlayMedia\shellпо умолчаниюREG_SZзначение не присвоено
    HKEY_CLASS_ROOT\WMP.PlayMedia\shell\Playпо умолчаниюREG_SZ&Play
    HKEY_CLASS_ROOT\WMP.PlayMedia\shell\Play\commandпо умолчаниюREG_SZзначение не присвоено
    HKEY_CLASS_ROOT\WMP.PlayMedia\shell\Play\commandDelegateExecuteREG_SZed1d0fdf-4414-470a-a56d-cfb68623fc58
    00.png
     
    Последнее редактирование: 21 июн 2017
  10. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    Переделал
    rc-файл
    Код (C++):
    1. #define MI_PROCESS_CREATE 0
    2. #define MI_PROCESS_TERMINATE 1
    3. #define MI_EXIT 2
    4. #define IDR_MAINMENU 30
    5. IDR_MAINMENU MENU
    6. {
    7. POPUP "&Process"
    8.         {
    9.          MENUITEM "&Create Process",MI_PROCESS_CREATE
    10.          MENUITEM "&Terminate Process",MI_PROCESS_TERMINATE,GRAYED
    11.          MENUITEM SEPARATOR
    12.          MENUITEM "E&xit",MI_EXIT
    13.         }
    14. }
    asm-файл
    Код (ASM):
    1. ; GUI #
    2. include win64a.inc
    3. include advapi32.inc
    4. includelib advapi32.lib
    5. MI_PROCESS_CREATE equ 0
    6. MI_PROCESS_TERMINATE equ 1
    7. MI_EXIT equ 2
    8. IDR_MAINMENU equ 30
    9. WM_FINISH equ WM_USER+100h
    10. MAX_KEY_LENGTH equ 255
    11. MAX_VALUE_NAME equ 16383
    12. .code
    13. WinMain proc
    14. local msg:MSG
    15.       xor ebx,ebx
    16. mov edi,offset ClassName
    17. mov esi,IMAGE_BASE
    18. mov ecx,offset FileName
    19. invoke LoadCursorFromFile
    20. push rax ;hIconSm
    21. push rdi ;lpszClassName
    22. push IDR_MAINMENU;lpszMenuName
    23. push COLOR_WINDOW;hbrBackground
    24. push 10003h ;hCursor
    25. push rax ;hIcon
    26. push rsi ;hInstance
    27. push rbx ;cbClsExtra & cbWndExtra
    28. pushaddr WndProc;lpfnWndProc
    29. push sizeof WNDCLASSEX;cbSize & style
    30. invoke RegisterClassEx,esp ;addr WNDCLASSEX
    31. push rbx
    32. push rsi ;rsi=400000h
    33. shl esi,9 ;rsi=CW_USEDEFAULT
    34. push rbx
    35. push rbx
    36. push 200
    37. push 300
    38. push rsi
    39. push rsi
    40. sub esp,20h
    41.     invoke CreateWindowEx,WS_EX_CLIENTEDGE,edi,edi,WS_OVERLAPPEDWINDOW or WS_VISIBLE
    42. invoke GetMenu,eax
    43. mov hMenu,rax
    44.     lea edi,msg
    45. @@:   invoke GetMessage,edi,0,0,0
    46. invoke DispatchMessage,edi
    47.       jmp @b
    48. WinMain endp
    49. WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    50. local progStartInfo:STARTUPINFO
    51. local hKey:qword
    52. local lpcbData:dword
    53. local lpType:dword
    54. local hFile:qword
    55. local szBuff[MAX_PATH*4]:byte
    56. local old_rdi:qword
    57. local old_rsi:qword
    58. mov hWnd,rcx
    59. mov wParam,r8
    60. mov lParam,r9
    61. mov old_rdi,rdi
    62.         mov old_rsi,rsi
    63. cmp  edx,WM_DESTROY
    64. je   wmDESTROY
    65. cmp  edx,WM_CREATE
    66. je   wmCREATE
    67. cmp  edx,WM_COMMAND
    68. je   wmCOMMAND
    69. cmp  edx,WM_INITMENUPOPUP
    70. je   wmINITMENUPOPUP
    71. cmp  edx,WM_FINISH
    72. je   TERMINATE
    73. cmp  edx,WM_TIMER
    74. je   wmTIMER
    75. leave
    76. jmp DefWindowProc
    77. wmDESTROY:invoke GetExitCodeProcess,processInfo.hProcess,esi;proExitCode
    78. cmp dword ptr proExitCode,STILL_ACTIVE
    79. jne @f
    80. invoke TerminateProcess,processInfo.hProcess,0
    81. @@: invoke CloseHandle,processInfo.hProcess
    82. mov processInfo.hProcess,rbx
    83. invoke ExitProcess,NULL
    84. wmCREATE:
    85. ;get the length of playing a wmv-file
    86. mov [rsp+30h],rbx ;hTemplateFile
    87. mov qword ptr [rsp+28h],FILE_ATTRIBUTE_ARCHIVE ;dwFlagsAndAttributes
    88. mov qword ptr [rsp+20h],OPEN_EXISTING ;dwCreationDisposition
    89. mov ecx,offset FileName1+1   ;lpFileName
    90. invoke CreateFile,,GENERIC_READ,\    ;dwDesiredAccess
    91. FILE_SHARE_READ or FILE_SHARE_WRITE,\;dwShareMode
    92. 0 ;lpSecurityAttributes
    93. mov hFile,rax;handle to file
    94. mov [rsp+20h],rbx
    95. lea r9d,lpcbData
    96. lea edi,szBuff
    97. invoke ReadFile,eax,edi,100h
    98. invoke CloseHandle,hFile
    99. mov rax,qword ptr szBuff[66h];duration in 100 nSec
    100. ;Duration in 100nSec-units is divided by 10000 and get in duration in 1mSec-units
    101. mov edx,3518437209;"magic number"
    102. mul edx
    103. shr edx,13
    104. mov duration,rdx;in mSec
    105. ;----------------------------------------------------
    106. ;Open the section HKEY_CLASSES_ROOT\.wmv\OpenWithProgids
    107. mov edx,offset aWmv1
    108. invoke RegOpenKeyEx,HKEY_CLASSES_ROOT,,0,KEY_READ,&hKey
    109.         or eax,eax
    110. jnz bad0
    111. xor esi,esi
    112. ; inc esi
    113. @@:     mov lpcbData,MAX_VALUE_NAME
    114. invoke RegEnumValue,hKey,esi,edi,&lpcbData,NULL,&lpType,NULL,NULL
    115. ;HKEY hKey, // A handle to an open registry key
    116. ;DWORD dwIndex,=esi // The index of the value to be retrieved
    117. ;LPTSTR lpValueName,edi=&szBuff // A pointer to a buffer that receives the name of the value as a null-terminated string
    118. ;LPDWORD lpcbValueName,=&lpcbData // A pointer to a variable that specifies the size of the buffer pointed to by the lpValueName parameter, in characters
    119. ;LPDWORD lpReserved,=0 // This parameter is reserved and must be NULL.
    120. ;LPDWORD lpType,=&lpType // A pointer to a variable that receives a code indicating the type of data stored in the specified value
    121. ;LPBYTE lpData,=0 // A pointer to a buffer that receives the data for the value entry
    122. ;LPDWORD lpcbData,=&lpcbData // A pointer to a variable that specifies the size of the buffer pointed to by the lpData parameter, in bytes
    123. or eax,eax
    124. jnz bad1;Until we get all the keys HKEY_CLASSES_ROOT\.wmv\OpenWithProgids
    125. ;Looking for a key with an end on .wmv
    126.         cmp lpcbData,5;The string is longer than ".wmv" ?
    127. jb a1; To the next line
    128. mov eax,edi
    129. add eax,lpcbData;Go to the end of the line
    130. mov eax,[rax-4]
    131. or eax,20202000h;We give an extension to the lower case
    132. cmp eax,dword ptr aWmv;это ".wmv" ?
    133. jz @f
    134. a1: inc esi
    135. jmp @b
    136. bad0:   invoke MessageBox,0,&error0,&ClassName,MB_OK
    137. jmp wmDESTROY
    138. bad1:;Closed the section HKEY_CLASSES_ROOT\.wmv\OpenWithProgids
    139. invoke RegCloseKey,hKey
    140. invoke MessageBox,0,&error1,&ClassName,MB_OK
    141. jmp wmDESTROY
    142. @@:;Closed the section HKEY_CLASSES_ROOT\.wmv\OpenWithProgids
    143. invoke RegCloseKey,hKey
    144. ;Get the name mplayerc.wmv or WMP11.AssocFile.WMV
    145. ;Make of it HKEY_CLASSES_ROOT\mplayerc.wmv\shell
    146. ;or HKEY_CLASSES_ROOT\WMP11.AssocFile.WMV\shell
    147. add edi,lpcbData
    148. cmp lpType,REG_SZ
    149. jne @f
    150. dec edi
    151. @@: mov dword ptr [rdi],'ehs\'
    152. mov dword ptr [rdi+4],'ll'
    153. lea edx,szBuff
    154. invoke RegOpenKeyEx,HKEY_CLASSES_ROOT,,0,KEY_READ,&hKey
    155. ;Read the meaning HKEY_CLASSES_ROOT\mplayerc.wmv\shell = open
    156. ;or        HKEY_CLASSES_ROOT\WMP11.AssocFile.WMV\shell = Play
    157.         lea eax,lpcbData
    158. mov [rsp+28h],rax
    159. add edi,7;Length of string "\shell\"
    160. mov [rsp+20h],rdi
    161. mov lpcbData,MAX_PATH
    162. invoke RegQueryValueEx,hKey,0,0,,edi,&lpcbData
    163. ;Closed the section HKEY_CLASSES_ROOT\mplayerc.wmv\shell
    164. ;   or  HKEY_CLASSES_ROOT\WMP11.AssocFile.WMV\shell
    165. invoke RegCloseKey,hKey
    166. ;Open the section HKEY_CLASSES_ROOT\mplayerc.wmv\shell\open\command
    167. ;or       HKEY_CLASSES_ROOT\WMP11.AssocFile.WMV\shell\play\command
    168. or word ptr [rdi-1],605Ch;"\"+ lower case
    169. mov rax,'dnammoc\'
    170. mov [rdi+4],rax
    171. mov [rdi+12],rbx
    172. invoke RegOpenKeyEx,HKEY_CLASSES_ROOT,&szBuff,0,KEY_READ,&hKey
    173. ;Read the meaning HKEY_CLASSES_ROOT\mplayerc.wmv\shell\open\command
    174. ;"C:\Program Files (x86)\Combined Community Codec Pack\MPC\mpc-hc.exe" "%1"
    175. ;     or HKEY_CLASSES_ROOT\WMP11.AssocFile.WMV\shell\play\command
    176. ;"%ProgramFiles(x86)%\Windows Media Player\wmplayer.exe" /prefetch:7 /Play "%L"
    177. mov lpcbData,MAX_PATH
    178. lea r9d,lpType
    179. invoke RegQueryValueEx,hKey,0,0,,&szBuff,&lpcbData
    180. ;Closed the section HKEY_CLASSES_ROOT\mplayerc.wmv\shell\open\command
    181. ;    or HKEY_CLASSES_ROOT\WMP11.AssocFile.WMV\shell\play\command
    182. invoke RegCloseKey,hKey
    183. lea edi,szBuff
    184. add edi,lpcbData
    185. sub edi,4
    186. invoke GetCurrentDirectory,MAX_PATH,edi
    187. lea edi,[rdi+rax]
    188. mov aWmv[4],'"'
    189. mov esi,offset FileName1
    190. mov ecx,sizeof FileName1+6
    191. rep movsb
    192. lea ecx,szBuff
    193. mov edx,offset szBuff1
    194. invoke ExpandEnvironmentStrings,,,MAX_PATH
    195. jmp wmBYE
    196. wmINITMENUPOPUP:mov edx,offset proExitCode
    197. invoke GetExitCodeProcess,processInfo.hProcess
    198. or eax,eax
    199. jz @f;GetExitCodeProcess_TRUE
    200. cmp dword ptr proExitCode,STILL_ACTIVE ;cmp proExitCode,STILL_ACTIVE
    201. jne @f ;     GetExitCodeProcess_STILL_ACTIVE
    202. invoke EnableMenuItem,hMenu,MI_PROCESS_CREATE,MF_GRAYED
    203. xor r8,r8; mov r8d,MF_ENABLED=0
    204. jmp @0
    205. @@: invoke EnableMenuItem,hMenu,MI_PROCESS_CREATE,MF_ENABLED
    206. mov r8d,MF_GRAYED
    207. @0:     invoke EnableMenuItem,hMenu,MI_PROCESS_TERMINATE
    208. jmp wmBYE
    209. wmCOMMAND:movzx eax,word ptr wParam
    210. or r9,r9 ;cmp lParam,0
    211. jnz wmBYE
    212. cmp rax,MI_EXIT
    213. ja wmBYE
    214. jmp  [menu_handlers+rax*8]
    215. PROCESS_CREATE:cmp processInfo.hProcess,rbx
    216. je pi_hProcess_IS_0
    217. invoke CloseHandle,processInfo.hProcess
    218. mov processInfo.hProcess,rbx
    219. pi_hProcess_IS_0:lea esi,progStartInfo
    220. invoke GetStartupInfo,esi
    221. invoke CreateProcess,0,&szBuff1,\
    222. 0,\;process security attributes
    223. 0,\;primary thread security attributes
    224. 0,\;handles are inherited
    225. NORMAL_PRIORITY_CLASS,\;creation flags
    226. 0,\;use parent's environment
    227. 0,\;use parent's current directory
    228. rsi,\;STARTUPINFO pointer
    229. &processInfo ;receives PROCESS_INFORMATION
    230. invoke CloseHandle,processInfo.hThread
    231. invoke SetTimer,hWnd,1,duration,0
    232. jmp wmBYE
    233. TERMINATE:mov edx,offset proExitCode
    234. invoke GetExitCodeProcess,processInfo.hProcess
    235. cmp dword ptr proExitCode,STILL_ACTIVE
    236. jne proExitCode_NOT_STILL_ACTIVE;a4;
    237. invoke TerminateProcess,processInfo.hProcess,0
    238. proExitCode_NOT_STILL_ACTIVE:
    239. invoke CloseHandle,processInfo.hProcess
    240. mov processInfo.hProcess,rbx;0
    241. invoke PostMessage,hWnd,WM_INITMENUPOPUP,NULL,NULL
    242. invoke KillTimer,hWnd,1
    243. jmp wmBYE
    244. wmTIMER:invoke PostMessage,,WM_FINISH,0,0
    245. jmp wmBYE
    246. EXIT: invoke DestroyWindow
    247. wmBYE:  mov rdi,old_rdi
    248.         mov rsi,old_rsi
    249. leave
    250. retn
    251. menu_handlers dq PROCESS_CREATE, TERMINATE, EXIT
    252. WndProc endp
    253. ;---------------------------------------
    254. .data
    255. ClassName       db 'Uncle Remus tales:#14 Process',0
    256. hMenu dq ?
    257. proExitCode dq ?;process exit code
    258. FileName db "..\Images\br_Rabbit3.cur",0
    259. FileName1 db '\movie3'
    260. aWmv db '.wmv',0,0
    261. aWmv1           db '.wmv\OpenWithProgids',0
    262. processInfo PROCESS_INFORMATION <>
    263. szBuff1 db MAX_PATH dup(?)
    264. duration dq ?
    265. error0 db "No section HKEY_CLASSES_ROOT\.wmv\OpenWithProgids",0
    266. error1 db "Did not find the application that plays the wmv-files",0
    267. end
    ехе и исходные файлы в аттаче, файл 'movie3.wmv' должен находиться в той же папке, что и ехе-файл
     

    Вложения:

    • 14.zip
      Размер файла:
      7,1 КБ
      Просмотров:
      306