📄 rasdial.c
字号:
}
return FALSE;
}
DWORD WINAPI
MsgThread(LPVOID pvarg)
{
HINSTANCE hInst = (HINSTANCE)GetCurrentProcessId();
MSG msg;
WNDCLASS wc;
#define RASDIAL_CLASS_NAME TEXT("RasDialWin")
wc.style = 0;
wc.lpfnWndProc = (WNDPROC) WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInst;
wc.hIcon = 0;
wc.hCursor = 0;
wc.hbrBackground = NULL;
wc.lpszMenuName = 0;
wc.lpszClassName = RASDIAL_CLASS_NAME;
// What if it fails?
RegisterClass(&wc);
v_hWnd = CreateWindow (RASDIAL_CLASS_NAME,
TEXT("This is a lame static window"),
0, 0, 0, 5, 5, NULL, NULL, hInst, NULL);
if (NULL == v_hWnd) {
OutputMessage (TEXT("Error from CreateWindow %d\r\n"),
GetLastError());
}
while ( GetMessage(&msg, NULL, 0, 0) != FALSE ) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
void
usage()
{
OutputMessage (TEXT("USAGE:\r\n"));
OutputMessage (TEXT(" rasdial entryname [username [password]]")
TEXT(" [/DOMAIN:domain] [/DEBUG:num]\r\n"));
OutputMessage (TEXT(" rasdial [entryname] /DISCONNECT\r\n"));
OutputMessage (TEXT(" rasdial [/STATS]\r\n\r\n"));
}
int WINAPI
_tmain (int argc, TCHAR **argv)
{
DWORD ParmNum = 0;
BOOL fDisconnect = FALSE;
DWORD i;
BOOL fPassword;
LPRASCONN pRasConn;
DWORD Connections;
DWORD cb;
BYTE RasConnData[10*sizeof(RASCONN)];
HRASCONN hRasConn;
DWORD RetVal;
RASCONNSTATUS RasConnStatus;
RASDIALPARAMS RasDialParams;
HANDLE hThread;
DWORD ThrdId;
BOOL fNoWin = FALSE;
BOOL fStats = FALSE;
RAS_STATS RasStats;
BOOL pF=FALSE;
// This will create the default entries if the key does not exist.
RasEnumEntries (NULL, NULL, NULL, &cb, NULL);
memset ((char *)&RasDialParams, 0, sizeof(RasDialParams));
RasDialParams.dwSize = sizeof(RasDialParams);
for (i=1; i < (DWORD)argc; i++) {
if ((argv[i][0] == TEXT('-')) || (argv[i][0] == TEXT('/'))) {
// Check for Debug redirect
if ((argv[i][2] == '\0') && ((argv[i][1] == 'd') || (argv[i][1] == 'D'))) {
v_fDebugOut = TRUE;
continue;
}
// Done with EntryName/UserName/Password
ParmNum = 3;
if (!_tcsnicmp (&argv[i][1], TEXT("Domain:"), 6)) {
// Copy the domain name over
if (_tcslen(&argv[i][7]) >= NUM_ELEMENTS(RasDialParams.szDomain)) {
OutputMessage (TEXT("Domain name too long\r\n"));
return 0;
}
_tcscpy (RasDialParams.szDomain, &argv[i][7]);
} else if (!_tcsnicmp (&argv[i][1], TEXT("Disconnect"), 10)) {
fDisconnect = TRUE;
} else if (!_tcsnicmp (&argv[i][1], TEXT("Debug:"), 6)) {
v_DebugFlag = 0;
v_DebugFlag = _ttoi (&argv[i][7]);
OutputMessage (TEXT("Debug flag set to %d\r\n"), v_DebugFlag);
} else if (!_tcsnicmp (&argv[i][1], TEXT("NoWin"), 5)) {
fNoWin = TRUE;
OutputMessage (TEXT("No Window option specified\r\n"));
} else if (!_tcsnicmp (&argv[i][1], TEXT("Stats"), 5)) {
fStats = TRUE;
} else {
OutputMessage (TEXT("Invalid cmdline '%s'\r\n"), &argv[i][1]);
usage();
return 0;
}
} else if (ParmNum == 0) {
// Get the entryname
if (_tcslen(argv[i]) >= NUM_ELEMENTS(RasDialParams.szEntryName)) {
OutputMessage (TEXT("Entry name too long\r\n"));
return 0;
}
_tcscpy (RasDialParams.szEntryName, argv[i]);
// Load the dial params for this entry.
RasGetEntryDialParams( NULL, &RasDialParams, &fPassword );
OutputMessage (TEXT("Opened RasEntry '%s', UserName='%s' PW='%s' Domain='%s'\r\n"),
RasDialParams.szEntryName, RasDialParams.szUserName,
RasDialParams.szPassword, RasDialParams.szDomain);
// Prepare for UserName.
ParmNum = 1;
} else if (ParmNum == 1) {
if (_tcslen(argv[i]) >= NUM_ELEMENTS(RasDialParams.szUserName)) {
OutputMessage (TEXT("User name too long\r\n"));
return 0;
}
_tcscpy (RasDialParams.szUserName, argv[i]);
ParmNum = 2;
} else if (ParmNum == 2) {
if (_tcslen(argv[i]) >= NUM_ELEMENTS(RasDialParams.szPassword)) {
OutputMessage (TEXT("Password too long\r\n"));
return 0;
}
_tcscpy (RasDialParams.szPassword, argv[i]);
// All done with normal params
ParmNum = 3;
} else {
OutputMessage (TEXT("Invalid cmdline '%s'\r\n"), argv[i]);
usage();
return 0;
}
}
// Get the current list of connections
pRasConn = (LPRASCONN) RasConnData;
pRasConn->dwSize = sizeof(RASCONN);
Connections = 0;
cb = sizeof(RasConnData);
if ( RasEnumConnections(pRasConn, &cb, &Connections)) {
OutputMessage (TEXT("Error from RasEnumConnections %d\r\n"),
GetLastError());
return 0;
}
if (fDisconnect) {
// Was an entryname specified?
if (RasDialParams.szEntryName[0]) {
for (i=0; i < Connections; i++) {
if (!_tcscmp (RasDialParams.szEntryName,
pRasConn[i].szEntryName)) {
break;
}
}
if (i == Connections) {
OutputMessage (TEXT("Error entry '%s' not found\r\n"),
RasDialParams.szEntryName);
return 0;
}
hRasConn = pRasConn[i].hrasconn;
} else {
// If one then disconnect it
if (Connections != 1) {
OutputMessage (TEXT("Error %d connections active\r\n"),
Connections);
for (i=0; i < Connections; i++) {
OutputMessage (TEXT(" 0x%08X '%s' \r\n"),
pRasConn[i].hrasconn,
pRasConn[i].szEntryName);
}
return 0;
}
hRasConn = pRasConn->hrasconn;
_tcscpy (RasDialParams.szEntryName, pRasConn->szEntryName);
}
// Hangup the RAS connection
OutputMessage (TEXT("Hanging up 0x%08X '%s'\r\n"), hRasConn,
RasDialParams.szEntryName);
RasHangUp (hRasConn);
return 0;
}
if (RasDialParams.szEntryName[0] == TEXT('\0')) {
// Just list the connections.
OutputMessage (TEXT("%d Active connections\r\n"), Connections);
for (i=0; i < Connections; i++) {
OutputMessage (TEXT(" 0x%08X '%s' "),
pRasConn[i].hrasconn,
pRasConn[i].szEntryName);
RasConnStatus.dwSize = sizeof(RasConnStatus);
if (RasGetConnectStatus (pRasConn[i].hrasconn, &RasConnStatus)) {
OutputMessage (TEXT("Error getting Connection Status\r\n"));
} else {
OutputMessage (TEXT("%s Error=%d DeviceName='%s' DeviceType='%s'\r\n"),
GetStateStr(RasConnStatus.rasconnstate),
RasConnStatus.dwError,
RasConnStatus.szDeviceName,
RasConnStatus.szDeviceType);
if (fStats) {
RasStats.dwSize = sizeof(RasStats);
if (RasGetLinkStatistics (pRasConn[i].hrasconn, 0, &RasStats)) {
OutputMessage (TEXT("Error getting link statistics\r\n"));
} else {
DWORD dwMin, dwSecs, dwMSecs;
dwMin = RasStats.dwConnectDuration / (1000*60);
dwSecs = (RasStats.dwConnectDuration/1000) % 60;
dwMSecs = RasStats.dwConnectDuration % 1000;
OutputMessage (TEXT(" Bytes S=%d, R=%d\r\n")
TEXT(" Frames S=%d, R=%d\r\n")
TEXT(" Compression I=%d%% O=%d%%\r\n")
TEXT(" Duration %d:%02d.%03d\r\n"),
RasStats.dwBytesXmited, RasStats.dwBytesRcved,
RasStats.dwFramesXmited, RasStats.dwFramesRcved,
RasStats.dwCompressionRatioIn,
RasStats.dwCompressionRatioOut,
dwMin, dwSecs, dwMSecs);
}
}
}
}
return 0;
}
// About to dial
OutputMessage (TEXT("Dialing RasEntry '%s', UserName='%s' PW='%s' Domain='%s'\r\n"),
RasDialParams.szEntryName, RasDialParams.szUserName,
RasDialParams.szPassword, RasDialParams.szDomain);
// Actually want to connect.
RasDialParams.dwSize = sizeof(RASDIALPARAMS);
if (fNoWin == FALSE) {
hThread = CreateThread (NULL, 0, MsgThread, (LPVOID)0,
0, &ThrdId);
// We don't want a handle.
CloseHandle (hThread);
// Sleep and let the window get created.
while (NULL == v_hWnd) {
Sleep(250);
}
} else {
// Don't bother waiting around if we're not going get callback messages
fExit = TRUE;
}
// pF=PortInitialize (_T("COM8:"));
RetVal = RasDial (NULL, NULL, &RasDialParams, 0xFFFFFFFF, v_hWnd, &hRasConn);
if (RetVal) {
OutputMessage (TEXT("Error from RasDial=%d\r\n"), RetVal);
if (hRasConn) {
RasHangUp (hRasConn);
}
} else {
OutputMessage (TEXT("RasDial successful, hRasConn = 0x%08X\r\n"),
hRasConn);
}
// Wait for the Connect or disconnect message
while (!fExit) {
Sleep (1000);
}
OutputMessage (TEXT("Exiting\r\n"));
if (fDisconnected) {
RasHangUp (hRasConn);
}
DestroyWindow (v_hWnd);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -