asm

; runit
; masm32
; win32

.386
.model flat, stdcall
option casemap:none

include windows.inc

include kernel32.inc
include user32.inc

includelib kernel32.lib
includelib user32.lib

; 定义 msg 函数原型
msg proto :LPSTR

.code
start:

; 到 main 程序入口
jz main
   
; msg 函数
msg proc Text:LPSTR
  ; MessageBoxA 参数
   push MB_OK or MB_ICONINFORMATION
   push offset msgCaption
   push Text
    ush NULL
  ; MessageBoxA 调用
   call MessageBoxA

  ; 返回
   ret
   
  ; 数据
   msgCaption db "msg", 0
msg endp

; main 程序入口
; main:
main proc
   jz main_start
  ; 数据
   LibName db "shell32.dll", 0
   FunctionName db "RunFileDlg", 0
   Runit db "runit", 0

main_start:
  ; 提示
  ; invoke msg, addr Runit; ok.
   push offset Runit
   call msg

  ; 调用 LoadLibrary, 参数 LibName
   push offset LibName
   call LoadLibrary
   
  ; 返回 handle 在 eax
   .if eax != NULL
      ; 保留返回 handle 为 FreeLibrary 使用
       push eax

      ; push offset FunctionName
       push 61; 系统提供的 RunFileDlg 函数地址(未公开的 api)
       push eax
       call GetProcAddress

      ; 返回 address of RunFileDlg
       .if eax != NULL
          ; 保留 address of RunFileDlg 备用
           mov ebx, eax
; void WINAPI RunFileDlg(HWND hwndOwner, HICON hIcon, LPCSTR lpstrDirectory,
; LPCSTR lpstrTitle, LPCSTR lpstrDescription, UINT uFlags);

           push 0
      push NULL
        push NULL
          push NULL
      push NULL
      push NULL

          ; 调用 RunFileDlg
        call ebx
       .endif

      ; handle
       pop eax
       push eax
       call FreeLibrary
   .endif

   invoke ExitProcess, NULL
   ret
main endp
end start
 

你可能感兴趣的:(shell,api,user,null,include,winapi)