灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:4466回复:0

[汇编源码]用MASM32编程获取并显示WinRAR的路径

楼主#
更多 发布于:2011-12-14 00:19
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; 文件名: rar_path.asm
; 功 能: 获取并显示WinRAR的路径
; 作 者: Purple Endurer
; 环 境: win 2K pro + masm32 V8

; log
;------------------------------------------------------------------------------------------
; 2006.03.24 创建
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

.386
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc

include \masm32\include\Advapi32.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc

includelib \masm32\lib\Advapi32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib


GetRarPath PROTO :LPSTR

m_m2m MACRO d1, d2
    push d2
    pop d1
ENDM


.data
g_szTitle       db "WinRAR路径", 0
g_szRegPath db  "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\WinRAR.exe", 0
g_szFailRegOpenKeyEx  db "RegOpenKeyEx失败!", 0
g_szFailRegQueryValueEx db "RegQueryValueEx失败!", 0
g_szValueName db "Path", 0

.data?
g_szRarPath  db 256 dup(?)
g_hRegKey4IE   HKEY    ?

.code
start:
        invoke GetRarPath, ADDR g_szRarPath
        .if eax==1
            mov eax, OFFSET g_szFailRegOpenKeyEx
        .elseif eax==2
            mov eax, OFFSET g_szFailRegQueryValueEx
        .else
            mov eax, OFFSET g_szRarPath
        .endif
        invoke MessageBox, NULL, eax, OFFSET g_szTitle, MB_OK

        invoke ExitProcess,NULL

GetRarPath PROC lpszRarPath: LPSTR
    LOCAL dwcbData: dword
;         LONG RegOpenKey(
;             HKEY hKey,    // handle of open key
;             LPCTSTR lpSubKey,    // address of name of subkey to open
;             PHKEY phkResult     // address of handle of open key
;         );

    invoke  RegOpenKey, HKEY_LOCAL_MACHINE, ADDR g_szRegPath, ADDR g_hRegKey4IE
    .if eax!=ERROR_SUCCESS
        m_m2m eax, 1
        ret
    .endif

;     LONG RegQueryValueEx(
;         HKEY hKey,          // 1.handle of key to query
;         LPTSTR lpValueName, // 2.address of name of value to query
;         LPDWORD lpReserved, // 3.reserved
;         LPDWORD lpType,     // 4.address of buffer for value type
;         LPBYTE lpData,      // 5.address of data buffer
;         LPDWORD lpcbData    // 6.address of data buffer size
;     );

    m_m2m dwcbData, SIZEOF g_szRarPath
    invoke RegQueryValueEx, g_hRegKey4IE, ADDR g_szValueName, NULL, NULL, ADDR g_szRarPath, ADDR dwcbData

    .if eax!=ERROR_SUCCESS
        m_m2m eax, 2
    .else
        xor eax, eax
    .endif

; LONG RegCloseKey(
;     HKEY hKey     // handle of key to close  
; );
    invoke RegCloseKey, g_hRegKey4IE

    ret
GetRarPath ENDP

end start  

喜欢0 评分0
游客

返回顶部