Простейшая программа, которая запускает проигрывание видеофайла Код (ASM): include win64a.inc .code WinMain proc sub esp,7*8 mov qword ptr [rsp+28h],SW_SHOWNORMAL xor ecx,ecx mov [rsp+20h],rcx xor r9d,r9d mov r8d,offset szFilm mov edx,offset szNoTxt invoke ShellExecute invoke ExitProcess,0 WinMain endp szFilm db 'movie3.wmv' szNoTxt db 0 end внутри ShellExecute находится ShellExecuteEx, которой передается адрес структуры типа SHELLEXECUTEINFO Код (ASM): include win64a.inc .code WinMain proc sub esp,7*8 mov ecx,offset sie invoke ShellExecuteEx invoke ExitProcess,0 WinMain endp sie dd 70h,1500h,0,0 dq szNoTxt dq szFilm dq 0,0 dd 1,0 dq 7 dup(0) szFilm db 'movie3.wmv' szNoTxt db 0 end а вот ЧТО находится внутри ShellExecuteEx? Интуитивно понятно, что происходит чтение реестра, где программа узнает с каким приложением ассоциировано расширение ".wmv" далее из реестра же находим путь к приложению, которое будет воспроизводить видеофайл создается командная строка типа '"C:\Program Files (x86)\Windows Media Player\wmplayer.exe" "E:\Uncle Remus tales\37\37c\movie3.wmv"',0 которая передается функции CreateProcess Подскажите какие ветки реестра мне нужно смотреть и анализировать, чтобы программа имела универсальное применение?
Сначала в HKEY_CLASSES_ROOT находим ключ wmv, дефолтовое значение которого определяет тип файла (например, wmvfile). Далее там же ищем ключ wmvfile, в подключе Shell\Open\Command которого хранится командная строка для открытия файлов данного типа (именем файла заменяем placeholder вида %0, %1, етц).
Еще раз огромное спасибо rmn! А это готовый продукт asm-файл Код (ASM): ; GUI # include win64a.inc include advapi32.inc includelib advapi32.lib MI_PROCESS_CREATE equ 0 MI_PROCESS_TERMINATE equ 1 MI_EXIT equ 2 IDR_MAINMENU equ 30 WM_FINISH equ WM_USER+100h MAX_KEY_LENGTH equ 255 MAX_VALUE_NAME equ 16383 .code WinMain proc local msg:MSG xor ebx,ebx mov edi,offset ClassName mov esi,IMAGE_BASE mov ecx,offset FileName invoke LoadCursorFromFile push rax ;hIconSm push rdi ;lpszClassName push IDR_MAINMENU;lpszMenuName push COLOR_WINDOW;hbrBackground push 10003h ;hCursor push rax ;hIcon push rsi ;hInstance push rbx ;cbClsExtra & cbWndExtra pushaddr WndProc;lpfnWndProc push sizeof WNDCLASSEX;cbSize & style invoke RegisterClassEx,esp ;addr WNDCLASSEX push rbx push rsi ;rsi=400000h shl esi,9 ;rsi=CW_USEDEFAULT push rbx push rbx push 200 push 300 push rsi push rsi sub esp,20h invoke CreateWindowEx,WS_EX_CLIENTEDGE,edi,edi,WS_OVERLAPPEDWINDOW or WS_VISIBLE invoke GetMenu,eax mov hMenu,rax lea edi,msg @@: invoke GetMessage,edi,0,0,0 invoke DispatchMessage,edi jmp @b WinMain endp WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM local progStartInfo:STARTUPINFO local hKey:qword local lpcbData:dword local hFile:qword local szBuff[MAX_PATH*4]:byte mov edi,offset processInfo mov esi,offset proExitCode mov hWnd,rcx mov wParam,r8 mov lParam,r9 cmp edx,WM_DESTROY je wmDESTROY cmp edx,WM_CREATE je wmCREATE cmp edx,WM_COMMAND je wmCOMMAND cmp edx,WM_INITMENUPOPUP je wmINITMENUPOPUP cmp edx,WM_FINISH je TERMINATE cmp edx,WM_TIMER je wmTIMER leave jmp DefWindowProc wmDESTROY:invoke GetExitCodeProcess,[rdi+PROCESS_INFORMATION.hProcess],esi;proExitCode cmp dword ptr [rsi],STILL_ACTIVE jne @f invoke TerminateProcess,[rdi+PROCESS_INFORMATION.hProcess],0 @@: invoke CloseHandle,[rdi+PROCESS_INFORMATION.hProcess] mov [rdi+PROCESS_INFORMATION.hProcess],rbx invoke ExitProcess,NULL wmCREATE: ;Узнаем длительность проигрывания wmv-файла mov [rsp+30h],rbx ;hTemplateFile mov qword ptr [rsp+28h],FILE_ATTRIBUTE_ARCHIVE ;dwFlagsAndAttributes mov qword ptr [rsp+20h],OPEN_EXISTING ;dwCreationDisposition mov ecx,offset FileName1+1 ;lpFileName invoke CreateFile,,GENERIC_READ,\ ;dwDesiredAccess FILE_SHARE_READ or FILE_SHARE_WRITE,\;dwShareMode 0 ;lpSecurityAttributes mov hFile,rax;handle to file mov [rsp+20h],rbx lea r9d,lpcbData lea edi,szBuff invoke ReadFile,eax,edi,100h invoke CloseHandle,hFile mov rax,qword ptr szBuff[66h];duration in 100 nSec mov edx,3518437209 mul edx shr edx,13 mov duration,rdx;in mSec ;---------------------------------------------------- mov edx,offset aWmv invoke RegOpenKeyEx,HKEY_CLASSES_ROOT,,0,KEY_READ,&hKey xor esi,esi @@: mov lpcbData,MAX_VALUE_NAME invoke RegEnumValue,hKey,esi,edi,&lpcbData,NULL,NULL,NULL,NULL or eax,eax jnz @f mov lpcbData,100h mov r9d,offset szREGSZ invoke RegQueryValueEx,hKey,edi,0,,edi,&lpcbData add edi,lpcbData mov eax,[rdi-5] or eax,20202000h cmp eax,dword ptr aWmv;'vmw.' jz @f inc esi jmp @b @@: ;Получаем имя класса------------------------------------------ lea edx,szBuff invoke RegOpenKeyEx,HKEY_CLASSES_ROOT,,0,KEY_READ,&hKey lea eax,szBuff add eax,lpcbData mov dword ptr [rax-1],'ehs\' mov dword ptr [rax+3],'ll' invoke RegCloseKey,hKey invoke RegOpenKeyEx,HKEY_CLASSES_ROOT,&szBuff,0,KEY_READ,&hKey lea eax,lpcbData mov [rsp+28h],rax lea eax,szBuff add eax,lpcbData mov edi,eax add edi,6 mov [rsp+20h],rdi mov lpcbData,MAX_PATH invoke RegQueryValueEx,hKey,0,0,,,&lpcbData or word ptr [rdi-1],605Ch;\ mov rax,'dnammoc\' mov [rdi+4],rax mov [rdi+12],rbx invoke RegCloseKey,hKey invoke RegOpenKeyEx,HKEY_CLASSES_ROOT,&szBuff,0,KEY_READ,&hKey mov lpcbData,MAX_PATH mov r9d,offset szREGEXPANDSZ invoke RegQueryValueEx,hKey,0,0,,&szBuff,&lpcbData invoke RegCloseKey,hKey lea edi,szBuff add edi,lpcbData sub edi,4 invoke GetCurrentDirectory,MAX_PATH,edi lea edi,[rdi+rax] mov aWmv[4],'"' mov esi,offset FileName1 mov ecx,sizeof FileName1+6 rep movsb lea ecx,szBuff mov edx,offset szBuff1 invoke ExpandEnvironmentStrings,,,MAX_PATH jmp wmBYE wmINITMENUPOPUP:invoke GetExitCodeProcess,[rdi+PROCESS_INFORMATION.hProcess],esi or eax,eax jz @f;GetExitCodeProcess_TRUE cmp dword ptr [rsi],STILL_ACTIVE ;cmp proExitCode,STILL_ACTIVE jne @f ; GetExitCodeProcess_STILL_ACTIVE invoke EnableMenuItem,hMenu,MI_PROCESS_CREATE,MF_GRAYED xor r8,r8; mov r8d,MF_ENABLED=0 jmp @0 @@: invoke EnableMenuItem,hMenu,MI_PROCESS_CREATE,MF_ENABLED mov r8d,MF_GRAYED @0: invoke EnableMenuItem,hMenu,MI_PROCESS_TERMINATE jmp wmBYE wmCOMMAND:movzx eax,word ptr wParam or r9,r9 ;cmp lParam,0 jnz wmBYE cmp rax,MI_EXIT ja wmBYE jmp [menu_handlers+rax*8] PROCESS_CREATE:cmp [rdi+PROCESS_INFORMATION.hProcess],rbx je pi_hProcess_IS_0 invoke CloseHandle,[rdi+PROCESS_INFORMATION.hProcess] mov [rdi+PROCESS_INFORMATION.hProcess],rbx pi_hProcess_IS_0:lea esi,progStartInfo invoke GetStartupInfo,esi invoke CreateProcess,0,&szBuff1,\ 0,\;process security attributes 0,\;primary thread security attributes 0,\;handles are inherited NORMAL_PRIORITY_CLASS,\;creation flags 0,\;use parent's environment 0,\;use parent's current directory rsi,\;STARTUPINFO pointer rdi ;receives PROCESS_INFORMATION invoke CloseHandle,[rdi+PROCESS_INFORMATION.hThread] invoke SetTimer,hWnd,1,duration,0 jmp wmBYE TERMINATE:invoke GetExitCodeProcess,[rdi+PROCESS_INFORMATION.hProcess],esi;proExitCode cmp dword ptr [rsi],STILL_ACTIVE jne proExitCode_NOT_STILL_ACTIVE;a4; invoke TerminateProcess,[rdi+PROCESS_INFORMATION.hProcess],0 proExitCode_NOT_STILL_ACTIVE: invoke CloseHandle,[rdi+PROCESS_INFORMATION.hProcess] mov [rdi+PROCESS_INFORMATION.hProcess],rbx;0 invoke PostMessage,hWnd,WM_INITMENUPOPUP,NULL,NULL invoke KillTimer,hWnd,1 jmp wmBYE wmTIMER:invoke PostMessage,,WM_FINISH,0,0 jmp wmBYE EXIT: invoke DestroyWindow wmBYE: leave retn menu_handlers dq PROCESS_CREATE, TERMINATE, EXIT WndProc endp ;--------------------------------------- ClassName db 'Uncle Remus tales:#14 Process',0 hMenu dq ? proExitCode dq ?;process exit code FileName db "..\Images\br_Rabbit3.cur",0 szREGSZ db 'REG_SZ',0 szREGEXPANDSZ db 'REG_EXPAND_SZ',0 FileName1 db '\movie3' aWmv db '.wmv',0,0 processInfo PROCESS_INFORMATION <> szBuff1 db MAX_PATH dup(?) duration dq ? end rc-файл Код (C): #define MI_PROCESS_CREATE 0 #define MI_PROCESS_TERMINATE 1 #define MI_EXIT 2 #define IDR_MAINMENU 30 IDR_MAINMENU MENU { POPUP "&Process" { MENUITEM "&Create Process",MI_PROCESS_CREATE MENUITEM "&Terminate Process",MI_PROCESS_TERMINATE,GRAYED MENUITEM SEPARATOR MENUITEM "E&xit",MI_EXIT } } bat-файл Код (Text): cls set masm64_path=\masm56\ set filename=%~n1 call :read_settings %filename% @echo %kind_of_file% goto %kind_of_file% :GUI if exist %filename%.exe del %filename%.exe if exist %filename%.obj del %filename%.obj if exist errors.txt del errors.txt %masm64_path%bin\ml64 /Cp /c /I"%masm64_path%Include" %filename%.asm >> errors.txt if errorlevel 1 exit if exist %1.rc ( %masm64_path%\bin\RC /r /i"%masm64_path%\Include" %filename%.rc >> errors.txt %masm64_path%bin\link /SUBSYSTEM:WINDOWS /LIBPATH:"%masm64_path%Lib" ^ /LARGEADDRESSAWARE:NO /BASE:0x400000 /STUB:%masm64_path%bin\stubby.exe ^ /SECTION:.text,W /ALIGN:16 /entry:WinMain /MERGE:.rdata=.text ^ /fixed /nocoffgrpinfo %filename%.obj %filename%.res >> errors.txt ) else ( %masm64_path%bin\link /SUBSYSTEM:WINDOWS /LIBPATH:"%masm64_path%Lib" ^ /LARGEADDRESSAWARE:NO /BASE:0x400000 /STUB:%masm64_path%bin\stubby.exe ^ /SECTION:.text,W /ALIGN:16 /entry:WinMain /MERGE:.rdata=.text ^ /fixed /nocoffgrpinfo %filename%.obj >> errors.txt ) if errorlevel 1 exit if exist %1.res del %1.res del %filename%.obj del errors.txt exit :DLL if exist %filename%.dll del %filename%.dll %masm64_path%bin\ml64 /c /Cp /I %masm64_path%include %filename%.asm >> errors.txt if errorlevel 1 exit if exist %1.rc ( %masm64_path%bin\RC /r %filename%.rc >> errors.txt if errorlevel 1 exit %masm64_path%bin\link /SUBSYSTEM:WINDOWS /LIBPATH:%masm64_path%lib ^ /ENTRY:DllMain /DLL /DLL /section:.bss,S /stub:%masm64_path%bin\stubby.exe ^ %filename%.obj %filename%.res /DEF:%filename%.def >> errors.txt ) else ( %masm64_path%bin\link /SUBSYSTEM:WINDOWS /LIBPATH:%masm64_path%lib ^ /ENTRY:DllMain /DLL /DLL /section:.bss,S /stub:%masm64_path%bin\stubby.exe ^ %filename%.obj /DEF:%filename%.def >> errors.txt ) if errorlevel 1 exit if exist %1.res del %1.res del %filename%.obj del %filename%.exp del errors.txt exit :read_settings for /f "eol=# tokens=2-3" %%A in (%filename%.asm) do ( set kind_of_file=%%A if %%B == # exit /b ) exit /b Файл movie3.wmv должен быть в той же папке, что и ехе-файл. В аттаче исходные тексты и ехе-файл
Mikl___, Зачем перебирать все подключи и значения? Можно просто взять расширение файла и использовать его в качестве имени ключа. Так же и с дефолтовым значением - в качестве имени используется пустая строка или NULL. И форматирование кода, конечно же, просто ужасное
rmn, увы, дефолтное значение не всегда file.wmv Пришлось перебирать все значения и искать ".wmv" или ".WMV". А по поводу, форматирования, IMHO табуляция не отображается...
Не понял. У нас есть ключ HKEY_CLASSES_ROOT\.??? для всех ассоциированных расширений, просто берем расширение файла с точкой и используем его в качестве имени ключа в RegOpenKey(). Если ключ успешно открыт, читаем его дефолтовое значение (пустая строка в качестве имени) и используем прочитанный тип файла в качестве имени ключа: HKEY_CLASSES_ROOT\%FILETYPE%\Shell\Open\Command. Если ключ успешно открыт, читаем его дефолтовое значение (пустая строка в качестве имени) и используем прочитанную командную строку для запуска ассоциированной программы. Очевидно, тут надо написать функцию: Код (C): BOOL RegQueryDefaultValue (HKEY key, LPCTSTR subKey, LPTSTR buffer) { RegOpenKeyEx(...); RegQueryValue (...); RegCloseKey (...); return result; } и решить задачу двумя ее вызовами, вместо перебора десятков тысяч ключей в HCR.
rmn, попробую объяснить. На домашнем компе: открываю ветку HKEY_CLASSES_ROOT\.wmv получаю значение по умолчанию "VLC.wmv" открываю ветку HKEY_CLASSES_ROOT\VLC.wmv добавляю \shell от неё идет три ветки "AddToPlaylistVLC", "Open" и "PlayWithVLC" какую выбирать? HKEY_CLASSES_ROOT\VLC.wmv\shell содержит значение "Open" переходим на HKEY_CLASSES_ROOT\VLC.wmv\shell\Open добавляю \command читаю значение "C:\Program Files (x86)\VideoLAN\VLC\vlc.exe" --started-from-file "%1" Но это на домашнем компе, на работе программа не пошла, так как "значение по умолчанию" не имело вид file.wmv, но вот третье значение было WMP11.AssocFile.WMV поэтому и пришлось задействовать связку из RegEnumValue+RegQueryValueEx перебирать значения и искать среди них запись с расширением .wmv
А оно может быть произвольного вида. Что там было? И был ли подключ с таким же именем в HCR? Попробуй вот этим (расширение поменять на exe).
веткаимятипзначениеHKEY_CLASS_ROOT\.wmvпо умолчаниюREG_SZWMP.PlayMediaHKEY_CLASS_ROOT\WMP.PlayMediaпо умолчаниюREG_SZзначение не присвоеноHKEY_CLASS_ROOT\WMP.PlayMedia\shellпо умолчаниюREG_SZзначение не присвоеноHKEY_CLASS_ROOT\WMP.PlayMedia\shell\Playпо умолчаниюREG_SZ&PlayHKEY_CLASS_ROOT\WMP.PlayMedia\shell\Play\commandпо умолчаниюREG_SZзначение не присвоеноHKEY_CLASS_ROOT\WMP.PlayMedia\shell\Play\commandDelegateExecuteREG_SZed1d0fdf-4414-470a-a56d-cfb68623fc58
Переделал rc-файл Код (C++): #define MI_PROCESS_CREATE 0 #define MI_PROCESS_TERMINATE 1 #define MI_EXIT 2 #define IDR_MAINMENU 30 IDR_MAINMENU MENU { POPUP "&Process" { MENUITEM "&Create Process",MI_PROCESS_CREATE MENUITEM "&Terminate Process",MI_PROCESS_TERMINATE,GRAYED MENUITEM SEPARATOR MENUITEM "E&xit",MI_EXIT } } asm-файл Код (ASM): ; GUI # include win64a.inc include advapi32.inc includelib advapi32.lib MI_PROCESS_CREATE equ 0 MI_PROCESS_TERMINATE equ 1 MI_EXIT equ 2 IDR_MAINMENU equ 30 WM_FINISH equ WM_USER+100h MAX_KEY_LENGTH equ 255 MAX_VALUE_NAME equ 16383 .code WinMain proc local msg:MSG xor ebx,ebx mov edi,offset ClassName mov esi,IMAGE_BASE mov ecx,offset FileName invoke LoadCursorFromFile push rax ;hIconSm push rdi ;lpszClassName push IDR_MAINMENU;lpszMenuName push COLOR_WINDOW;hbrBackground push 10003h ;hCursor push rax ;hIcon push rsi ;hInstance push rbx ;cbClsExtra & cbWndExtra pushaddr WndProc;lpfnWndProc push sizeof WNDCLASSEX;cbSize & style invoke RegisterClassEx,esp ;addr WNDCLASSEX push rbx push rsi ;rsi=400000h shl esi,9 ;rsi=CW_USEDEFAULT push rbx push rbx push 200 push 300 push rsi push rsi sub esp,20h invoke CreateWindowEx,WS_EX_CLIENTEDGE,edi,edi,WS_OVERLAPPEDWINDOW or WS_VISIBLE invoke GetMenu,eax mov hMenu,rax lea edi,msg @@: invoke GetMessage,edi,0,0,0 invoke DispatchMessage,edi jmp @b WinMain endp WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM local progStartInfo:STARTUPINFO local hKey:qword local lpcbData:dword local lpType:dword local hFile:qword local szBuff[MAX_PATH*4]:byte local old_rdi:qword local old_rsi:qword mov hWnd,rcx mov wParam,r8 mov lParam,r9 mov old_rdi,rdi mov old_rsi,rsi cmp edx,WM_DESTROY je wmDESTROY cmp edx,WM_CREATE je wmCREATE cmp edx,WM_COMMAND je wmCOMMAND cmp edx,WM_INITMENUPOPUP je wmINITMENUPOPUP cmp edx,WM_FINISH je TERMINATE cmp edx,WM_TIMER je wmTIMER leave jmp DefWindowProc wmDESTROY:invoke GetExitCodeProcess,processInfo.hProcess,esi;proExitCode cmp dword ptr proExitCode,STILL_ACTIVE jne @f invoke TerminateProcess,processInfo.hProcess,0 @@: invoke CloseHandle,processInfo.hProcess mov processInfo.hProcess,rbx invoke ExitProcess,NULL wmCREATE: ;get the length of playing a wmv-file mov [rsp+30h],rbx ;hTemplateFile mov qword ptr [rsp+28h],FILE_ATTRIBUTE_ARCHIVE ;dwFlagsAndAttributes mov qword ptr [rsp+20h],OPEN_EXISTING ;dwCreationDisposition mov ecx,offset FileName1+1 ;lpFileName invoke CreateFile,,GENERIC_READ,\ ;dwDesiredAccess FILE_SHARE_READ or FILE_SHARE_WRITE,\;dwShareMode 0 ;lpSecurityAttributes mov hFile,rax;handle to file mov [rsp+20h],rbx lea r9d,lpcbData lea edi,szBuff invoke ReadFile,eax,edi,100h invoke CloseHandle,hFile mov rax,qword ptr szBuff[66h];duration in 100 nSec ;Duration in 100nSec-units is divided by 10000 and get in duration in 1mSec-units mov edx,3518437209;"magic number" mul edx shr edx,13 mov duration,rdx;in mSec ;---------------------------------------------------- ;Open the section HKEY_CLASSES_ROOT\.wmv\OpenWithProgids mov edx,offset aWmv1 invoke RegOpenKeyEx,HKEY_CLASSES_ROOT,,0,KEY_READ,&hKey or eax,eax jnz bad0 xor esi,esi ; inc esi @@: mov lpcbData,MAX_VALUE_NAME invoke RegEnumValue,hKey,esi,edi,&lpcbData,NULL,&lpType,NULL,NULL ;HKEY hKey, // A handle to an open registry key ;DWORD dwIndex,=esi // The index of the value to be retrieved ;LPTSTR lpValueName,edi=&szBuff // A pointer to a buffer that receives the name of the value as a null-terminated string ;LPDWORD lpcbValueName,=&lpcbData // A pointer to a variable that specifies the size of the buffer pointed to by the lpValueName parameter, in characters ;LPDWORD lpReserved,=0 // This parameter is reserved and must be NULL. ;LPDWORD lpType,=&lpType // A pointer to a variable that receives a code indicating the type of data stored in the specified value ;LPBYTE lpData,=0 // A pointer to a buffer that receives the data for the value entry ;LPDWORD lpcbData,=&lpcbData // A pointer to a variable that specifies the size of the buffer pointed to by the lpData parameter, in bytes or eax,eax jnz bad1;Until we get all the keys HKEY_CLASSES_ROOT\.wmv\OpenWithProgids ;Looking for a key with an end on .wmv cmp lpcbData,5;The string is longer than ".wmv" ? jb a1; To the next line mov eax,edi add eax,lpcbData;Go to the end of the line mov eax,[rax-4] or eax,20202000h;We give an extension to the lower case cmp eax,dword ptr aWmv;это ".wmv" ? jz @f a1: inc esi jmp @b bad0: invoke MessageBox,0,&error0,&ClassName,MB_OK jmp wmDESTROY bad1:;Closed the section HKEY_CLASSES_ROOT\.wmv\OpenWithProgids invoke RegCloseKey,hKey invoke MessageBox,0,&error1,&ClassName,MB_OK jmp wmDESTROY @@:;Closed the section HKEY_CLASSES_ROOT\.wmv\OpenWithProgids invoke RegCloseKey,hKey ;Get the name mplayerc.wmv or WMP11.AssocFile.WMV ;Make of it HKEY_CLASSES_ROOT\mplayerc.wmv\shell ;or HKEY_CLASSES_ROOT\WMP11.AssocFile.WMV\shell add edi,lpcbData cmp lpType,REG_SZ jne @f dec edi @@: mov dword ptr [rdi],'ehs\' mov dword ptr [rdi+4],'ll' lea edx,szBuff invoke RegOpenKeyEx,HKEY_CLASSES_ROOT,,0,KEY_READ,&hKey ;Read the meaning HKEY_CLASSES_ROOT\mplayerc.wmv\shell = open ;or HKEY_CLASSES_ROOT\WMP11.AssocFile.WMV\shell = Play lea eax,lpcbData mov [rsp+28h],rax add edi,7;Length of string "\shell\" mov [rsp+20h],rdi mov lpcbData,MAX_PATH invoke RegQueryValueEx,hKey,0,0,,edi,&lpcbData ;Closed the section HKEY_CLASSES_ROOT\mplayerc.wmv\shell ; or HKEY_CLASSES_ROOT\WMP11.AssocFile.WMV\shell invoke RegCloseKey,hKey ;Open the section HKEY_CLASSES_ROOT\mplayerc.wmv\shell\open\command ;or HKEY_CLASSES_ROOT\WMP11.AssocFile.WMV\shell\play\command or word ptr [rdi-1],605Ch;"\"+ lower case mov rax,'dnammoc\' mov [rdi+4],rax mov [rdi+12],rbx invoke RegOpenKeyEx,HKEY_CLASSES_ROOT,&szBuff,0,KEY_READ,&hKey ;Read the meaning HKEY_CLASSES_ROOT\mplayerc.wmv\shell\open\command ;"C:\Program Files (x86)\Combined Community Codec Pack\MPC\mpc-hc.exe" "%1" ; or HKEY_CLASSES_ROOT\WMP11.AssocFile.WMV\shell\play\command ;"%ProgramFiles(x86)%\Windows Media Player\wmplayer.exe" /prefetch:7 /Play "%L" mov lpcbData,MAX_PATH lea r9d,lpType invoke RegQueryValueEx,hKey,0,0,,&szBuff,&lpcbData ;Closed the section HKEY_CLASSES_ROOT\mplayerc.wmv\shell\open\command ; or HKEY_CLASSES_ROOT\WMP11.AssocFile.WMV\shell\play\command invoke RegCloseKey,hKey lea edi,szBuff add edi,lpcbData sub edi,4 invoke GetCurrentDirectory,MAX_PATH,edi lea edi,[rdi+rax] mov aWmv[4],'"' mov esi,offset FileName1 mov ecx,sizeof FileName1+6 rep movsb lea ecx,szBuff mov edx,offset szBuff1 invoke ExpandEnvironmentStrings,,,MAX_PATH jmp wmBYE wmINITMENUPOPUP:mov edx,offset proExitCode invoke GetExitCodeProcess,processInfo.hProcess or eax,eax jz @f;GetExitCodeProcess_TRUE cmp dword ptr proExitCode,STILL_ACTIVE ;cmp proExitCode,STILL_ACTIVE jne @f ; GetExitCodeProcess_STILL_ACTIVE invoke EnableMenuItem,hMenu,MI_PROCESS_CREATE,MF_GRAYED xor r8,r8; mov r8d,MF_ENABLED=0 jmp @0 @@: invoke EnableMenuItem,hMenu,MI_PROCESS_CREATE,MF_ENABLED mov r8d,MF_GRAYED @0: invoke EnableMenuItem,hMenu,MI_PROCESS_TERMINATE jmp wmBYE wmCOMMAND:movzx eax,word ptr wParam or r9,r9 ;cmp lParam,0 jnz wmBYE cmp rax,MI_EXIT ja wmBYE jmp [menu_handlers+rax*8] PROCESS_CREATE:cmp processInfo.hProcess,rbx je pi_hProcess_IS_0 invoke CloseHandle,processInfo.hProcess mov processInfo.hProcess,rbx pi_hProcess_IS_0:lea esi,progStartInfo invoke GetStartupInfo,esi invoke CreateProcess,0,&szBuff1,\ 0,\;process security attributes 0,\;primary thread security attributes 0,\;handles are inherited NORMAL_PRIORITY_CLASS,\;creation flags 0,\;use parent's environment 0,\;use parent's current directory rsi,\;STARTUPINFO pointer &processInfo ;receives PROCESS_INFORMATION invoke CloseHandle,processInfo.hThread invoke SetTimer,hWnd,1,duration,0 jmp wmBYE TERMINATE:mov edx,offset proExitCode invoke GetExitCodeProcess,processInfo.hProcess cmp dword ptr proExitCode,STILL_ACTIVE jne proExitCode_NOT_STILL_ACTIVE;a4; invoke TerminateProcess,processInfo.hProcess,0 proExitCode_NOT_STILL_ACTIVE: invoke CloseHandle,processInfo.hProcess mov processInfo.hProcess,rbx;0 invoke PostMessage,hWnd,WM_INITMENUPOPUP,NULL,NULL invoke KillTimer,hWnd,1 jmp wmBYE wmTIMER:invoke PostMessage,,WM_FINISH,0,0 jmp wmBYE EXIT: invoke DestroyWindow wmBYE: mov rdi,old_rdi mov rsi,old_rsi leave retn menu_handlers dq PROCESS_CREATE, TERMINATE, EXIT WndProc endp ;--------------------------------------- .data ClassName db 'Uncle Remus tales:#14 Process',0 hMenu dq ? proExitCode dq ?;process exit code FileName db "..\Images\br_Rabbit3.cur",0 FileName1 db '\movie3' aWmv db '.wmv',0,0 aWmv1 db '.wmv\OpenWithProgids',0 processInfo PROCESS_INFORMATION <> szBuff1 db MAX_PATH dup(?) duration dq ? error0 db "No section HKEY_CLASSES_ROOT\.wmv\OpenWithProgids",0 error1 db "Did not find the application that plays the wmv-files",0 end ехе и исходные файлы в аттаче, файл 'movie3.wmv' должен находиться в той же папке, что и ехе-файл