Created
September 2, 2018 12:25
-
-
Save kizernis/afce5d0b98e08817659c04907f2c8ed2 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <winsock2.h> | |
#include "resource.h" | |
#ifndef _DEBUG | |
#pragma comment(linker, "/entry:_WinMain /nodefaultlib /subsystem:windows /filealign:512 /stack:65536,65536") | |
#pragma comment(linker, "/merge:.data=.text /merge:.rdata=.text /section:.text,ewrx /ignore:4078") | |
#endif | |
#define OPTION_BOTH 1 | |
#define OPTION_MODEM 2 | |
#define OPTION_ROUTER 3 | |
int g_nOption; | |
PCSTR g_csStatusReady = "Ready."; | |
PCSTR g_csStatusError = "Error."; | |
PCSTR g_csStatusProcessing = "Processing..."; | |
PCSTR g_csCurrentStatus; | |
int g_nMessageLength, g_nPos; | |
char g_sMsgTmp[20]; | |
#ifdef _DEBUG | |
PCSTR g_csModemHTTPRequest = "GET / HTTP/1.0\nAuthorization: Basic YWRtaW46YWRtaW4=\nConnection: Close\n\n"; | |
PCSTR g_csRouterHTTPRequest = "GET / HTTP/1.0\nAuthorization: Basic YWRtaW46\nConnection: Close\n\n"; | |
#else | |
PCSTR g_csModemHTTPRequest = "GET /rebootinfo.cgi HTTP/1.0\nAuthorization: Basic YWRtaW46YWRtaW4=\nConnection: Close\n\n"; | |
PCSTR g_csRouterHTTPRequest = "GET /restart.cgi HTTP/1.0\nAuthorization: Basic YWRtaW46\nConnection: Close\n\n"; | |
#endif | |
PCSTR g_csModemIP = "192.168.1.1"; | |
PCSTR g_csRouterIP = "192.168.0.1"; | |
HWND g_hWnd, g_hStatus; | |
BOOL g_bProcessing, g_bSuccess, g_bBothDone; | |
#define TIMER_PROCESSING 0 | |
#define TIMER_TYPING 1 | |
#define TIMER_BLINKING 2 | |
void CALLBACK BlinkingTimerProc(HWND hWnd, UINT nMsg, UINT nEventID, DWORD dwTime) | |
{ | |
char sTmp[20]; | |
int nLen = GetWindowText(g_hStatus, sTmp, 18); | |
if (sTmp[nLen - 1] == '_') | |
sTmp[nLen - 1] = '\0'; | |
else | |
{ sTmp[nLen] = '_'; sTmp[nLen + 1] = '\0'; } | |
SetWindowText(g_hStatus, sTmp); | |
} | |
void CALLBACK TypingTimerProc(HWND hWnd, UINT nMsg, UINT nEventID, DWORD dwTime) | |
{ | |
g_sMsgTmp[g_nPos - 1] = g_csCurrentStatus[g_nPos - 1]; | |
g_sMsgTmp[g_nPos] = '_'; | |
g_sMsgTmp[g_nPos + 1] = '\0'; | |
SetWindowText(g_hStatus, g_sMsgTmp); | |
if (++g_nPos > g_nMessageLength) | |
KillTimer(g_hWnd, TIMER_TYPING); | |
} | |
void TypeStatusMessage(PCSTR csMessage) | |
{ | |
g_csCurrentStatus = csMessage; | |
lstrcpy(&g_sMsgTmp[1], &csMessage[1]); | |
g_nMessageLength = lstrlen(csMessage); g_nPos = 1; | |
SetTimer(g_hWnd, TIMER_TYPING, 30, TypingTimerProc); | |
} | |
DWORD WINAPI NegotiationThreadProc(PVOID pDummy) | |
{ | |
BOOL bIsModem = (g_nOption == OPTION_MODEM) || (g_nOption == OPTION_BOTH && !g_bBothDone); | |
PCSTR csRequest = bIsModem ? g_csModemHTTPRequest : g_csRouterHTTPRequest; | |
PCSTR csTargetIP = bIsModem ? g_csModemIP : g_csRouterIP; | |
SOCKET s; | |
SOCKADDR_IN sa = { 0 }; | |
int nBytes; | |
char sTmp[20]; | |
if (INVALID_SOCKET == (s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))) | |
{ g_bSuccess = FALSE; g_bProcessing = FALSE; return 0; } | |
sa.sin_family = AF_INET; | |
sa.sin_port = htons(80); | |
sa.sin_addr.s_addr = inet_addr(csTargetIP); | |
if (connect(s, (struct sockaddr *)&sa, sizeof(SOCKADDR_IN))) | |
{ closesocket(s); g_bSuccess = FALSE; g_bProcessing = FALSE; return 0; } | |
if (SOCKET_ERROR == send(s, csRequest, lstrlen(csRequest), 0)) | |
{ closesocket(s); g_bSuccess = FALSE; g_bProcessing = FALSE; return 0; } | |
nBytes = recv(s, sTmp, sizeof(sTmp), 0); | |
shutdown(s, SD_RECEIVE); | |
closesocket(s); | |
if (nBytes != sizeof(sTmp)) | |
{ g_bSuccess = FALSE; g_bProcessing = FALSE; return 0; } | |
// HTTP/1.0 200 OK | |
if (sTmp[ 8] != ' ' | |
|| sTmp[ 9] != '2' | |
|| sTmp[10] != '0' | |
|| sTmp[11] != '0' | |
|| sTmp[12] != ' ') | |
{ | |
g_bSuccess = FALSE; | |
} | |
g_bProcessing = FALSE; | |
return 0; | |
} | |
void RestartDevice() | |
{ | |
DWORD dwThreadId; | |
TypeStatusMessage(g_csStatusProcessing); | |
g_bProcessing = TRUE; g_bSuccess = TRUE; | |
SetTimer(g_hWnd, TIMER_PROCESSING, 25, NULL); | |
CreateThread(NULL, 0, NegotiationThreadProc, NULL, 0, &dwThreadId); | |
} | |
#define STATUS_HEIGHT 18 | |
BOOL CALLBACK DlgProc(HWND hDlg, UINT nMsg, WPARAM wParam, LPARAM lParam) | |
{ | |
switch (nMsg) | |
{ | |
case WM_INITDIALOG: | |
g_hWnd = hDlg; | |
g_hStatus = GetDlgItem(hDlg, ID_LBL_STATUS); | |
SetWindowPos(hDlg, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE); | |
{ | |
RECT rc; | |
GetClientRect(hDlg, &rc); | |
SetWindowPos(g_hStatus, NULL, 0, rc.bottom - STATUS_HEIGHT, rc.right, STATUS_HEIGHT, SWP_NOZORDER); | |
} | |
SetTimer(g_hWnd, TIMER_BLINKING, 500, BlinkingTimerProc); | |
TypeStatusMessage(g_csStatusReady); | |
break; | |
case WM_TIMER: | |
if (g_bProcessing) | |
break; | |
if (g_nOption == OPTION_BOTH && !g_bBothDone && g_bSuccess) | |
{ | |
g_bBothDone = TRUE; | |
RestartDevice(); | |
} | |
else | |
{ | |
KillTimer(g_hWnd, TIMER_PROCESSING); | |
if (!g_bSuccess) | |
TypeStatusMessage(g_csStatusError); | |
else | |
switch (g_nOption) | |
{ | |
case OPTION_BOTH: TypeStatusMessage("Modem && router restarted."); break; | |
case OPTION_MODEM: TypeStatusMessage("Modem restarted."); break; | |
case OPTION_ROUTER: TypeStatusMessage("Router restarted."); break; | |
} | |
} | |
break; | |
case WM_COMMAND: | |
if (g_bProcessing || (HWND)lParam == NULL) | |
break; | |
switch (LOWORD(wParam)) | |
{ | |
case ID_BTN_BOTH: g_nOption = OPTION_BOTH; g_bBothDone = FALSE; break; | |
case ID_BTN_MODEM: g_nOption = OPTION_MODEM; break; | |
case ID_BTN_ROUTER: g_nOption = OPTION_ROUTER; break; | |
} | |
RestartDevice(); | |
break; | |
case WM_CLOSE: | |
EndDialog(hDlg, 0); | |
break; | |
default: | |
return FALSE; | |
} | |
return TRUE; | |
} | |
#ifdef _DEBUG | |
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, PSTR psCmdLine, int nShowCmd) | |
{ | |
#else | |
void _WinMain(void) | |
{ | |
HINSTANCE hInst = GetModuleHandle(NULL); | |
#endif | |
WSADATA wd; | |
WSAStartup(0x0101, &wd); | |
DialogBox(hInst, MAKEINTRESOURCE(ID_DLG_MAIN), HWND_DESKTOP, DlgProc); | |
WSACleanup(); | |
#ifdef _DEBUG | |
return 0; | |
#else | |
ExitProcess(0); | |
#endif | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment