windows-nt/Source/XPSP1/NT/net/rras/ras/autodial/rasauto/misc.c
2020-09-26 16:20:57 +08:00

374 lines
7.6 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
Copyright(c) 1995 Microsoft Corporation
MODULE NAME
misc.c
ABSTRACT
Miscellaneous routines for the automatic connection service.
AUTHOR
Anthony Discolo (adiscolo) 20-Mar-1995
REVISION HISTORY
Original version from Gurdeep
--*/
#define UNICODE
#define _UNICODE
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <stdlib.h>
#include <windows.h>
#include <stdio.h>
#include <npapi.h>
#include <winsock.h>
#include <acd.h>
#include <debug.h>
#include <rasman.h>
#include "access.h"
#include "reg.h"
#include "misc.h"
#include "process.h"
#include "rtutils.h"
LPTSTR
AddressToUnicodeString(
IN PACD_ADDR pAddr
)
{
PCHAR pch;
struct in_addr in;
// CHAR szBuf[64];
CHAR *pszBuf = NULL;
LPTSTR pszAddrOrig = NULL, pszAddr = NULL;
INT i;
INT cch;
pszBuf = LocalAlloc(LPTR, 1024);
if(NULL == pszBuf)
{
return NULL;
}
switch (pAddr->fType) {
case ACD_ADDR_IP:
in.s_addr = pAddr->ulIpaddr;
pch = inet_ntoa(in);
pszAddrOrig = AnsiStringToUnicodeString(pch, NULL, 0);
break;
case ACD_ADDR_IPX:
NodeNumberToString(pAddr->cNode, pszBuf);
pszAddrOrig = AnsiStringToUnicodeString(pszBuf, NULL, 0);
break;
case ACD_ADDR_NB:
// RtlZeroMemory(&szBuf, sizeof (szBuf));
pch = pszBuf;
for (i = 0; i < 1024; i++) {
if (pAddr->cNetbios[i] == ' ' || pAddr->cNetbios[i] == '\0')
break;
*pch++ = pAddr->cNetbios[i];
}
//
// Make sure this is a string - there are penetration attack
// tests in stress which pass bogus buffers.
//
pszBuf[1023] = '\0';
pszAddrOrig = AnsiStringToUnicodeString(pszBuf, NULL, 0);
break;
case ACD_ADDR_INET:
//
// Make sure that the address is a string
//
pAddr->szInet[1023] = '\0';
pszAddrOrig = AnsiStringToUnicodeString(pAddr->szInet, NULL, 0);
break;
default:
RASAUTO_TRACE1("AddressToUnicodeString: unknown address type (%d)", pAddr->fType);
break;
}
if (pszAddrOrig != NULL) {
pszAddr = CanonicalizeAddress(pszAddrOrig);
LocalFree(pszAddrOrig);
}
if(NULL != pszBuf)
{
LocalFree(pszBuf);
}
return pszAddr;
} // AddressToUnicodeString
LPTSTR
CompareConnectionLists(
IN LPTSTR *lpPreList,
IN DWORD dwPreSize,
IN LPTSTR *lpPostList,
IN DWORD dwPostSize
)
{
DWORD i, j;
DWORD iMax, jMax;
LPTSTR *piList, *pjList;
BOOLEAN fFound;
if (dwPostSize > dwPreSize) {
iMax = dwPostSize;
piList = lpPostList;
jMax = dwPreSize;
pjList = lpPreList;
}
else {
iMax = dwPreSize;
piList = lpPreList;
jMax = dwPostSize;
pjList = lpPostList;
}
//
// If one list is empty, then return
// the first entry of the other list.
//
if (iMax > 0 && jMax == 0)
return piList[0];
for (i = 0; i < iMax; i++) {
fFound = FALSE;
for (j = 0; j < jMax; j++) {
if (!wcscmp(piList[i], pjList[j])) {
fFound = TRUE;
break;
}
}
if (!fFound)
return piList[i];
}
//
// Didn't find any differences.
//
return NULL;
} // CompareConnectionLists
LPTSTR
CopyString(
IN LPTSTR pszString
)
{
LPTSTR pszNewString;
pszNewString = LocalAlloc(
LPTR,
(wcslen(pszString) + 1) * sizeof (TCHAR));
if (pszNewString == NULL) {
RASAUTO_TRACE("CopyString: LocalAlloc failed");
return NULL;
}
wcscpy(pszNewString, pszString);
return pszNewString;
} // CopyString
PCHAR
UnicodeStringToAnsiString(
IN PWCHAR pszUnicode,
OUT PCHAR pszAnsi,
IN USHORT cbAnsi
)
{
NTSTATUS status;
BOOLEAN fAllocate = (pszAnsi == NULL);
UNICODE_STRING unicodeString;
ANSI_STRING ansiString;
RtlInitUnicodeString(&unicodeString, pszUnicode);
if (pszAnsi != NULL) {
ansiString.Length = 0;
ansiString.MaximumLength = cbAnsi;
ansiString.Buffer = pszAnsi;
}
status = RtlUnicodeStringToAnsiString(
&ansiString,
&unicodeString,
fAllocate);
return (status == STATUS_SUCCESS ? ansiString.Buffer : NULL);
} // UnicodeStringToAnsiString
PWCHAR
AnsiStringToUnicodeString(
IN PCHAR pszAnsi,
OUT PWCHAR pszUnicode,
IN USHORT cbUnicode
)
{
NTSTATUS status;
BOOLEAN fAllocate = (pszUnicode == NULL);
UNICODE_STRING unicodeString;
ANSI_STRING ansiString;
RtlInitAnsiString(&ansiString, pszAnsi);
if (pszUnicode != NULL) {
unicodeString.Length = 0;
unicodeString.MaximumLength = cbUnicode;
unicodeString.Buffer = pszUnicode;
}
status = RtlAnsiStringToUnicodeString(
&unicodeString,
&ansiString,
fAllocate);
return (status == STATUS_SUCCESS ? unicodeString.Buffer : NULL);
} // AnsiStringToUnicodeString
VOID
FreeStringArray(
IN LPTSTR *lpEntries,
IN LONG lcEntries
)
{
while (--lcEntries >= 0)
LocalFree(lpEntries[lcEntries]);
LocalFree(lpEntries);
} // FreeStringArray
LPTSTR
CanonicalizeAddress(
IN LPTSTR pszAddress
)
{
LPTSTR psz, pWhack;
if (pszAddress[0] == L'\\' && pszAddress[1] == L'\\') {
psz = CopyString(&pszAddress[2]);
if (psz == NULL)
return NULL;
pWhack = wcschr(psz, '\\');
if (pWhack != NULL)
*pWhack = L'\0';
}
else {
psz = CopyString(pszAddress);
if (psz == NULL)
return NULL;
}
_wcslwr(psz);
RASAUTO_TRACE2("CanonicalizeAddress(%S) returns %S", pszAddress, psz);
return psz;
} // CanonicalizeAddress
BOOLEAN
GetOrganization(
IN LPTSTR pszAddr,
OUT LPTSTR pszOrganization
)
{
BOOLEAN fSuccess = FALSE;
TCHAR *pszA, *pszO;
ULONG nDots;
//
// Get the domain and organization name. These
// are the last two components separated by a '.'.
//
for (pszA = pszAddr; *pszA; pszA++);
for (nDots = 0, pszA--; pszA != pszAddr; pszA--) {
if (*pszA == TEXT('.'))
nDots++;
if (nDots == 2)
break;
}
if (nDots == 2 || (pszA == pszAddr && nDots == 1)) {
if (nDots == 2)
pszA++; // skip '.'
for (pszO = pszOrganization; *pszO = *pszA; pszA++, pszO++);
fSuccess = TRUE;
RASAUTO_TRACE2("GetOrganization: org for %S is %S", pszAddr, pszOrganization);
}
return fSuccess;
} // GetOrganization
// Tracing
//
DWORD g_dwRasAutoTraceId = INVALID_TRACEID;
DWORD
RasAutoDebugInit()
{
DebugInitEx("RASAUTO", &g_dwRasAutoTraceId);
return 0;
}
DWORD
RasAutoDebugTerm()
{
DebugTermEx(&g_dwRasAutoTraceId);
return 0;
}
/*
VOID
repareForLongWait(VOID)
{
//
// Unload user-based resources because they
// cannot be held over logout/login sequence.
//
// RegCloseKey(HKEY_CURRENT_USER);
} // PrepareForLongWait
*/
#if DBG
VOID
DumpHandles(
IN PCHAR lpString,
IN ULONG a1,
IN ULONG a2,
IN ULONG a3,
IN ULONG a4,
IN ULONG a5
)
{
PSYSTEM_PROCESS_INFORMATION pSystemInfo, pProcessInfo;
ULONG ulHandles;
pSystemInfo = GetSystemProcessInfo();
if (pSystemInfo == NULL)
return;
pProcessInfo = FindProcessByName(pSystemInfo, L"rasman.exe");
if (pProcessInfo == NULL)
return;
DbgPrint(lpString, a1, a2, a3, a4, a5);
DbgPrint(": HANDLES=%d\n", pProcessInfo->HandleCount);
FreeSystemProcessInfo(pSystemInfo);
} // DumpHandles
#endif