📄 pipe.asm
字号:
.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
include \masm32\include\gdi32.inc
includelib \masm32\lib\gdi32.lib
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
IDM_EXEC equ 1
IDM_EXIT equ 2
F_RUNNING equ 0001h
.data
ClassName db "SimpleWinClass",0
AppName db "Our First Window",0
MainMenu db "MainMenu",0
EditClass db "EDIT",0
cmd db "C:\winXP\system32\cmd.exe",0
lpCMD db " /c debug",0,"C:\winXP\system32\CMD.EXE",0,"c:\command.com",0,"d:\winnt\system32\cmd.exe",0
.data?
hInstance HINSTANCE ?
CommandLine LPSTR ?
hwndEdit dd ?
OldWndProc dd ?
dwFlag dd ?
hRead1 dd ?
hWrite1 dd ?
hRead2 dd ?
hWrite2 dd ?
hRead3 dd ?
hWrite3 dd ?
ThreadID dd ?
hwnd dd ?
.code
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke GetCommandLine
mov CommandLine,eax
invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
invoke ExitProcess,eax
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
mov wc.cbSize,SIZEOF WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, OFFSET WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,NULL
push hInstance
pop wc.hInstance
mov wc.hbrBackground,2
mov wc.lpszMenuName,OFFSET MainMenu
mov wc.lpszClassName,OFFSET ClassName
invoke LoadIcon,NULL,IDI_APPLICATION
mov wc.hIcon,eax
mov wc.hIconSm,eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
invoke RegisterClassEx, addr wc
INVOKE CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\
WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\
hInst,NULL
mov hwnd,eax
invoke ShowWindow, hwnd,SW_SHOWNORMAL
invoke UpdateWindow, hwnd
.WHILE TRUE
invoke GetMessage, ADDR msg,NULL,0,0
.BREAK .IF (!eax)
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
.ENDW
mov eax,msg.wParam
ret
WinMain endp
RunThread proc
local stSecurity:SECURITY_ATTRIBUTES
local stStartUp:STARTUPINFO
local stProcInfo:PROCESS_INFORMATION
local dwExitCode:DWORD
local dwBytesRead:DWORD
local szBuffer[512]:byte
or dwFlag,F_RUNNING
mov stSecurity.nLength,sizeof SECURITY_ATTRIBUTES
mov stSecurity.lpSecurityDescriptor,NULL
mov stSecurity.bInheritHandle,TRUE
invoke CreatePipe,addr hRead1,addr hWrite1,addr stSecurity,NULL
invoke CreatePipe,addr hRead2,addr hWrite2,addr stSecurity,NULL
invoke GetStartupInfo,addr stStartUp
mov eax,hRead1
mov stStartUp.hStdInput,eax
mov eax,hWrite2
mov stStartUp.hStdOutput,eax
mov stStartUp.hStdError,eax
mov stStartUp.dwFlags,STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW
mov stStartUp.wShowWindow,SW_HIDE
invoke CreateProcess,addr cmd,NULL,NULL,NULL,TRUE,NULL,NULL,NULL,addr stStartUp,addr stProcInfo
.if eax !=0
.while TRUE
invoke GetExitCodeProcess,stProcInfo.hProcess,addr dwExitCode
.break .if dwExitCode != STILL_ACTIVE
invoke PeekNamedPipe,hRead2,addr szBuffer,511,addr dwBytesRead,NULL,NULL
.if dwBytesRead != 0
invoke RtlZeroMemory,addr szBuffer,512
invoke ReadFile,hRead2,addr szBuffer,dwBytesRead,addr dwBytesRead,NULL
invoke SendMessage,hwndEdit,EM_SETSEL,-1,0
invoke SendMessage,hwndEdit,EM_REPLACESEL,FALSE,addr szBuffer
;invoke SetWindowText,hwnd,addr szBuffer
.endif
.endw
invoke CloseHandle,stProcInfo.hProcess
invoke CloseHandle,stProcInfo.hThread
.else
invoke MessageBox,0,addr lpCMD,NULL,0
.endif
invoke CloseHandle,hRead1
invoke CloseHandle,hWrite1
invoke CloseHandle,hRead2
invoke CloseHandle,hWrite2
invoke EnableWindow,hwndEdit,FALSE
and dwFlag,not F_RUNNING
ret
RunThread endp
InputProc PROC hEdit:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
local szBuffer[4]:BYTE
local dwBytesWrite:dword
.if uMsg==WM_CHAR
mov eax,wParam
movzx eax,al
mov dword ptr szBuffer,eax
test dwFlag,F_RUNNING
.if !ZERO?
.if szBuffer[0]==13
mov szBuffer[1],10
invoke WriteFile,hWrite1,addr szBuffer,2,addr dwBytesWrite,NULL
.else
invoke WriteFile,hWrite1,addr szBuffer,1,addr dwBytesWrite,NULL
.endif
.endif
.elseif uMsg==WM_KEYDOWN
.else
invoke CallWindowProc,OldWndProc,hEdit,uMsg,wParam,lParam
ret
.endif
xor eax,eax
ret
InputProc endp
_InputProc proc uses ebx edi esi, \
hWnd:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
local @szBuffer[4]:BYTE
local @dwBytesWrite
mov eax,uMsg
.if eax == WM_CHAR
mov eax,wParam
movzx eax,al
mov dword ptr @szBuffer,eax
test dwFlag,F_RUNNING
.if !ZERO?
.if @szBuffer[0]==13
mov @szBuffer[1],10
.endif
invoke WriteFile,hWrite2,addr @szBuffer,2,addr @dwBytesWrite,NULL
.endif
xor eax,eax
ret
.endif
invoke CallWindowProc,OldWndProc,hWnd,uMsg,wParam,lParam
ret
_InputProc endp
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
.IF uMsg==WM_DESTROY
invoke PostQuitMessage,NULL
.elseif uMsg==WM_CREATE
invoke CreateWindowEx,WS_EX_CLIENTEDGE,offset EditClass,NULL,WS_CHILD+WS_VISIBLE+WS_VSCROLL+ES_MULTILINE,0,0,0,0,hWnd,NULL,hInstance,NULL
mov hwndEdit,eax
invoke SetWindowLong,hwndEdit,GWL_WNDPROC,addr InputProc
mov OldWndProc,eax
.elseif uMsg==WM_CTLCOLOREDIT
invoke SetTextColor,wParam,White
invoke SetBkColor,wParam,Black
invoke GetStockObject,BLACK_BRUSH
ret
.elseif uMsg==WM_SIZE
mov edx,lParam
mov ecx,edx
shr ecx,16
and edx,0ffffh
invoke MoveWindow,hwndEdit,0,0,edx,ecx,TRUE
.elseif uMsg==WM_COMMAND
mov eax,wParam
.if eax==IDM_EXEC
test dwFlag,F_RUNNING
.if ZERO?
invoke EnableWindow,hwndEdit,TRUE
invoke SetFocus,hwndEdit
invoke CreateThread,NULL,NULL,offset RunThread,NULL,NULL,addr ThreadID
;invoke MessageBox ,0,addr EditClass,addr EditClass,0
.else
invoke TerminateProcess,ThreadID,-1
.endif
.elseif eax==IDM_EXIT
invoke ExitProcess,eax
.endif
.elseif uMsg==WM_LBUTTONDOWN
.ELSE
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.ENDIF
xor eax,eax
ret
WndProc endp
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -