实现网络唤醒开机程序

来源:互联网 发布:数据堂工资怎么样 编辑:程序博客网 时间:2024/05/18 01:56
好久没发贴了..发个垃圾程序..最近给自己管理的服务器写的..
作者:成松林
QQ:179641795
Email:cheng_5103@126.com
;goto make
;实现网络唤醒开机程序
.386
.model flat, stdcall
option casemap :none   ; case sensitive 

include d:\masm32\include\windows.inc
include d:\masm32\include\iphlpapi.inc
include d:\masm32\include\ws2_32.inc
include d:\masm32\include\user32.inc
include d:\masm32\include\kernel32.inc
includelib d:\masm32\LIB\iphlpapi.LIB
includelib d:\masm32\LIB\WS2_32.LIB
includelib d:\masm32\LIB\user32.LIB
includelib d:\masm32\LIB\kernel32.LIB
.data
ERR             db "网络初始化错误!",0
OK              db "发送数据成功",0
MsgCaption      db "远程开机",0
stSin           sockaddr_in <0>
SendBuffer      dd 16 dup (0)
stWsa           WSADATA <0>
FBroadcast      dd TRUE
SendLen         dd 102                          ;要发送的数据包长度
hSocket         dd ? 
;要唤醒的网卡MAC地址
csx1            db 00,0eh,7fh,0adh,029h,9ah
csx1_2          db 00,0eh,7fh,0adh,029h,99h
csx2            db 00,11h,85h,66h,0eah,0dfh
csx3            db 00,11h,85h,66h,0eah,0d0h     
.code
;*******************************************************************
NetWakerSend proc            ;入口:esi->要远程唤醒的网卡MAC
        ;获取IP的MAC地址:szMacLen=长度(802.3为6B),szMac存放的缓冲
        ;invoke  inet_addr,addr ip                       ;例如定义IP:ip db "192.168.1.6",0
        ;invoke  SendARP,eax,0,addr szMac,addr szMacLen  ;eax!=NO_ERROR表示成功
    ;构造远程唤醒发送缓冲区内容
    mov edi,offset SendBuffer                        ;edi->发送缓冲区
    mov al,0ffh
    mov ecx,6
    rep stosb                                        ;发送缓冲区头部为6个0ffh
    mov edx,16                                       ;紧接着重复填写16次MAC地址
    .while edx > 0                                   ;循环填写缓冲区后面的内容
        push esi
                mov ecx,6              
            rep movsb                                
        dec edx
        pop esi
    .endw 
    ;设置允许以255.255.255.255方式发送广播包,如果不设置也可以例:192.168.1.255方式发送
        invoke setsockopt,hSocket,SOL_SOCKET,SO_BROADCAST,addr FBroadcast,sizeof FBroadcast
    mov     stSin.sin_addr,INADDR_BROADCAST          ;设置广播地址IP:255.255.255.255
        invoke sendto,hSocket,addr SendBuffer,SendLen,0,addr stSin,sizeof sockaddr_in
        .if     eax!=SOCKET_ERROR                        ;显示发送成功消息
            invoke  MessageBoxA, 0,addr OK,addr MsgCaption,0
    .endif
    ret
NetWakerSend endp
;*************************************************************************
start: ;主程序在这里开始
invoke  WSAStartup,101h,addr stWsa
invoke  socket,AF_INET,SOCK_DGRAM,0
mov     hSocket,eax
invoke  htons,65534                                     ;任意定义一个未用端口
mov     stSin.sin_port,ax
mov     stSin.sin_family,AF_INET
invoke  bind,hSocket,addr stSin,sizeof stSin
.if     eax==SOCKET_ERROR                               ;初始化网络出错                 
        invoke MessageBoxA, 0,addr ERR,addr MsgCaption,0;显示网络出错
.else
    mov esi,offset csx1                             ;esi->要远程唤醒的网卡MAC
    call NetWakerSend    
    mov esi,offset csx1_2                           ;esi->要远程唤醒的网卡MAC
    call NetWakerSend    
    mov esi,offset csx2                             ;esi->要远程唤醒的网卡MAC
    call NetWakerSend    
    mov esi,offset csx3                             ;esi->要远程唤醒的网卡MAC
    call NetWakerSend    
.endif
invoke  ExitProcess,NULL
end start
;**************************************************************************
:make
set drv=NetWaker
rem d:\masm32\bin\rc %drv%
d:\masm32\bin\ml /c /coff  %drv%.bat
d:\masm32\bin\link /subsystem:windows  %drv%.obj
del %drv%.obj
pause
原创粉丝点击