首页
社区
课程
招聘
[旧帖] 寻WIN32ASM高手解远程开机与关机问题 0.00雪花
发表于: 2010-4-17 04:29 4883

[旧帖] 寻WIN32ASM高手解远程开机与关机问题 0.00雪花

2010-4-17 04:29
4883
那位大牛帮忙一下WIN32下进行远程对机器的开与关(在局域网的)
要使用哪几个函进行呢???????????????????????????????

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 145
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
来自已顶一下
只有看没有人回答,在这不如在CSDN有关编程问答,
我看到一个软件是lanhelper不知它是怎样实现在局域网上进行开关机
所以想在这问一下大家
2010-4-17 08:37
0
雪    币: 594
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
去MSDN找:

BOOL InitiateSystemShutdownEx(
  LPTSTR lpMachineName,
  LPTSTR lpMessage,
  DWORD dwTimeout,
  BOOL bForceAppsClosed,
  BOOL bRebootAfterShutdown,
  DWORD dwReason
);


lpMachineName - 要关闭网络计算机的名称
bRebootAfterShutdown - True -> 计算机关闭后重新启动
2010-4-17 14:43
0
雪    币: 145
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢 boycoder 提供的答案,我回去试一下
2010-4-18 07:32
0
雪    币: 145
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
还是不了解,我只对asm->win32asm有些了解,所以现在我还是不态明白
2010-4-20 21:40
0
雪    币: 285
活跃值: (16)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
boycoder,顺便问你一下,如何实现远程开机,有源码吗?
2010-4-21 09:05
0
雪    币: 145
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
.386
.model flat, stdcall
option casemap :none   ; case sensitive

include windows.inc
include iphlpapi.inc
include ws2_32.inc
include user32.inc
include kernel32.inc
includelib iphlpapi.LIB
includelib WS2_32.LIB
includelib user32.LIB
includelib 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                        ;使用upd
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
2010-5-13 11:57
0
雪    币: 145
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
上面的代面是aogosoft所得到的希望给与我有同样需要的人,不过我还没有去试一下
2010-5-13 11:59
0
雪    币: 174
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
远程唤醒比较简单,只要远程机器支持并设置得当,当向远程机器发送指定/任意格式数据包,即可唤醒;
需要设置的地方包括:BIOS,(外置)网卡的WOL连线,Windows设备管理器网卡属性;
远程关机比较麻烦一点,首先要取得远程机器的权限,然后再执行关机命令;
2010-5-13 13:25
0
雪    币: 324
活跃值: (113)
能力值: ( LV15,RANK:280 )
在线值:
发帖
回帖
粉丝
10
1 局域网远程开机源码,VS2005下测试通过。
2 被唤醒的主机的bios中激活远程唤醒功能
#pragma comment(lib,"Setupapi.lib")
#pragma comment(lib,"Netapi32.lib")
#pragma comment(lib,"Iphlpapi.lib")
//远程唤醒计算机,ether_addr:MAC地址字符串,cnt:MAC地址个数
bool WakeupOnLan(const std::string *ether_addr,int cnt)
{


	//启动WSA
	WSADATA WSAData;
	if (WSAStartup( MAKEWORD(2, 0), &WSAData)!=0)
	{
		fprintf(stderr, "WSAStartup failed: %d\n", GetLastError());
		return false;
	}

	//创建socket
	SOCKET sock=socket(AF_INET, SOCK_DGRAM, 0);
	if (sock==INVALID_SOCKET)
	{
		fprintf(stderr, "Socket create error: %d\n", GetLastError());
		return false;
	}

	//设置为广播发送
	BOOL bOptVal=TRUE;
	int iOptLen=sizeof(BOOL);
	if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char*)&bOptVal, iOptLen)==SOCKET_ERROR)
	{
		fprintf(stderr, "setsockopt error: %d\n", WSAGetLastError());
		closesocket(sock);
		WSACleanup();
		return false;
	}

	sockaddr_in to;
	to.sin_family=AF_INET;
	to.sin_port=htons(0);
	to.sin_addr.s_addr=htonl(INADDR_BROADCAST);


	//构造Magic Packet 发送Magic Packet
	int ret = true;
	u_char magicpacket[200];
	memset(magicpacket, 0xff, 6);
	for(int index = 0;index < cnt;index++)
	{
		int dstaddr[6];
		int i=sscanf(ether_addr[index].c_str(), "%2x%2x%2x%2x%2x%2x", &dstaddr[0], &dstaddr[1], &dstaddr[2], &dstaddr[3], &dstaddr[4], &dstaddr[5]);
		if (i!=6)
		{
			fprintf(stderr, "Invalid MAC Address!");
			return false;
		}

		unsigned char Real_Mac[6];
		for (i=0; i<6; i++)
			Real_Mac[i]=dstaddr[i];

		int packetsize=6;
		for (i=0; i<16; i++)
		{
			memcpy(magicpacket+packetsize,Real_Mac , 6);
			packetsize+=6;
		}
		if (sendto(sock, (const char *)magicpacket, packetsize, 0,
			(const struct sockaddr *)&to, sizeof(to))==SOCKET_ERROR) 
		{
			ret = false;
		}
		Sleep(20);//防止网络拥堵
	}
	closesocket(sock);
	WSACleanup();
	return ret;
}

2010-5-18 13:56
0
游客
登录 | 注册 方可回帖
返回
//