summaryrefslogtreecommitdiffstats
path: root/private/unimodem/new/mic
diff options
context:
space:
mode:
authorAdam <you@example.com>2020-05-17 05:51:50 +0200
committerAdam <you@example.com>2020-05-17 05:51:50 +0200
commite611b132f9b8abe35b362e5870b74bce94a1e58e (patch)
treea5781d2ec0e085eeca33cf350cf878f2efea6fe5 /private/unimodem/new/mic
downloadNT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.gz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.bz2
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.lz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.xz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.zst
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.zip
Diffstat (limited to 'private/unimodem/new/mic')
-rw-r--r--private/unimodem/new/mic/alloc.h86
-rw-r--r--private/unimodem/new/mic/chksum.cpp57
-rw-r--r--private/unimodem/new/mic/chksum.h23
-rw-r--r--private/unimodem/new/mic/common.h32
-rw-r--r--private/unimodem/new/mic/consts.h30
-rw-r--r--private/unimodem/new/mic/dev.cpp1103
-rw-r--r--private/unimodem/new/mic/dev.h136
-rw-r--r--private/unimodem/new/mic/globals.cpp53
-rw-r--r--private/unimodem/new/mic/globals.h28
-rw-r--r--private/unimodem/new/mic/ilist.cpp58
-rw-r--r--private/unimodem/new/mic/ilist.h66
-rw-r--r--private/unimodem/new/mic/inf.cpp903
-rw-r--r--private/unimodem/new/mic/inf.h998
-rw-r--r--private/unimodem/new/mic/ini.cpp153
-rw-r--r--private/unimodem/new/mic/ini.h210
-rw-r--r--private/unimodem/new/mic/main.cpp18
-rw-r--r--private/unimodem/new/mic/makefile6
-rw-r--r--private/unimodem/new/mic/mic.cpp167
-rw-r--r--private/unimodem/new/mic/mic.h1
-rw-r--r--private/unimodem/new/mic/notes.txt231
-rw-r--r--private/unimodem/new/mic/resp.cpp3538
-rw-r--r--private/unimodem/new/mic/sample.inf64
-rw-r--r--private/unimodem/new/mic/sources36
-rw-r--r--private/unimodem/new/mic/sym.cpp316
-rw-r--r--private/unimodem/new/mic/sym.h215
-rw-r--r--private/unimodem/new/mic/sync.cpp35
-rw-r--r--private/unimodem/new/mic/sync.h148
-rw-r--r--private/unimodem/new/mic/tdev.cpp84
-rw-r--r--private/unimodem/new/mic/test.h2
-rw-r--r--private/unimodem/new/mic/tsym.cpp65
30 files changed, 8862 insertions, 0 deletions
diff --git a/private/unimodem/new/mic/alloc.h b/private/unimodem/new/mic/alloc.h
new file mode 100644
index 000000000..ae5637608
--- /dev/null
+++ b/private/unimodem/new/mic/alloc.h
@@ -0,0 +1,86 @@
+//
+// Copyright (c) 1996 Microsoft Corporation
+//
+//
+// ALLOC.H -- Header for Classes:
+// CAllococator
+//
+//
+// History:
+// 05/22/96 JosephJ Created
+//
+//
+#if (TODO)
+
+
+class CAllocator
+{
+ Allocator(UINT uSize) : m_uSize(uSize)
+ {
+ ASSERT(!(uSize %sizeof(void *)));
+ m_uBlockSize = (uSize+sizeof(void *))
+ if (uSize<1000)
+ m_uBlockSize = m_uBlockSize*10 + sizeof(void *)
+
+ m_uBlockSize += sizeof (void*);
+ }
+
+ ~Allocator()
+ {
+ void *pList = m_pBlockList;
+ while(pList)
+ {
+ void *pOld = pList;
+ pList = (void *) *pList;
+ GlobalFree(pOld);
+ }
+ }
+
+ void * Alloc(void)
+ {
+ m_sync.EnterCrit();
+
+ void *pvRet = m_pFreeList;
+
+ if (!m_pFreeList)
+ {
+ void *pv = GlobalAlloc(LPTR, m_uBlockSize);
+ void *pvEnd = pv+m_uBlockSize;
+ if (pv)
+ {
+ *pv = m_pvBlockList;
+ m_pvBlockList = pv;
+ m_pFreeList = ++pv;
+ for(;;pv = *pv)
+ {
+ *pv = pv + m_uSize + sizeof (void *);
+ if (*pv >= pvEnd) {*pv=NULL;break;}
+ pv = *pv;
+ }
+ pvRet = m_pFreeList;
+ }
+ }
+
+ m_sync.LeaveCrit();
+
+ return pvRet;
+ }
+
+ void Free(void *pv)
+ {
+ m_sync.EnterCrit();
+ pv--;
+ *pv = m_pFreeList;
+ m_pFreeList=*pv;
+ m_sync.LeaveCrit();
+ }
+
+private:
+
+ void * m_pFreeList;
+ void * m_pBlockList;
+ const UINT m_uSize;
+ UINT m_uBlockSize;
+ CSync m_sync;
+}
+#endif (TODO)
diff --git a/private/unimodem/new/mic/chksum.cpp b/private/unimodem/new/mic/chksum.cpp
new file mode 100644
index 000000000..55e936eaa
--- /dev/null
+++ b/private/unimodem/new/mic/chksum.cpp
@@ -0,0 +1,57 @@
+//
+// Copyright (c) 1996 Microsoft Corporation
+//
+//
+// CHKSUM.CPP -- Implementation Checksum()
+//
+// History:
+// 05/24/96 JosephJ Created
+//
+//
+#include "common.h"
+
+//---------------- ::Checksum -----------------------------------
+// Compute a 32-bit checksum of the specified bytes
+// 0 is retured if pb==NULL or cb==0
+DWORD Checksum(const BYTE *pb, UINT cb)
+{
+ const UINT MAXSIZE = 1024;
+ DWORD dwRet = 0;
+ //DWORD rgdwBuf[MAXSIZE/sizeof(DWORD)];
+
+
+ if (!pb) goto end;
+
+
+ // TODO: replace by crc32
+ while(cb--) {dwRet ^= dwRet<<1 ^ *pb++;}
+
+#if (TODO)
+ // If buffer not dword aligned, we copy it over to a buffer which is,
+ // and pad it
+ if (cb & 0x3)
+ {
+ if (cb>=MAXSIZE)
+ {
+ ASSERT(FALSE);
+ goto end;
+ }
+ CopyMemory(rgdwBuf, pb, cb);
+ }
+#endif (TODO)
+
+end:
+ return dwRet;
+}
+
+
+//---------------- ::AddToChecksumDW ----------------------------
+// Set *pdwChkSum to a new checksum, computed using it's previous value and dw.
+void AddToChecksumDW(DWORD *pdwChkSum, DWORD dw)
+{
+ DWORD rgdw[2];
+ rgdw[0] = *pdwChkSum;
+ rgdw[1] = dw;
+
+ *pdwChkSum = Checksum((const BYTE *) rgdw, sizeof(rgdw));
+}
diff --git a/private/unimodem/new/mic/chksum.h b/private/unimodem/new/mic/chksum.h
new file mode 100644
index 000000000..e5af9e49f
--- /dev/null
+++ b/private/unimodem/new/mic/chksum.h
@@ -0,0 +1,23 @@
+//
+// Copyright (c) 1996 Microsoft Corporation
+//
+//
+// CHKSUM.H -- Header for Checksum computation
+//
+// History:
+// 05/24/96 JosephJ Created
+//
+//
+#ifndef _CHKSUM_H_
+#define _CHKSUM_H_
+
+//---------------- ::Checksum -----------------------------------
+// Compute a 32-bit checksum of the specified bytes
+// 0 is retured if pb==NULL or cb==0
+DWORD Checksum(const BYTE *pb, UINT cb);
+
+//---------------- ::AddToChecksumDW ----------------------------
+// Set *pdwChkSum to a new checksum, computed using it's previous value and dw.
+void AddToChecksumDW(DWORD *pdwChkSum, DWORD dw);
+
+#endif // _CHKSUM_H_
diff --git a/private/unimodem/new/mic/common.h b/private/unimodem/new/mic/common.h
new file mode 100644
index 000000000..6dfe74c45
--- /dev/null
+++ b/private/unimodem/new/mic/common.h
@@ -0,0 +1,32 @@
+//
+// Copyright (c) 1996 Microsoft Corporation
+//
+// COMMON.H -- Common header
+//
+// History:
+// 05/22/96 JosephJ Created
+//
+//
+
+#ifndef _COMMON_H_
+#define _COMMON_H_
+
+#include <windows.h>
+#include <stdio.h>
+
+#define ASSERT(_c) \
+ ((_c) ? 0: printf( \
+ "\n***Assertion failed in %s:%d\n***\n",\
+ __FILE__,\
+ __LINE__\
+ ))
+
+#include "consts.h"
+#include "chksum.h"
+#include "ilist.h"
+#include "sync.h"
+#include "sym.h"
+#include "globals.h"
+
+
+#endif // _COMMON_H_
diff --git a/private/unimodem/new/mic/consts.h b/private/unimodem/new/mic/consts.h
new file mode 100644
index 000000000..68d39d3b7
--- /dev/null
+++ b/private/unimodem/new/mic/consts.h
@@ -0,0 +1,30 @@
+//
+// Copyright (c) 1996 Microsoft Corporation
+//
+// CONSTS.H -- Common constants
+//
+// History:
+// 06/13/96 JosephJ Created
+//
+//
+#ifndef _CONSTS_H_
+#define _CONSTS_H_
+
+// Platforms
+enum ePLATFORM
+{
+ ePLAT_ALL,
+ ePLAT_NT_ALL,
+ ePLAT_NT_ALPHA,
+ ePLAT_NT_PPC,
+ ePLAT_NT_MIPS
+};
+
+// Object signatures.
+enum eOBJSIG
+{
+ eOBJSIG_INVALID = 0,
+ eOBJSIG_CInfManufacturerSection = 1234
+};
+
+#endif // _CONSTS_H_
diff --git a/private/unimodem/new/mic/dev.cpp b/private/unimodem/new/mic/dev.cpp
new file mode 100644
index 000000000..051632a5c
--- /dev/null
+++ b/private/unimodem/new/mic/dev.cpp
@@ -0,0 +1,1103 @@
+//
+// Copyright (c) 1996 Microsoft Corporation
+//
+//
+// DEV.C -- Implementation for Classes:
+// CInfDevice
+//
+//
+// History:
+// 05/22/96 JosephJ Created
+//
+//
+#include "common.h"
+#include "ini.h"
+#include "inf.h"
+#include "dev.h"
+
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CInfDevice
+///////////////////////////////////////////////////////////////////////////
+
+
+//-------------- Dump ------------------
+// Dump state
+void CInfDevice::Dump(void) const
+{
+ // Dump Version
+ m_pVersion->Dump();
+
+ // Dump manufacturer name
+ m_pSymManufacturerName->Dump();
+
+ // Dump model name
+ m_pSymDeviceName->Dump();
+
+ // Dump AddRegList
+ {
+ const CInfList *pList = m_pAddRegList;
+
+ for (;pList; pList=pList->Next())
+ {
+ const CInfAddRegEntry * pAddRegEntry =
+ (const CInfAddRegEntry *) pList->GetData();
+ pAddRegEntry->Dump();
+ }
+
+ }
+
+ // Dump CopyFilesList
+ {
+ const CInfList *pList = m_pCopyFilesList;
+
+ for (;pList; pList=pList->Next())
+ {
+ const CInfCopyFilesEntry * pCopyFilesEntry =
+ (const CInfCopyFilesEntry *) pList->GetData();
+ pCopyFilesEntry->Dump();
+ }
+
+ }
+
+ // NoResDup section
+ {
+ // [Modem6.NoResDup]
+ // UNIMODEMCC646872,UNIMODEMA4970248,UNIMODEMB6071C15
+
+ // TODO: unimplemented
+
+ }
+
+ // PosDup section
+ {
+ // [Modem12.PosDup]
+ // *PNP0500
+
+ // TODO: unimplemented
+ }
+ // TODO: UpdateInis, Uninstall, NoResDup, PosDup
+
+}
+
+
+//-------------- Load ------------------
+// Load (init), using information from the specified inf file and model entry.
+BOOL CInfDevice::Load
+(
+ const CInfFile *pInf,
+ const CInfManufacturerEntry *pManuE,
+ const CInfModelEntry *pModelE
+)
+{
+ BOOL fRet = FALSE;
+
+ mfn_EnterCrit();
+
+ // TODO: call m_sync.BeginLoad
+
+ ASSERT
+ (
+ !m_pvInfSession
+ && !m_pInfFile
+ && !m_pManufacturerEntry
+ && !m_pModelEntry
+ && !m_pVersion
+ && !m_pSymManufacturerName
+ && !m_pSymDeviceName
+ && !m_pCopyFilesList
+ && !m_pAddRegList
+ );
+
+ if (!pInf || !pManuE || !pModelE) goto end;
+
+ // Keep a reference to the Inf file and manufacturer and model entry
+ m_pInfFile = pInf;
+ m_pModelEntry = pModelE;
+ m_pManufacturerEntry = pManuE;
+
+ // Open a session with the inf file.
+ m_pvInfSession = pInf->OpenSession ();
+
+ if (!m_pvInfSession)
+ {
+ printf("Error calling pInf->OpenSession()\n");
+ goto end;
+ }
+
+ // version
+ m_pVersion = pInf->GetVersion();
+
+ // manufacturer name
+ m_pSymManufacturerName = pManuE->GetName();
+
+ // model name
+ m_pSymDeviceName = pModelE->GetName();
+
+ // TODO: UpdateInis, Uninstall
+
+ if (
+ m_pvInfSession
+ && m_pInfFile
+ && m_pModelEntry
+ && m_pManufacturerEntry
+ && m_pVersion
+ && m_pSymManufacturerName
+ && m_pSymDeviceName
+ )
+ {
+ fRet = mfn_CreateAddRegList(pModelE);
+ fRet = fRet && mfn_CreateCopyFilesList(pModelE);
+ }
+
+ // Create signatures
+
+ // Version
+ m_dwSigVersion = m_pVersion->Checksum();
+
+ // Make and Model
+ m_dwSigManuAndModel = m_pSymManufacturerName->Checksum();
+ AddToChecksumDW(&m_dwSigManuAndModel, m_pSymDeviceName->Checksum());
+
+ // Control Flags
+ m_dwSigFlags = m_pModelEntry->GetControlFlags(ePLAT_ALL);
+ AddToChecksumDW(&m_dwSigFlags,m_pModelEntry->GetControlFlags(ePLAT_NT_ALL));
+ AddToChecksumDW(&m_dwSigFlags,m_pModelEntry->GetControlFlags(ePLAT_NT_ALPHA));
+ AddToChecksumDW(&m_dwSigFlags,m_pModelEntry->GetControlFlags(ePLAT_NT_PPC));
+ AddToChecksumDW(&m_dwSigFlags,m_pModelEntry->GetControlFlags(ePLAT_NT_MIPS));
+
+ // AddReg -- got created by mfn_CreateAddRegList
+
+ // Copy files -- got created by mfn_CreateCopyFilesList
+
+ // NoResDup and PosDup
+ {
+ const CInfInstallSection *pInstall = m_pModelEntry->GetInstallSection();
+ DWORD dwSigNoResDup=0;
+ DWORD dwSigPosDup=0;
+ const CInfList *pSymList = pInstall->GetNoResDupIDList();
+ while(pSymList)
+ {
+ const CInfSymbol *pSym = (const CInfSymbol *) pSymList->GetData();
+ // We use XOR to combine the checksum, because we don't care about
+ // order.
+ dwSigNoResDup ^= pSym->Checksum();
+ pSymList = pSymList->Next();
+ }
+
+ pSymList = pInstall->GetPosDupIDList();
+ while(pSymList)
+ {
+ const CInfSymbol *pSym = (const CInfSymbol *) pSymList->GetData();
+ // We use XOR to combine the checksum, because we don't care about
+ // order.
+ dwSigPosDup ^= pSym->Checksum();
+ pSymList = pSymList->Next();
+ }
+
+ // Combine, and this time we *are* sensitive to the order.
+ m_dwSigDup = dwSigNoResDup;
+ AddToChecksumDW(&m_dwSigDup, dwSigPosDup);
+ }
+
+ // Rank0
+ m_dwSigRank0 = (m_pModelEntry->GetRank0ID())->Checksum();
+
+ // All ranks
+ m_dwSigRanks = m_dwSigRank0;
+ AddToChecksumDW(&m_dwSigRanks, (m_pModelEntry->GetRank1ID())->Checksum());
+ AddToChecksumDW(&m_dwSigRanks, (m_pModelEntry->GetRank2ID())->Checksum());
+
+ // Signature of everything.
+ m_dwSigAll = m_dwSigVersion;
+ AddToChecksumDW(&m_dwSigAll, m_dwSigManuAndModel);
+ AddToChecksumDW(&m_dwSigAll, m_dwSigFlags);
+ AddToChecksumDW(&m_dwSigAll, m_dwSigAddReg);
+ AddToChecksumDW(&m_dwSigAll, m_dwSigCopyFiles);
+ AddToChecksumDW(&m_dwSigAll, m_dwSigDup);
+ AddToChecksumDW(&m_dwSigAll, m_dwSigRanks);
+
+end:
+ if (!fRet)
+ {
+ mfn_Cleanup();
+ }
+
+ mfn_LeaveCrit();
+
+ return fRet;
+}
+
+//-------------- Unload ------------------
+// Unloads a previously loaded file.
+HANDLE CInfDevice::Unload (void)
+{
+ HANDLE hUnload = NULL;
+
+ mfn_EnterCrit();
+
+ // TODO: call m_sync.BeginUnload to try to put us in unloadable state.
+
+ mfn_Cleanup();
+
+ mfn_LeaveCrit();
+
+ return hUnload;
+}
+
+//-------------- WriteInf ------------------
+// Creates an inf file with all the information of this device.
+BOOL CInfDevice::WriteInf(LPCTSTR lpctszIniFile) const
+{
+ // String-related constants
+ LPCTSTR lpctszStrings = TEXT("Strings");
+
+ BOOL fRet = FALSE;
+ const CInfSymbol * pSym=NULL;
+
+ printf(TEXT("Writing inf [%s]\n"), lpctszIniFile);
+
+ // Create/truncate file, and write header comment
+ if (!mfn_write_header(lpctszIniFile)) goto end;
+
+end:
+ return fRet;
+}
+
+
+// Cleanup by freeing any allocated resources.
+void CInfDevice::mfn_Cleanup (void)
+{
+ mfn_EnterCrit();
+
+ // TODO: ASSERT(state == loading or state == unloading)
+
+ if (m_pAddRegList)
+ {
+ // Explicitly cast to non-const because we're deleting it.
+ CInfList::FreeList((CInfList *) m_pAddRegList);
+ }
+
+ if (m_pCopyFilesList)
+ {
+ // Explicitly cast to non-const because we're deleting it.
+ CInfList::FreeList((CInfList *) m_pCopyFilesList);
+ }
+
+ if (m_pvInfSession)
+ {
+ ASSERT(m_pInfFile);
+ m_pInfFile->CloseSession(m_pvInfSession);
+ }
+
+ m_pAddRegList = NULL;
+ m_pCopyFilesList = NULL;
+ m_pvInfSession = NULL;
+ m_pInfFile = NULL;
+ m_pModelEntry = NULL;
+ m_pManufacturerEntry = NULL;
+ m_pVersion = NULL;
+ m_pSymManufacturerName = NULL;
+ m_pSymDeviceName = NULL;
+
+ m_dwSigVersion = 0;
+ m_dwSigManuAndModel = 0;
+ m_dwSigFlags = 0;
+ m_dwSigAddReg = 0;
+ m_dwSigCopyFiles = 0;
+ m_dwSigRank0 = 0;
+ m_dwSigRanks = 0;
+
+
+ mfn_LeaveCrit();
+}
+
+
+// Initializes m_pAddRegList to list of addreg entries.
+BOOL CInfDevice::mfn_CreateAddRegList(const CInfModelEntry *pModelE)
+{
+ const CInfInstallSection * pInstall = pModelE->GetInstallSection();
+ const CInfList * pAddRegList = pInstall->GetAddRegSectionList();
+
+ ASSERT(!m_pAddRegList);
+
+ // Initialize this here -- it is modified by mfn_AddToAddRegList.
+ m_dwSigAddReg = 0;
+
+ // Walk AddReg list, adding each entry for each addreg section.
+ for (;pAddRegList; pAddRegList=pAddRegList->Next())
+ {
+ const CInfAddRegSection * pAddRegSection =
+ (const CInfAddRegSection *) pAddRegList->GetData();
+
+ ASSERT(pAddRegSection);
+
+ // Add all the entries in the section, overwriting previous entries
+ // with the same subkey/value-name.
+ const CInfAddRegEntry * pAddRegEntry =
+ pAddRegSection->GetFirstAddRegEntry ();
+ for(;pAddRegEntry; pAddRegEntry = pAddRegEntry->Next())
+ {
+ mfn_AddToAddRegList(pAddRegEntry);
+ }
+ }
+
+ return TRUE;
+}
+
+void CInfDevice::mfn_AddToAddRegList (const CInfAddRegEntry *pAddRegEntry)
+{
+ // TODO: need to overwrite or not, depending on the addreg flags.
+ // for now, simply add to front of list.
+ m_pAddRegList = new CInfList ((void *) pAddRegEntry, m_pAddRegList);
+ AddToChecksumDW(&m_dwSigAddReg, pAddRegEntry->Checksum());
+}
+
+BOOL CInfDevice::mfn_CreateCopyFilesList(const CInfModelEntry *pModelE)
+{
+
+ const CInfInstallSection * pInstall = pModelE->GetInstallSection();
+ const CInfList * pCopyFilesList = pInstall->GetCopyFilesSectionList();
+
+ ASSERT(!m_pCopyFilesList);
+
+ // Initialize this here -- it is modified by mfn_AddToCopyFilesList.
+ m_dwSigCopyFiles = 0;
+
+ // Walk CopyFiles list, adding each entry for each copyfile section.
+ for (;pCopyFilesList; pCopyFilesList=pCopyFilesList->Next())
+ {
+ const CInfCopyFilesSection * pCopyFilesSection =
+ (const CInfCopyFilesSection *) pCopyFilesList->GetData();
+
+ ASSERT(pCopyFilesSection);
+
+ // Add all the entries in the section, overwriting previous entries
+ // with the name and destination.
+ const CInfCopyFilesEntry * pCopyFilesEntry =
+ pCopyFilesSection->GetFirstCopyFilesEntry();
+ for(;pCopyFilesEntry; pCopyFilesEntry = pCopyFilesEntry->Next())
+ {
+ mfn_AddToCopyFilesList(pCopyFilesEntry);
+ }
+ }
+
+ return TRUE;
+}
+
+void CInfDevice::mfn_AddToCopyFilesList (
+ const CInfCopyFilesEntry *pCopyFilesEntry
+ )
+{
+ // TODO: need to overwrite or not, depending on the addreg flags.
+ // for now, simply add to front of list.
+ m_pCopyFilesList = new CInfList (
+ (void *) pCopyFilesEntry,
+ m_pCopyFilesList
+ );
+ AddToChecksumDW(&m_dwSigCopyFiles, pCopyFilesEntry->Checksum());
+}
+
+
+
+// Create/Truncate inf file for just this device, and write header.
+BOOL CInfDevice::mfn_write_header (
+ LPCTSTR lpctszIniFile
+ )
+const
+{
+ LPCTSTR lpctszOrigFile = TEXT("");
+ LPCTSTR lpctszManuS = TEXT("");
+ LPCTSTR lpctszManuName = TEXT("");
+ LPCTSTR lpctszModelLHS = TEXT("");
+ LPCTSTR lpctszModelName = TEXT("");
+ LPCTSTR lpctszRank0 = TEXT("");
+ LPCTSTR lpctszRank1 = TEXT("");
+ LPCTSTR lpctszRank2 = TEXT("");
+ LPCTSTR lpctszProviderName = TEXT("");
+
+ BOOL fRet = FALSE;
+ const CInfSymbol * pSym=NULL;
+
+ TCHAR rgchBuf[4098];
+ HANDLE hFile=NULL;
+
+ SYSTEMTIME st;
+ UINT u = 0;
+ GetLocalTime(&st);
+
+ // Open file
+ {
+ TCHAR rgchPathName[MAX_PATH];
+ const TCHAR tchBack = (TCHAR) '\\';
+ const TCHAR tchColon = (TCHAR) ':';
+ const uLen = lstrlen(lpctszIniFile);
+
+ if (!uLen || (uLen+2) > sizeof(rgchPathName)/sizeof(TCHAR)) goto end;
+
+ rgchPathName[0] = 0;
+
+ u=0;
+ // Append %windir% if file name is not of the form
+ // "\.*" or "?:.*"
+ #if 0 // Don't do this anymore.
+ if ( (lpctszIniFile[0] != tchBack)
+ && (uLen<2 || lpctszIniFile[1]!=tchColon))
+ {
+ const UINT uMax = sizeof(rgchPathName)/sizeof(TCHAR) - uLen - 2;
+ u = GetWindowsDirectory
+ (
+ rgchPathName,
+ uMax
+ );
+
+ if (!u || u >= uMax) goto end;
+ lstrcpy(rgchPathName+u, TEXT("\\"));
+ u++;
+ }
+ #endif // 0
+
+ ASSERT((u+uLen+1)<(sizeof(rgchPathName)/sizeof(TCHAR)));
+ lstrcpy(rgchPathName+u, lpctszIniFile);
+ printf("Ini Path Name = [%s]\n", rgchPathName);
+
+
+ // Open file, nuke it if it exists.
+ hFile = CreateFile
+ (
+ rgchPathName,
+ GENERIC_WRITE,
+ 0, // deny sharing
+ NULL,
+ CREATE_ALWAYS,
+ FILE_ATTRIBUTE_NORMAL,
+ NULL
+ );
+
+ if (hFile==INVALID_HANDLE_VALUE)
+ {
+ printf("Create file fails with error %08lu\n", GetLastError());
+ hFile = NULL;
+ goto end;
+ }
+ else
+ {
+ printf("File opened\n");
+ }
+ }
+
+ // write header.
+ {
+ //;
+ //; OUT.INF
+ //;
+ //; Inf generated for a single modem.
+ //;
+ //; Created: Fri 05-24-1996 12:13:42
+ //; Checksum: 12507659
+ //; Original Inf: mdmgen.inf/[Rockwell]/%Rockwell1%
+ //; Manufacturer: "Rockwell"
+ //; Model: "14400 bps PCMCIA Data-Fax Modem"
+ //; Rank0ID: GEN_Apex1
+ //; Rank1ID: PCMCIA\RIPICAA-RC144ACL-845A
+ //; Rank2ID: PCMCIA\RIPICAA-YYY-ZZZ
+ //;
+ //; Rank0 Version M&M Flags AddReg CopyFile Ranks
+ //; SIG= 12342412 12222233 12334444 12234444 12244444 53265123 52366664
+ //;
+
+ const CInfSymbol *pSym = NULL;
+
+ // File name
+ pSym = m_pInfFile->GetFileName();
+ lpctszOrigFile = pSym->GetText();
+
+ // Manufacturer section name
+ {
+ const CInfManufacturerSection * pManuS =
+ m_pManufacturerEntry->GetManufacturerSection();
+ if (pManuS)
+ {
+ pSym = pManuS->GetSectionName();
+ lpctszManuS = pSym->GetText();
+ }
+ }
+
+ // Model entry name (LHS)
+ pSym = m_pModelEntry->GetLHS();
+ lpctszModelLHS = pSym->GetText();
+
+ // Manufacturer name
+ pSym = m_pSymManufacturerName;
+ lpctszManuName = pSym->GetText();
+
+ // Model name
+ pSym = m_pSymDeviceName;
+ lpctszModelName = pSym->GetText();
+
+ // Rank 0
+ pSym = m_pModelEntry->GetRank0ID();
+ lpctszRank0 = pSym->GetText();
+
+
+ // Rank 1
+ pSym = m_pModelEntry->GetRank1ID();
+ lpctszRank1 = pSym->GetText();
+
+ // Rank 1
+ pSym = m_pModelEntry->GetRank1ID();
+ lpctszRank1 = pSym->GetText();
+
+ u = wsprintf
+ (
+ rgchBuf,
+ TEXT
+ (
+ ";\r\n"
+ "; OUT.INF\r\n"
+ ";\r\n"
+ "; Inf generated for a single modem.\r\n"
+ ";\r\n"
+ "; Created: %02u-%02u-%04u %02u:%02u:%02u\r\n"
+ "; Checksum: %08lx\r\n"
+ ),
+ st.wMonth,
+ st.wDay,
+ st.wYear,
+ st.wHour,
+ st.wMinute,
+ st.wSecond,
+ m_dwSigAll
+ );
+ ASSERT(u < sizeof (rgchBuf)/sizeof(TCHAR));
+
+ u+= wsprintf
+ (
+ rgchBuf+u,
+ TEXT
+ (
+ "; Original Inf: %s/[%s]/%s\r\n"
+ "; Manufacturer: \"%s\"\r\n"
+ "; Model: \"%s\"\r\n"
+ "; Rank0ID: %s\r\n"
+ "; Rank1ID: %s\r\n"
+ "; Rank2ID: %s\r\n"
+ ),
+ lpctszOrigFile, // original inf file
+ lpctszManuS, // manufacturer section
+ lpctszModelLHS, // model entry name
+ lpctszManuName, // manufacturer name
+ lpctszModelName,// model name
+ lpctszRank0, // Rank0 ID
+ lpctszRank1, // Rank1 ID
+ lpctszRank2 // Rank2 ID
+ );
+ ASSERT(u < sizeof (rgchBuf)/sizeof(TCHAR));
+
+ u+= wsprintf
+ (
+ rgchBuf+u,
+ TEXT
+ (
+ ";\r\n"
+"; Rank0 Version M&M Flags AddReg CopyFile Dup Ranks\r\n"
+ "; SIG= %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\r\n"
+ ";\r\n"
+ ),
+ m_dwSigRank0,
+ m_dwSigVersion,
+ m_dwSigManuAndModel,
+ m_dwSigFlags,
+ m_dwSigAddReg,
+ m_dwSigCopyFiles,
+ m_dwSigDup, // NoResDup and PosDup
+ m_dwSigRanks
+ );
+ ASSERT(u < sizeof (rgchBuf)/sizeof(TCHAR));
+ } // end write header
+
+ // Write Version
+ {
+ // Sample:
+ //; ---------------------- VERSION ------------------------------
+ //[Version]
+ //LayoutFile=layout.inf
+ //Signature="$CHICAGO$"
+ //Class=Modem
+ //ClassGUID={4D36E96D-E325-11CE-BFC1-08002BE10318}
+ //Provider=%provider%
+
+ u+= wsprintf
+ (
+ rgchBuf+u,
+ TEXT
+ (
+ "\r\n"
+ "\r\n"
+ "; ---------------------- VERSION ------------------------------\r\n"
+ "[Version]\r\n"
+ )
+ );
+
+ // LayoutFile
+ pSym = m_pVersion->GetLayoutFile();
+ if (pSym)
+ {
+ u+= wsprintf
+ (
+ rgchBuf+u,
+ TEXT("LayoutFile=%s\r\n"),
+ pSym->GetText()
+ );
+ }
+
+ // Signature
+ pSym = m_pVersion->GetSignature();
+ if (pSym)
+ {
+ u+= wsprintf
+ (
+ rgchBuf+u,
+ TEXT("Signature=%s\r\n"),
+ pSym->GetText()
+ );
+ }
+
+ // Class
+ pSym = m_pVersion->GetClass();
+ if (pSym)
+ {
+ u+= wsprintf
+ (
+ rgchBuf+u,
+ TEXT("Class=%s\r\n"),
+ pSym->GetText()
+ );
+ }
+
+ // ClassGUID
+ pSym = m_pVersion->GetClassGUID();
+ if (pSym)
+ {
+ u+= wsprintf
+ (
+ rgchBuf+u,
+ TEXT("ClassGUID=%s\r\n"),
+ pSym->GetText()
+ );
+ }
+
+ // Provider
+ pSym = m_pVersion->GetProvider();
+ if (pSym)
+ {
+ lpctszProviderName = pSym->GetText();
+ u+= wsprintf
+ (
+ rgchBuf+u,
+ TEXT("Provider=%%provider%%\r\n")
+ );
+ }
+
+ ASSERT(u < sizeof (rgchBuf)/sizeof(TCHAR));
+
+ } // End writing version info
+
+
+ // Write Control flags section
+ // Sample:
+ // -------------------- CONTROLFLAGS ---------------------------
+ // [ControlFlags]
+ // ExcludeFromSelect=SERENUM\MNP0281
+ // ExcludeFromSelect.NT=LPTENUM\MICROCOMTRAVELPORTE_1FF4
+ {
+ DWORD dwFlagsAll;
+ DWORD dwFlagsNTAll;
+ DWORD dwFlagsNTAlpha;
+ DWORD dwFlagsNTPPC;
+ DWORD dwFlagsNTMips;
+
+ u+= wsprintf
+ (
+ rgchBuf+u,
+ TEXT(
+ "\r\n"
+ "\r\n"
+ "; -------------------- CONTROLFLAGS ---------------------------\r\n"
+ "[ControlFlags]\r\n"
+ )
+ );
+
+ dwFlagsAll = m_pModelEntry->GetControlFlags(ePLAT_ALL);
+ dwFlagsNTAll = m_pModelEntry->GetControlFlags(ePLAT_NT_ALL);
+ dwFlagsNTAlpha = m_pModelEntry->GetControlFlags(ePLAT_NT_ALPHA);
+ dwFlagsNTPPC = m_pModelEntry->GetControlFlags(ePLAT_NT_PPC);
+ dwFlagsNTMips = m_pModelEntry->GetControlFlags(ePLAT_NT_MIPS);
+
+ if(dwFlagsAll & dwCF_EXCLUDE_FROM_SELECT)
+ {
+ u+= wsprintf
+ (
+ rgchBuf+u,
+ TEXT("ExcludeFromSelect=%s\r\n"),
+ lpctszRank0
+ );
+ }
+
+ if(dwFlagsNTAll & dwCF_EXCLUDE_FROM_SELECT)
+ {
+ u+= wsprintf
+ (
+ rgchBuf+u,
+ TEXT("ExcludeFromSelect.NT=%s\r\n"),
+ lpctszRank0
+ );
+ }
+
+ if(dwFlagsNTAlpha & dwCF_EXCLUDE_FROM_SELECT)
+ {
+ u+= wsprintf
+ (
+ rgchBuf+u,
+ TEXT("ExcludeFromSelect.NT.Alpha=%s\r\n"),
+ lpctszRank0
+ );
+ }
+
+ if(dwFlagsNTPPC & dwCF_EXCLUDE_FROM_SELECT)
+ {
+ u+= wsprintf
+ (
+ rgchBuf+u,
+ TEXT("ExcludeFromSelect.NT.PPC=%s\r\n"),
+ lpctszRank0
+ );
+ }
+
+ if(dwFlagsNTMips & dwCF_EXCLUDE_FROM_SELECT)
+ {
+ u+= wsprintf
+ (
+ rgchBuf+u,
+ TEXT("ExcludeFromSelect.NT.Mips=%s\r\n"),
+ lpctszRank0
+ );
+ }
+
+ // TODO: unimplemented: Other control flags.
+
+ ASSERT(u < sizeof (rgchBuf)/sizeof(TCHAR));
+
+ } // End writing control flags section
+
+
+ // Write Manufacturer section
+ {
+ u+= wsprintf
+ (
+ rgchBuf+u,
+ TEXT
+ (
+ "\r\n"
+ "\r\n"
+ "; -------------------- MANUFACTURER ---------------------------\r\n"
+ "[Manufacturer]\r\n"
+ "%%make%%= Make\r\n"
+ )
+ );
+ ASSERT(u < sizeof (rgchBuf)/sizeof(TCHAR));
+
+ } // End writing Manufacturer section
+
+
+ // Write make section
+ {
+ u+= wsprintf
+ (
+ rgchBuf+u,
+ TEXT
+ (
+ "\r\n"
+ "\r\n"
+ "; ----------------------- MAKE --------------------------------\r\n"
+ "[Make]\r\n"
+ "%%model%%= Model, %s"
+ ),
+ lpctszRank0
+ );
+ if (*lpctszRank1 || *lpctszRank2)
+ {
+ u+= wsprintf (rgchBuf+u, ", %s", lpctszRank1);
+ }
+ if (*lpctszRank2)
+ {
+ u+= wsprintf (rgchBuf+u, ", %s", lpctszRank2);
+ }
+
+ ASSERT(u < sizeof (rgchBuf)/sizeof(TCHAR));
+
+ } // End writing make section
+
+ // Write Model section
+ {
+ u+= wsprintf
+ (
+ rgchBuf+u,
+ TEXT
+ (
+ "\r\n"
+ "\r\n"
+ "\r\n"
+ "; ----------------------- MODEL -------------------------------\r\n"
+ "[Model]\r\n"
+ "AddReg=AddReg\r\n"
+ "CopyFiles=CopyFiles\r\n"
+ )
+ );
+
+ ASSERT(u < sizeof (rgchBuf)/sizeof(TCHAR));
+
+ } // End writing Model section
+
+
+ // NoResDup section
+ {
+ // [Make.NoResDup]
+ // UNIMODEMCC646872,UNIMODEMA4970248,UNIMODEMB6071C15
+ const CInfInstallSection *pInstall = m_pModelEntry->GetInstallSection();
+ const CInfList *pSymList = pInstall->GetNoResDupIDList();
+ const CInfSymbol *pSym = NULL;
+
+ u+= wsprintf
+ (
+ rgchBuf+u,
+ TEXT
+ (
+ "\r\n"
+ "\r\n"
+ "; ---------------------- NORESDUP -----------------------------\r\n"
+ "[Model.NoResDup]\r\n"
+ )
+ );
+
+ while(pSymList)
+ {
+ if (pSym) { u+= wsprintf (rgchBuf+u, TEXT(",")); }
+ pSym = (const CInfSymbol *) pSymList->GetData();
+ u+= wsprintf (rgchBuf+u, TEXT("%s"), pSym->GetText());
+
+ pSymList = pSymList->Next();
+ }
+
+ ASSERT(u < sizeof (rgchBuf)/sizeof(TCHAR));
+
+ }
+
+
+ // PosDup section
+ {
+ // [Make.PosDup]
+ // *PNP0500
+ const CInfInstallSection *pInstall = m_pModelEntry->GetInstallSection();
+ const CInfList *pSymList = pInstall->GetPosDupIDList();
+ const CInfSymbol *pSym = NULL;
+
+ u+= wsprintf
+ (
+ rgchBuf+u,
+ TEXT
+ (
+ "\r\n"
+ "\r\n"
+ "; ---------------------- POSDUP -------------------------------\r\n"
+ "[Model.PosDup]\r\n"
+ )
+ );
+
+ while(pSymList)
+ {
+ if (pSym) { u+= wsprintf (rgchBuf+u, TEXT(",")); }
+ pSym = (const CInfSymbol *) pSymList->GetData();
+ u+= wsprintf (rgchBuf+u, TEXT("%s"), pSym->GetText());
+
+ pSymList = pSymList->Next();
+ }
+ ASSERT(u < sizeof (rgchBuf)/sizeof(TCHAR));
+ }
+
+
+ // Write CopyFiles section
+ // BUGBUG: we need the concept of muliple copy-file sections, because
+ // each section can have a different destination dir.
+ // Also: the CopyFiles.NT, etc sections.
+ {
+ u+= wsprintf
+ (
+ rgchBuf+u,
+ TEXT
+ (
+ "\r\n"
+ "\r\n"
+ "; --------------------- COPYFILES -----------------------------\r\n"
+ "[CopyFiles]\r\n"
+ )
+ );
+
+ // Now write each copyfile entry
+ {
+ const CInfList *pList = m_pCopyFilesList;
+
+ for (;pList; pList=pList->Next())
+ {
+ // TODO: unimplemented
+ }
+
+ }
+ ASSERT(u < sizeof (rgchBuf)/sizeof(TCHAR));
+
+
+ } // End writing CopyFiles section
+
+
+ // Write DestinationDirs section
+ {
+ u+= wsprintf
+ (
+ rgchBuf+u,
+ TEXT
+ (
+ "\r\n"
+ "\r\n"
+ "; ------------------- DESTINATIONDIRS -------------------------\r\n"
+ "[DestinationDirs]\r\n"
+ )
+ );
+
+ // Now write each copyfile entry
+ // TODO: Need to construct destination-dirs entries
+
+ ASSERT(u < sizeof (rgchBuf)/sizeof(TCHAR));
+
+
+ } // End writing DestinationDirs section
+
+
+ // TODO: UpdateInis, Uninstall
+
+
+ // Write Addreg section
+ {
+ u+= wsprintf
+ (
+ rgchBuf+u,
+ TEXT
+ (
+ "\r\n"
+ "\r\n"
+ "; ---------------------- ADDREG -------------------------------\r\n"
+ "[AddReg]\r\n"
+ )
+ );
+
+ ASSERT(u < sizeof (rgchBuf)/sizeof(TCHAR));
+
+
+ // Now write each addreg entry
+ {
+ const CInfList *pList = m_pAddRegList;
+
+ for (;pList; pList=pList->Next())
+ {
+ LPCTSTR lpctszRegRoot = TEXT("");
+ LPCTSTR lpctszSubKey = TEXT("");
+ LPCTSTR lpctszValueName = TEXT("");
+ TCHAR rgchFlag[20] = TEXT("");
+ LPCTSTR lpctszValue = TEXT("");
+ DWORD dwFlag = MAXDWORD;
+ const CInfSymbol *pSym = NULL;
+ const CInfAddRegEntry * pARE =
+ (const CInfAddRegEntry *) pList->GetData();
+ ASSERT(pARE);
+
+ pSym = pARE->GetRegRoot();
+ lpctszRegRoot = pSym->GetText();
+
+ pSym = pARE->GetSubKey();
+ lpctszSubKey = pSym->GetText();
+
+ pSym = pARE->GetValueName();
+ lpctszValueName = pSym->GetText();
+
+ dwFlag = pARE->GetFlag();
+ if (dwFlag!=MAXDWORD)
+ {
+ wsprintf(rgchFlag, TEXT("%lu"), dwFlag);
+ }
+
+ pSym = pARE->GetValue();
+ lpctszValue = pSym->GetText();
+
+//HKR, Settings, Prefix,, "AT"
+//HKR, Responses, "AUTOSTREAM: LEVEL 3", 1, 01, 00, 00,00,00,00, 00,00,00,00
+ u+= wsprintf
+ (
+ rgchBuf+u,
+ TEXT
+ (
+ "%s, %s, %s, %s, %s\r\n"
+ ),
+ lpctszRegRoot,
+ lpctszSubKey,
+ lpctszValueName,
+ rgchFlag,
+ lpctszValue
+ );
+ }
+
+ }
+ } // End writing addreg section
+
+
+ // Write Strings section
+ {
+
+ u+= wsprintf
+ (
+ rgchBuf+u,
+ TEXT
+ (
+ "\r\n"
+ "\r\n"
+ "; ---------------------- STRINGS ------------------------------\r\n"
+ "[Strings]\r\n"
+ "provider=\"%s\"\r\n"
+ "make=\"%s\"\r\n"
+ "model=\"%s\"\r\n"
+ ),
+ lpctszProviderName,
+ lpctszManuName,
+ lpctszModelName
+ );
+
+ ASSERT(u < sizeof (rgchBuf)/sizeof(TCHAR));
+
+ } // End Strings flags section
+
+ DWORD dwWr;
+ if (!WriteFile(hFile, (LPBYTE) rgchBuf, u*sizeof(TCHAR), &dwWr, NULL))
+ {
+ printf("Write file fails with error %08lu\n", GetLastError());
+ goto end;
+ }
+ else
+ {
+ printf("Write file succeeded\n");
+ }
+
+ fRet = TRUE;
+
+end:
+ if (hFile) CloseHandle(hFile);
+
+ return fRet;
+}
diff --git a/private/unimodem/new/mic/dev.h b/private/unimodem/new/mic/dev.h
new file mode 100644
index 000000000..695571f35
--- /dev/null
+++ b/private/unimodem/new/mic/dev.h
@@ -0,0 +1,136 @@
+//
+// Copyright (c) 1996 Microsoft Corporation
+//
+//
+// DEV.H -- Header for Classes:
+// CInfDevice
+//
+//
+// History:
+// 05/22/96 JosephJ Created
+//
+//
+
+
+class CInfDevice;
+
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CInfDevice
+///////////////////////////////////////////////////////////////////////////
+//
+// Represents a single device, as specified by an inf (device information)
+// file.
+//
+
+class CInfDevice
+{
+
+public:
+
+ CInfDevice(const CInfDevice *pNext)
+ : m_pNext(pNext),
+ m_sync(),
+
+ m_pvInfSession(NULL),
+ m_pInfFile(NULL),
+ m_pManufacturerEntry(NULL),
+ m_pModelEntry(NULL),
+ m_pVersion(NULL),
+ m_pSymManufacturerName(NULL),
+ m_pSymDeviceName(NULL),
+ m_pAddRegList(NULL),
+ m_pCopyFilesList(NULL),
+
+ m_dwSigVersion(101),
+ m_dwSigManuAndModel(102),
+ m_dwSigFlags(103),
+ m_dwSigAddReg(104),
+ m_dwSigCopyFiles(105),
+ m_dwSigDup(106),
+ m_dwSigRank0(107),
+ m_dwSigRanks(108),
+ m_dwSigAll(109)
+ {}
+
+ ~CInfDevice() {}
+
+ // --------------- Dump ---------------
+ // Dump state
+ void Dump(void) const;
+
+ // --------------- Load ---------------
+ // Load (init) the device specifed by the inf file and model entry.
+ BOOL Load (
+ const CInfFile *pInf,
+ const CInfManufacturerEntry *pManuE,
+ const CInfModelEntry *pModelE
+ );
+
+ //-------------- Unload ------------------
+ // Unloads a previously loaded file. If there are open sessions to this
+ // object, Unload returns a handle which will be signalled when all
+ // sessions are closed. New sessions will not be allowed after this
+ // function returns. The call should free the handle.
+ HANDLE Unload (void);
+
+ //-------------- WriteInf ------------------
+ // Creates an inf file with all the information of this device.
+ BOOL WriteInf(LPCTSTR lpctszIniFile) const;
+
+ //-------------- GetRank0Checksum ----------
+ // Returns signature of the rank0 ID
+ DWORD Rank0Checksum(void) const {return m_dwSigRank0;}
+
+ //-------------- Checksum --------------
+ // Returns combined checksum for this device.
+ DWORD Checksum(void) const {return m_dwSigAll;}
+
+ #if (TODO)
+ UpdateInisSection
+ UninstallSection
+ NoResDupIDList
+ PosDupIDList
+ #endif // (TODO)
+
+
+private:
+
+ const CInfDevice * m_pNext;
+ CSync m_sync;
+
+ const void * m_pvInfSession;
+
+ const CInfFile * m_pInfFile;
+ const CInfManufacturerEntry *m_pManufacturerEntry;
+ const CInfModelEntry * m_pModelEntry;
+
+ const CInfVersionSection * m_pVersion;
+ const CInfSymbol * m_pSymManufacturerName;
+ const CInfSymbol * m_pSymDeviceName;
+
+ const CInfList * m_pAddRegList;
+ const CInfList * m_pCopyFilesList;
+
+ BOOL mfn_CreateAddRegList (const CInfModelEntry *);
+ BOOL mfn_CreateCopyFilesList (const CInfModelEntry *);
+ void mfn_AddToAddRegList (const CInfAddRegEntry *);
+ void mfn_AddToCopyFilesList (const CInfCopyFilesEntry *);
+ void mfn_Cleanup (void);
+ BOOL mfn_write_header (LPCTSTR lpctszIniFile) const;
+
+ void mfn_EnterCrit(void) const {m_sync.EnterCrit();}
+ void mfn_LeaveCrit(void) const {m_sync.LeaveCrit();}
+
+ DWORD m_dwSigVersion; // Checksum of version section
+ DWORD m_dwSigManuAndModel;// Checksum of manufacturer name & model name
+ DWORD m_dwSigFlags; // Group-checksum of control flags.
+ DWORD m_dwSigAddReg; // Group-checksum of add reg section
+ DWORD m_dwSigCopyFiles; // Group-checksum of copyfile section
+ DWORD m_dwSigDup; // Group-checksum of NoResDup and PosDup.
+ DWORD m_dwSigRank0; // Group-checksum of all ranks.
+ DWORD m_dwSigRanks; // Group-checksum of all ranks.
+ DWORD m_dwSigAll; // Checksum of all the info of this device
+ // including version, manufacturer-name &
+ // model-name
+};
diff --git a/private/unimodem/new/mic/globals.cpp b/private/unimodem/new/mic/globals.cpp
new file mode 100644
index 000000000..b25209b6d
--- /dev/null
+++ b/private/unimodem/new/mic/globals.cpp
@@ -0,0 +1,53 @@
+//
+// Copyright (c) 1996 Microsoft Corporation
+//
+//
+// GLOBALS.CPP -- Defines global data:
+// CInfSymbolTable gSymtab;
+//
+// History:
+// 05/27/96 JosephJ Created
+//
+//
+#include "common.h"
+
+//----------------------- gSymtab -------------------------------
+// Global symbol table.
+CInfSymbolTable gSymtab;
+
+
+
+// --------------------- Global Property Symbols ----------------
+const CInfSymbol *g_pSymPropCopyFilesSection;
+const CInfSymbol *g_pSymPropManufacturerSection;
+const CInfSymbol *g_pSymPropAddRegSection;
+
+LPCTSTR lpctszPropCopyFilesSection = TEXT("InfCFS");
+LPCTSTR lpctszPropManufacturerSection = TEXT("InfMS");
+LPCTSTR lpctszPropAddRegSection = TEXT("InfARS");
+
+BOOL InitializePropertySymbols(void);
+
+
+BOOL InitGlobals(void)
+{
+ return InitializePropertySymbols();
+}
+
+
+BOOL InitializePropertySymbols(void)
+{
+ g_pSymPropCopyFilesSection = gSymtab.Lookup(
+ lpctszPropCopyFilesSection,
+ TRUE
+ );
+ g_pSymPropManufacturerSection = gSymtab.Lookup(
+ lpctszPropManufacturerSection,
+ TRUE
+ );
+ g_pSymPropAddRegSection = gSymtab.Lookup(lpctszPropAddRegSection, TRUE);
+
+ return g_pSymPropCopyFilesSection
+ && g_pSymPropManufacturerSection
+ && g_pSymPropAddRegSection;
+}
diff --git a/private/unimodem/new/mic/globals.h b/private/unimodem/new/mic/globals.h
new file mode 100644
index 000000000..b1bf94e22
--- /dev/null
+++ b/private/unimodem/new/mic/globals.h
@@ -0,0 +1,28 @@
+//
+// Copyright (c) 1996 Microsoft Corporation
+//
+//
+// GLOBALS.H -- Declares global data:
+// CInfSymbolTable gSymtab;
+//
+// History:
+// 05/27/96 JosephJ Created
+//
+//
+
+//----------------------- gSymtab -------------------------------
+// Global symbol table.
+// This symbol table maintains a global pool of strings -- only one copy of
+// each unique string is maintained.
+extern CInfSymbolTable gSymtab;
+
+// --------------------- Global Property Symbols ----------------
+extern const CInfSymbol *g_pSymPropCopyFilesSection;
+extern const CInfSymbol *g_pSymPropManufacturerSection;
+extern const CInfSymbol *g_pSymPropAddRegSection;
+#define PROP_INFSECTION_MANUFACTURER g_pSymPropManufacturerSection
+#define PROP_INFSECTION_COPYFILES g_pSymPropCopyFilesSection
+#define PROP_INFSECTION_ADDREG g_pSymPropAddRegSection
+
+
+BOOL InitGlobals(void);
diff --git a/private/unimodem/new/mic/ilist.cpp b/private/unimodem/new/mic/ilist.cpp
new file mode 100644
index 000000000..64350a621
--- /dev/null
+++ b/private/unimodem/new/mic/ilist.cpp
@@ -0,0 +1,58 @@
+//
+// Copyright (c) 1996 Microsoft Corporation
+//
+//
+// ILIST.CPP -- Implementation for Classes:
+// CInfList
+//
+//
+// History:
+// 05/27/96 JosephJ Created
+//
+//
+#include "common.h"
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CInfList
+///////////////////////////////////////////////////////////////////////////
+
+// Simple singly-linked list which can not be modified once it's been
+// created. Assumes creation and eventual deletion are protected by some
+// external critical section.
+//
+// Sample:
+// for (; pList; pList = pList->Next())
+// {
+// const CInfAddregSection *pAS = (CInfAddregSection *) pList->GetData();
+// }
+
+//-------------- FreeList ------------------
+// Distroys the list.
+void
+CInfList::FreeList (CInfList *pList)
+{
+ while(pList)
+ {
+ // Cast to get rid of the const declaration of pList->Next().
+ CInfList *pNext = (CInfList *) pList->Next();
+ delete pList;
+ pList = pNext;
+ }
+}
+
+//-------------- ReverseList ------------------
+// Reverses the specified list.
+void
+CInfList::ReverseList (const CInfList **ppList)
+{
+ CInfList *pList = (CInfList *) *ppList; // override const
+ const CInfList *pPrev = NULL;
+ while(pList)
+ {
+ const CInfList *pTmp = pList->Next();
+ pList->mfn_SetNext(pPrev);
+ pPrev = pList;
+ pList = (CInfList *) pTmp; // override const
+ }
+ *ppList = pPrev;
+}
diff --git a/private/unimodem/new/mic/ilist.h b/private/unimodem/new/mic/ilist.h
new file mode 100644
index 000000000..ee91756f5
--- /dev/null
+++ b/private/unimodem/new/mic/ilist.h
@@ -0,0 +1,66 @@
+//
+// Copyright (c) 1996 Microsoft Corporation
+//
+//
+// ILIST.H -- Header for Classes:
+// CInfList
+//
+//
+// History:
+// 05/22/96 JosephJ Created
+//
+//
+
+
+class CInfList;
+
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CInfList
+///////////////////////////////////////////////////////////////////////////
+
+// Simple singly-linked list which can not be modified once it's been
+// created. Assumes creation and eventual deletion are protected by some
+// external critical section.
+//
+// Sample:
+// for (; pList; pList = pList->Next())
+// {
+// const CInfAddregSection *pAS = (CInfAddregSection *) pList->GetData();
+// }
+
+class CInfList
+{
+
+public:
+
+ CInfList(void *pvData, const CInfList *pNext)
+ : m_pvData(pvData), m_pNext(pNext) {}
+ ~CInfList() {}
+
+ //-------------- GetData ------------------
+ const void * GetData (void) const {return m_pvData;}
+
+ //-------------- Next ------------------
+ const CInfList * Next (void) const {return m_pNext;}
+
+ //-------------- FreeList ------------------
+ // Distroys the specified list.
+ static void FreeList(CInfList *);
+
+ //-------------- ReverseList ------------------
+ // Reverses the specified list.
+ static void ReverseList(const CInfList **);
+
+private:
+
+ void mfn_SetNext(const CInfList * pNewNext)
+ {
+ m_pNext = pNewNext;
+ }
+
+ void * m_pvData;
+ const CInfList * m_pNext;
+
+};
+
diff --git a/private/unimodem/new/mic/inf.cpp b/private/unimodem/new/mic/inf.cpp
new file mode 100644
index 000000000..471530a1d
--- /dev/null
+++ b/private/unimodem/new/mic/inf.cpp
@@ -0,0 +1,903 @@
+//
+// Copyright (c) 1996 Microsoft Corporation
+//
+//
+// INF.CPP -- Implemtation for Classes:
+// CInfFile
+//
+// History:
+// 05/21/96 JosephJ Created
+//
+//
+#include "common.h"
+#include "ini.h"
+#include "inf.h"
+
+// Version-related constants
+LPCTSTR lpctszVersion = TEXT("Version");
+LPCTSTR lpctszLayoutFile = TEXT("LayoutFile");
+LPCTSTR lpctszSignature = TEXT("Signature");
+LPCTSTR lpctszClass = TEXT("Class");
+LPCTSTR lpctszClassGUID = TEXT("ClassGUID");
+LPCTSTR lpctszProvider = TEXT("Provider");
+
+
+LPCTSTR lpctszManufacturer = TEXT("Manufacturer");
+LPCTSTR lpctszControlFlags = TEXT("ControlFlags");
+LPCTSTR lpctszStrings = TEXT("Strings");
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CInfFile
+///////////////////////////////////////////////////////////////////////////
+
+
+CInfFile::CInfFile(void)
+{
+ m_pVersion=NULL;
+ m_pFirstManuE=NULL;
+ m_pSymFileName=NULL;
+ m_pIniFile=NULL;
+}
+
+
+CInfFile::~CInfFile()
+{
+ mfn_EnterCrit();
+
+ // Free resources -- there should be none to free...
+ ASSERT(!m_pVersion);
+ ASSERT(!m_pFirstManuE);
+ ASSERT(!m_pIniFile);
+
+}
+
+
+//-------------- Load ------------------
+// Loads the specified file. (Obviously) only one file can be loaded at
+// a time.
+BOOL CInfFile::Load (const TCHAR rgchPathname[])
+{
+ BOOL fRet = FALSE;
+
+ mfn_EnterCrit();
+
+ // TODO: call m_sync.BeginLoad
+
+ ASSERT(!m_pVersion);
+ ASSERT(!m_pFirstManuE);
+ ASSERT(!m_pIniFile);
+
+ // Save file name
+ m_pSymFileName = gSymtab.Lookup(rgchPathname, TRUE);
+ if (!m_pSymFileName) goto end;
+
+ // Create and Load Ini File
+ m_pIniFile = new CIniFile;
+ if (m_pIniFile)
+ {
+ if (!m_pIniFile->Load(rgchPathname))
+ {
+ delete m_pIniFile;
+ m_pIniFile=NULL;
+ }
+ }
+ if (!m_pIniFile) goto end;
+
+ // Create and Load version
+ {
+ CInfVersionSection *pVS = new CInfVersionSection;
+ if (pVS)
+ {
+ // Override const * declaration of m_pVersion
+ if (!pVS->Load(m_pIniFile))
+ {
+ delete pVS;
+ pVS=NULL;
+ }
+ }
+ m_pVersion = pVS;
+ }
+ if (!m_pVersion) goto end;
+
+ // Create and load Manufacturer list...
+ m_pFirstManuE = sfn_CreateManufacturerList(m_pIniFile);
+ if (!m_pFirstManuE) goto end;
+
+ fRet = TRUE;
+
+end:
+
+ if (!fRet)
+ {
+ mfn_Cleanup();
+ }
+
+ mfn_LeaveCrit();
+
+ return fRet;
+}
+
+
+//-------------- Unload ------------------
+// Unloads a previously loaded file. If there are open sessions to this
+// object, Unload returns a handle which will be signalled when all
+// sessions are closed. New sessions will not be allowed after this
+// function returns. The call should free the handle.
+HANDLE CInfFile::Unload (void)
+{
+ HANDLE hUnload = NULL;
+
+ mfn_EnterCrit();
+
+ // TODO: call m_sync.BeginUnload to try to put us in unloadable state.
+
+ mfn_Cleanup();
+
+ mfn_LeaveCrit();
+
+
+ return hUnload;
+}
+
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CInfVersionSection
+///////////////////////////////////////////////////////////////////////////
+
+// Sample Version section:
+// [Version]
+// LayoutFile=layout.inf
+// Signature="$CHICAGO$"
+// Class=Modem
+// ClassGUID={4D36E96D-E325-11CE-BFC1-08002BE10318}
+// Provider=%MS%
+
+
+//-------------- Load ------------------
+// TODO: unimplemented
+BOOL CInfVersionSection::Load (const CIniFile *pIniFile)
+{
+ BOOL fRet = FALSE;
+ const CIniFileSection *pISVer = pIniFile->LookupSection(lpctszVersion);
+ const CIniFileSection *pISStr = pIniFile->LookupSection(lpctszStrings);
+ const CIniFileEntry *pIE = NULL;
+
+#if 0
+ m_pSymLayoutFile = gSymtab.Lookup(TEXT("layout.inf"), TRUE);
+ m_pSymSignature = gSymtab.Lookup(TEXT("\"$CHICAGO$\""), TRUE);
+ m_pSymClass = gSymtab.Lookup(TEXT("Modem"), TRUE);
+ m_pSymClassGUID = gSymtab.Lookup
+ (
+ TEXT("{4D36E96D-E325-11CE-BFC1-08002BE10318}"),
+ TRUE
+ );
+ m_pSymProvider = gSymtab.Lookup(TEXT("Microsoft"), TRUE);
+
+ m_dwChecksum = 0x12345678L;
+#endif
+
+ ASSERT
+ (
+ !m_pSymLayoutFile
+ && !m_pSymSignature
+ && !m_pSymClass
+ && !m_pSymClassGUID
+ && !m_pSymProvider
+ && !m_dwChecksum
+ );
+
+ if (!pISVer || !pISStr) goto end;
+
+ // LayoutFile=layout.inf
+ pIE = pISVer->LookupEntry(lpctszLayoutFile);
+ if (pIE)
+ {
+ m_pSymLayoutFile = pIE->GetRHS();
+ pIE->Release();pIE=NULL;
+ // TODO: further checks here
+ }
+
+ // Signature="$CHICAGO$"
+ pIE = pISVer->LookupEntry(lpctszSignature);
+ if (pIE)
+ {
+ m_pSymSignature = pIE->GetRHS();
+ pIE->Release();pIE=NULL;
+ // TODO: further checks here
+ }
+
+ // Class=Modem
+ pIE = pISVer->LookupEntry(lpctszClass);
+ if (pIE)
+ {
+ m_pSymClass = pIE->GetRHS();
+ pIE->Release();pIE=NULL;
+ // TODO: further checks here
+ }
+
+ // ClassGUID={4D36E96D-E325-11CE-BFC1-08002BE10318}
+ pIE = pISVer->LookupEntry(lpctszClassGUID);
+ if (pIE)
+ {
+ m_pSymClassGUID = pIE->GetRHS();
+ pIE->Release();pIE=NULL;
+ // TODO: further checks here
+ }
+
+ // Provider=%MS%
+ pIE = pISVer->LookupEntry(lpctszProvider);
+ if (pIE)
+ {
+ const CInfSymbol *pSymLHS = pIE->GetLHS();
+ pIE->Release();pIE=NULL;
+
+ if (pSymLHS)
+ {
+ pIE = pISStr->LookupEntry(pSymLHS->GetText());
+ if (pIE)
+ {
+ m_pSymProvider = pIE->GetRHS();
+ pIE->Release();pIE=NULL;
+ }
+ }
+ // TODO: further checks here
+ }
+
+ // Compute checksum of entire version structure
+ m_dwChecksum = m_pSymLayoutFile->Checksum();
+ AddToChecksumDW(&m_dwChecksum, m_pSymSignature->Checksum());
+ AddToChecksumDW(&m_dwChecksum, m_pSymClass->Checksum());
+ AddToChecksumDW(&m_dwChecksum, m_pSymClassGUID->Checksum());
+ AddToChecksumDW(&m_dwChecksum, m_pSymProvider->Checksum());
+
+ fRet =TRUE;
+
+end:
+
+ if (pIE) { pIE->Release(); pIE=NULL; }
+ if (pISVer) { pISVer->Release(); pISVer=NULL; }
+ if (pISStr) { pISStr->Release(); pISStr=NULL; }
+
+ if (!fRet)
+ {
+ mfn_Cleanup();
+ }
+
+ return fRet;
+}
+
+
+//-------------- Unload ------------------
+void CInfVersionSection::Unload (void)
+{
+ // TODO: call m_sync.BeginUnload to try to put us in unloadable state.
+
+ mfn_Cleanup();
+
+ return;
+}
+
+
+
+//-------------- Dump ------------------
+// Dump state
+void
+CInfVersionSection::Dump(void)
+const
+{
+}
+
+// Cleanup by freeing any allocated resources.
+void CInfVersionSection::mfn_Cleanup (void)
+{
+ m_pSymLayoutFile = NULL;
+ m_pSymSignature = NULL;
+ m_pSymClass = NULL;;
+ m_pSymClassGUID = NULL;
+ m_pSymProvider = NULL;
+ m_dwChecksum = 0;
+}
+
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CInfManufacturerEntry
+///////////////////////////////////////////////////////////////////////////
+
+// Sample Manufacturer list section:
+// [Manufacturer]
+// %Generic% = Generic
+// %MagicRam% = MagicRam
+// ..
+
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CInfManufacturerSection
+///////////////////////////////////////////////////////////////////////////
+
+// Sample Manufacturer section:
+// [Generic]
+// %Gen% = Gen, MDMGEN
+// %Gen3% = Gen3, MDMGEN3
+// %Gen12% = Gen12, MDMGEN12
+// %Gen24% = Gen24, MDMGEN24
+// ...
+
+
+// --------------- GetFirstModelEntry --------------
+// Get first model entry
+const CInfModelEntry *
+CInfManufacturerSection::GetFirstModelEntry (void)
+const
+{
+ return m_pFirstModelE;
+}
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CInfInstallSection
+///////////////////////////////////////////////////////////////////////////
+
+// Sample Install section:
+// [Modem29]
+// AddReg=All, MfgAddReg, ROCK_VOICE_ALL, ROCK_VOICE_SERWAVE, INTERNAL
+// CopyFiles = VV_Sys, VV_Sock_Sys, VV_App, VV_Help
+// UpdateInis = VView.Inis
+// Uninstall = VoiceView_remove
+//
+// Also contains info from the related PosDup and NoResDup sections.
+
+
+// --------------- GetAddRegSectionList ----------
+// Get generic list whose data items are pointers to
+// CInfAddRegSection objects
+const CInfList *
+CInfInstallSection::GetAddRegSectionList (void)
+const
+{
+ // TODO: unimplemented
+
+ static const CInfAddRegSection AddRegSection;
+ static const CInfList AddRegSectionList((void *) &AddRegSection, NULL);
+
+ return &AddRegSectionList;
+}
+
+
+// --------------- GetCopyFilesSectionList ----------
+// Get generic list whose data items are pointers to
+// CInfCopyFilesSection objects
+const CInfList *
+CInfInstallSection::GetCopyFilesSectionList (void)
+const
+{
+ // TODO: unimplemented
+
+ static const CInfCopyFilesSection CopyFilesSection;
+ static const CInfList CopyFilesSectionList((void *) &CopyFilesSection, NULL);
+
+ return &CopyFilesSectionList;
+}
+
+
+// --------------- GetNoResDupIDList ----------
+// Get generic list whose data items are pointers to
+// InfSymbol objects representing the Rank0 IDs in the corresponding
+// NoResDup section.
+const CInfList *
+CInfInstallSection::GetNoResDupIDList (void)
+const
+{
+ // TODO: unimplemented
+
+ static const CInfList NoResDupIDList
+ (
+ (void *) gSymtab.Lookup(TEXT("NORESDUP-ID"), TRUE),
+ NULL
+ );
+
+ return &NoResDupIDList;
+}
+
+
+// --------------- GetPosDupIDList ----------
+// Get generic list whose data items are pointers to
+// InfSymbol objects representing the Rank0 IDs in the corresponding
+// PosDup section.
+// const CInfList * GetPosDupIDList (void) const;
+const CInfList *
+CInfInstallSection::GetPosDupIDList (void)
+const
+{
+ // TODO: unimplemented
+ static const CInfList PosDupIDList1
+ (
+ (void *) gSymtab.Lookup(TEXT("POSDUP-ID1"), TRUE),
+ NULL
+ );
+ static const CInfList PosDupIDList
+ (
+ (void *) gSymtab.Lookup(TEXT("POSDUP-ID0"), TRUE),
+ &PosDupIDList1
+ );
+
+ return &PosDupIDList;
+}
+
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CInfAddRegSection
+///////////////////////////////////////////////////////////////////////////
+
+// Sample AddReg section:
+// [All]
+// HKR,,FriendlyDriver,,Unimodem.vxd
+// HKR,,DevLoader,,*vcomm
+// HKR,,ConfigDialog,,modemui.dll
+// HKR,,EnumPropPages,,"modemui.dll,EnumPropPages"
+// HKR,,PortSubClass,1,02
+// HKR, Init, 1,, "AT<cr>"
+// HKR, Responses, "<cr><lf>OK<cr><lf>", 1, 00, 00, 00,00,00,00, ...etc.
+// HKR, Responses, "<cr><lf>ERROR<cr><lf>", 1, 03, 00, 00,00,00, ...etc.
+
+
+// Get first addreg entry
+const CInfAddRegEntry *
+CInfAddRegSection::GetFirstAddRegEntry (void)
+const
+{
+ // TODO -- fake static entries
+ static const CInfAddRegEntry FirstAddRegEntry;
+ return &FirstAddRegEntry;
+}
+
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CInfCopyFilesSection
+///////////////////////////////////////////////////////////////////////////
+
+// Sample DestinationDirs section:
+// [DestinationDirs]
+// Register.Copy = 17 ;LDID_INF
+// VV_Sys = 11
+// VV_Sock_Sys = 11 ;LDID_SYS \Windows\system dir
+// VV_Sock_Win = 10 ;LDID_WIN \Windows dir
+// VV_App = 10
+// VV_Help = 18 ;LDID_HELP
+
+// Sample Copyfiles section:
+// [VV_Sys]
+// fte.dll
+// vvexe32.exe
+// wsvv.vxd
+
+
+// --------------- GetFirstCopyFilesEntry ----------
+// Get first copyfiles entry
+const CInfCopyFilesEntry *
+CInfCopyFilesSection::GetFirstCopyFilesEntry (void) const
+{
+ // TODO -- fake static entries
+ static const CInfCopyFilesEntry FirstCopyFilesEntry;
+ return &FirstCopyFilesEntry;
+}
+
+
+// Cleanup by freeing any allocated resources.
+// TODO: unimplemented
+void CInfFile::mfn_Cleanup (void)
+{
+ mfn_EnterCrit();
+
+ // TODO: ASSERT(state == loading or state == unloading)
+
+ // Unload and free version
+ if (m_pVersion)
+ {
+ // override const *
+ CInfVersionSection *pVS = (CInfVersionSection *) m_pVersion;
+ pVS->Unload();
+ delete pVS;
+ m_pVersion=NULL;
+ }
+
+
+ // Unload and free Manufacturerlist.
+ if (m_pFirstManuE)
+ {
+ sfn_DeleteManufacturerList(m_pFirstManuE);
+ m_pFirstManuE=NULL;
+ }
+
+ if (m_pIniFile)
+ {
+ m_pIniFile->Unload();
+ delete (CIniFile *) m_pIniFile; // override const *
+ m_pIniFile=NULL;
+ }
+
+ m_pSymFileName=NULL;
+
+ mfn_LeaveCrit();
+}
+
+// static helper function...
+const CInfManufacturerEntry *
+CInfFile::sfn_CreateManufacturerList (CIniFile *pIniFile)
+{
+ CInfManufacturerEntry * pManuE = NULL;
+ const CIniFileSection *pISStr = pIniFile->LookupSection(lpctszStrings);
+ const CIniFileSection *pISManL =
+ pIniFile->LookupSection(lpctszManufacturer);
+ CIniFileEntry *pIE = NULL;
+
+ if (!pISManL || !pISStr) goto end;
+
+ pIE = pISManL->GetFirstEntry();
+ if (!pIE) goto end;
+
+ // Iterate through manufacturers, building manufacturer entries...
+ do
+ {
+ pManuE = new CInfManufacturerEntry(pManuE);
+ if (!pManuE || !pManuE->Load(pIniFile, pISStr, pIE))
+ {
+ // TODO: warning; for now break out.
+ if (pManuE)
+ {
+ // TODO delete previously-created elements of the list as well!
+ // (Or leave them there and deal with a partial list).
+ delete pManuE;
+ pManuE = NULL;
+ }
+ goto end;
+ }
+
+ } while(pIE->BecomeNext());
+
+ // Reverse list
+ CInfManufacturerEntry::ReverseList(&pManuE);
+
+end:
+ if (pIE) {pIE->Release(); pIE=NULL;}
+ if (pISManL) { pISManL->Release(); pISManL=NULL; }
+ if (pISStr) { pISStr->Release(); pISStr=NULL; }
+
+ return pManuE;
+}
+
+// Static helper function
+void
+CInfFile::sfn_DeleteManufacturerList
+(
+ const CInfManufacturerEntry * pManuEFirst
+)
+{
+ // TODO
+}
+
+// --------------- Load ------------------
+BOOL
+CInfManufacturerEntry::Load
+(
+ const CIniFile *pIniFile,
+ const CIniFileSection *pISStr,
+ const CIniFileEntry *pIE
+)
+{
+ BOOL fRet = FALSE;
+ const CInfSymbol *pSymLHS = pIE->GetLHS();
+ const CInfSymbol *pSymManuName = NULL;
+ // TODO need to make manu-section case insensitive!
+ // Basically pSymManuSection should be created based on an upper-case'd
+ // version of pIE->GetRHS().
+ const CInfSymbol *pSymManuSection = pIE->GetRHS();
+ CInfManufacturerSection *pManuS = NULL;
+ BOOL fNew=FALSE;
+
+ ASSERT(!m_pManuS);
+ ASSERT(!m_pSymManuName);
+
+ // Get manufacturer name ...
+ if (pSymLHS)
+ {
+ const CIniFileEntry *pIEStr = pISStr->LookupEntry(pSymLHS->GetText());
+ if (pIEStr)
+ {
+ pSymManuName = pIE->GetRHS();
+ pIEStr->Release();pIEStr=NULL;
+ }
+ }
+
+ pManuS=NULL;
+
+ // Look up/create manufacturer section
+ {
+ void **ppv=NULL;
+ BOOL fExists=FALSE;
+ BOOL fRet = pSymManuSection->GetOrCreatePropLoc(
+ PROP_INFSECTION_MANUFACTURER,
+ &ppv,
+ &fExists);
+ if (fRet)
+ {
+ if (fExists)
+ {
+ // This section already exists...
+ pManuS = (CInfManufacturerSection *) *ppv;
+ ASSERT(pManuS->Validate());
+ }
+ else
+ {
+ // This section doesn't exist -- create it.
+ pManuS = new CInfManufacturerSection();
+ if (pManuS)
+ {
+ if (pManuS->Load(pIniFile, pISStr, pSymManuSection))
+ {
+ // set the property data
+ *ppv = (void *) pManuS;
+ }
+ else
+ {
+ delete pManuS;
+ pManuS=NULL;
+ pSymManuSection->DelProp(PROP_INFSECTION_MANUFACTURER);
+ }
+ }
+ }
+ }
+ }
+
+ if (pManuS)
+ {
+ m_pManuS = pManuS;
+ m_pSymManuName = pSymManuName;
+ fRet = TRUE;
+ }
+
+ if (!fRet)
+ {
+ mfn_Cleanup();
+ }
+
+ return fRet;
+
+}
+
+// --------------- Unload ------------------
+void CInfManufacturerEntry::Unload(void)
+// TODO
+{
+ m_pManuS = NULL;
+ m_pSymManuName = NULL;
+ // TODO: decrement ref count for the section and delete it and delprop
+ // it when done.
+ mfn_Cleanup();
+
+}
+
+
+// --------------- Cleanup ------------------
+// Cleanup by freeing any allocated resources.
+void CInfManufacturerEntry::mfn_Cleanup (void)
+{
+ m_pManuS = NULL;
+ m_pSymManuName = NULL;
+}
+
+
+// --------------- Load ------------------
+BOOL
+CInfManufacturerSection::Load
+(
+ const CIniFile *pIniFile,
+ const CIniFileSection *pISStr,
+ const CInfSymbol *pSymManuSection
+)
+{
+ BOOL fRet = FALSE;
+ const CIniFileSection *pIS =
+ pIniFile->LookupSection(pSymManuSection->GetText());
+
+ ASSERT(!m_pSymSectionName);
+ ASSERT(!m_pFirstModelE);
+ ASSERT(m_eObjSig==eOBJSIG_CInfManufacturerSection);
+
+ if (!pIS)
+ {
+ goto end;
+ }
+
+ m_pSymSectionName = pSymManuSection;
+
+ // Create and load model list
+ m_pFirstModelE = sfn_CreateModelList(pIniFile, pISStr, pIS);
+
+ if (!m_pFirstModelE)
+ {
+ goto end;
+ }
+
+ fRet = TRUE;
+
+end:
+
+ if (!fRet)
+ {
+ mfn_Cleanup();
+ }
+
+ return fRet;
+}
+
+// --------------- Unload ------------------
+void CInfManufacturerSection::Unload(void)
+{
+ mfn_Cleanup();
+}
+
+
+// --------------- Cleanup ------------------
+// Cleanup by freeing any allocated resources.
+void CInfManufacturerSection::mfn_Cleanup (void)
+// TODO
+{
+ m_pSymSectionName = NULL;
+ m_pFirstModelE = NULL;
+}
+
+
+// Static helper function to create the list of models for this manufacturer
+const CInfModelEntry *
+CInfManufacturerSection::sfn_CreateModelList
+(
+ const CIniFile *pIniFile,
+ const CIniFileSection *pISStr,
+ const CIniFileSection *pISManuS
+)
+{
+ CInfModelEntry * pModelE = NULL;
+ CIniFileEntry *pIE = NULL;
+
+ if (!pISManuS || !pISStr) goto end;
+
+ pIE = pISManuS->GetFirstEntry();
+ if (!pIE) goto end;
+
+ // Iterate through models, building model entries...
+ do
+ {
+ pModelE = new CInfModelEntry(pModelE);
+ if (!pModelE || !pModelE->Load(pIniFile, pISStr, pIE))
+ {
+ // TODO: warning; for now break out.
+ if (pModelE)
+ {
+ // TODO delete previously-created elements of the list as well!
+ // (Or leave them there and deal with a partial list).
+ delete pModelE;
+ pModelE = NULL;
+ }
+ goto end;
+ }
+
+ } while(pIE->BecomeNext());
+
+ // Reverse list
+ CInfModelEntry::ReverseList(&pModelE);
+
+end:
+ if (pIE) {pIE->Release(); pIE=NULL;}
+ //if (pISManL) { pISManL->Release(); pISManL=NULL; }
+ //if (pISStr) { pISStr->Release(); pISStr=NULL; }
+
+ return pModelE;
+}
+
+
+// --------------- Cleanup ------------------
+// Cleanup by freeing any allocated resources.
+void CInfModelEntry::mfn_Cleanup (void)
+// TODO
+{
+}
+
+
+// --------------- Load ------------------
+BOOL
+CInfModelEntry::Load
+(
+ const CIniFile *pIniFile,
+ const CIniFileSection *pISStr,
+ const CIniFileEntry *pIE
+)
+// TODO
+{
+ return TRUE;
+#if 0
+ BOOL fRet = FALSE;
+ const CInfSymbol *pSymLHS = pIE->GetLHS();
+ const CInfSymbol *pSymManuName = NULL;
+ // TODO need to make manu-section case insensitive!
+ // Basically pSymManuSection should be created based on an upper-case'd
+ // version of pIE->GetRHS().
+ const CInfSymbol *pSymManuSection = pIE->GetRHS();
+ CInfManufacturerSection *pManuS = NULL;
+ BOOL fNew=FALSE;
+
+ ASSERT(!m_pManuS);
+ ASSERT(!m_pSymManuName);
+
+ // Get manufacturer name ...
+ if (pSymLHS)
+ {
+ const CIniFileEntry *pIEStr = pISStr->LookupEntry(pSymLHS->GetText());
+ if (pIEStr)
+ {
+ pSymManuName = pIE->GetRHS();
+ pIEStr->Release();pIEStr=NULL;
+ }
+ }
+
+ pManuS=NULL;
+
+ // Look up/create manufacturer section
+ {
+ void **ppv=NULL;
+ BOOL fExists=FALSE;
+ BOOL fRet = pSymManuSection->GetOrCreatePropLoc(
+ PROP_INFSECTION_MANUFACTURER,
+ &ppv,
+ &fExists);
+ if (fRet)
+ {
+ if (fExists)
+ {
+ // This section already exists...
+ pManuS = (CInfManufacturerSection *) *ppv;
+ ASSERT(pManuS->Validate());
+ }
+ else
+ {
+ // This section doesn't exist -- create it.
+ pManuS = new CInfManufacturerSection();
+ if (pManuS)
+ {
+ if (pManuS->Load(pIniFile, pISStr, pSymManuSection))
+ {
+ // set the property data
+ *ppv = (void *) pManuS;
+ }
+ else
+ {
+ delete pManuS;
+ pManuS=NULL;
+ pSymManuSection->DelProp(PROP_INFSECTION_MANUFACTURER);
+ }
+ }
+ }
+ }
+ }
+
+ if (pManuS)
+ {
+ m_pManuS = pManuS;
+ m_pSymManuName = pSymManuName;
+ fRet = TRUE;
+ }
+
+ if (!fRet)
+ {
+ mfn_Cleanup();
+ }
+
+ return fRet;
+#endif
+
+}
+
+// --------------- Unload ------------------
+void CInfModelEntry::Unload(void)
+// TODO
+{
+ mfn_Cleanup();
+}
diff --git a/private/unimodem/new/mic/inf.h b/private/unimodem/new/mic/inf.h
new file mode 100644
index 000000000..32e1ae85a
--- /dev/null
+++ b/private/unimodem/new/mic/inf.h
@@ -0,0 +1,998 @@
+// // Copyright (c) 1996 Microsoft Corporation
+//
+//
+// INF.H -- Header for Classes:
+//
+// CInfFile
+//
+// CInfVersionSection
+// CInfManufacturerSection
+// CInfInstallSection
+// CInfAddRegSection
+// CInfCopyFilesSection
+//
+// CInfManufacturerEntry
+// CInfModelEntry
+// CInfCopyFilesEntry
+// CInfAddRegEntry
+//
+// CInfModelEntryAux
+//
+//
+// History:
+// 05/21/96 JosephJ Created
+//
+//
+
+
+class CInfVersionSection;
+class CInfManufacturerEntry;
+class CInfManufacturerSection;
+class CInfModelEntry;
+class CInfInstallSection;
+class CInfAddRegSection;
+class CInfAddRegEntry;
+class CInfCopyFilesEntry;
+class CInfCopyFilesSection;
+class CInfModelEntryAux;
+
+
+// Control flags
+const DWORD dwCF_EXCLUDE_FROM_SELECT = 0x1<<0;
+
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CInfFile
+///////////////////////////////////////////////////////////////////////////
+
+// Represents an inf (device information) file -- which is a special kind
+// of INI file.
+
+
+class CInfFile
+{
+
+public:
+
+ CInfFile(void);
+ ~CInfFile();
+
+ //-------------- Load ------------------
+ // Loads the specified file. (Obviously) only one file can be loaded at
+ // a time.
+ BOOL Load (const TCHAR rgchPathname[]);
+
+ //-------------- Unload ------------------
+ // Unloads a previously loaded file. If there are open sessions to this
+ // object, Unload returns a handle which will be signalled when all
+ // sessions are closed. New sessions will not be allowed after this
+ // function returns. The call should free the handle.
+ // See CloseSession for more info.
+ HANDLE Unload (void);
+
+ //-------------- OpenSession ------------------
+ // Open a session to this object. The object will not be unloaded until
+ // this session is closed. 0 indicates failure.
+ // TODO: unimplemented
+ const void * OpenSession (void) const {return (const void *) 1;}
+
+ //-------------- CloseSession ------------------
+ // Close the specified session to this object.
+ // If the reference count goes to zero and we're marked for unloading,
+ // the object is unloaded as well.
+ // TODO: unimplemented
+ void CloseSession (const void *) const {}
+
+ // --------------- Dump ------------------
+ // Dump state
+ void Dump(void) const;
+
+ // --------------- GetFileName ------------------
+ // Get Version info
+ const CInfSymbol * GetFileName(void) const
+ {
+ return m_pSymFileName;
+ }
+
+ // --------------- GetVersion ------------------
+ // Get Version info
+ const CInfVersionSection * GetVersion(void) const
+ {
+ return m_pVersion;
+ }
+
+ // --------------- GetFirstManufacturerEntry ------
+ // Get first manufacturer entry under the manufacturer section
+ const CInfManufacturerEntry * GetFirstManufacturerEntry(void) const
+ {
+ return m_pFirstManuE;
+ }
+
+ #if (TODO)
+ // --------------- GetFirstStringEntry --------------
+ // Get first string entry under the strings section
+ const CInfStringEntry * GetFirstStringEntry(void) const;
+ DestinationDirs
+
+ // --------------- LookupManufacturerSection ----------
+ // Lookup and return the manufacturer section with the specified name.
+ const CInfManufacturerSection *
+ LookupInstallSection(const CInfSymbol *pSymManSection)
+ const;
+
+ // --------------- LookupInstallSection ----------
+ // Lookup and return the install section with the specified name.
+ const CInfInstallSection * LookupInstallSection(const TCHAR pchName[])const;
+
+ // --------------- LookupAddRegSection --------------
+ // Lookup and return the addreg section with the specifed name.
+ const CInfAddRegSection * LookupAddRegSection(const TCHAR pchName[]) const;
+
+ // --------------- LookupString --------------
+ // Lookup and return the specified string
+ const CInfSymbol * LookupString(const TCHAR pchName[]) const;
+#endif // TODO
+
+
+private:
+
+ // ============= PRIVATE MEMBER FUNCTIONS ===============
+ void mfn_EnterCrit(void) const {m_sync.EnterCrit();}
+ void mfn_LeaveCrit(void) const {m_sync.LeaveCrit();}
+ void mfn_Cleanup(void);
+
+ // ============= PRIVATE STATIC HELPER FUNCTIONS ========
+
+ static
+ const CInfManufacturerEntry *
+ sfn_CreateManufacturerList(CIniFile *);
+
+ static
+ void
+ sfn_DeleteManufacturerList(const CInfManufacturerEntry *);
+
+ // ======================= DATA ========================
+ const CInfVersionSection * m_pVersion;
+ const CInfManufacturerEntry * m_pFirstManuE;
+ const CInfSymbol * m_pSymFileName;
+ CSync m_sync;
+
+ CIniFile *m_pIniFile;
+
+};
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CInfVersionSection
+///////////////////////////////////////////////////////////////////////////
+
+// Sample Version section:
+// [Version]
+// LayoutFile=layout.inf
+// Signature="$CHICAGO$"
+// Class=Modem
+// ClassGUID={4D36E96D-E325-11CE-BFC1-08002BE10318}
+// Provider=%MS%
+
+class CInfVersionSection
+{
+
+public:
+
+ CInfVersionSection(void)
+ {
+ m_pSymLayoutFile = NULL;
+ m_pSymSignature = NULL;
+ m_pSymClass = NULL;;
+ m_pSymClassGUID = NULL;
+ m_pSymProvider = NULL;
+ m_dwChecksum = 0;
+ }
+
+ ~CInfVersionSection()
+ {
+ }
+
+ // --------------- Dump ------------------
+ // Dump state
+ void Dump(void) const;
+
+ // --------------- Checksum ------------------
+ // Return checksum of contents
+ DWORD Checksum(void) const
+ {
+ return m_dwChecksum;
+ }
+
+ // --------------- GetLayoutFile ------------------
+ const CInfSymbol * GetLayoutFile (void) const
+ {
+ return m_pSymLayoutFile;
+ }
+
+ // --------------- GetSignature ------------------
+ const CInfSymbol * GetSignature (void) const
+ {
+ return m_pSymSignature;
+ }
+
+ // --------------- GetClass ------------------
+ const CInfSymbol * GetClass (void) const
+ {
+ return m_pSymClass;
+ }
+
+ // --------------- GetClassGUID ------------------
+ const CInfSymbol * GetClassGUID (void) const
+ {
+ return m_pSymClassGUID;
+ }
+
+ // --------------- GetProvider ------------------
+ const CInfSymbol * GetProvider (void) const
+ {
+ return m_pSymProvider;
+ }
+
+
+private:
+
+ friend class CInfFile;
+
+ BOOL Load(const CIniFile *);
+ void Unload(void);
+
+ void mfn_Cleanup(void);
+
+ const CInfSymbol * m_pSymLayoutFile;
+ const CInfSymbol * m_pSymSignature;
+ const CInfSymbol * m_pSymClass;
+ const CInfSymbol * m_pSymClassGUID;
+ const CInfSymbol * m_pSymProvider;
+ DWORD m_dwChecksum;
+
+
+};
+
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CInfManufacturerEntry
+///////////////////////////////////////////////////////////////////////////
+
+// Sample Manufacturer list section:
+// [Manufacturer]
+// %Generic% = Generic
+// %MagicRam% = MagicRam
+// ..
+
+class CInfManufacturerEntry: private CInfList
+{
+
+public:
+
+ CInfManufacturerEntry(const CInfManufacturerEntry *pNext)
+ : CInfList(NULL, pNext),
+ m_pManuS(NULL),
+ m_pSymManuName(NULL)
+ {}
+
+ ~CInfManufacturerEntry() {}
+
+ // --------------- Dump ------------------
+ // Dump state
+ void Dump(void) const;
+
+ // --------------- GetManufacturerSection ----------
+ // Get manufacturer section
+ const CInfManufacturerSection * GetManufacturerSection (void) const
+ {
+ return m_pManuS;
+ }
+
+ // --------------- GetName ------------------
+ // Get manufacturer name (actual manufacturer name, not %xxxx%.)
+ const CInfSymbol * GetName (void) const
+ {
+ return m_pSymManuName;
+ }
+
+ // --------------- Next ------------------
+ // Get next Entry. NULL if no more...
+ const CInfManufacturerEntry * Next(void) const
+ {
+ return (const CInfManufacturerEntry *) CInfList::Next();
+ }
+
+ // --------------- Load ------------------
+ BOOL
+ Load(
+ const CIniFile *pIniFile,
+ const CIniFileSection *pISStr,
+ const CIniFileEntry *pIE
+ );
+
+ // --------------- Unload ------------------
+ void Unload(void);
+
+ //-------------- ReverseList ------------------
+ // Reverses the implicit list of manufacturer entries
+ static void ReverseList(CInfManufacturerEntry **ppManuE)
+ {
+ CInfList::ReverseList((const CInfList **) ppManuE);
+ }
+
+private:
+
+ void mfn_Cleanup(void);
+
+ const CInfManufacturerSection *m_pManuS;
+ const CInfSymbol *m_pSymManuName;
+
+};
+
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CInfManufacturerSection
+///////////////////////////////////////////////////////////////////////////
+
+// Sample Manufacturer section:
+// [Generic]
+// %Gen% = Gen, MDMGEN
+// %Gen3% = Gen3, MDMGEN3
+// %Gen12% = Gen12, MDMGEN12
+// %Gen24% = Gen24, MDMGEN24
+// ...
+
+class CInfManufacturerSection
+{
+
+public:
+
+ CInfManufacturerSection(void)
+ {
+ m_eObjSig=eOBJSIG_CInfManufacturerSection;
+ m_pSymSectionName = NULL;
+ m_pFirstModelE = NULL;
+ }
+
+ ~CInfManufacturerSection()
+ //TODO
+ {
+ m_eObjSig = eOBJSIG_INVALID;
+ }
+
+ // --------------- Dump ------------------
+ // Dump state
+ void Dump(void) const;
+
+ // --------------- GetFirstModelEntry --------------
+ // Get first model entry
+ const CInfModelEntry * GetFirstModelEntry (void) const;
+
+ // --------------- GetSectionName ------------------
+ // Get section name
+ const CInfSymbol * GetSectionName (void) const
+ {
+ return m_pSymSectionName;
+ }
+
+ // --------------- Load ------------------
+ BOOL
+ Load
+ (
+ const CIniFile *pIniFile,
+ const CIniFileSection *pISStr,
+ const CInfSymbol *pSymManuSection
+ );
+
+ // --------------- Unload ------------------
+ void Unload(void);
+
+ // --------------- Validate ------------------
+ BOOL Validate(void) const
+ {
+ // TODO: can place in try-except clause...
+ return this && m_eObjSig==eOBJSIG_CInfManufacturerSection;
+ }
+
+ #if (TODO)
+ // --------------- GetName ------------------
+ // Get manufacturer name (actual manufacturer name),
+ const CInfSymbol * GetName (void) const;
+ #endif
+
+private:
+
+ void mfn_Cleanup(void);
+
+ // Static helper function
+ const CInfModelEntry *
+ sfn_CreateModelList(
+ const CIniFile *pIniFile,
+ const CIniFileSection *pISStr,
+ const CIniFileSection *pISManuS
+ );
+
+ const CInfSymbol *m_pSymSectionName;
+ const CInfModelEntry * m_pFirstModelE;
+ eOBJSIG m_eObjSig;
+};
+
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CInfModelEntry
+///////////////////////////////////////////////////////////////////////////
+
+// Sample Model entry:
+// %Gen% = Gen, MDMGEN
+
+class CInfModelEntry : private CInfList
+{
+
+public:
+
+ CInfModelEntry(const CInfModelEntry *pNext)
+ : CInfList(NULL, pNext)
+ {
+ /*TODO*/
+ m_dwControlFlags_All = dwCF_EXCLUDE_FROM_SELECT;
+ m_dwControlFlags_NT_All = dwCF_EXCLUDE_FROM_SELECT;
+ m_dwControlFlags_NT_Alpha = dwCF_EXCLUDE_FROM_SELECT;
+ m_dwControlFlags_NT_PPC = dwCF_EXCLUDE_FROM_SELECT;
+ m_dwControlFlags_NT_Mips = dwCF_EXCLUDE_FROM_SELECT;
+ }
+
+ ~CInfModelEntry() {/*TODO*/}
+
+ // --------------- Dump ------------------
+ // Dump state
+ void Dump(void) const;
+
+
+ // --------------- Load ------------------
+ BOOL
+ Load(
+ const CIniFile *pIniFile,
+ const CIniFileSection *pISStr,
+ const CIniFileEntry *pIE
+ );
+
+ // --------------- Unload ------------------
+ void Unload(void);
+
+ // --------------- GetNext ------------------
+ // Get next Entry. NULL if no more...
+ const CInfModelEntry * Next(void) const
+ {
+ return (const CInfModelEntry *) CInfList::Next();
+ }
+
+ //-------------- ReverseList ------------------
+ // Reverses the implicit list of model entries
+ static void ReverseList(CInfModelEntry **ppModelE)
+ {
+ CInfList::ReverseList((const CInfList **) ppModelE);
+ }
+
+ // --------------- GetLHS ------------------
+ // Get next Entry. NULL if no more...
+ const CInfSymbol * GetLHS(void) const
+ {
+ // TODO
+ return gSymtab.Lookup(TEXT("%bongo101%"), TRUE);
+ }
+
+ // --------------- GetInstallSection --------------
+ // Get install section
+ const CInfInstallSection * GetInstallSection (void) const
+ {
+ return m_pInstallSection;
+ }
+
+ // --------------- GetName ------------------
+ // Get model name (actual model name, not %xxx%)
+ const CInfSymbol * GetName (void) const
+ {
+ // TODO
+ //return m_pSymName;
+ return gSymtab.Lookup(TEXT("Christy Brinkly"), TRUE);
+ }
+
+ // --------------- GetRank0ID ------------------
+ // Rank-0 ID
+ const CInfSymbol * GetRank0ID (void) const
+ {
+ // TODO
+ //return m_pSymRank0ID;
+ // TODO
+ return gSymtab.Lookup(TEXT("RANK-0-ID"), TRUE);
+
+ }
+
+ // --------------- GetRank1ID ------------------
+ // Rank-1 ID
+ const CInfSymbol * GetRank1ID (void) const
+ {
+ // TODO
+ // return m_pSymRank1ID;
+ return gSymtab.Lookup(TEXT("RANK-1-ID"), TRUE);
+ }
+
+ // --------------- GetRank2ID ------------------
+ // Rank-2 ID
+ const CInfSymbol * GetRank2ID (void) const
+ {
+ // TODO
+ // return m_pSymRank2ID;
+ return gSymtab.Lookup(TEXT("RANK-2-ID"), TRUE);
+ }
+
+ // --------------- GetControlFlags -----------------
+ // Return install flags (one or more dwCF_* flags) for the specified
+ // platform.
+ DWORD GetControlFlags(ePLATFORM ePlat) const
+ {
+ DWORD dwRet = 0;
+
+ switch(ePlat)
+ {
+ case ePLAT_ALL:
+ break;
+ case ePLAT_NT_ALL:
+ dwRet = m_dwControlFlags_NT_All;
+ break;
+
+ case ePLAT_NT_ALPHA:
+ dwRet = m_dwControlFlags_NT_Alpha;
+ break;
+
+ case ePLAT_NT_PPC:
+ dwRet = m_dwControlFlags_NT_PPC;
+ break;
+
+ case ePLAT_NT_MIPS:
+ dwRet = m_dwControlFlags_NT_Mips;
+ break;
+
+ default:
+ break;
+ }
+
+ return dwRet;
+ }
+
+private:
+
+ void mfn_Cleanup(void);
+
+ const CInfInstallSection * m_pInstallSection;
+ // Pointer to install section
+
+ const CInfSymbol * m_pSymName;
+ // Device name
+
+ const CInfSymbol * m_pSymRank0ID;
+ // Rank-0 ID (primary device ID)
+
+ const CInfSymbol * m_pSymRank1ID;
+ // Rank-1 ID (compatible device ID)
+
+ const CInfSymbol * m_pSymRank2ID;
+ // Rank-2 ID (Rank 2 ID)
+
+ DWORD m_dwControlFlags_All;
+ // Install flags (eg exclude from select, needs reboot, etc) that
+ // apply to all platforms.
+
+ DWORD m_dwControlFlags_NT_All;
+ // Install flags (eg exclude from select, needs reboot, etc) that
+ // apply to all NT platforms.
+
+ DWORD m_dwControlFlags_NT_Alpha;
+ // Install flags (eg exclude from select, needs reboot, etc) that
+ // apply to NT Alpha platform.
+
+ DWORD m_dwControlFlags_NT_PPC;
+ // Install flags (eg exclude from select, needs reboot, etc) that
+ // apply to NT PPC platform.
+
+ DWORD m_dwControlFlags_NT_Mips;
+ // Install flags (eg exclude from select, needs reboot, etc) that
+ // apply to NT MIPS platform.
+};
+
+
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CInfInstallSection
+///////////////////////////////////////////////////////////////////////////
+
+// Sample Install section:
+// [Modem29]
+// AddReg=All, MfgAddReg, ROCK_VOICE_ALL, ROCK_VOICE_SERWAVE, INTERNAL
+// CopyFiles = VV_Sys, VV_Sock_Sys, VV_App, VV_Help
+// UpdateInis = VView.Inis
+// Uninstall = VoiceView_remove
+//
+// Also contains info from the related PosDup and NoResDup sections:
+//
+// [Modem12.PosDup]
+// *PNP0500
+//
+// [Modem6.NoResDup]
+// UNIMODEMCC646872,UNIMODEMA4970248,UNIMODEMB6071C15
+//
+
+class CInfInstallSection
+{
+
+public:
+
+ CInfInstallSection(void);
+ ~CInfInstallSection();
+
+ // --------------- Dump ------------------
+ // Dump state
+ void Dump(void) const;
+
+ // --------------- GetAddRegSectionList ----------
+ // Get generic list whose data items are pointers to
+ // CInfAddRegSection objects
+ const CInfList * GetAddRegSectionList (void) const;
+
+ // --------------- GetCopyFilesSectionList ----------
+ // Get generic list whose data items are pointers to
+ // CInfCopyFilesSection objects
+ const CInfList * GetCopyFilesSectionList (void) const;
+
+ // --------------- GetNoResDupIDList ----------
+ // Get generic list whose data items are pointers to
+ // InfSymbol objects representing the Rank0 IDs in the corresponding
+ // NoResDup section.
+ const CInfList * GetNoResDupIDList (void) const;
+
+ // --------------- GetPosDupIDList ----------
+ // Get generic list whose data items are pointers to
+ // InfSymbol objects representing the Rank0 IDs in the corresponding
+ // PosDup section.
+ const CInfList * GetPosDupIDList (void) const;
+
+ #if (TODO)
+
+ // --------------- GetUpdateInisSectionList ------
+ // Get generic list whose data items are pointers to
+ // CInfUpdateInisSection objects
+ const CInfList * GetUpdateInisSectionList (void) const;
+
+ // --------------- GetUninstallSectionList ------
+ // Get generic list whose data items are pointers to
+ // CInfUninstallSection objects
+ const CInfList * GetUninstallSectionList (void) const;
+
+ // TODO: Also, treat as errors any sections which we don't understand or
+ // don't expect in a modem inf file or we don't support in the compiler:
+ // eg rename sections, and other fancy INF file constructs.
+
+ #endif // (TODO)
+
+private:
+
+ void mfn_Cleanup(void);
+};
+
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CInfAddRegSection
+///////////////////////////////////////////////////////////////////////////
+
+// Sample AddReg section:
+// [All]
+// HKR,,FriendlyDriver,,Unimodem.vxd
+// HKR,,DevLoader,,*vcomm
+// HKR,,ConfigDialog,,modemui.dll
+// HKR,,EnumPropPages,,"modemui.dll,EnumPropPages"
+// HKR,,PortSubClass,1,02
+// HKR, Init, 1,, "AT<cr>"
+// HKR, Responses, "<cr><lf>OK<cr><lf>", 1, 00, 00, 00,00,00,00, ...etc.
+// HKR, Responses, "<cr><lf>ERROR<cr><lf>", 1, 03, 00, 00,00,00, ...etc.
+
+class CInfAddRegSection
+{
+
+public:
+
+ CInfAddRegSection(void) {/*TODO*/}
+ ~CInfAddRegSection() {/*TODO*/}
+
+ // --------------- Dump ------------------
+ // Dump state
+ void
+ Dump(void)
+ const;
+
+ // --------------- GetFirstAddRegEntry --------------
+ // Get first addreg entry
+ const
+ CInfAddRegEntry *
+ GetFirstAddRegEntry (void)
+ const;
+
+private:
+
+ void mfn_Cleanup(void);
+};
+
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CInfAddRegEntry
+///////////////////////////////////////////////////////////////////////////
+
+// Sample AddReg entry:
+// HKR, Init, 1,, "AT<cr>"
+
+class CInfAddRegEntry
+{
+
+public:
+
+ CInfAddRegEntry(void)
+ {
+ // TODO -- faked out
+
+ m_pSymRegRoot = gSymtab.Lookup(TEXT("HKR"), TRUE);
+ m_pSymSubKey = gSymtab.Lookup(TEXT("Init"), TRUE);
+ m_pSymValueName = gSymtab.Lookup(TEXT("1"), TRUE);
+ m_dwFlag = MAXDWORD;
+ m_pSymValue = gSymtab.Lookup(TEXT("\"AT<cr>\""), TRUE);
+ m_dwChecksum = 1000;
+ }
+
+ ~CInfAddRegEntry() {/*TODO*/}
+
+ // --------------- Dump ------------------
+ // Dump state
+ void
+ Dump(void)
+ const
+ {
+ // TODO: unimplemented
+ printf(" HKR, Init, 1,, \"AT<cr>\"\n");
+ }
+
+ // --------------- Checksum ------------------
+ // Compute and return checksum of contents
+ DWORD
+ Checksum(void)
+ const
+ {
+ return m_dwChecksum;
+ }
+
+ // --------------- Next ------------------
+ // Get next Entry. NULL if no more...
+ const CInfAddRegEntry *
+ Next(void)
+ const
+ {
+ // TODO: unimplemented
+ return NULL;
+ }
+
+ // --------------- GetRegRoot ------------------
+ // Get reg-root-string key (HKR, etc)
+ const CInfSymbol *
+ GetRegRoot (void)
+ const
+ {
+ return m_pSymRegRoot;
+ }
+
+ // --------------- GetSubKey ------------------
+ // Get sub key, NULL if none.
+ const CInfSymbol *
+ GetSubKey (void)
+ const
+ {
+ return m_pSymSubKey;
+ }
+
+ // --------------- GetValueName ------------------
+ // Get value-name, NULL if none.
+ const CInfSymbol *
+ GetValueName (void)
+ const
+ {
+ return m_pSymValueName;
+ }
+
+ // --------------- GetFlag ------------------
+ // Get flag-name, MAXDWORD if none.
+ DWORD
+ GetFlag (void)
+ const
+ {
+ return m_dwFlag;
+ }
+
+ // --------------- GetValue ------------------
+ // Get value-name, NULL if none.
+ // For binary data, this represents a normalized version of the
+ // string specified in the inf file: it has the format: "xxyxxyxx.."
+ // where xx is 2-digit hex representation of a byte and y is the space
+ // character (' '). For ASCII data, the value is the ascii string without
+ // the enclosing quotes. Extending '\' characters are processed.
+ const CInfSymbol *
+ GetValue (void)
+ const
+ {
+ return m_pSymValue;
+ }
+
+ #if (TODO)
+ ... more stuff
+ #endif
+
+private:
+
+ void mfn_Cleanup(void);
+
+ const CInfSymbol * m_pSymRegRoot;
+ const CInfSymbol * m_pSymSubKey;
+ const CInfSymbol * m_pSymValueName;
+ const CInfSymbol * m_pSymValue;
+ DWORD m_dwFlag;
+ DWORD m_dwChecksum;
+};
+
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CInfCopyFilesSection
+///////////////////////////////////////////////////////////////////////////
+
+// Sample DestinationDirs section:
+// [DestinationDirs]
+// Register.Copy = 17 ;LDID_INF
+// VV_Sys = 11
+// VV_Sock_Sys = 11 ;LDID_SYS \Windows\system dir
+// VV_Sock_Win = 10 ;LDID_WIN \Windows dir
+// VV_App = 10
+// VV_Help = 18 ;LDID_HELP
+
+// Sample Copyfiles section:
+// [VV_Sys]
+// fte.dll
+// vvexe32.exe
+// wsvv.vxd
+
+// Note: each CInfCopyFilesEntry object keeps a pointer to its destination
+// directory (all the entries for a particular section will have the same
+// destination dir, because in the inf, a destination directory is associated
+// with an entire section.
+
+class CInfCopyFilesSection
+{
+
+public:
+
+ // --------------- Dump ------------------
+ // Dump state
+ void Dump(void) const;
+
+ // --------------- GetFirstCopyFilesEntry ----------
+ // Get first copyfiles entry
+ const CInfCopyFilesEntry * GetFirstCopyFilesEntry (void) const;
+
+ #if (TODO)
+ // Following reflect the Copyfiles.NT* extensions. We need to keep
+ // this information along with the section.
+ enum {PROC_X86, PROC_MIPS, PROC_ALPHA, PROC_PPC} eProcessorType;
+ enum {PLAT_NT, , PLAT_WIN9X} ePlatformType;
+ #endif // (TODO)
+
+ // TODO: remove following friend declaration once
+ // CInfInstallSection::GetCopyFilesList
+ // is properly implemented (it currently needs to access this
+ // class's constructor.
+ // Also, move ~CInfCopyFIlesEntry to protected when done.
+ friend class CInfInstallSection;
+ ~CInfCopyFilesSection() {/*TODO*/}
+
+protected:
+
+ CInfCopyFilesSection(void) {/*TODO*/}
+
+
+private:
+
+ void mfn_Cleanup(void);
+
+};
+
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CInfCopyFilesEntry
+///////////////////////////////////////////////////////////////////////////
+
+// Sample CopyFiles entry:
+// fte.dll
+// Note: each CInfCopyFilesEntry object keeps a pointer to its destination
+// directory.
+// TODO: keep information about platform & processor as well (see TODO
+// notes under CInfCopyFilesSection).
+
+class CInfCopyFilesEntry
+{
+
+public:
+
+ // --------------- Dump ------------------
+ // Dump state
+ void Dump(void) const
+ {
+ // TODO: unimplemented
+ printf(" fte.dll ; goes to 11\n");
+ }
+
+ // --------------- Checksum ------------------
+ // Compute and return checksum of contents
+ // Compute and return checksum of contents
+ DWORD
+ Checksum(void)
+ const
+ {
+ return m_dwChecksum;
+ }
+
+ // --------------- GetNext ------------------
+ // Get next Entry. NULL if no more...
+ const CInfCopyFilesEntry * Next(void) const
+ {
+ // TODO: unimplemented
+ return NULL;
+ }
+
+ // --------------- GetFileName ------------------
+ // Get file name to be copied.
+ const CInfSymbol * GetFileName (void) const;
+
+ // --------------- GetDestDir ------------------
+ // Get file name to be copied.
+ const CInfSymbol * GetDestDir (void) const;
+
+ // TODO: remove following friend declaration once
+ // CInfCopyFilesSection::GetFirstCopyFilesEntry
+ // is properly implemented (it currently needs to access this
+ // class's constructor.
+ // Also, move ~CInfCopyFIlesEntry to protected when done.
+ friend class CInfCopyFilesSection;
+ ~CInfCopyFilesEntry() {/*TODO*/}
+
+protected:
+
+ CInfCopyFilesEntry(void)
+ {
+ // TODO -- faked out
+ m_dwChecksum = 1001;
+ }
+
+private:
+
+ void mfn_Cleanup(void);
+
+ DWORD m_dwChecksum;
+
+};
+
+#if 0
+pInf->Load("mdmgen.inf");
+pManuf = pInf->GetFirstManufacturerEntry();
+for(;pManuf; pManuf = pManuf->Next())
+{
+ pNewDevice = new ModemDevice(pDevice);
+ pDevice->Load(pInf, pManuf);
+ pDevice->Dump();
+ pDevice = pNewDevice;
+}
+pInf->Unload("
+NewSession()
+FreeSession()
+#endif
diff --git a/private/unimodem/new/mic/ini.cpp b/private/unimodem/new/mic/ini.cpp
new file mode 100644
index 000000000..617471ec9
--- /dev/null
+++ b/private/unimodem/new/mic/ini.cpp
@@ -0,0 +1,153 @@
+//
+// Copyright (c) 1996 Microsoft Corporation
+//
+//
+// INI.CPP -- Implemtation for Classes:
+// CIniFile
+//
+// History:
+// 05/22/96 JosephJ Created
+//
+//
+#include "common.h"
+#include "ini.h"
+
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CIniFile
+///////////////////////////////////////////////////////////////////////////
+
+
+CIniFile::CIniFile(void)
+{
+}
+
+
+CIniFile::~CIniFile()
+{
+ mfn_EnterCrit();
+
+ // Free resources
+}
+
+
+//-------------- Load ------------------
+// Loads the specified file. (Obviously) only one file can be loaded at
+// a time.
+// TODO: unimplemented
+BOOL CIniFile::Load (const TCHAR rgchPathname[])
+{
+ BOOL fRet = FALSE;
+
+ //mfn_EnterCrit();
+
+ fRet = TRUE;
+
+// end:
+
+ if (!fRet)
+ {
+ //mfn_Cleanup();
+ }
+
+ //mfn_LeaveCrit();
+
+ return fRet;
+}
+
+
+//-------------- Unload ------------------
+// Unloads a previously loaded file. If there are open sessions to this
+// object, Unload returns a handle which will be signalled when all
+// sessions are closed. New sessions will not be allowed after this
+// function returns. The call should free the handle.
+// TODO: unimplemented
+HANDLE CIniFile::Unload (void)
+{
+ HANDLE hUnload = NULL;
+
+ // mfn_EnterCrit();
+
+ // TODO: call m_sync.BeginUnload to try to put us in unloadable state.
+
+ // mfn_Cleanup();
+
+ // mfn_LeaveCrit();
+
+
+ return hUnload;
+}
+
+
+//-------------- LookupSection ------------------
+// Unloads a previously loaded file. If there are open sessions to this
+const CIniFileSection *
+CIniFile::LookupSection(const TCHAR *lptcszSection)
+const
+// TODO
+{
+ static const CIniFileSection * pIS;
+ if (!pIS) pIS = new CIniFileSection;
+ return pIS;
+}
+
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CIniFileSection
+///////////////////////////////////////////////////////////////////////////
+
+
+//-------------- LookupEntry ------------------
+const CIniFileEntry *
+CIniFileSection::LookupEntry(const TCHAR *lptcszEntry)
+const
+// TODO
+{
+ static const CIniFileEntry * pIE;
+ if (!pIE) pIE = new CIniFileEntry;
+ return pIE;
+}
+
+//-------------- GetFirstEntry ------------------
+CIniFileEntry *
+CIniFileSection::GetFirstEntry (void)
+// TODO
+const
+{
+ static CIniFileEntry * pIE;
+ if (!pIE) pIE = new CIniFileEntry;
+ return pIE;
+}
+
+//-------------- Release ------------------
+void
+CIniFileSection::Release(void)
+const
+// TODO
+{
+}
+
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CIniFileEntry
+///////////////////////////////////////////////////////////////////////////
+
+
+//-------------- GetRHS ------------------
+const CInfSymbol *
+CIniFileEntry::GetRHS(void)
+const
+// TODO
+{
+ return gSymtab.Lookup("[RHS]", TRUE);
+}
+
+
+//-------------- Release ------------------
+void
+CIniFileEntry::Release(void)
+const
+// TODO
+{
+}
+
diff --git a/private/unimodem/new/mic/ini.h b/private/unimodem/new/mic/ini.h
new file mode 100644
index 000000000..1c2933b1b
--- /dev/null
+++ b/private/unimodem/new/mic/ini.h
@@ -0,0 +1,210 @@
+//
+// Copyright (c) 1996 Microsoft Corporation
+//
+//
+// INI.H -- Header for Classes:
+// CIniFile
+// CIniFileLine
+// CIniFileSection
+// CIniFileEntry
+//
+// History:
+// 05/21/96 JosephJ Created
+//
+//
+
+class CIniFile;
+class CIniFileLine;
+class CIniFileSection;
+class CIniFileEntry;
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CIniFile
+///////////////////////////////////////////////////////////////////////////
+
+// Represents a windows INI file.
+
+class CIniFile
+{
+
+public:
+
+ CIniFile(void);
+ ~CIniFile();
+
+ //-------------- Load ------------------
+ // Loads the specified file. (Obviously) only one file can be loaded at
+ // a time.
+ BOOL Load (const TCHAR rgchPathname[]);
+
+ //-------------- Unload ------------------
+ // Unloads a previously loaded file. If there are open sessions to this
+ // object, Unload returns a handle which will be signalled when all
+ // sessions are closed. New sessions will not be allowed after this
+ // function returns. The call should free the handle.
+ HANDLE Unload (void);
+
+ //-------------- OpenSession ------------------
+ // Open a session to this object. The object will not be unloaded until
+ // this session is closed. 0 indicates failure.
+ // TODO: unimplemented
+ const void * OpenSession (void) const {return (const void *) 1;}
+
+ //-------------- CloseSession ------------------
+ // Close the specified session to this object.
+ // TODO: unimplemented
+ void CloseSession (const void *) const {}
+
+ //-------------- GetFirstLine ------------------
+ // Get the first line in the file. Subsequent lines can be got by
+ // calling Next() on the line object.
+ const CIniFileLine * GetFirstLine (void) const;
+
+ //-------------- GetFirstSection ------------------
+ // Get the first section in the file.
+ const CIniFileSection * GetFirstSection (void) const;
+
+ //-------------- LookupSection ------------------
+ // Lookup a section in the file, given a name. Comparison is case-
+ // insensitive.
+ const CIniFileSection * LookupSection (const TCHAR * pchName) const;
+
+ //-------------- Dump ------------------
+ // Dump state
+ void Dump(void) const;
+
+ //-------------- GetName ------------------
+ // Returns the file name
+ const CInfSymbol * GetName (void) const
+ {
+ return m_pSymFileName;
+ }
+
+protected:
+
+ //-------------- mfn_GetProp ---------------
+ // Gets the property value associated with this object.
+ void * mfn_GetProp(void) {return m_pvProp;}
+
+ //-------------- mfn_SetProp ---------------
+ // Sets the property value associated with this object.
+ // Returns previously-set value, if any.
+ void * mfn_SetProp(void *pvNew)
+ {
+ void *pv;
+ mfn_EnterCrit();
+ pv = m_pvProp;
+ m_pvProp = pvNew;
+ mfn_LeaveCrit();
+ return pv;
+ }
+
+ //-------------- mfn_EnterCrit ------------------
+ void mfn_EnterCrit(void) const {m_sync.EnterCrit();}
+
+
+ //-------------- mfn_LeaveCrit ------------------
+ void mfn_LeaveCrit(void) const {m_sync.LeaveCrit();}
+
+
+private:
+
+ CSync m_sync;
+ void * m_pvProp;
+ const CInfSymbol * m_pSymFileName;
+};
+
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CIniFileLine
+///////////////////////////////////////////////////////////////////////////
+
+// Represents a single line in an INI file.
+// TODO: unimplemented
+// Note: Only CIniFile member functions can construct/destruct these
+// objects.
+
+class CIniFileLine
+{
+
+protected:
+
+ CIniFileLine(void) {}
+ ~CIniFileLine() {}
+
+private:
+
+ friend class CIniFile;
+};
+
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CIniFileSection
+///////////////////////////////////////////////////////////////////////////
+
+// Represents a single section in an INI file.
+// Note: Only CIniFile member functions can construct/destruct these
+// objects.
+
+class CIniFileSection
+{
+
+public:
+
+ const CInfSymbol * GetName (void) const
+ {
+ // TODO
+ return gSymtab.Lookup(TEXT("Steroids"), TRUE);
+ }
+
+ CIniFileEntry * GetFirstEntry (void) const;
+ const CIniFileEntry * LookupEntry (const TCHAR rgchName[]) const;
+ const CIniFileSection * Next(void) const;
+ void Release(void) const;
+protected:
+
+ CIniFileSection(void) {/*TODO*/}
+ ~CIniFileSection() {/*TODO*/}
+
+private:
+
+ friend class CIniFile;
+};
+
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CIniFileEntry
+///////////////////////////////////////////////////////////////////////////
+
+// Represents a single entry in a section in an INI file.
+// Note: Only CIniFileSection member functions can construct/destruct these
+// objects.
+
+class CIniFileEntry
+{
+
+public:
+
+ const CInfSymbol * GetLHS (void) const
+ {
+ // TODO
+ return gSymtab.Lookup(TEXT("%bongo101%"), TRUE);
+ }
+ const CInfSymbol * GetRHS (void) const;
+ const CIniFileLine * GetFirstLine (void) const;
+ BOOL * BecomeNext (void)
+ {
+ return FALSE;
+ }
+
+ void Release(void) const;
+
+protected:
+
+ CIniFileEntry(void) {/*TODO*/}
+ ~CIniFileEntry() {/*TODO*/}
+
+private:
+
+ friend class CIniFileSection;
+};
diff --git a/private/unimodem/new/mic/main.cpp b/private/unimodem/new/mic/main.cpp
new file mode 100644
index 000000000..a83cab10f
--- /dev/null
+++ b/private/unimodem/new/mic/main.cpp
@@ -0,0 +1,18 @@
+#include "common.h"
+#include "test.h"
+#include "mic.h"
+
+//#define MAIN_T main_tdev
+#define MAIN_T main_mic
+
+int __cdecl main(int argc, char * argv[])
+{
+ int iRet = 0;
+
+ if (!InitGlobals()) goto end;
+
+ iRet = MAIN_T (argc, argv);
+
+end:
+ return iRet;
+}
diff --git a/private/unimodem/new/mic/makefile b/private/unimodem/new/mic/makefile
new file mode 100644
index 000000000..6ee4f43fa
--- /dev/null
+++ b/private/unimodem/new/mic/makefile
@@ -0,0 +1,6 @@
+#
+# DO NOT EDIT THIS FILE!!! Edit .\sources. if you want to add a new source
+# file to this component. This file merely indirects to the real make file
+# that is shared by all the components of NT OS/2
+#
+!INCLUDE $(NTMAKEENV)\makefile.def
diff --git a/private/unimodem/new/mic/mic.cpp b/private/unimodem/new/mic/mic.cpp
new file mode 100644
index 000000000..9fa79d695
--- /dev/null
+++ b/private/unimodem/new/mic/mic.cpp
@@ -0,0 +1,167 @@
+//
+// Copyright (c) 1996 Microsoft Corporation
+//
+//
+// MIC.CPP -- Modem INF Compiler -- basic version
+//
+// Copyright (c) 1996 Microsoft Corporation
+//
+//
+// History:
+// 06/04/96 JosephJ Created
+//
+#include "common.h"
+#include "ini.h"
+#include "inf.h"
+#include "dev.h"
+#include "test.h"
+
+#define SIMPLE 0
+#define COMPLEX 1
+#define ACTUAL 2
+
+//#define TEST_TYPE (SIMPLE)
+#define TEST_TYPE (COMPLEX)
+//#define TEST_TYPE (ACTUAL)
+
+
+#if (TEST_TYPE==SIMPLE)
+#elif (TEST_TYPE==COMPLEX)
+#elif (TEST_TYPE==ACTUAL)
+#endif
+
+class CMicOptions
+{
+public:
+ CMicOptions(void) {}
+ ~CMicOptions() {}
+ BOOL Load (int argc, const char *argv[]);
+ void Unload(void) {}
+ static void Usage(void);
+ const TCHAR *OrigInfPath(void) {return m_rgchOrigInfPath;}
+ const TCHAR *NewInfDir(void) {return m_rgchNewInfDir;}
+
+private:
+
+ TCHAR m_rgchOrigInfPath[MAX_PATH];
+ TCHAR m_rgchNewInfDir[MAX_PATH];
+
+};
+
+CMicOptions gMicOptions;
+
+BOOL CMicOptions::Load (int argc, const char *argv[])
+{
+ BOOL fRet = FALSE;
+ UINT u;
+
+ if (argc!=3) goto end;
+
+ if (lstrlen(argv[1]) >= (sizeof(m_rgchOrigInfPath)/sizeof(TCHAR)))
+ {
+ goto end;
+ }
+
+ u = lstrlen(argv[2]);
+ // Extra space for possible addition of '\\'.
+ if ((u+1) >= (sizeof(m_rgchNewInfDir)/sizeof(TCHAR)))
+ {
+ goto end;
+ }
+
+ lstrcpy(m_rgchOrigInfPath, argv[1]);
+ lstrcpy(m_rgchNewInfDir, argv[2]);
+
+ ASSERT(u);
+
+ // Add final \, if required.
+ {
+ TCHAR tch = m_rgchNewInfDir[u-1];
+ if ( (tch!=(TCHAR) '\\') && (u>2 || tch!=(TCHAR)':'))
+ {
+ m_rgchNewInfDir[u]=TCHAR('\\');
+ m_rgchNewInfDir[u+1]=0;
+ }
+ }
+
+ printf
+ (
+ "OrigIP=[%s]; NewID=[%s]\n",
+ m_rgchOrigInfPath,
+ m_rgchNewInfDir
+ );
+ fRet = TRUE;
+
+end:
+ return fRet;
+}
+
+void CMicOptions::Usage (void)
+{
+ printf(TEXT("\nUsage: mic <original-inf-path> <destination-dir>\n\n"));
+}
+
+int main_mic(int argc, char * argv[])
+{
+ const CInfManufacturerEntry *pManuE = NULL;
+ CInfFile *pInf= NULL;
+ CInfDevice *pDev = NULL;
+
+
+ // Parse Options
+ // Format: mic <original inf path> <destination-dir>
+ if (!gMicOptions.Load(argc, (const char **) argv))
+ {
+ CMicOptions::Usage();
+ return 1;
+ }
+
+ pInf= new CInfFile();
+ pDev = new CInfDevice(NULL);
+
+ if (!pInf || !pDev) goto end;
+
+ if (pInf->Load(gMicOptions.OrigInfPath()))
+ {
+ pManuE = pInf->GetFirstManufacturerEntry();
+ }
+
+ for (;pManuE; pManuE = pManuE->Next())
+ {
+ const CInfManufacturerSection *pManuS=pManuE->GetManufacturerSection();
+ const CInfModelEntry *pModelE = NULL;
+ if (pManuS)
+ {
+ pModelE = pManuS->GetFirstModelEntry();
+ }
+ for (;pModelE; pModelE = pModelE->Next())
+ {
+ if (pDev->Load(pInf, pManuE, pModelE))
+ {
+ TCHAR rgchNewInf[MAX_PATH];
+ DWORD dwRank0Checksum = pDev->Rank0Checksum();
+ DWORD dwDeviceChecksum = pDev->Checksum();
+ wsprintf
+ (
+ rgchNewInf,
+ TEXT("%s%08lx_%08lx.inf"),
+ gMicOptions.NewInfDir(),
+ dwRank0Checksum,
+ dwDeviceChecksum
+ );
+ pDev->Dump();
+
+ pDev->WriteInf(rgchNewInf);
+ pDev->Unload();
+ }
+ }
+ }
+
+end:
+ if (pDev) {delete pDev; pDev=NULL;}
+ if (pInf) {pInf->Unload(); delete pInf; pInf=NULL;}
+
+ gMicOptions.Unload();
+
+ return 0;
+}
diff --git a/private/unimodem/new/mic/mic.h b/private/unimodem/new/mic/mic.h
new file mode 100644
index 000000000..2d1fd1697
--- /dev/null
+++ b/private/unimodem/new/mic/mic.h
@@ -0,0 +1 @@
+int main_mic(int argc, char * argv[]);
diff --git a/private/unimodem/new/mic/notes.txt b/private/unimodem/new/mic/notes.txt
new file mode 100644
index 000000000..08a196351
--- /dev/null
+++ b/private/unimodem/new/mic/notes.txt
@@ -0,0 +1,231 @@
+Modem Inf Compiler -- MIC
+-------------------------
+
+History:
+ 5/18/96 JosephJ Created
+
+Files:
+
+
+Classes:
+
+-------------------------------
+ CIniFile
+ Bind(FilePath pFilePath)
+ Out(FilePath pFilePath)
+ Section(szName)
+ UnBind()
+ Name
+
+ CIniFileSection
+ CIniFileSection
+ EntryIterator
+ Out(HFILE);
+ Name
+ Line
+
+ CIniFileEntry
+ Name
+ RHS
+ Out(HFILE);
+ Line
+
+ CIniFileEntryIterator
+ NextEntry
+
+ CIniFileLine
+ //Can be one of: blank, annotations, section-header,
+ // entry, entry-continuation, or unknown
+ //State can be one of: ok, warning, error(%d)
+ Type
+ State
+ Text
+
+
+ CIniFileAnnotation
+
+-------------------------------
+
+ CInfFile
+
+ CIniFile
+
+
+ CInfDevice
+
+ CSymbolTable
+ Lookup
+
+ CSymbol
+ GetText
+ GetTextLength
+
+ CInfAddRegList
+ CInfCopyFileList
+
+ CInfRank
+
+ CDisplay
+
+--------------------------------
+
+CModemDevice::CreateModem(CInfFile *pInf, CDeviceLocation *pDevLoc)
+{
+ // GetVersion
+ pInf->Version
+
+ // Get manufacturer
+ ptbszManufacturer = pDevLoc->ptbszManufacturer;
+
+ // Get Device name.
+ ptbszName = pDevLoc->Name
+
+ // Get InstallSection
+ pInstallSec = pInf->InstallSection(pDevice->ptbszInstallSection);
+
+ // Walk Addreg list
+ {
+ DWORD rgdwChecksum[MAX];
+ CAddregIterator pAddregIter = pDevLoc->AddregIterator();
+
+ for (int i=0, CAddreg pAddReg=0;(pAddreg=pAddregIter->Iterate());i++)
+ {
+ // For mow, add checksum to array
+ rgdwChecksum[i++] = pAddreg->Checksum();
+ }
+
+ // Compute Addreg checksum
+ ::CRC16((LPBYTE)rgdwChecksum, (i)? (i-1) : 0);
+ }
+
+ // Walk other list...
+ // Copyfiles
+ {
+ }
+
+}
+-------------------------------
+
+Files
+
+Class headers:
+ inf.h CIniFile
+ ini.h CInfFile
+ device.h CInfDevice
+ sym.h CInfSymbol
+---------------------------------
+
+class CGenericIterator
+{
+
+public:
+ CGenericIterator(void * pData, const CGenericIterator *pNext)
+ {m_pData=pData; m_pNext = pNext;}
+ ~CGenericIterator();
+
+ const CGenericIterator * Next (void) const {return pNext;}
+ void * Data (void) const {return pData;}
+
+private:
+
+ const CGenericIterator * m_pNext;
+ void * m_pNext;
+};
+
+for (; pIter, pIter = pIter->Next())
+{
+ const CAddregSection * pAddreg = (const CAddregSection *) pIter;
+ // blah blah...
+}
+
+ CInfString
+------------------------------------------
+
+CSyncObject
+
+ Load
+ Unload
+
+ DWORD OpenSession(void)
+ void CloseSession(DWORD)
+
+ EnterCrit
+ LeaveCrit
+
+private:
+ CRITICAL_SECTION
+ Slist EventList
+ UINT uRefCount;
+ enum {UNLOADED, MARKED_FOR_UNLOAD, LOADED} eState;
+
+--------------------------------------------------
+[Support APIs from sdk\inc\setupi.h]
+SetupGetInfInformation
+SetupQueryInfFileInformation useful?
+SetupQueryInfVersionInformation useful?
+SetupGetInfFileList useful?
+SetupOpenInfFile
+SetupOpenMasterInf
+SetupOpenAppendInfFileW
+SetupCloseInfFile
+SetupFindFirstLineA useful?
+SetupFindNextLine useful?
+SetupFindNextMatchLine useful?
+SetupGetLineByIndex useful?
+SetupGetLineCount useful?
+SetupGetLineText useful?
+SetupGetFieldCount useful?
+SetupGetStringField useful?
+SetupGetIntField useful?
+SetupGetMultiSzField useful?
+SetupGetBinaryField useful?
+SetupGetFileCompressionInfo
+SetupGetSourceFileLocation useful?
+SetupGetSourceFileSize
+SetupGetTargetPath useful?
+Error codes:
+ Inf parse outcomes:
+ ERROR_EXPECTED_SECTION_NAME
+ ERROR_BAD_SECTION_NAME_LINE
+ ERROR_SECTION_NAME_TOO_LONG
+ ERROR_GENERAL_SYNTAX
+
+ Inf runtime errors:
+ ERROR_WRONG_INF_STYLE
+ ERROR_SECTION_NOT_FOUND
+ ERROR_LINE_NOT_FOUND
+--------------------
+6/9/96
+
+Inf:Load:
+
+-- Read Version Information
+-- Read Manufacturer List Section
+ Read Manufacturer Entry
+ Read Manufacturer Section
+ Read Model Entry
+ Read Install Section
+ Read AddregSection
+ ...
+ Read ControlFlags section
+
+---------
+6/12/96
+-- concept of a Validate member function for each class:
+BOOL Validate(void)
+{
+ if (!this) return FALSE;
+
+ _try
+ {
+ test other things, like an object-type signature (each object can
+ have an object-type signature, which is assigned by the constructur
+ and cleared by the destructor.
+ }
+ _except(....)
+ {
+ }
+
+end:
+
+}
diff --git a/private/unimodem/new/mic/resp.cpp b/private/unimodem/new/mic/resp.cpp
new file mode 100644
index 000000000..fcb92de7d
--- /dev/null
+++ b/private/unimodem/new/mic/resp.cpp
@@ -0,0 +1,3538 @@
+//
+// Copyright (c) 1996 Microsoft Corporation
+//
+#include <windows.h>
+
+const TCHAR *rgpszSimpleResp[] =
+{
+ "How",
+ "Now",
+ "Brown",
+ "Cow!",
+ NULL
+};
+
+const TCHAR *rgpszComplexResp[] =
+{
+"-SFA",
+"-SMD",
+"-SRA",
+"-SRC:",
+"-SRQ",
+"-SSV",
+"-STO",
+"-SVM",
+"+F4",
+"+F4/+FCERROR",
+"+F4@",
+"+FC-FCERROR",
+"+FC@",
+"+FCERROR",
+"+FCON",
+"@",
+"@#-SFA@#",
+"@#-SMD@#",
+"@#-SRA@#",
+"@#-SRC:@#",
+"@#-SRQ@#",
+"@#-SSV@#",
+"@#-STO@#",
+"@#-SVM@#",
+"@# CONNECT 1200 LAPM COMPRESSED@#",
+"@#+FCERROR@@#",
+"@#+FCERROR@#",
+"@#@#NO CARRIER@#",
+"@#ABORD@#",
+"@#ABORTED@#",
+"@#AUTOLOGON FAILED@#",
+"@#BLACKLISTED@#",
+"@#BUSY@#",
+"@#C@#",
+"@#CALL LOCKED:BLACKLISTED@#",
+"@#CARRIER 1200@#",
+"@#CARRIER 2400@#",
+"@#CARRIER 300@#",
+"@#CARRIER 600@#",
+"@#CARRIER 1200 V.34@#",
+"@#CARRIER 1200/75",
+"@#CARRIER 1200/75 V.23@#",
+"@#CARRIER 1200/75/VFC@#",
+"@#CARRIER 1200/75@#",
+"@#CARRIER 1200/VFC@#",
+"@#CARRIER 1200@#",
+"@#CARRIER 12000/VFC@#",
+"@#CARRIER 12000@#",
+"@#CARRIER 1200TX/75RX V.23@#",
+"@#CARRIER 14400 V.34@#",
+"@#CARRIER 14400/VFC@ @#",
+"@#CARRIER 14400/VFC@#",
+"@#CARRIER 14400@#",
+"@#CARRIER 16800 V.34@#",
+"@#CARRIER 16800/VFC@@#",
+"@#CARRIER 16800/VFC@#",
+"@#CARRIER 16800@#",
+"@#CARRIER 19200 V.34@#",
+"@#CARRIER 19200/VFC@@#",
+"@#CARRIER 19200/VFC@#",
+"@#CARRIER 19200@#",
+"@#CARRIER 21600 V.34@#",
+"@#CARRIER 21600/VFC@@#",
+"@#CARRIER 21600/VFC@#",
+"@#CARRIER 21600@#",
+"@#CARRIER 2400 V.34@#",
+"@#CARRIER 2400/VFC@#",
+"@#CARRIER 2400@#",
+"@#CARRIER 24000 V.34@#",
+"@#CARRIER 24000/VFC@@#",
+"@#CARRIER 24000/VFC@#",
+"@#CARRIER 24000@#",
+"@#CARRIER 26400 V.34@#",
+"@#CARRIER 26400/VFC@@#",
+"@#CARRIER 26400/VFC@#",
+"@#CARRIER 26400@#",
+"@#CARRIER 28800 V.34@#",
+"@#CARRIER 28800/VFC@@#",
+"@#CARRIER 28800/VFC@#",
+"@#CARRIER 28800@#",
+"@#CARRIER 300 V.34@#",
+"@#CARRIER 300/VFC@#",
+"@#CARRIER 300@#",
+"@#CARRIER 4800 V.34@#",
+"@#CARRIER 4800/VFC@#",
+"@#CARRIER 4800@#",
+"@#CARRIER 600@#",
+"@#CARRIER 64000@#",
+"@#CARRIER 7200 V.34@#",
+"@#CARRIER 7200/VFC@#",
+"@#CARRIER 7200@#",
+"@#CARRIER 75/1200",
+"@#CARRIER 75/1200 V.23@#",
+"@#CARRIER 75/1200/VFC@#",
+"@#CARRIER 75/1200@#",
+"@#CARRIER 75TX/1200RX V.23@#",
+"@#CARRIER 9600 V.34@#",
+"@#CARRIER 9600/VFC@#",
+"@#CARRIER 9600@#",
+"@#CED@# ",
+"@#COMPRESSION :CLASS5@#",
+"@#COMPRESSION NONE@#",
+"@#COMPRESSION V.42BIS@#",
+"@#COMPRESSION: ADC",
+"@#COMPRESSION: ADC@#",
+"@#COMPRESSION: CLASS 5@#",
+"@#COMPRESSION: CLASS5@#",
+"@#COMPRESSION: MNP5@#",
+"@#COMPRESSION: NONE@#",
+"@#COMPRESSION: V.42 bis@#",
+"@#COMPRESSION: V.42 BIS@#",
+"@#COMPRESSION: V.42 bis@#",
+"@#COMPRESSION: V.42 BIS@#",
+"@#COMPRESSION: V.42 bis@#",
+"@#COMPRESSION: V.42 BIS@#",
+"@#COMPRESSION: V.42 bis@#",
+"@#COMPRESSION: V.42 BIS@#",
+"@#COMPRESSION: V.42 bis@#",
+"@#COMPRESSION: V.42 BIS@#",
+"@#COMPRESSION: V.42BIS@#",
+"@#COMPRESSION: V.42bis@#",
+"@#COMPRESSION: V.42BIS@#",
+"@#COMPRESSION: V.42bis@#",
+"@#COMPRESSION: V.42BIS@#",
+"@#COMPRESSION: V.42bis@#",
+"@#COMPRESSION: V.42BIS@#",
+"@#COMPRESSION: V.42bis@#",
+"@#COMPRESSION: V.42BIS@#",
+"@#COMPRESSION: V.42bis@#",
+"@#COMPRESSION: V.42BIS@#",
+"@#COMPRESSION: V.42bis@#",
+"@#COMPRESSION: V.42BIS@#",
+"@#COMPRESSION: V42BIS@#",
+"@#COMPRESSION:CLASS 5@#",
+"@#COMPRESSION:NONE@#",
+"@#COMPRESSION:V.42bis@#",
+"@#COMPRESSION:V.42BIS@#",
+"@#CONNECT 0600/ARQ@#",
+"@#CONNECT 0600/LAP-M/COMPRESSION@#",
+"@#CONNECT 0600/LAP-M@#",
+"@#CONNECT 0600/LAPM/COMP@#",
+"@#CONNECT 0600/LAPM@#",
+"@#CONNECT 0600/MNP@#",
+"@#CONNECT 0600/NONE@#",
+"@#CONNECT 0600/REL-LAPM V.42 BIS@#",
+"@#CONNECT 0600/REL/COMP@#",
+"@#CONNECT 0600/REL@#",
+"@#CONNECT 0600/V42BIS@#",
+"@#CONNECT 0600@#",
+"@#CONNECT 112000/ARQ/MLP /V120/V42b@#",
+"@#CONNECT 112000/ARQ/MLP /V120@#",
+"@#CONNECT 112000@#",
+"@#CONNECT 115,200/ARQ@#",
+"@#CONNECT 115,200/LAP-M/COMPRESSION@#",
+"@#CONNECT 115,200/LAP-M@#",
+"@#CONNECT 115,200/LAPM/COMP@#",
+"@#CONNECT 115,200/LAPM@#",
+"@#CONNECT 115,200/MNP@#",
+"@#CONNECT 115,200/NONE@#",
+"@#CONNECT 115,200/REL/COMP@#",
+"@#CONNECT 115,200/REL@#",
+"@#CONNECT 115,200/V42@#",
+"@#CONNECT 115,200/V42BIS@#",
+"@#CONNECT 115,200@#",
+"@#CONNECT 115200 ALT / MNP5@#",
+"@#CONNECT 115200 ALT /MNP 5@#",
+"@#CONNECT 115200 ALT@#",
+"@#CONNECT 115200 LAPM / V.42bis@#",
+"@#CONNECT 115200 LAPM /V.42bis@#",
+"@#CONNECT 115200 LAPM@#",
+"@#CONNECT 115200 REL/MNP5@#",
+"@#CONNECT 115200 REL@#",
+"@#CONNECT 115200/ARQ@#",
+"@#CONNECT 115200/LAP-M/COMPRESSION@#",
+"@#CONNECT 115200/LAP-M@#",
+"@#CONNECT 115200/LAPM/COMP@#",
+"@#CONNECT 115200/LAPM@#",
+"@#CONNECT 115200/MNP COMPRESSED@#",
+"@#CONNECT 115200/MNP@#",
+"@#CONNECT 115200/NONE@#",
+"@#CONNECT 115200/REL-LAPM V.42 BIS@#",
+"@#CONNECT 115200/REL-LAPM@#",
+"@#CONNECT 115200/REL-V.42@#",
+"@#CONNECT 115200/REL/COMP@#",
+"@#CONNECT 115200/REL@#",
+"@#CONNECT 115200/V42@#",
+"@#CONNECT 115200/V42BIS@#",
+"@#CONNECT 115200/VBIS@#",
+"@#CONNECT 115200@#",
+"@#CONNECT 115200T/V42BIS@#",
+"@#CONNECT 1200 ALT / MNP5@#",
+"@#CONNECT 1200 ALT /MNP 5@#",
+"@#CONNECT 1200 ALT@#",
+"@#CONNECT 1200 EC/V42BIS@#",
+"@#CONNECT 1200 EC@#",
+"@#CONNECT 1200 LAPM / V.42bis@#",
+"@#CONNECT 1200 LAPM /V.42bis@#",
+"@#CONNECT 1200 LAPM COMPRESSED@#",
+"@#CONNECT 1200 LAPM@#",
+"@#CONNECT 1200 NORMAL@#",
+"@#CONNECT 1200 REL/MNP5@#",
+"@#CONNECT 1200 REL/V42@#",
+"@#CONNECT 1200 REL/V42BIS@#",
+"@#CONNECT 1200 REL@#",
+"@#CONNECT 1200 RELIABLE COMPRESSED@#",
+"@#CONNECT 1200 RELIABLE@#",
+"@#CONNECT 1200 V.42@#",
+"@#CONNECT 1200/75",
+"@#CONNECT 1200/75/ARQ@#",
+"@#CONNECT 1200/75/LAP-M/COMPRESSION@#",
+"@#CONNECT 1200/75/LAP-M@#",
+"@#CONNECT 1200/75/LAPM/COMP@#",
+"@#CONNECT 1200/75/LAPM@#",
+"@#CONNECT 1200/75/MNP@#",
+"@#CONNECT 1200/75/NONE@#",
+"@#CONNECT 1200/75/REL-LAPM V.42 BIS@#",
+"@#CONNECT 1200/75/REL/COMP@#",
+"@#CONNECT 1200/75/REL@#",
+"@#CONNECT 1200/75/V42@#",
+"@#CONNECT 1200/75/V42BIS@#",
+"@#CONNECT 1200/75@#",
+"@#CONNECT 1200/ARQ/MNP4@#",
+"@#CONNECT 1200/ARQ/MNP5@#",
+"@#CONNECT 1200/ARQ/V.42@#",
+"@#CONNECT 1200/ARQ/V.42bis@#",
+"@#CONNECT 1200/ARQ/V22 /MNP4@#",
+"@#CONNECT 1200/ARQ/V22 /MNP5@#",
+"@#CONNECT 1200/ARQ/V22 /V42 /SREJ@#",
+"@#CONNECT 1200/ARQ/V22 /V42 @#",
+"@#CONNECT 1200/ARQ/V22 /V42b/SREJ@#",
+"@#CONNECT 1200/ARQ/V22 /V42b@#",
+"@#CONNECT 1200/ARQ/V22/MNP4@#",
+"@#CONNECT 1200/ARQ/V22/MNP5@#",
+"@#CONNECT 1200/ARQ/V22/V42 /SREJ@#",
+"@#CONNECT 1200/ARQ/V22/V42 @#",
+"@#CONNECT 1200/ARQ/V22/V42b/SREJ@#",
+"@#CONNECT 1200/ARQ/V22/V42b@#",
+"@#CONNECT 1200/ARQ/V22b /MNP4@#",
+"@#CONNECT 1200/ARQ/V22b /MNP5@#",
+"@#CONNECT 1200/ARQ/V22b /V42 /SREJ@#",
+"@#CONNECT 1200/ARQ/V22b /V42 @#",
+"@#CONNECT 1200/ARQ/V22b /V42b/SREJ@#",
+"@#CONNECT 1200/ARQ/V22b /V42b@#",
+"@#CONNECT 1200/ARQ/V22b/MNP4@#",
+"@#CONNECT 1200/ARQ/V22b/MNP5@#",
+"@#CONNECT 1200/ARQ/V22b/V42 /SREJ@#",
+"@#CONNECT 1200/ARQ/V22b/V42 @#",
+"@#CONNECT 1200/ARQ/V22b/V42b/SREJ@#",
+"@#CONNECT 1200/ARQ/V22b/V42b@#",
+"@#CONNECT 1200/ARQ/V32 /MNP4@#",
+"@#CONNECT 1200/ARQ/V32 /MNP5@#",
+"@#CONNECT 1200/ARQ/V32 /V42 /SREJ@#",
+"@#CONNECT 1200/ARQ/V32 /V42 @#",
+"@#CONNECT 1200/ARQ/V32 /V42b/SREJ@#",
+"@#CONNECT 1200/ARQ/V32 /V42b@#",
+"@#CONNECT 1200/ARQ/V32 /MNP4@#",
+"@#CONNECT 1200/ARQ/V32 /MNP5@#",
+"@#CONNECT 1200/ARQ/V32 /V42 /SREJ@#",
+"@#CONNECT 1200/ARQ/V32 /V42 @#",
+"@#CONNECT 1200/ARQ/V32 /V42b/SREJ@#",
+"@#CONNECT 1200/ARQ/V32 /V42b@#",
+"@#CONNECT 1200/ARQ/V32b /MNP4@#",
+"@#CONNECT 1200/ARQ/V32b /MNP5@#",
+"@#CONNECT 1200/ARQ/V32b /V42 /SREJ@#",
+"@#CONNECT 1200/ARQ/V32b /V42 @#",
+"@#CONNECT 1200/ARQ/V32b /V42b/SREJ@#",
+"@#CONNECT 1200/ARQ/V32b /V42b@#",
+"@#CONNECT 1200/ARQ/V32b/MNP4@#",
+"@#CONNECT 1200/ARQ/V32b/MNP5@#",
+"@#CONNECT 1200/ARQ/V32b/V42 /SREJ@#",
+"@#CONNECT 1200/ARQ/V32b/V42 @#",
+"@#CONNECT 1200/ARQ/V32b/V42b/SREJ@#",
+"@#CONNECT 1200/ARQ/V32b/V42b@#",
+"@#CONNECT 1200/ARQ/V42 /SREJ@#",
+"@#CONNECT 1200/ARQ/V42 @#",
+"@#CONNECT 1200/ARQ/V42b/SREJ@#",
+"@#CONNECT 1200/ARQ/V42b@#",
+"@#CONNECT 1200/ARQ/ZyX /MNP4@#",
+"@#CONNECT 1200/ARQ/ZyX /MNP5@#",
+"@#CONNECT 1200/ARQ/ZyX /V42 /SREJ@#",
+"@#CONNECT 1200/ARQ/ZyX /V42 @#",
+"@#CONNECT 1200/ARQ/ZyX /V42b/SREJ@#",
+"@#CONNECT 1200/ARQ/ZyX /V42b@#",
+"@#CONNECT 1200/ARQ/ZyX /MNP4@#",
+"@#CONNECT 1200/ARQ/ZyX /MNP5@#",
+"@#CONNECT 1200/ARQ/ZyX /V42 /SREJ@#",
+"@#CONNECT 1200/ARQ/ZyX /V42 @#",
+"@#CONNECT 1200/ARQ/ZyX /V42b/SREJ@#",
+"@#CONNECT 1200/ARQ/ZyX /V42b@#",
+"@#CONNECT 1200/ARQ@#",
+"@#CONNECT 1200/COMP@#",
+"@#CONNECT 1200/LAP-M/COMPRESSION@#",
+"@#CONNECT 1200/LAP-M@#",
+"@#CONNECT 1200/LAPM/COMP@#",
+"@#CONNECT 1200/LAPM/V42BIS@#",
+"@#CONNECT 1200/LAPM@#",
+"@#CONNECT 1200/MNP COMPRESSED@#",
+"@#CONNECT 1200/MNP@#",
+"@#CONNECT 1200/NONE@#",
+"@#CONNECT 1200/NOR@#",
+"@#CONNECT 1200/REL-LAPM-COMP@#",
+"@#CONNECT 1200/REL-LAPM V.42 BIS@#",
+"@#CONNECT 1200/REL-LAPM@#",
+"@#CONNECT 1200/REL-MNP-COMP@#",
+"@#CONNECT 1200/REL-MNP@#",
+"@#CONNECT 1200/REL-V.42@#",
+"@#CONNECT 1200/REL 1@# ",
+"@#CONNECT 1200/REL 2@# ",
+"@#CONNECT 1200/REL 3@# ",
+"@#CONNECT 1200/REL 4@# ",
+"@#CONNECT 1200/REL 5@# ",
+"@#CONNECT 1200/REL COMP@#",
+"@#CONNECT 1200/REL COMPRESSED@#",
+"@#CONNECT 1200/REL/COMP@#",
+"@#CONNECT 1200/REL@#",
+"@#CONNECT 1200/RELC@#",
+"@#CONNECT 1200/RELIABLE/LAPM/COMPRESSED@#",
+"@#CONNECT 1200/RELIABLE/LAPM@#",
+"@#CONNECT 1200/RELIABLE/MNP/COMPRESSED@#",
+"@#CONNECT 1200/RELIABLE/MNP@#",
+"@#CONNECT 1200/V42@#",
+"@#CONNECT 1200/V42B@#",
+"@#CONNECT 1200/V42BIS@#",
+"@#CONNECT 1200@#",
+"@#CONNECT 12000 ALT / MNP5@#",
+"@#CONNECT 12000 ALT /MNP 5@#",
+"@#CONNECT 12000 ALT@#",
+"@#CONNECT 12000 EC/V42@#",
+"@#CONNECT 12000 EC/V42BIS@#",
+"@#CONNECT 12000 EC@#",
+"@#CONNECT 12000 LAPM / V.42bis@#",
+"@#CONNECT 12000 LAPM /V.42bis@#",
+"@#CONNECT 12000 LAPM COMPRESSED@#",
+"@#CONNECT 12000 LAPM@#",
+"@#CONNECT 12000 REL/MNP5@#",
+"@#CONNECT 12000 REL/V42@#",
+"@#CONNECT 12000 REL/V42BIS@#",
+"@#CONNECT 12000 REL@#",
+"@#CONNECT 12000 RELIABLE COMPRESSED@#",
+"@#CONNECT 12000 RELIABLE@#",
+"@#CONNECT 12000/ARQ/CELL /MNP4@#",
+"@#CONNECT 12000/ARQ/CELL /MNP5@#",
+"@#CONNECT 12000/ARQ/CELL /V42 /SREJ@#",
+"@#CONNECT 12000/ARQ/CELL /V42 @#",
+"@#CONNECT 12000/ARQ/CELL /V42b/SREJ@#",
+"@#CONNECT 12000/ARQ/CELL /V42b@#",
+"@#CONNECT 12000/ARQ/CELL/MNP4@#",
+"@#CONNECT 12000/ARQ/CELL/MNP5@#",
+"@#CONNECT 12000/ARQ/CELL/V42 /SREJ@#",
+"@#CONNECT 12000/ARQ/CELL/V42 @#",
+"@#CONNECT 12000/ARQ/CELL/V42b/SREJ@#",
+"@#CONNECT 12000/ARQ/CELL/V42b@#",
+"@#CONNECT 12000/ARQ/MNP4@#",
+"@#CONNECT 12000/ARQ/MNP5@#",
+"@#CONNECT 12000/ARQ/V.34/MNP4@#",
+"@#CONNECT 12000/ARQ/V.34/MNP5@#",
+"@#CONNECT 12000/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 12000/ARQ/V.34/V42 @#",
+"@#CONNECT 12000/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 12000/ARQ/V.34/V42b@#",
+"@#CONNECT 12000/ARQ/V.42@#",
+"@#CONNECT 12000/ARQ/V.42bis@#",
+"@#CONNECT 12000/ARQ/V32b /MNP4@#",
+"@#CONNECT 12000/ARQ/V32b /MNP5@#",
+"@#CONNECT 12000/ARQ/V32b /V42 /SREJ@#",
+"@#CONNECT 12000/ARQ/V32b /V42 @#",
+"@#CONNECT 12000/ARQ/V32b /V42b/SREJ@#",
+"@#CONNECT 12000/ARQ/V32b /V42b@#",
+"@#CONNECT 12000/ARQ/V32b/MNP4@#",
+"@#CONNECT 12000/ARQ/V32b/MNP5@#",
+"@#CONNECT 12000/ARQ/V32b/V42 /SREJ@#",
+"@#CONNECT 12000/ARQ/V32b/V42 @#",
+"@#CONNECT 12000/ARQ/V32b/V42b/SREJ@#",
+"@#CONNECT 12000/ARQ/V32b/V42b@#",
+"@#CONNECT 12000/ARQ/V42 /SREJ@#",
+"@#CONNECT 12000/ARQ/V42 @#",
+"@#CONNECT 12000/ARQ/V42b/SREJ@#",
+"@#CONNECT 12000/ARQ/V42b@#",
+"@#CONNECT 12000/ARQ/ZyX /MNP4@#",
+"@#CONNECT 12000/ARQ/ZyX /MNP5@#",
+"@#CONNECT 12000/ARQ/ZyX /V42 /SREJ@#",
+"@#CONNECT 12000/ARQ/ZyX /V42 @#",
+"@#CONNECT 12000/ARQ/ZyX /V42b/SREJ@#",
+"@#CONNECT 12000/ARQ/ZyX /V42b@#",
+"@#CONNECT 12000/ARQ/ZyX /MNP4@#",
+"@#CONNECT 12000/ARQ/ZyX /MNP5@#",
+"@#CONNECT 12000/ARQ/ZyX /V42 /SREJ@#",
+"@#CONNECT 12000/ARQ/ZyX /V42 @#",
+"@#CONNECT 12000/ARQ/ZyX /V42b/SREJ@#",
+"@#CONNECT 12000/ARQ/ZyX /V42b@#",
+"@#CONNECT 12000/ARQ@#",
+"@#CONNECT 12000/COMP@#",
+"@#CONNECT 12000/LAP-M/COMPRESSION@#",
+"@#CONNECT 12000/LAP-M@#",
+"@#CONNECT 12000/LAPM/COMP@#",
+"@#CONNECT 12000/LAPM/V42BIS@#",
+"@#CONNECT 12000/LAPM@#",
+"@#CONNECT 12000/MNP COMPRESSED@#",
+"@#CONNECT 12000/MNP@#",
+"@#CONNECT 12000/NONE@#",
+"@#CONNECT 12000/NOR@#",
+"@#CONNECT 12000/REL-LAPM-COMP@#",
+"@#CONNECT 12000/REL-LAPM V.42 BIS@#",
+"@#CONNECT 12000/REL-LAPM@#",
+"@#CONNECT 12000/REL-MNP-COMP@#",
+"@#CONNECT 12000/REL-MNP@#",
+"@#CONNECT 12000/REL-V.42@#",
+"@#CONNECT 12000/REL COMP@#",
+"@#CONNECT 12000/REL COMPRESSED@#",
+"@#CONNECT 12000/REL/COMP@#",
+"@#CONNECT 12000/REL@#",
+"@#CONNECT 12000/RELC@#",
+"@#CONNECT 12000/RELIABLE/LAPM/COMPRESSED@#",
+"@#CONNECT 12000/RELIABLE/LAPM@#",
+"@#CONNECT 12000/RELIABLE/MNP/COMPRESSED@#",
+"@#CONNECT 12000/RELIABLE/MNP@#",
+"@#CONNECT 12000/V42@#",
+"@#CONNECT 12000/V42B@#",
+"@#CONNECT 12000/V42BIS@#",
+"@#CONNECT 12000@#",
+"@#CONNECT 12000T/V42BIS@#",
+"@#CONNECT 1200T/V42BIS@#",
+"@#CONNECT 1200TX/75RX REL/MNP5@#",
+"@#CONNECT 1200TX/75RX REL@#",
+"@#CONNECT 1200TX/75RX/ARQ@#",
+"@#CONNECT 1200TX/75RX/LAP-M/COMPRESSION@#",
+"@#CONNECT 1200TX/75RX/LAP-M@#",
+"@#CONNECT 1200TX/75RX/LAPM/COMP@#",
+"@#CONNECT 1200TX/75RX/LAPM@#",
+"@#CONNECT 1200TX/75RX/MNP@#",
+"@#CONNECT 1200TX/75RX/NONE@#",
+"@#CONNECT 1200TX/75RX/REL-LAPM V.42 BIS@#",
+"@#CONNECT 1200TX/75RX/REL/COMP@#",
+"@#CONNECT 1200TX/75RX/REL@#",
+"@#CONNECT 1200TX/75RX/V42@#",
+"@#CONNECT 1200TX/75RX/V42BIS@#",
+"@#CONNECT 1200TX/75RX@#",
+"@#CONNECT 12200/ARQ/V.34/MNP4@#",
+"@#CONNECT 12200/ARQ/V.34/MNP5@#",
+"@#CONNECT 12200/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 12200/ARQ/V.34/V42 @#",
+"@#CONNECT 12200/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 12200/ARQ/V.34/V42b@#",
+"@#CONNECT 12200@#",
+"@#CONNECT 1275@#",
+"@#CONNECT 128000/ARQ/MLP /X.75/V42b@#",
+"@#CONNECT 128000/ARQ/MLP /X.75@#",
+"@#CONNECT 128000@#",
+"@#CONNECT 14400 ALT / MNP5@#",
+"@#CONNECT 14400 ALT /MNP 5@#",
+"@#CONNECT 14400 ALT@#",
+"@#CONNECT 14400 EC/V42@#",
+"@#CONNECT 14400 EC/V42BIS@#",
+"@#CONNECT 14400 EC@#",
+"@#CONNECT 14400 LAPM / V.42bis@#",
+"@#CONNECT 14400 LAPM /V.42bis@#",
+"@#CONNECT 14400 LAPM COMPRESSED@#",
+"@#CONNECT 14400 LAPM@#",
+"@#CONNECT 14400 NORMAL@#",
+"@#CONNECT 14400 REL/MNP5@#",
+"@#CONNECT 14400 REL/V42@#",
+"@#CONNECT 14400 REL/V42BIS@#",
+"@#CONNECT 14400 REL@#",
+"@#CONNECT 14400 RELIABLE COMPRESSED@#",
+"@#CONNECT 14400 RELIABLE@#",
+"@#CONNECT 14400 V.42@#",
+"@#CONNECT 14400/ARQ/CELL /MNP4@#",
+"@#CONNECT 14400/ARQ/CELL /MNP5@#",
+"@#CONNECT 14400/ARQ/CELL /V42 /SREJ@#",
+"@#CONNECT 14400/ARQ/CELL /V42 @#",
+"@#CONNECT 14400/ARQ/CELL /V42b/SREJ@#",
+"@#CONNECT 14400/ARQ/CELL /V42b@#",
+"@#CONNECT 14400/ARQ/CELL/MNP4@#",
+"@#CONNECT 14400/ARQ/CELL/MNP5@#",
+"@#CONNECT 14400/ARQ/CELL/V42 /SREJ@#",
+"@#CONNECT 14400/ARQ/CELL/V42 @#",
+"@#CONNECT 14400/ARQ/CELL/V42b/SREJ@#",
+"@#CONNECT 14400/ARQ/CELL/V42b@#",
+"@#CONNECT 14400/ARQ/MNP4@#",
+"@#CONNECT 14400/ARQ/MNP5@#",
+"@#CONNECT 14400/ARQ/V.34/MNP4@#",
+"@#CONNECT 14400/ARQ/V.34/MNP5@#",
+"@#CONNECT 14400/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 14400/ARQ/V.34/V42 @#",
+"@#CONNECT 14400/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 14400/ARQ/V.34/V42b@#",
+"@#CONNECT 14400/ARQ/V.42@#",
+"@#CONNECT 14400/ARQ/V.42bis@#",
+"@#CONNECT 14400/ARQ/V32b /MNP4@#",
+"@#CONNECT 14400/ARQ/V32b /MNP5@#",
+"@#CONNECT 14400/ARQ/V32b /V42 /SREJ@#",
+"@#CONNECT 14400/ARQ/V32b /V42 @#",
+"@#CONNECT 14400/ARQ/V32b /V42b/SREJ@#",
+"@#CONNECT 14400/ARQ/V32b /V42b@#",
+"@#CONNECT 14400/ARQ/V32b/MNP4@#",
+"@#CONNECT 14400/ARQ/V32b/MNP5@#",
+"@#CONNECT 14400/ARQ/V32b/V42 /SREJ@#",
+"@#CONNECT 14400/ARQ/V32b/V42 @#",
+"@#CONNECT 14400/ARQ/V32b/V42b/SREJ@#",
+"@#CONNECT 14400/ARQ/V32b/V42b@#",
+"@#CONNECT 14400/ARQ/V42 /SREJ@#",
+"@#CONNECT 14400/ARQ/V42 @#",
+"@#CONNECT 14400/ARQ/V42b/SREJ@#",
+"@#CONNECT 14400/ARQ/V42b@#",
+"@#CONNECT 14400/ARQ/ZyX /MNP4@#",
+"@#CONNECT 14400/ARQ/ZyX /MNP5@#",
+"@#CONNECT 14400/ARQ/ZyX /V42 /SREJ@#",
+"@#CONNECT 14400/ARQ/ZyX /V42 @#",
+"@#CONNECT 14400/ARQ/ZyX /V42b/SREJ@#",
+"@#CONNECT 14400/ARQ/ZyX /V42b@#",
+"@#CONNECT 14400/ARQ/ZyX /MNP4@#",
+"@#CONNECT 14400/ARQ/ZyX /MNP5@#",
+"@#CONNECT 14400/ARQ/ZyX /V42 /SREJ@#",
+"@#CONNECT 14400/ARQ/ZyX /V42 @#",
+"@#CONNECT 14400/ARQ/ZyX /V42b/SREJ@#",
+"@#CONNECT 14400/ARQ/ZyX /V42b@#",
+"@#CONNECT 14400/ARQ@#",
+"@#CONNECT 14400/COMP@#",
+"@#CONNECT 14400/LAP-M/COMPRESSION@#",
+"@#CONNECT 14400/LAP-M@#",
+"@#CONNECT 14400/LAPM/COMP@#",
+"@#CONNECT 14400/LAPM/V42BIS@#",
+"@#CONNECT 14400/LAPM@#",
+"@#CONNECT 14400/MNP COMPRESSED@#",
+"@#CONNECT 14400/MNP@#",
+"@#CONNECT 14400/NONE@#",
+"@#CONNECT 14400/NOR@#",
+"@#CONNECT 14400/REL-LAPM-COMP@#",
+"@#CONNECT 14400/REL-LAPM V.42 BIS@#",
+"@#CONNECT 14400/REL-LAPM@#",
+"@#CONNECT 14400/REL-MNP-COMP@#",
+"@#CONNECT 14400/REL-MNP@#",
+"@#CONNECT 14400/REL-V.42@#",
+"@#CONNECT 14400/REL COMP@#",
+"@#CONNECT 14400/REL COMPRESSED@#",
+"@#CONNECT 14400/REL/COMP@#",
+"@#CONNECT 14400/REL@#",
+"@#CONNECT 14400/RELC@#",
+"@#CONNECT 14400/RELIABLE/LAPM/COMPRESSED@#",
+"@#CONNECT 14400/RELIABLE/LAPM@#",
+"@#CONNECT 14400/RELIABLE/MNP/COMPRESSED@#",
+"@#CONNECT 14400/RELIABLE/MNP@#",
+"@#CONNECT 14400/V42@#",
+"@#CONNECT 14400/V42B@#",
+"@#CONNECT 14400/V42BIS@#",
+"@#CONNECT 14400@#",
+"@#CONNECT 14400T RELIABLE@#",
+"@#CONNECT 14400T V.42@#",
+"@#CONNECT 14400T/V42BIS@#",
+"@#CONNECT 14600/ARQ/V.34/MNP4@#",
+"@#CONNECT 14600/ARQ/V.34/MNP5@#",
+"@#CONNECT 14600/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 14600/ARQ/V.34/V42 @#",
+"@#CONNECT 14600/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 14600/ARQ/V.34/V42b@#",
+"@#CONNECT 14600@#",
+"@#CONNECT 16000 EC/V42BIS@#",
+"@#CONNECT 16800 EC/V42@#",
+"@#CONNECT 16800 EC/V42BIS@#",
+"@#CONNECT 16800 EC@#",
+"@#CONNECT 16800 LAPM COMPRESSED@#",
+"@#CONNECT 16800 LAPM@#",
+"@#CONNECT 16800 REL/MNP5@#",
+"@#CONNECT 16800 REL/V42@#",
+"@#CONNECT 16800 REL/V42BIS@#",
+"@#CONNECT 16800 REL@#",
+"@#CONNECT 16800 RELIABLE COMPRESSED@#",
+"@#CONNECT 16800 RELIABLE@#",
+"@#CONNECT 16800/ARQ/MNP4@#",
+"@#CONNECT 16800/ARQ/MNP5@#",
+"@#CONNECT 16800/ARQ/V.34/MNP4@#",
+"@#CONNECT 16800/ARQ/V.34/MNP5@#",
+"@#CONNECT 16800/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 16800/ARQ/V.34/V42 @#",
+"@#CONNECT 16800/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 16800/ARQ/V.34/V42b@#",
+"@#CONNECT 16800/ARQ/V.42@#",
+"@#CONNECT 16800/ARQ/V.42bis@#",
+"@#CONNECT 16800/ARQ/V42 /SREJ@#",
+"@#CONNECT 16800/ARQ/V42 @#",
+"@#CONNECT 16800/ARQ/V42b/SREJ@#",
+"@#CONNECT 16800/ARQ/V42b@#",
+"@#CONNECT 16800/ARQ/ZyX /MNP4@#",
+"@#CONNECT 16800/ARQ/ZyX /MNP5@#",
+"@#CONNECT 16800/ARQ/ZyX /V42 /SREJ@#",
+"@#CONNECT 16800/ARQ/ZyX /V42 @#",
+"@#CONNECT 16800/ARQ/ZyX /V42b/SREJ@#",
+"@#CONNECT 16800/ARQ/ZyX /V42b@#",
+"@#CONNECT 16800/ARQ/ZyX /MNP4@#",
+"@#CONNECT 16800/ARQ/ZyX /MNP5@#",
+"@#CONNECT 16800/ARQ/ZyX /V42 /SREJ@#",
+"@#CONNECT 16800/ARQ/ZyX /V42 @#",
+"@#CONNECT 16800/ARQ/ZyX /V42b/SREJ@#",
+"@#CONNECT 16800/ARQ/ZyX /V42b@#",
+"@#CONNECT 16800/ARQ@#",
+"@#CONNECT 16800/COMP@#",
+"@#CONNECT 16800/LAP-M/COMPRESSION@#",
+"@#CONNECT 16800/LAP-M@#",
+"@#CONNECT 16800/LAPM/COMP@#",
+"@#CONNECT 16800/LAPM/V42BIS@#",
+"@#CONNECT 16800/LAPM@#",
+"@#CONNECT 16800/MNP COMPRESSED@#",
+"@#CONNECT 16800/MNP@#",
+"@#CONNECT 16800/NONE@#",
+"@#CONNECT 16800/NOR@#",
+"@#CONNECT 16800/REL-LAPM V.42 BIS@#",
+"@#CONNECT 16800/REL-LAPM@#",
+"@#CONNECT 16800/REL-V.42@#",
+"@#CONNECT 16800/REL COMP@#",
+"@#CONNECT 16800/REL/COMP@#",
+"@#CONNECT 16800/REL@#",
+"@#CONNECT 16800/RELIABLE/LAPM/COMPRESSED@#",
+"@#CONNECT 16800/RELIABLE/LAPM@#",
+"@#CONNECT 16800/RELIABLE/MNP/COMPRESSED@#",
+"@#CONNECT 16800/RELIABLE/MNP@#",
+"@#CONNECT 16800/V42@#",
+"@#CONNECT 16800/V42BIS@#",
+"@#CONNECT 16800@#",
+"@#CONNECT 16800T/V42BIS@#",
+"@#CONNECT 17000/ARQ/V.34/MNP4@#",
+"@#CONNECT 17000/ARQ/V.34/MNP5@#",
+"@#CONNECT 17000/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 17000/ARQ/V.34/V42 @#",
+"@#CONNECT 17000/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 17000/ARQ/V.34/V42b@#",
+"@#CONNECT 17000@#",
+"@#CONNECT 19200 ALT / MNP5@#",
+"@#CONNECT 19200 ALT /MNP 5@#",
+"@#CONNECT 19200 ALT@#",
+"@#CONNECT 19200 EC/BIS@#",
+"@#CONNECT 19200 EC/V42@#",
+"@#CONNECT 19200 EC/V42BIZ@#",
+"@#CONNECT 19200 EC@#",
+"@#CONNECT 19200 LAPM / V.42bis@#",
+"@#CONNECT 19200 LAPM /V.42bis@#",
+"@#CONNECT 19200 LAPM COMPRESSED@#",
+"@#CONNECT 19200 LAPM@#",
+"@#CONNECT 19200 REL/MNP5@#",
+"@#CONNECT 19200 REL/V42@#",
+"@#CONNECT 19200 REL/V42BIS@#",
+"@#CONNECT 19200 REL@#",
+"@#CONNECT 19200 RELIABLE COMPRESSED@#",
+"@#CONNECT 19200 RELIABLE@#",
+"@#CONNECT 19200/ARQ/MNP4@#",
+"@#CONNECT 19200/ARQ/MNP5@#",
+"@#CONNECT 19200/ARQ/V.34/MNP4@#",
+"@#CONNECT 19200/ARQ/V.34/MNP5@#",
+"@#CONNECT 19200/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 19200/ARQ/V.34/V42 @#",
+"@#CONNECT 19200/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 19200/ARQ/V.34/V42b@#",
+"@#CONNECT 19200/ARQ/V.42@#",
+"@#CONNECT 19200/ARQ/V.42bis@#",
+"@#CONNECT 19200/ARQ/V42 /SREJ@#",
+"@#CONNECT 19200/ARQ/V42 @#",
+"@#CONNECT 19200/ARQ/V42b/SREJ@#",
+"@#CONNECT 19200/ARQ/V42b@#",
+"@#CONNECT 19200/ARQ/ZyX /MNP4@#",
+"@#CONNECT 19200/ARQ/ZyX /MNP5@#",
+"@#CONNECT 19200/ARQ/ZyX /V42 /SREJ@#",
+"@#CONNECT 19200/ARQ/ZyX /V42 @#",
+"@#CONNECT 19200/ARQ/ZyX /V42b/SREJ@#",
+"@#CONNECT 19200/ARQ/ZyX /V42b@#",
+"@#CONNECT 19200/ARQ/ZyX /MNP4@#",
+"@#CONNECT 19200/ARQ/ZyX /MNP5@#",
+"@#CONNECT 19200/ARQ/ZyX /V42 /SREJ@#",
+"@#CONNECT 19200/ARQ/ZyX /V42 @#",
+"@#CONNECT 19200/ARQ/ZyX /V42b/SREJ@#",
+"@#CONNECT 19200/ARQ/ZyX /V42b@#",
+"@#CONNECT 19200/ARQ@#",
+"@#CONNECT 19200/COMP@#",
+"@#CONNECT 19200/LAP-M/COMPRESSION@#",
+"@#CONNECT 19200/LAP-M@#",
+"@#CONNECT 19200/LAPM/COMP@#",
+"@#CONNECT 19200/LAPM/V42BIS@#",
+"@#CONNECT 19200/LAPM@#",
+"@#CONNECT 19200/MNP COMPRESSED@#",
+"@#CONNECT 19200/MNP@#",
+"@#CONNECT 19200/NONE@#",
+"@#CONNECT 19200/NOR@#",
+"@#CONNECT 19200/REL-LAPM V.42 BIS@#",
+"@#CONNECT 19200/REL-LAPM@#",
+"@#CONNECT 19200/REL-V.42@#",
+"@#CONNECT 19200/REL COMP@#",
+"@#CONNECT 19200/REL/COMP@#",
+"@#CONNECT 19200/REL@#",
+"@#CONNECT 19200/RELIABLE/LAPM/COMPRESSED@#",
+"@#CONNECT 19200/RELIABLE/LAPM@#",
+"@#CONNECT 19200/RELIABLE/MNP/COMPRESSED@#",
+"@#CONNECT 19200/RELIABLE/MNP@#",
+"@#CONNECT 19200/V.110@#",
+"@#CONNECT 19200/V42@#",
+"@#CONNECT 19200/V42BIS@#",
+"@#CONNECT 19200@#",
+"@#CONNECT 19200T/V42BIS@#",
+"@#CONNECT 19400/ARQ/V.34/MNP4@#",
+"@#CONNECT 19400/ARQ/V.34/MNP5@#",
+"@#CONNECT 19400/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 19400/ARQ/V.34/V42 @#",
+"@#CONNECT 19400/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 19400/ARQ/V.34/V42b@#",
+"@#CONNECT 19400@#",
+"@#CONNECT 21600 LAPM COMPRESSED@#",
+"@#CONNECT 21600 LAPM@#",
+"@#CONNECT 21600 REL/MNP5@#",
+"@#CONNECT 21600 REL@#",
+"@#CONNECT 21600 RELIABLE COMPRESSED@#",
+"@#CONNECT 21600 RELIABLE@#",
+"@#CONNECT 21600/ARQ/V.34/MNP4@#",
+"@#CONNECT 21600/ARQ/V.34/MNP5@#",
+"@#CONNECT 21600/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 21600/ARQ/V.34/V42 @#",
+"@#CONNECT 21600/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 21600/ARQ/V.34/V42b@#",
+"@#CONNECT 21600/ARQ@#",
+"@#CONNECT 21600/COMP@#",
+"@#CONNECT 21600/LAP-M/COMPRESSION@#",
+"@#CONNECT 21600/LAP-M@#",
+"@#CONNECT 21600/LAPM/COMP@#",
+"@#CONNECT 21600/LAPM/V42BIS@#",
+"@#CONNECT 21600/LAPM@#",
+"@#CONNECT 21600/MNP COMPRESSED@#",
+"@#CONNECT 21600/MNP@#",
+"@#CONNECT 21600/NONE@#",
+"@#CONNECT 21600/NOR@#",
+"@#CONNECT 21600/REL-LAPM V.42 BIS@#",
+"@#CONNECT 21600/REL-LAPM@#",
+"@#CONNECT 21600/REL-V.42@#",
+"@#CONNECT 21600/REL COMP@#",
+"@#CONNECT 21600/REL/COMP@#",
+"@#CONNECT 21600/REL@#",
+"@#CONNECT 21600/RELIABLE/LAPM/COMPRESSED@#",
+"@#CONNECT 21600/RELIABLE/LAPM@#",
+"@#CONNECT 21600/RELIABLE/MNP/COMPRESSED@#",
+"@#CONNECT 21600/RELIABLE/MNP@#",
+"@#CONNECT 21600/V42@#",
+"@#CONNECT 21600/V42BIS@#",
+"@#CONNECT 21600@#",
+"@#CONNECT 21600T/V42BIS@#",
+"@#CONNECT 21800/ARQ/V.34/MNP4@#",
+"@#CONNECT 21800/ARQ/V.34/MNP5@#",
+"@#CONNECT 21800/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 21800/ARQ/V.34/V42 @#",
+"@#CONNECT 21800/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 21800/ARQ/V.34/V42b@#",
+"@#CONNECT 21800@#",
+"@#CONNECT 230400/ARQ@#",
+"@#CONNECT 230400/LAP-M@#",
+"@#CONNECT 230400/LAPM/COMP@#",
+"@#CONNECT 230400/LAPM@#",
+"@#CONNECT 230400/MNP@#",
+"@#CONNECT 230400/NONE@#",
+"@#CONNECT 230400/REL/COMP@#",
+"@#CONNECT 230400/REL@#",
+"@#CONNECT 230400/V42BIS@#",
+"@#CONNECT 230400@#",
+"@#CONNECT 240/MNP@#",
+"@#CONNECT 2400 @#",
+"@#CONNECT 2400 ALT / MNP5@#",
+"@#CONNECT 2400 ALT /MNP 5@#",
+"@#CONNECT 2400 ALT@#",
+"@#CONNECT 2400 EC/V42@#",
+"@#CONNECT 2400 EC/V42BIS@#",
+"@#CONNECT 2400 EC@#",
+"@#CONNECT 2400 LAPM / V.42bis@#",
+"@#CONNECT 2400 LAPM /V.42bis@#",
+"@#CONNECT 2400 LAPM COMPRESSED@#",
+"@#CONNECT 2400 LAPM@#",
+"@#CONNECT 2400 NORMAL@#",
+"@#CONNECT 2400 REL/MNP5@#",
+"@#CONNECT 2400 REL/V42@#",
+"@#CONNECT 2400 REL/V42BIS@#",
+"@#CONNECT 2400 REL@#",
+"@#CONNECT 2400 RELIABLE COMPRESSED@#",
+"@#CONNECT 2400 RELIABLE@#",
+"@#CONNECT 2400 V.42@#",
+"@#CONNECT 2400/ARQ/CELL /MNP4@#",
+"@#CONNECT 2400/ARQ/CELL /MNP5@#",
+"@#CONNECT 2400/ARQ/CELL /V42 /SREJ@#",
+"@#CONNECT 2400/ARQ/CELL /V42 @#",
+"@#CONNECT 2400/ARQ/CELL /V42b/SREJ@#",
+"@#CONNECT 2400/ARQ/CELL /V42b@#",
+"@#CONNECT 2400/ARQ/CELL/MNP4@#",
+"@#CONNECT 2400/ARQ/CELL/MNP5@#",
+"@#CONNECT 2400/ARQ/CELL/V42 /SREJ@#",
+"@#CONNECT 2400/ARQ/CELL/V42 @#",
+"@#CONNECT 2400/ARQ/CELL/V42b/SREJ@#",
+"@#CONNECT 2400/ARQ/CELL/V42b@#",
+"@#CONNECT 2400/ARQ/MNP4@#",
+"@#CONNECT 2400/ARQ/MNP5@#",
+"@#CONNECT 2400/ARQ/V.34/MNP4@#",
+"@#CONNECT 2400/ARQ/V.34/MNP5@#",
+"@#CONNECT 2400/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 2400/ARQ/V.34/V42 @#",
+"@#CONNECT 2400/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 2400/ARQ/V.34/V42b@#",
+"@#CONNECT 2400/ARQ/V.42@#",
+"@#CONNECT 2400/ARQ/V.42bis@#",
+"@#CONNECT 2400/ARQ/V22b /MNP4@#",
+"@#CONNECT 2400/ARQ/V22b /MNP5@#",
+"@#CONNECT 2400/ARQ/V22b /V42 /SREJ@#",
+"@#CONNECT 2400/ARQ/V22b /V42 @#",
+"@#CONNECT 2400/ARQ/V22b /V42b/SREJ@#",
+"@#CONNECT 2400/ARQ/V22b /V42b@#",
+"@#CONNECT 2400/ARQ/V22b/MNP4@#",
+"@#CONNECT 2400/ARQ/V22b/MNP5@#",
+"@#CONNECT 2400/ARQ/V22b/V42 /SREJ@#",
+"@#CONNECT 2400/ARQ/V22b/V42 @#",
+"@#CONNECT 2400/ARQ/V22b/V42b/SREJ@#",
+"@#CONNECT 2400/ARQ/V22b/V42b@#",
+"@#CONNECT 2400/ARQ/V32 /MNP4@#",
+"@#CONNECT 2400/ARQ/V32 /MNP5@#",
+"@#CONNECT 2400/ARQ/V32 /V42 /SREJ@#",
+"@#CONNECT 2400/ARQ/V32 /V42 @#",
+"@#CONNECT 2400/ARQ/V32 /V42b/SREJ@#",
+"@#CONNECT 2400/ARQ/V32 /V42b@#",
+"@#CONNECT 2400/ARQ/V32 /MNP4@#",
+"@#CONNECT 2400/ARQ/V32 /MNP5@#",
+"@#CONNECT 2400/ARQ/V32 /V42 /SREJ@#",
+"@#CONNECT 2400/ARQ/V32 /V42 @#",
+"@#CONNECT 2400/ARQ/V32 /V42b/SREJ@#",
+"@#CONNECT 2400/ARQ/V32 /V42b@#",
+"@#CONNECT 2400/ARQ/V32b /MNP4@#",
+"@#CONNECT 2400/ARQ/V32b /MNP5@#",
+"@#CONNECT 2400/ARQ/V32b /V42 /SREJ@#",
+"@#CONNECT 2400/ARQ/V32b /V42 @#",
+"@#CONNECT 2400/ARQ/V32b /V42b/SREJ@#",
+"@#CONNECT 2400/ARQ/V32b /V42b@#",
+"@#CONNECT 2400/ARQ/V32b/MNP4@#",
+"@#CONNECT 2400/ARQ/V32b/MNP5@#",
+"@#CONNECT 2400/ARQ/V32b/V42 /SREJ@#",
+"@#CONNECT 2400/ARQ/V32b/V42 @#",
+"@#CONNECT 2400/ARQ/V32b/V42b/SREJ@#",
+"@#CONNECT 2400/ARQ/V32b/V42b@#",
+"@#CONNECT 2400/ARQ/V42 /SREJ@#",
+"@#CONNECT 2400/ARQ/V42 @#",
+"@#CONNECT 2400/ARQ/V42b/SREJ@#",
+"@#CONNECT 2400/ARQ/V42b@#",
+"@#CONNECT 2400/ARQ/ZyX /MNP4@#",
+"@#CONNECT 2400/ARQ/ZyX /MNP5@#",
+"@#CONNECT 2400/ARQ/ZyX /V42 /SREJ@#",
+"@#CONNECT 2400/ARQ/ZyX /V42 @#",
+"@#CONNECT 2400/ARQ/ZyX /V42b/SREJ@#",
+"@#CONNECT 2400/ARQ/ZyX /V42b@#",
+"@#CONNECT 2400/ARQ/ZyX /MNP4@#",
+"@#CONNECT 2400/ARQ/ZyX /MNP5@#",
+"@#CONNECT 2400/ARQ/ZyX /V42 /SREJ@#",
+"@#CONNECT 2400/ARQ/ZyX /V42 @#",
+"@#CONNECT 2400/ARQ/ZyX /V42b/SREJ@#",
+"@#CONNECT 2400/ARQ/ZyX /V42b@#",
+"@#CONNECT 2400/ARQ@#",
+"@#CONNECT 2400/COMP@#",
+"@#CONNECT 2400/LAP-M/COMPRESSION@#",
+"@#CONNECT 2400/LAP-M@#",
+"@#CONNECT 2400/LAPM/COMP@#",
+"@#CONNECT 2400/LAPM/V42BIS@#",
+"@#CONNECT 2400/LAPM@#",
+"@#CONNECT 2400/MNP COMPRESSED@#",
+"@#CONNECT 2400/MNP@#",
+"@#CONNECT 2400/NONE@#",
+"@#CONNECT 2400/NOR@#",
+"@#CONNECT 2400/REL-LAPM-COMP@#",
+"@#CONNECT 2400/REL-LAPM V.42 BIS@#",
+"@#CONNECT 2400/REL-LAPM@#",
+"@#CONNECT 2400/REL-MNP-COMP@#",
+"@#CONNECT 2400/REL-MNP@#",
+"@#CONNECT 2400/REL-V.42@#",
+"@#CONNECT 2400/REL 1@# ",
+"@#CONNECT 2400/REL 2@# ",
+"@#CONNECT 2400/REL 3@# ",
+"@#CONNECT 2400/REL 4@# ",
+"@#CONNECT 2400/REL 5@# ",
+"@#CONNECT 2400/REL COMP@#",
+"@#CONNECT 2400/REL COMPRESSED@#",
+"@#CONNECT 2400/REL/COMP@#",
+"@#CONNECT 2400/REL@#",
+"@#CONNECT 2400/RELC@#",
+"@#CONNECT 2400/RELIABLE/LAPM/COMPRESSED@#",
+"@#CONNECT 2400/RELIABLE/LAPM@#",
+"@#CONNECT 2400/RELIABLE/MNP/COMPRESSED@#",
+"@#CONNECT 2400/RELIABLE/MNP@#",
+"@#CONNECT 2400/V42@#",
+"@#CONNECT 2400/V42B@#",
+"@#CONNECT 2400/V42BIS@#",
+"@#CONNECT 2400@#",
+"@#CONNECT 24000 LAPM COMPRESSED@#",
+"@#CONNECT 24000 LAPM@#",
+"@#CONNECT 24000 REL/MNP5@#",
+"@#CONNECT 24000 REL@#",
+"@#CONNECT 24000 RELIABLE COMPRESSED@#",
+"@#CONNECT 24000 RELIABLE@#",
+"@#CONNECT 24000/ARQ/V.34/MNP4@#",
+"@#CONNECT 24000/ARQ/V.34/MNP5@#",
+"@#CONNECT 24000/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 24000/ARQ/V.34/V42 @#",
+"@#CONNECT 24000/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 24000/ARQ/V.34/V42b@#",
+"@#CONNECT 24000/ARQ@#",
+"@#CONNECT 24000/COMP@#",
+"@#CONNECT 24000/LAP-M/COMPRESSION@#",
+"@#CONNECT 24000/LAP-M@#",
+"@#CONNECT 24000/LAPM/COMP@#",
+"@#CONNECT 24000/LAPM/V42BIS@#",
+"@#CONNECT 24000/LAPM@#",
+"@#CONNECT 24000/MNP COMPRESSED@#",
+"@#CONNECT 24000/MNP@#",
+"@#CONNECT 24000/NONE@#",
+"@#CONNECT 24000/NOR@#",
+"@#CONNECT 24000/REL-LAPM V.42 BIS@#",
+"@#CONNECT 24000/REL-LAPM@#",
+"@#CONNECT 24000/REL-V.42@#",
+"@#CONNECT 24000/REL COMP@#",
+"@#CONNECT 24000/REL/COMP@#",
+"@#CONNECT 24000/REL@#",
+"@#CONNECT 24000/RELIABLE/LAPM/COMPRESSED@#",
+"@#CONNECT 24000/RELIABLE/LAPM@#",
+"@#CONNECT 24000/RELIABLE/MNP/COMPRESSED@#",
+"@#CONNECT 24000/RELIABLE/MNP@#",
+"@#CONNECT 24000/V42@#",
+"@#CONNECT 24000/V42BIS@#",
+"@#CONNECT 24000@#",
+"@#CONNECT 24000T/V42BIS@#",
+"@#CONNECT 2400T/V42BIS@#",
+"@#CONNECT 24200/ARQ/V.34/MNP4@#",
+"@#CONNECT 24200/ARQ/V.34/MNP5@#",
+"@#CONNECT 24200/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 24200/ARQ/V.34/V42 @#",
+"@#CONNECT 24200/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 24200/ARQ/V.34/V42b@#",
+"@#CONNECT 24200@#",
+"@#CONNECT 2600/ARQ/V.34/MNP4@#",
+"@#CONNECT 2600/ARQ/V.34/MNP5@#",
+"@#CONNECT 2600/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 2600/ARQ/V.34/V42 @#",
+"@#CONNECT 2600/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 2600/ARQ/V.34/V42b@#",
+"@#CONNECT 2600@#",
+"@#CONNECT 26400 LAPM COMPRESSED<cR>#",
+"@#CONNECT 26400 LAPM@#",
+"@#CONNECT 26400 REL/MNP5@#",
+"@#CONNECT 26400 REL@#",
+"@#CONNECT 26400 RELIABLE COMPRESSED<cR>#",
+"@#CONNECT 26400 RELIABLE@#",
+"@#CONNECT 26400/ARQ/V.34/MNP4@#",
+"@#CONNECT 26400/ARQ/V.34/MNP5@#",
+"@#CONNECT 26400/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 26400/ARQ/V.34/V42 @#",
+"@#CONNECT 26400/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 26400/ARQ/V.34/V42b@#",
+"@#CONNECT 26400/ARQ@#",
+"@#CONNECT 26400/COMP@#",
+"@#CONNECT 26400/LAP-M/COMPRESSION@#",
+"@#CONNECT 26400/LAP-M@#",
+"@#CONNECT 26400/LAPM/COMP@#",
+"@#CONNECT 26400/LAPM/V42BIS@#",
+"@#CONNECT 26400/LAPM@#",
+"@#CONNECT 26400/MNP COMPRESSED@#",
+"@#CONNECT 26400/MNP@#",
+"@#CONNECT 26400/NONE@#",
+"@#CONNECT 26400/NOR@#",
+"@#CONNECT 26400/REL-LAPM V.42 BIS@#",
+"@#CONNECT 26400/REL-LAPM@#",
+"@#CONNECT 26400/REL-V.42@#",
+"@#CONNECT 26400/REL COMP@#",
+"@#CONNECT 26400/REL/COMP@#",
+"@#CONNECT 26400/REL@#",
+"@#CONNECT 26400/RELIABLE/LAPM/COMPRESSED@#",
+"@#CONNECT 26400/RELIABLE/LAPM@#",
+"@#CONNECT 26400/RELIABLE/MNP/COMPRESSED@#",
+"@#CONNECT 26400/RELIABLE/MNP@#",
+"@#CONNECT 26400/V42@#",
+"@#CONNECT 26400/V42BIS@#",
+"@#CONNECT 26400@#",
+"@#CONNECT 26400T/V42BIS@#",
+"@#CONNECT 26600/ARQ/V.34/MNP4@#",
+"@#CONNECT 26600/ARQ/V.34/MNP5@#",
+"@#CONNECT 26600/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 26600/ARQ/V.34/V42 @#",
+"@#CONNECT 26600/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 26600/ARQ/V.34/V42b@#",
+"@#CONNECT 26600@#",
+"@#CONNECT 26800/MNP COMPRESSED@#",
+"@#CONNECT 28800 LAPM COMPRESSED@#",
+"@#CONNECT 28800 LAPM@#",
+"@#CONNECT 28800 REL/MNP5@#",
+"@#CONNECT 28800 REL@#",
+"@#CONNECT 28800 RELIABLE COMPRESSED@#",
+"@#CONNECT 28800 RELIABLE@#",
+"@#CONNECT 28800/ARQ/V.34/MNP4@#",
+"@#CONNECT 28800/ARQ/V.34/MNP5@#",
+"@#CONNECT 28800/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 28800/ARQ/V.34/V42 @#",
+"@#CONNECT 28800/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 28800/ARQ/V.34/V42b@#",
+"@#CONNECT 28800/ARQ@#",
+"@#CONNECT 28800/COMP@#",
+"@#CONNECT 28800/LAP-M/COMPRESSION@#",
+"@#CONNECT 28800/LAP-M@#",
+"@#CONNECT 28800/LAPM/COMP@#",
+"@#CONNECT 28800/LAPM/V42BIS@#",
+"@#CONNECT 28800/LAPM@#",
+"@#CONNECT 28800/MNP COMPRESSED@#",
+"@#CONNECT 28800/MNP@#",
+"@#CONNECT 28800/NONE@#",
+"@#CONNECT 28800/NOR@#",
+"@#CONNECT 28800/REL-LAPM V.42 BIS@#",
+"@#CONNECT 28800/REL-LAPM@#",
+"@#CONNECT 28800/REL-V.42@#",
+"@#CONNECT 28800/REL COMP@#",
+"@#CONNECT 28800/REL/COMP@#",
+"@#CONNECT 28800/REL@#",
+"@#CONNECT 28800/RELIABLE/LAPM/COMPRESSED@#",
+"@#CONNECT 28800/RELIABLE/LAPM@#",
+"@#CONNECT 28800/RELIABLE/MNP/COMPRESSED@#",
+"@#CONNECT 28800/RELIABLE/MNP@#",
+"@#CONNECT 28800/V42@#",
+"@#CONNECT 28800/V42BIS@#",
+"@#CONNECT 28800@#",
+"@#CONNECT 28800T/V42BIS@#",
+"@#CONNECT 29000/ARQ/V.34/MNP4@#",
+"@#CONNECT 29000/ARQ/V.34/MNP5@#",
+"@#CONNECT 29000/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 29000/ARQ/V.34/V42 @#",
+"@#CONNECT 29000/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 29000/ARQ/V.34/V42b@#",
+"@#CONNECT 29000@#",
+"@#CONNECT 300 ALT / MNP5@#",
+"@#CONNECT 300 ALT /MNP 5@#",
+"@#CONNECT 300 ALT@#",
+"@#CONNECT 300 EC/V42BIS@#",
+"@#CONNECT 300 EC@#",
+"@#CONNECT 300 LAPM / V.42bis@#",
+"@#CONNECT 300 LAPM /V.42bis@#",
+"@#CONNECT 300 LAPM@#",
+"@#CONNECT 300 REL/MNP5@#",
+"@#CONNECT 300 REL@#",
+"@#CONNECT 300/ARQ/MNP4@#",
+"@#CONNECT 300/ARQ/MNP5@#",
+"@#CONNECT 300/ARQ/V.42@#",
+"@#CONNECT 300/ARQ/V.42bis@#",
+"@#CONNECT 300/ARQ/V42 /SREJ@#",
+"@#CONNECT 300/ARQ/V42 @#",
+"@#CONNECT 300/ARQ/V42b@#",
+"@#CONNECT 300/ARQ@#",
+"@#CONNECT 300/COMP@#",
+"@#CONNECT 300/LAP-M/COMPRESSION@#",
+"@#CONNECT 300/LAP-M@#",
+"@#CONNECT 300/LAPM/COMP@#",
+"@#CONNECT 300/LAPM/V42BIS@#",
+"@#CONNECT 300/LAPM@#",
+"@#CONNECT 300/MNP COMPRESSED@#",
+"@#CONNECT 300/MNP@#",
+"@#CONNECT 300/NONE@#",
+"@#CONNECT 300/NOR@#",
+"@#CONNECT 300/REL-LAPM V.42 BIS@#",
+"@#CONNECT 300/REL-LAPM@#",
+"@#CONNECT 300/REL-MNP@#",
+"@#CONNECT 300/REL-V.42@#",
+"@#CONNECT 300/REL 1@# ",
+"@#CONNECT 300/REL 2@# ",
+"@#CONNECT 300/REL 3@# ",
+"@#CONNECT 300/REL 4@# ",
+"@#CONNECT 300/REL 5@# ",
+"@#CONNECT 300/REL COMP@#",
+"@#CONNECT 300/REL COMPRESSED@#",
+"@#CONNECT 300/REL/COMP@#",
+"@#CONNECT 300/REL@#",
+"@#CONNECT 300/V42@#",
+"@#CONNECT 300/V42BIS@#",
+"@#CONNECT 300@#",
+"@#CONNECT 300T/V42BIS@#",
+"@#CONNECT 31200/ARQ/V.34/MNP4@#",
+"@#CONNECT 31200/ARQ/V.34/MNP5@#",
+"@#CONNECT 31200/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 31200/ARQ/V.34/V42 @#",
+"@#CONNECT 31200/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 31200/ARQ/V.34/V42b@#",
+"@#CONNECT 31200@#",
+"@#CONNECT 31400/ARQ/V.34/MNP4@#",
+"@#CONNECT 31400/ARQ/V.34/MNP5@#",
+"@#CONNECT 31400/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 31400/ARQ/V.34/V42 @#",
+"@#CONNECT 31400/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 31400/ARQ/V.34/V42b@#",
+"@#CONNECT 31400@#",
+"@#CONNECT 33600/ARQ/V.34/MNP4@#",
+"@#CONNECT 33600/ARQ/V.34/MNP5@#",
+"@#CONNECT 33600/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 33600/ARQ/V.34/V42 @#",
+"@#CONNECT 33600/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 33600/ARQ/V.34/V42b@#",
+"@#CONNECT 33600@#",
+"@#CONNECT 33800/ARQ/V.34/MNP4@#",
+"@#CONNECT 33800/ARQ/V.34/MNP5@#",
+"@#CONNECT 33800/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 33800/ARQ/V.34/V42 @#",
+"@#CONNECT 33800/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 33800/ARQ/V.34/V42b@#",
+"@#CONNECT 33800@#",
+"@#CONNECT 38400 ALT / MNP5@#",
+"@#CONNECT 38400 ALT /MNP 5@#",
+"@#CONNECT 38400 ALT@#",
+"@#CONNECT 38400 EC/V42BIS@#",
+"@#CONNECT 38400 EC@#",
+"@#CONNECT 38400 LAPM / V.42bis@#",
+"@#CONNECT 38400 LAPM /V.42bis@#",
+"@#CONNECT 38400 LAPM@#",
+"@#CONNECT 38400 REL/MNP5@#",
+"@#CONNECT 38400 REL/V42@#",
+"@#CONNECT 38400 REL@#",
+"@#CONNECT 38400/ARQ/V42 /SREJ@#",
+"@#CONNECT 38400/ARQ/V42 @#",
+"@#CONNECT 38400/ARQ/V42b@#",
+"@#CONNECT 38400/ARQ@#",
+"@#CONNECT 38400/COMP@#",
+"@#CONNECT 38400/LAP-M/COMPRESSION@#",
+"@#CONNECT 38400/LAP-M@#",
+"@#CONNECT 38400/LAPM/COMP@#",
+"@#CONNECT 38400/LAPM@#",
+"@#CONNECT 38400/MNP COMPRESSED@#",
+"@#CONNECT 38400/MNP@#",
+"@#CONNECT 38400/NONE@#",
+"@#CONNECT 38400/NOR@#",
+"@#CONNECT 38400/REL-LAPM V.42 BIS@#",
+"@#CONNECT 38400/REL-LAPM@#",
+"@#CONNECT 38400/REL-V.42@#",
+"@#CONNECT 38400/REL COMP@#",
+"@#CONNECT 38400/REL/COMP@#",
+"@#CONNECT 38400/REL@#",
+"@#CONNECT 38400/V.110@#",
+"@#CONNECT 38400/V42@#",
+"@#CONNECT 38400/V42BIS@#",
+"@#CONNECT 38400@#",
+"@#CONNECT 38400T/V42BIS@#",
+"@#CONNECT 4800 ALT / MNP5@#",
+"@#CONNECT 4800 ALT /MNP 5@#",
+"@#CONNECT 4800 ALT@#",
+"@#CONNECT 4800 EC/V42@#",
+"@#CONNECT 4800 EC/V42BIS@#",
+"@#CONNECT 4800 EC@#",
+"@#CONNECT 4800 LAPM / V.42bis@#",
+"@#CONNECT 4800 LAPM /V.42bis@#",
+"@#CONNECT 4800 LAPM COMPRESSED@#",
+"@#CONNECT 4800 LAPM@#",
+"@#CONNECT 4800 NORMAL@#",
+"@#CONNECT 4800 REL/MNP5@#",
+"@#CONNECT 4800 REL/V42@#",
+"@#CONNECT 4800 REL/V42BIS@#",
+"@#CONNECT 4800 REL@#",
+"@#CONNECT 4800 RELIABLE COMPRESSED@#",
+"@#CONNECT 4800 RELIABLE@#",
+"@#CONNECT 4800 V.42@#",
+"@#CONNECT 4800/ARQ/CELL /MNP4@#",
+"@#CONNECT 4800/ARQ/CELL /MNP5@#",
+"@#CONNECT 4800/ARQ/CELL /V42 /SREJ@#",
+"@#CONNECT 4800/ARQ/CELL /V42 @#",
+"@#CONNECT 4800/ARQ/CELL /V42b/SREJ@#",
+"@#CONNECT 4800/ARQ/CELL /V42b@#",
+"@#CONNECT 4800/ARQ/CELL/MNP4@#",
+"@#CONNECT 4800/ARQ/CELL/MNP5@#",
+"@#CONNECT 4800/ARQ/CELL/V42 /SREJ@#",
+"@#CONNECT 4800/ARQ/CELL/V42 @#",
+"@#CONNECT 4800/ARQ/CELL/V42b/SREJ@#",
+"@#CONNECT 4800/ARQ/CELL/V42b@#",
+"@#CONNECT 4800/ARQ/MNP4@#",
+"@#CONNECT 4800/ARQ/MNP5@#",
+"@#CONNECT 4800/ARQ/V.34/MNP4@#",
+"@#CONNECT 4800/ARQ/V.34/MNP5@#",
+"@#CONNECT 4800/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 4800/ARQ/V.34/V42 @#",
+"@#CONNECT 4800/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 4800/ARQ/V.34/V42b@#",
+"@#CONNECT 4800/ARQ/V.42@#",
+"@#CONNECT 4800/ARQ/V.42bis@#",
+"@#CONNECT 4800/ARQ/V32 /MNP4@#",
+"@#CONNECT 4800/ARQ/V32 /MNP5@#",
+"@#CONNECT 4800/ARQ/V32 /V42 /SREJ@#",
+"@#CONNECT 4800/ARQ/V32 /V42 @#",
+"@#CONNECT 4800/ARQ/V32 /V42b/SREJ@#",
+"@#CONNECT 4800/ARQ/V32 /V42b@#",
+"@#CONNECT 4800/ARQ/V32 /MNP4@#",
+"@#CONNECT 4800/ARQ/V32 /MNP5@#",
+"@#CONNECT 4800/ARQ/V32 /V42 /SREJ@#",
+"@#CONNECT 4800/ARQ/V32 /V42 @#",
+"@#CONNECT 4800/ARQ/V32 /V42b/SREJ@#",
+"@#CONNECT 4800/ARQ/V32 /V42b@#",
+"@#CONNECT 4800/ARQ/V32b /MNP4@#",
+"@#CONNECT 4800/ARQ/V32b /MNP5@#",
+"@#CONNECT 4800/ARQ/V32b /V42 /SREJ@#",
+"@#CONNECT 4800/ARQ/V32b /V42 @#",
+"@#CONNECT 4800/ARQ/V32b /V42b/SREJ@#",
+"@#CONNECT 4800/ARQ/V32b /V42b@#",
+"@#CONNECT 4800/ARQ/V32b/MNP4@#",
+"@#CONNECT 4800/ARQ/V32b/MNP5@#",
+"@#CONNECT 4800/ARQ/V32b/V42 /SREJ@#",
+"@#CONNECT 4800/ARQ/V32b/V42 @#",
+"@#CONNECT 4800/ARQ/V32b/V42b/SREJ@#",
+"@#CONNECT 4800/ARQ/V32b/V42b@#",
+"@#CONNECT 4800/ARQ/V42 /SREJ@#",
+"@#CONNECT 4800/ARQ/V42 @#",
+"@#CONNECT 4800/ARQ/V42b/SREJ@#",
+"@#CONNECT 4800/ARQ/V42b@#",
+"@#CONNECT 4800/ARQ/ZyX /MNP4@#",
+"@#CONNECT 4800/ARQ/ZyX /MNP5@#",
+"@#CONNECT 4800/ARQ/ZyX /V42 /SREJ@#",
+"@#CONNECT 4800/ARQ/ZyX /V42 @#",
+"@#CONNECT 4800/ARQ/ZyX /V42b/SREJ@#",
+"@#CONNECT 4800/ARQ/ZyX /V42b@#",
+"@#CONNECT 4800/ARQ/ZyX /MNP4@#",
+"@#CONNECT 4800/ARQ/ZyX /MNP5@#",
+"@#CONNECT 4800/ARQ/ZyX /V42 /SREJ@#",
+"@#CONNECT 4800/ARQ/ZyX /V42 @#",
+"@#CONNECT 4800/ARQ/ZyX /V42b/SREJ@#",
+"@#CONNECT 4800/ARQ/ZyX /V42b@#",
+"@#CONNECT 4800/ARQ@#",
+"@#CONNECT 4800/COMP@#",
+"@#CONNECT 4800/LAP-M/COMPRESSION@#",
+"@#CONNECT 4800/LAP-M@#",
+"@#CONNECT 4800/LAPM/COMP@#",
+"@#CONNECT 4800/LAPM/V42BIS@#",
+"@#CONNECT 4800/LAPM@#",
+"@#CONNECT 4800/MNP COMPRESSED@#",
+"@#CONNECT 4800/MNP@#",
+"@#CONNECT 4800/NONE@#",
+"@#CONNECT 4800/NOR@#",
+"@#CONNECT 4800/REL-LAPM-COMP@#",
+"@#CONNECT 4800/REL-LAPM V.42 BIS@#",
+"@#CONNECT 4800/REL-LAPM@#",
+"@#CONNECT 4800/REL-MNP-COMP@#",
+"@#CONNECT 4800/REL-MNP@#",
+"@#CONNECT 4800/REL-V.42@#",
+"@#CONNECT 4800/REL 1@# ",
+"@#CONNECT 4800/REL 2@# ",
+"@#CONNECT 4800/REL 3@# ",
+"@#CONNECT 4800/REL 4@# ",
+"@#CONNECT 4800/REL 5@# ",
+"@#CONNECT 4800/REL COMP@#",
+"@#CONNECT 4800/REL COMPRESSED@#",
+"@#CONNECT 4800/REL/COMP@#",
+"@#CONNECT 4800/REL@#",
+"@#CONNECT 4800/RELC@#",
+"@#CONNECT 4800/RELIABLE/LAPM/COMPRESSED@#",
+"@#CONNECT 4800/RELIABLE/LAPM@#",
+"@#CONNECT 4800/RELIABLE/MNP/COMPRESSED@#",
+"@#CONNECT 4800/RELIABLE/MNP@#",
+"@#CONNECT 4800/V42@#",
+"@#CONNECT 4800/V42B@#",
+"@#CONNECT 4800/V42BIS@#",
+"@#CONNECT 4800@#",
+"@#CONNECT 48000@#",
+"@#CONNECT 4800T/V42BIS@#",
+"@#CONNECT 5000/ARQ/V.34/MNP4@#",
+"@#CONNECT 5000/ARQ/V.34/MNP5@#",
+"@#CONNECT 5000/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 5000/ARQ/V.34/V42 @#",
+"@#CONNECT 5000/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 5000/ARQ/V.34/V42b@#",
+"@#CONNECT 5000@#",
+"@#CONNECT 56000/ARQ/SLP /V120/V42b@#",
+"@#CONNECT 56000/ARQ/SLP /V120@#",
+"@#CONNECT 56000/REL@#",
+"@#CONNECT 56000@#",
+"@#CONNECT 57600 ALT / MNP5@#",
+"@#CONNECT 57600 ALT /MNP 5@#",
+"@#CONNECT 57600 ALT@#",
+"@#CONNECT 57600 EC/V42BIS@#",
+"@#CONNECT 57600 EC@#",
+"@#CONNECT 57600 LAPM / V.42bis@#",
+"@#CONNECT 57600 LAPM /V.42bis@#",
+"@#CONNECT 57600 LAPM@#",
+"@#CONNECT 57600 REL/MNP5@#",
+"@#CONNECT 57600 REL@#",
+"@#CONNECT 57600/ARQ/V42 /SREJ@#",
+"@#CONNECT 57600/ARQ/V42 @#",
+"@#CONNECT 57600/ARQ/V42b@#",
+"@#CONNECT 57600/ARQ@#",
+"@#CONNECT 57600/COMP@#",
+"@#CONNECT 57600/LAP-M/COMPRESSION@#",
+"@#CONNECT 57600/LAP-M@#",
+"@#CONNECT 57600/LAPM/COMP@#",
+"@#CONNECT 57600/LAPM@#",
+"@#CONNECT 57600/MNP COMPRESSED@#",
+"@#CONNECT 57600/MNP@#",
+"@#CONNECT 57600/NONE@#",
+"@#CONNECT 57600/NOR@#",
+"@#CONNECT 57600/REL-LAPM V.42 BIS@#",
+"@#CONNECT 57600/REL-LAPM@#",
+"@#CONNECT 57600/REL-V.42@#",
+"@#CONNECT 57600/REL COMP@#",
+"@#CONNECT 57600/REL/COMP@#",
+"@#CONNECT 57600/REL@#",
+"@#CONNECT 57600/V42@#",
+"@#CONNECT 57600/V42BIS@#",
+"@#CONNECT 57600@#",
+"@#CONNECT 57600@#@#@#*@#COM@#",
+"@#CONNECT 57600T/V42BIS@#",
+"@#CONNECT 600 ALT / MNP5@#",
+"@#CONNECT 600 ALT /MNP 5@#",
+"@#CONNECT 600 ALT@#",
+"@#CONNECT 600 EC/V42BIS@#",
+"@#CONNECT 600 EC@#",
+"@#CONNECT 600 LAPM / V.42bis@#",
+"@#CONNECT 600 LAPM /V.42bis@#",
+"@#CONNECT 600 LAPM@#",
+"@#CONNECT 600 REL/MNP5@#",
+"@#CONNECT 600 REL@#",
+"@#CONNECT 600/ARQ/MNP4@#",
+"@#CONNECT 600/ARQ/MNP5@#",
+"@#CONNECT 600/ARQ/V.42@#",
+"@#CONNECT 600/ARQ/V.42bis@#",
+"@#CONNECT 600/ARQ@#",
+"@#CONNECT 600/COMP@#",
+"@#CONNECT 600/LAP-M/COMPRESSION@#",
+"@#CONNECT 600/LAP-M@#",
+"@#CONNECT 600/LAPM/COMP@#",
+"@#CONNECT 600/LAPM@#",
+"@#CONNECT 600/MNP COMPRESSED@#",
+"@#CONNECT 600/MNP@#",
+"@#CONNECT 600/NONE@#",
+"@#CONNECT 600/REL-LAPM V.42 BIS@#",
+"@#CONNECT 600/REL 1@# ",
+"@#CONNECT 600/REL 2@# ",
+"@#CONNECT 600/REL 3@# ",
+"@#CONNECT 600/REL 4@# ",
+"@#CONNECT 600/REL 5@# ",
+"@#CONNECT 600/REL COMPRESSED@#",
+"@#CONNECT 600/REL/COMP@#",
+"@#CONNECT 600/REL@#",
+"@#CONNECT 600/V42@#",
+"@#CONNECT 600/V42BIS@#",
+"@#CONNECT 600@#",
+"@#CONNECT 64000/ARQ/SLP /X.75/V42b@#",
+"@#CONNECT 64000/ARQ/SLP /X.75@#",
+"@#CONNECT 64000/MNP@#",
+"@#CONNECT 64000/REL@#",
+"@#CONNECT 64000/X.70 BTX@#",
+"@#CONNECT 64000/X.70NL@#",
+"@#CONNECT 64000/X.75@#",
+"@#CONNECT 64000@#",
+"@#CONNECT 7200 ALT / MNP5@#",
+"@#CONNECT 7200 ALT /MNP 5@#",
+"@#CONNECT 7200 ALT@#",
+"@#CONNECT 7200 EC/V42@#",
+"@#CONNECT 7200 EC/V42BIS@#",
+"@#CONNECT 7200 EC@#",
+"@#CONNECT 7200 LAPM / V.42bis@#",
+"@#CONNECT 7200 LAPM /V.42bis@#",
+"@#CONNECT 7200 LAPM COMPRESSED@#",
+"@#CONNECT 7200 LAPM@#",
+"@#CONNECT 7200 REL/MNP5@#",
+"@#CONNECT 7200 REL/V42@#",
+"@#CONNECT 7200 REL/V42BIS@#",
+"@#CONNECT 7200 REL@#",
+"@#CONNECT 7200 RELIABLE@#",
+"@#CONNECT 7200/ARQ/CELL /MNP4@#",
+"@#CONNECT 7200/ARQ/CELL /MNP5@#",
+"@#CONNECT 7200/ARQ/CELL /V42 /SREJ@#",
+"@#CONNECT 7200/ARQ/CELL /V42 @#",
+"@#CONNECT 7200/ARQ/CELL /V42b/SREJ@#",
+"@#CONNECT 7200/ARQ/CELL /V42b@#",
+"@#CONNECT 7200/ARQ/CELL/MNP4@#",
+"@#CONNECT 7200/ARQ/CELL/MNP5@#",
+"@#CONNECT 7200/ARQ/CELL/V42 /SREJ@#",
+"@#CONNECT 7200/ARQ/CELL/V42 @#",
+"@#CONNECT 7200/ARQ/CELL/V42b/SREJ@#",
+"@#CONNECT 7200/ARQ/CELL/V42b@#",
+"@#CONNECT 7200/ARQ/MNP4@#",
+"@#CONNECT 7200/ARQ/MNP5@#",
+"@#CONNECT 7200/ARQ/V.34/MNP4@#",
+"@#CONNECT 7200/ARQ/V.34/MNP5@#",
+"@#CONNECT 7200/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 7200/ARQ/V.34/V42 @#",
+"@#CONNECT 7200/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 7200/ARQ/V.34/V42b@#",
+"@#CONNECT 7200/ARQ/V.42@#",
+"@#CONNECT 7200/ARQ/V.42bis@#",
+"@#CONNECT 7200/ARQ/V32 /MNP4@#",
+"@#CONNECT 7200/ARQ/V32 /MNP5@#",
+"@#CONNECT 7200/ARQ/V32 /V42 /SREJ@#",
+"@#CONNECT 7200/ARQ/V32 /V42 @#",
+"@#CONNECT 7200/ARQ/V32 /V42b/SREJ@#",
+"@#CONNECT 7200/ARQ/V32 /V42b@#",
+"@#CONNECT 7200/ARQ/V32 /MNP4@#",
+"@#CONNECT 7200/ARQ/V32 /MNP5@#",
+"@#CONNECT 7200/ARQ/V32 /V42 /SREJ@#",
+"@#CONNECT 7200/ARQ/V32 /V42 @#",
+"@#CONNECT 7200/ARQ/V32 /V42b/SREJ@#",
+"@#CONNECT 7200/ARQ/V32 /V42b@#",
+"@#CONNECT 7200/ARQ/V32b /MNP4@#",
+"@#CONNECT 7200/ARQ/V32b /MNP5@#",
+"@#CONNECT 7200/ARQ/V32b /V42 /SREJ@#",
+"@#CONNECT 7200/ARQ/V32b /V42 @#",
+"@#CONNECT 7200/ARQ/V32b /V42b/SREJ@#",
+"@#CONNECT 7200/ARQ/V32b /V42b@#",
+"@#CONNECT 7200/ARQ/V32b/MNP4@#",
+"@#CONNECT 7200/ARQ/V32b/MNP5@#",
+"@#CONNECT 7200/ARQ/V32b/V42 /SREJ@#",
+"@#CONNECT 7200/ARQ/V32b/V42 @#",
+"@#CONNECT 7200/ARQ/V32b/V42b/SREJ@#",
+"@#CONNECT 7200/ARQ/V32b/V42b@#",
+"@#CONNECT 7200/ARQ/V42 /SREJ@#",
+"@#CONNECT 7200/ARQ/V42 @#",
+"@#CONNECT 7200/ARQ/V42b/SREJ@#",
+"@#CONNECT 7200/ARQ/V42b@#",
+"@#CONNECT 7200/ARQ/ZyX /MNP4@#",
+"@#CONNECT 7200/ARQ/ZyX /MNP5@#",
+"@#CONNECT 7200/ARQ/ZyX /V42 /SREJ@#",
+"@#CONNECT 7200/ARQ/ZyX /V42 @#",
+"@#CONNECT 7200/ARQ/ZyX /V42b/SREJ@#",
+"@#CONNECT 7200/ARQ/ZyX /V42b@#",
+"@#CONNECT 7200/ARQ/ZyX /MNP4@#",
+"@#CONNECT 7200/ARQ/ZyX /MNP5@#",
+"@#CONNECT 7200/ARQ/ZyX /V42 /SREJ@#",
+"@#CONNECT 7200/ARQ/ZyX /V42 @#",
+"@#CONNECT 7200/ARQ/ZyX /V42b/SREJ@#",
+"@#CONNECT 7200/ARQ/ZyX /V42b@#",
+"@#CONNECT 7200/ARQ@#",
+"@#CONNECT 7200/COMP@#",
+"@#CONNECT 7200/LAP-M/COMPRESSION@#",
+"@#CONNECT 7200/LAP-M@#",
+"@#CONNECT 7200/LAPM/COMP@#",
+"@#CONNECT 7200/LAPM/V42BIS@#",
+"@#CONNECT 7200/LAPM@#",
+"@#CONNECT 7200/MNP COMPRESSED@#",
+"@#CONNECT 7200/MNP@#",
+"@#CONNECT 7200/NONE@#",
+"@#CONNECT 7200/NOR@#",
+"@#CONNECT 7200/REL-LAPM-COMP@#",
+"@#CONNECT 7200/REL-LAPM V.42 BIS@#",
+"@#CONNECT 7200/REL-LAPM@#",
+"@#CONNECT 7200/REL-MNP-COMP@#",
+"@#CONNECT 7200/REL-MNP@#",
+"@#CONNECT 7200/REL-V.42@#",
+"@#CONNECT 7200/REL 1@# ",
+"@#CONNECT 7200/REL 2@# ",
+"@#CONNECT 7200/REL 3@# ",
+"@#CONNECT 7200/REL 4@# ",
+"@#CONNECT 7200/REL 5@# ",
+"@#CONNECT 7200/REL COMP@#",
+"@#CONNECT 7200/REL/COMP@#",
+"@#CONNECT 7200/REL@#",
+"@#CONNECT 7200/RELC@#",
+"@#CONNECT 7200/RELIABLE/LAPM/COMPRESSED@#",
+"@#CONNECT 7200/RELIABLE/LAPM@#",
+"@#CONNECT 7200/RELIABLE/MNP/COMPRESSED@#",
+"@#CONNECT 7200/RELIABLE/MNP@#",
+"@#CONNECT 7200/V42@#",
+"@#CONNECT 7200/V42B@#",
+"@#CONNECT 7200/V42BIS@#",
+"@#CONNECT 7200@#",
+"@#CONNECT 7200T/V42BIS@#",
+"@#CONNECT 7400/ARQ/V.34/MNP4@#",
+"@#CONNECT 7400/ARQ/V.34/MNP5@#",
+"@#CONNECT 7400/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 7400/ARQ/V.34/V42 @#",
+"@#CONNECT 7400/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 7400/ARQ/V.34/V42b@#",
+"@#CONNECT 7400@#",
+"@#CONNECT 75/1200",
+"@#CONNECT 75/1200/ARQ@#",
+"@#CONNECT 75/1200/LAP-M/COMPRESSION@#",
+"@#CONNECT 75/1200/LAP-M@#",
+"@#CONNECT 75/1200/LAPM/COMP@#",
+"@#CONNECT 75/1200/LAPM@#",
+"@#CONNECT 75/1200/MNP@#",
+"@#CONNECT 75/1200/NONE@#",
+"@#CONNECT 75/1200/REL-LAPM V.42 BIS@#",
+"@#CONNECT 75/1200/REL/COMP@#",
+"@#CONNECT 75/1200/REL@#",
+"@#CONNECT 75/1200/REL#",
+"@#CONNECT 75/1200/V42@#",
+"@#CONNECT 75/1200/V42BIS@#",
+"@#CONNECT 75/1200@#",
+"@#CONNECT 75TX/1200RX REL/MNP5@#",
+"@#CONNECT 75TX/1200RX REL@#",
+"@#CONNECT 75TX/1200RX/ARQ@#",
+"@#CONNECT 75TX/1200RX/LAP-M/COMPRESSION@#",
+"@#CONNECT 75TX/1200RX/LAP-M@#",
+"@#CONNECT 75TX/1200RX/LAPM/COMP@#",
+"@#CONNECT 75TX/1200RX/LAPM@#",
+"@#CONNECT 75TX/1200RX/MNP@#",
+"@#CONNECT 75TX/1200RX/NONE@#",
+"@#CONNECT 75TX/1200RX/REL-LAPM V.42 BIS@#",
+"@#CONNECT 75TX/1200RX/REL/COMP@#",
+"@#CONNECT 75TX/1200RX/REL@#",
+"@#CONNECT 75TX/1200RX/V42@#",
+"@#CONNECT 75TX/1200RX/V42BIS@#",
+"@#CONNECT 75TX/1200RX@#",
+"@#CONNECT 76800/ARQ/V42 /SREJ@#",
+"@#CONNECT 76800/ARQ/V42 @#",
+"@#CONNECT 76800/ARQ/V42b@#",
+"@#CONNECT 76800@#",
+"@#CONNECT 9600 ALT / MNP5@#",
+"@#CONNECT 9600 ALT /MNP 5@#",
+"@#CONNECT 9600 ALT@#",
+"@#CONNECT 9600 EC/V42@#",
+"@#CONNECT 9600 EC/V42BIS@#",
+"@#CONNECT 9600 EC@#",
+"@#CONNECT 9600 LAPM / V.42bis@#",
+"@#CONNECT 9600 LAPM /V.42bis@#",
+"@#CONNECT 9600 LAPM COMPRESSED@#",
+"@#CONNECT 9600 LAPM@#",
+"@#CONNECT 9600 NORMAL@#",
+"@#CONNECT 9600 REL/MNP5@#",
+"@#CONNECT 9600 REL/V42@#",
+"@#CONNECT 9600 REL/V42BIS@#",
+"@#CONNECT 9600 REL@#",
+"@#CONNECT 9600 RELIABLE COMPRESSED@#",
+"@#CONNECT 9600 RELIABLE@#",
+"@#CONNECT 9600 V.42@#",
+"@#CONNECT 9600/ARQ/CELL /MNP4@#",
+"@#CONNECT 9600/ARQ/CELL /MNP5@#",
+"@#CONNECT 9600/ARQ/CELL /V42 /SREJ@#",
+"@#CONNECT 9600/ARQ/CELL /V42 @#",
+"@#CONNECT 9600/ARQ/CELL /V42b/SREJ@#",
+"@#CONNECT 9600/ARQ/CELL /V42b@#",
+"@#CONNECT 9600/ARQ/CELL/MNP4@#",
+"@#CONNECT 9600/ARQ/CELL/MNP5@#",
+"@#CONNECT 9600/ARQ/CELL/V42 /SREJ@#",
+"@#CONNECT 9600/ARQ/CELL/V42 @#",
+"@#CONNECT 9600/ARQ/CELL/V42b/SREJ@#",
+"@#CONNECT 9600/ARQ/CELL/V42b@#",
+"@#CONNECT 9600/ARQ/MNP4@#",
+"@#CONNECT 9600/ARQ/MNP5@#",
+"@#CONNECT 9600/ARQ/V.34/MNP4@#",
+"@#CONNECT 9600/ARQ/V.34/MNP5@#",
+"@#CONNECT 9600/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 9600/ARQ/V.34/V42 @#",
+"@#CONNECT 9600/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 9600/ARQ/V.34/V42b@#",
+"@#CONNECT 9600/ARQ/V.42@#",
+"@#CONNECT 9600/ARQ/V.42bis@#",
+"@#CONNECT 9600/ARQ/V32 /MNP4@#",
+"@#CONNECT 9600/ARQ/V32 /MNP5@#",
+"@#CONNECT 9600/ARQ/V32 /V42 /SREJ@#",
+"@#CONNECT 9600/ARQ/V32 /V42 @#",
+"@#CONNECT 9600/ARQ/V32 /V42b/SREJ@#",
+"@#CONNECT 9600/ARQ/V32 /V42b@#",
+"@#CONNECT 9600/ARQ/V32 /MNP4@#",
+"@#CONNECT 9600/ARQ/V32 /MNP5@#",
+"@#CONNECT 9600/ARQ/V32 /V42 /SREJ@#",
+"@#CONNECT 9600/ARQ/V32 /V42 @#",
+"@#CONNECT 9600/ARQ/V32 /V42b/SREJ@#",
+"@#CONNECT 9600/ARQ/V32 /V42b@#",
+"@#CONNECT 9600/ARQ/V32b /MNP4@#",
+"@#CONNECT 9600/ARQ/V32b /MNP5@#",
+"@#CONNECT 9600/ARQ/V32b /V42 /SREJ@#",
+"@#CONNECT 9600/ARQ/V32b /V42 @#",
+"@#CONNECT 9600/ARQ/V32b /V42b/SREJ@#",
+"@#CONNECT 9600/ARQ/V32b /V42b@#",
+"@#CONNECT 9600/ARQ/V32b/MNP4@#",
+"@#CONNECT 9600/ARQ/V32b/MNP5@#",
+"@#CONNECT 9600/ARQ/V32b/V42 /SREJ@#",
+"@#CONNECT 9600/ARQ/V32b/V42 @#",
+"@#CONNECT 9600/ARQ/V32b/V42b/SREJ@#",
+"@#CONNECT 9600/ARQ/V32b/V42b@#",
+"@#CONNECT 9600/ARQ/V42 /SREJ@#",
+"@#CONNECT 9600/ARQ/V42 @#",
+"@#CONNECT 9600/ARQ/V42b/SREJ@#",
+"@#CONNECT 9600/ARQ/V42b@#",
+"@#CONNECT 9600/ARQ/ZyX /MNP4@#",
+"@#CONNECT 9600/ARQ/ZyX /MNP5@#",
+"@#CONNECT 9600/ARQ/ZyX /V42 /SREJ@#",
+"@#CONNECT 9600/ARQ/ZyX /V42 @#",
+"@#CONNECT 9600/ARQ/ZyX /V42b/SREJ@#",
+"@#CONNECT 9600/ARQ/ZyX /V42b@#",
+"@#CONNECT 9600/ARQ/ZyX /MNP4@#",
+"@#CONNECT 9600/ARQ/ZyX /MNP5@#",
+"@#CONNECT 9600/ARQ/ZyX /V42 /SREJ@#",
+"@#CONNECT 9600/ARQ/ZyX /V42 @#",
+"@#CONNECT 9600/ARQ/ZyX /V42b/SREJ@#",
+"@#CONNECT 9600/ARQ/ZyX /V42b@#",
+"@#CONNECT 9600/ARQ@#",
+"@#CONNECT 9600/COMP@#",
+"@#CONNECT 9600/LAP-M/COMPRESSION@#",
+"@#CONNECT 9600/LAP-M@#",
+"@#CONNECT 9600/LAPM/COMP@#",
+"@#CONNECT 9600/LAPM/V42BIS@#",
+"@#CONNECT 9600/LAPM@#",
+"@#CONNECT 9600/MNP COMPRESSED@#",
+"@#CONNECT 9600/MNP@#",
+"@#CONNECT 9600/NONE@#",
+"@#CONNECT 9600/NOR@#",
+"@#CONNECT 9600/REL-LAPM-COMP@#",
+"@#CONNECT 9600/REL-LAPM V.42 BIS@#",
+"@#CONNECT 9600/REL-LAPM@#",
+"@#CONNECT 9600/REL-MNP-COMP@#",
+"@#CONNECT 9600/REL-MNP@#",
+"@#CONNECT 9600/REL-V.42@#",
+"@#CONNECT 9600/REL 1@# ",
+"@#CONNECT 9600/REL 2@# ",
+"@#CONNECT 9600/REL 3@# ",
+"@#CONNECT 9600/REL 4@# ",
+"@#CONNECT 9600/REL 5@# ",
+"@#CONNECT 9600/REL COMP@#",
+"@#CONNECT 9600/REL COMPRESSED@#",
+"@#CONNECT 9600/REL/COMP@#",
+"@#CONNECT 9600/REL@#",
+"@#CONNECT 9600/RELC@#",
+"@#CONNECT 9600/RELIABLE/LAPM/COMPRESSED@#",
+"@#CONNECT 9600/RELIABLE/LAPM@#",
+"@#CONNECT 9600/RELIABLE/MNP/COMPRESSED@#",
+"@#CONNECT 9600/RELIABLE/MNP@#",
+"@#CONNECT 9600/V.110@#",
+"@#CONNECT 9600/V42@#",
+"@#CONNECT 9600/V42B@#",
+"@#CONNECT 9600/V42BIS@#",
+"@#CONNECT 9600@#",
+"@#CONNECT 9600T RELIABLE@#",
+"@#CONNECT 9600T V.42@#",
+"@#CONNECT 9600T/V42BIS@#",
+"@#CONNECT 9800/ARQ/V.34/MNP4@#",
+"@#CONNECT 9800/ARQ/V.34/MNP5@#",
+"@#CONNECT 9800/ARQ/V.34/V42 /SREJ@#",
+"@#CONNECT 9800/ARQ/V.34/V42 @#",
+"@#CONNECT 9800/ARQ/V.34/V42b/SREJ@#",
+"@#CONNECT 9800/ARQ/V.34/V42b@#",
+"@#CONNECT 9800@#",
+"@#CONNECT EC@#",
+"@#CONNECT FAST@#",
+"@#CONNECT LAPM COMPRESSED@#",
+"@#CONNECT LAPM@#",
+"@#CONNECT REL/MNP5@#",
+"@#CONNECT REL@#",
+"@#CONNECT RELIABLE COMPRESSED@#",
+"@#CONNECT RELIABLE@#",
+"@#CONNECT V.21/REL@#",
+"@#CONNECT/ARQ@#",
+"@#CONNECT/LAP-M/COMPRESSION@#",
+"@#CONNECT/LAP-M@#",
+"@#CONNECT/LAPM/COMP@#",
+"@#CONNECT/LAPM@#",
+"@#CONNECT/MNP@#",
+"@#CONNECT/NONE@#",
+"@#CONNECT/REL/COMP@#",
+"@#CONNECT/REL@#",
+"@#CONNECT/V42@#",
+"@#CONNECT/V42BIS@#",
+"@#CONNECT@#",
+"@#DALAYED@#",
+"@#DATA@#",
+"@#DATE = ",
+"@#DELAYED",
+"@#Delayed@#",
+"@#DELAYED@#",
+"@#Delayed@#",
+"@#DELAYED@#",
+"@#DIALING@#",
+"@#DISCONNECT@#",
+"@#Don't use this command at this situation @#",
+"@#ERROR SERIAL SPEED SETUP@#",
+"@#ERROR@#",
+"@#FAX@#",
+"@#LIB DER 00@#",
+"@#LOCKED@#",
+"@#NO ANSWER@#",
+"@#NO CARRIER@#",
+"@#NO DIAL TONE@#",
+"@#NO DIALTONE@#",
+"@#NO USER RESPONDING@#",
+"@#NOTUSED@#",
+"@#NUMBER DELAYED:TIMER@#",
+"@#NUMBER LOCKED OUT@#",
+"@#OFF HOOK@#",
+"@#OK@#",
+"@#PROTOCOL: ALT-+FCERROR@#",
+"@#PROTOCOL: ALT-CELLULAR@#",
+"@#PROTOCOL: ALT-DATA@#",
+"@#PROTOCOL: ALT-FAX@#",
+"@#PROTOCOL: ALT - CELLULAR@#",
+"@#PROTOCOL: ALT CELLULAR@#",
+"@#PROTOCOL: ALT@#",
+"@#PROTOCOL: ERROR-CONTROL/LAP-B@#",
+"@#PROTOCOL: ERROR-CONTROL/LAPB/AFT@#",
+"@#PROTOCOL: ERROR-CONTROL/LAPB/HDX@#",
+"@#PROTOCOL: ERROR-CONTROL/LAPB@#",
+"@#PROTOCOL: LAP-M/AFT@#",
+"@#PROTOCOL: LAP-M/HDX@#",
+"@#PROTOCOL: LAP-M@#",
+"@#PROTOCOL: LAP_M@#",
+"@#PROTOCOL: LAPM/AFT@#",
+"@#PROTOCOL: LAPM/HDX@#",
+"@#PROTOCOL: LAPM@#",
+"@#PROTOCOL: MNP 3,4@#",
+"@#PROTOCOL: MNP ALT@#",
+"@#PROTOCOL: MNP REL 1@#",
+"@#PROTOCOL: MNP REL 2@#",
+"@#PROTOCOL: MNP REL 3@#",
+"@#PROTOCOL: MNP REL 4@#",
+"@#PROTOCOL: MNP REL 5@#",
+"@#PROTOCOL: MNP REL@#",
+"@#PROTOCOL: MNP@#",
+"@#PROTOCOL: MNP1@#",
+"@#PROTOCOL: MNP2@#",
+"@#PROTOCOL: MNP3@#",
+"@#PROTOCOL: MNP4@#",
+"@#PROTOCOL: NONE@#",
+"@#PROTOCOL: PAD@#",
+"@#PROTOCOL: V.42BIS@#",
+"@#PROTOCOL: V42@#",
+"@#PROTOCOL: V42BIS@#",
+"@#PROTOCOL: X.25/LAPB/AFT@#",
+"@#PROTOCOL: X.25/LAPB/HDX@#",
+"@#PROTOCOL: X.25/LAPB@#",
+"@#PROTOCOL:ALT-+FCERROR@#",
+"@#PROTOCOL:ALT-CELLULAR@#",
+"@#PROTOCOL:ALT-DATA@#",
+"@#PROTOCOL:ALT-FAX@#",
+"@#PROTOCOL:ALT@#",
+"@#PROTOCOL:LAP-M@#",
+"@#PROTOCOL:LAPM@#",
+"@#PROTOCOL:MNP@#",
+"@#PROTOCOL:MNP2@#",
+"@#PROTOCOL:MNP3@#",
+"@#PROTOCOL:MNP4@#",
+"@#PROTOCOL:NONE@#",
+"@#PROTOCOL:V.42BIS@#",
+"@#PROTOCOL:V42BIS@#",
+"@#RING@#",
+"@#RING1@#",
+"@#RING2@#",
+"@#RING3@#",
+"@#RINGING@#",
+"@#RRING@#",
+"@#TEST FAILED@#",
+"@#TEST PASSED@#",
+"@#VCON@#",
+"@#VOICE@#",
+"@#Wait 5 seconds,then dial@#",
+"@OK#",
+"<ff>@",
+"<ff>@@#OK@#",
+"<h00>CLIENT",
+"#",
+"0@",
+"0<CR>",
+"0@",
+"00@",
+"01@",
+"02@",
+"03@",
+"04@",
+"05@",
+"06@",
+"07@",
+"08@",
+"1<CR>",
+"1@",
+"10@",
+"10<CR>",
+"10@",
+"10@#",
+"10@66@",
+"10@67@",
+"10@69@",
+"100@",
+"101@",
+"102@",
+"103@",
+"104@",
+"105@",
+"10L@#",
+"10LC@#",
+"10R@#",
+"10RC@#",
+"11<CR>",
+"11@",
+"11<CR>",
+"11@",
+"11<CR>",
+"11@",
+"11<CR>",
+"11@",
+"11<CR>",
+"11@",
+"11@#",
+"11@66@",
+"11@67@",
+"11@69@",
+"111@",
+"112@",
+"113@",
+"114@",
+"115@",
+"116@",
+"117@",
+"118@",
+"119@",
+"11L@#",
+"11LC@#",
+"11R@#",
+"11RC@#",
+"12@",
+"12<CR>",
+"12@",
+"12<CR>",
+"12@",
+"12<CR>",
+"12@",
+"12<CR>",
+"12@",
+"12<CR>",
+"12@",
+"12@#",
+"12@66@",
+"12@67@",
+"12@69@",
+"120@",
+"121@",
+"122@",
+"123@",
+"124@",
+"125@",
+"126@",
+"127@",
+"128@",
+"129@",
+"12L@#",
+"12LC@#",
+"12R@#",
+"12RC@#",
+"13@",
+"13<CR>",
+"13@",
+"13<CR>",
+"13@",
+"13<CR>",
+"13@",
+"13<CR>",
+"13@",
+"13<CR>",
+"13@#",
+"13@66@",
+"13@67@",
+"13@69@",
+"13L@#",
+"13LC@#",
+"13R@#",
+"13RC@#",
+"14@",
+"14<CR>",
+"14@",
+"14<CR>",
+"14@",
+"14<CR>",
+"14@",
+"14<CR>",
+"14@66@",
+"14@67@",
+"14@69@",
+"15@",
+"15<CR>",
+"15@",
+"15<CR>",
+"15@",
+"15<CR>",
+"15@",
+"15<CR>",
+"15@",
+"15@66@",
+"15@67@",
+"15@69@",
+"16@",
+"16<CR>",
+"16@",
+"16@66@",
+"16@67@",
+"16@69@",
+"17@",
+"18@",
+"18<CR>",
+"18@",
+"19@",
+"19@#",
+"19L@#",
+"19LC@#",
+"19R@#",
+"19RC@#",
+"1L@#",
+"1LC@#",
+"1R@#",
+"1RC@#",
+"2@",
+"2<CR>",
+"2@",
+"20@",
+"21@",
+"21@#",
+"21L@#",
+"21LC@#",
+"21R@#",
+"21RC@#",
+"22@",
+"22<CR>",
+"22@",
+"22<CR>",
+"22@",
+"22<CR>",
+"22@",
+"22<CR>",
+"22@",
+"23<CR>",
+"23@",
+"23<CR>",
+"23@",
+"23<CR>",
+"23@",
+"23<CR>",
+"23@",
+"24@",
+"24<CR>",
+"24@",
+"24<CR>",
+"24@",
+"24<CR>",
+"24@",
+"24<CR>",
+"24@",
+"24<CR>",
+"24@",
+"24@#",
+"24L@#",
+"24LC@#",
+"24R@#",
+"24RC@#",
+"25@",
+"25<CR>",
+"25@",
+"25<CR>",
+"25@",
+"25<CR>",
+"26<CR>",
+"26@",
+"26<CR>",
+"26@",
+"26<CR>",
+"26@",
+"26@#",
+"26L@#",
+"26LC@#",
+"26R@#",
+"26RC<cR>#",
+"27@",
+"28@",
+"28<CR>",
+"28@",
+"28<CR>",
+"28@",
+"28<CR>",
+"28@",
+"28@#",
+"28L@#",
+"28LC@#",
+"28R@#",
+"28RC@#",
+"29@",
+"29<CR>",
+"29@",
+"3@",
+"3<CR>",
+"3@",
+"30@",
+"31@",
+"31<CR>",
+"31@",
+"32@",
+"33@",
+"34<CR>",
+"34@",
+"35@",
+"36@",
+"36<CR>",
+"36@",
+"37@",
+"37<CR>",
+"37@",
+"38<CR>",
+"38@",
+"39@",
+"4@",
+"4<CR>",
+"4@",
+"40@",
+"40<CR>",
+"40@",
+"40@70@01@",
+"40@70@66@01@",
+"40@70@67@01@",
+"40@70@69@01@",
+"40@77@01@",
+"40@77@66@01@",
+"40@77@67@01@",
+"40@77@69@01@",
+"40@80@01@",
+"40@80@66@01@",
+"40@80@67@01@",
+"40@80@69@01@",
+"40@81@01@",
+"40@81@66@01@",
+"40@81@67@01@",
+"40@81@69@01@",
+"41@",
+"42@",
+"43@",
+"44@",
+"44<CR>",
+"44@",
+"44@70@05@",
+"44@70@66@05@",
+"44@70@67@05@",
+"44@70@69@05@",
+"44@77@05@",
+"44@77@66@05@",
+"44@77@67@05@",
+"44@77@69@05@",
+"44@80@05@",
+"44@80@66@05@",
+"44@80@67@05@",
+"44@80@69@05@",
+"44@81@05@",
+"44@81@66@05@",
+"44@81@67@05@",
+"44@81@69@05@",
+"45@",
+"45<CR>",
+"45@",
+"45@70@05@",
+"45@70@66@05@",
+"45@70@67@05@",
+"45@70@69@05@",
+"45@77@05@",
+"45@77@66@05@",
+"45@77@67@05@",
+"45@77@69@05@",
+"45@80@05@",
+"45@80@66@05@",
+"45@80@67@05@",
+"45@80@69@05@",
+"45@81@05@",
+"45@81@66@05@",
+"45@81@67@05@",
+"45@81@69@05@",
+"46@",
+"46<CR>",
+"46@",
+"46@70@05@",
+"46@70@66@05@",
+"46@70@67@05@",
+"46@70@69@05@",
+"46@77@05@",
+"46@77@66@05@",
+"46@77@67@05@",
+"46@77@69@05@",
+"46@80@05@",
+"46@80@66@05@",
+"46@80@67@05@",
+"46@80@69@05@",
+"46@81@05@",
+"46@81@66@05@",
+"46@81@67@05@",
+"46@81@69@05@",
+"47@",
+"47<CR>",
+"47@",
+"47@70@10@",
+"47@70@66@10@",
+"47@70@67@10@",
+"47@70@69@10@",
+"47@77@10@",
+"47@77@66@10@",
+"47@77@67@10@",
+"47@77@69@10@",
+"47@80@10@",
+"47@80@66@10@",
+"47@80@67@10@",
+"47@80@69@10@",
+"47@81@10@",
+"47@81@66@10@",
+"47@81@67@10@",
+"47@81@69@10@",
+"48@",
+"48<CR>",
+"48@",
+"48@70@11@",
+"48@70@66@11@",
+"48@70@67@11@",
+"48@70@69@11@",
+"48@77@11@",
+"48@77@66@11@",
+"48@77@67@11@",
+"48@77@69@11@",
+"48@80@11@",
+"48@80@66@11@",
+"48@80@67@11@",
+"48@80@69@11@",
+"48@81@11@",
+"48@81@66@11@",
+"48@81@67@11@",
+"48@81@69@11@",
+"49@",
+"49<CR>",
+"49@",
+"49@70@13@",
+"49@70@66@13@",
+"49@70@67@13@",
+"49@70@69@13@",
+"49@77@13@",
+"49@77@66@13@",
+"49@77@67@13@",
+"49@77@69@13@",
+"49@80@13@",
+"49@80@66@13@",
+"49@80@67@13@",
+"49@80@69@13@",
+"49@81@13@",
+"49@81@66@13@",
+"49@81@67@13@",
+"49@81@69@13@",
+"5@",
+"5<CR>",
+"5@",
+"5@66@",
+"5@67@",
+"5@69@",
+"50@",
+"50<CR>",
+"50@",
+"50@70@12@",
+"50@70@66@12@",
+"50@70@67@12@",
+"50@70@69@12@",
+"50@77@12@",
+"50@77@66@12@",
+"50@77@67@12@",
+"50@77@69@12@",
+"50@80@12@",
+"50@80@66@12@",
+"50@80@67@12@",
+"50@80@69@12@",
+"50@81@12@",
+"50@81@66@12@",
+"50@81@67@12@",
+"50@81@69@12@",
+"51@",
+"51<CR>",
+"51@",
+"51@70@14@",
+"51@70@66@14@",
+"51@70@67@14@",
+"51@70@69@14@",
+"51@77@14@",
+"51@77@66@14@",
+"51@77@67@14@",
+"51@77@69@14@",
+"51@80@14@",
+"51@80@66@14@",
+"51@80@67@14@",
+"51@80@69@14@",
+"51@81@14@",
+"51@81@66@14@",
+"51@81@67@14@",
+"51@81@69@14@",
+"52@",
+"52<CR>",
+"52@",
+"52@70@15@",
+"52@70@66@15@",
+"52@70@67@15@",
+"52@70@69@15@",
+"52@77@15@",
+"52@77@66@15@",
+"52@77@67@15@",
+"52@77@69@15@",
+"52@80@15@",
+"52@80@66@15@",
+"52@80@67@15@",
+"52@80@69@15@",
+"52@81@15@",
+"52@81@66@15@",
+"52@81@67@15@",
+"52@81@69@15@",
+"53@",
+"53<CR>",
+"53@",
+"53@70@59@",
+"53@70@66@59@",
+"53@70@67@59@",
+"53@70@69@59@",
+"53@77@59@",
+"53@77@66@59@",
+"53@77@67@59@",
+"53@77@69@59@",
+"53@80@59@",
+"53@80@66@59@",
+"53@80@67@59@",
+"53@80@69@59@",
+"53@81@59@",
+"53@81@66@59@",
+"53@81@67@59@",
+"53@81@69@59@",
+"54@",
+"54<CR>",
+"54@70@16@",
+"54@70@66@16@",
+"54@70@67@16@",
+"54@70@69@16@",
+"54@77@16@",
+"54@77@66@16@",
+"54@77@67@16@",
+"54@77@69@16@",
+"54@80@16@",
+"54@80@66@16@",
+"54@80@67@16@",
+"54@80@69@16@",
+"54@81@16@",
+"54@81@66@16@",
+"54@81@67@16@",
+"54@81@69@16@",
+"55@",
+"55<CR>",
+"55@",
+"55@70@61@",
+"55@70@66@61@",
+"55@70@67@61@",
+"55@70@69@61@",
+"55@77@61@",
+"55@77@66@61@",
+"55@77@67@61@",
+"55@77@69@61@",
+"55@80@61@",
+"55@80@66@61@",
+"55@80@67@61@",
+"55@80@69@61@",
+"55@81@61@",
+"55@81@66@61@",
+"55@81@67@61@",
+"55@81@69@61@",
+"56@",
+"56@70@62@",
+"56@70@66@62@",
+"56@70@67@62@",
+"56@70@69@62@",
+"56@77@62@",
+"56@77@66@62@",
+"56@77@67@62@",
+"56@77@69@62@",
+"56@80@62@",
+"56@80@66@62@",
+"56@80@67@62@",
+"56@80@69@62@",
+"56@81@62@",
+"56@81@66@62@",
+"56@81@67@62@",
+"56@81@69@62@",
+"57@",
+"57@70@63@",
+"57@70@66@63@",
+"57@70@67@63@",
+"57@70@69@63@",
+"57@77@63@",
+"57@77@66@63@",
+"57@77@67@63@",
+"57@77@69@63@",
+"57@80@63@",
+"57@80@66@63@",
+"57@80@67@63@",
+"57@80@69@63@",
+"57@81@63@",
+"57@81@66@63@",
+"57@81@67@63@",
+"57@81@69@63@",
+"58@",
+"58@70@64@",
+"58@70@66@64@",
+"58@70@67@64@",
+"58@70@69@64@",
+"58@77@64@",
+"58@77@66@64@",
+"58@77@67@64@",
+"58@77@69@64@",
+"58@80@64@",
+"58@80@66@64@",
+"58@80@67@64@",
+"58@80@69@64@",
+"58@81@64@",
+"58@81@66@64@",
+"58@81@67@64@",
+"58@81@69@64@",
+"59@",
+"5L@#",
+"5LC@#",
+"5R@#",
+"5RC@#",
+"6@",
+"6<CR>",
+"6@",
+"60@",
+"60<CR>",
+"60@",
+"61@",
+"62@",
+"63@",
+"63@66@",
+"63@67@",
+"63@69@",
+"64@",
+"64@66@",
+"64@67@",
+"64@69@",
+"65@",
+"66@",
+"66<CR>",
+"66@",
+"67@",
+"67<CR>",
+"67@",
+"68@",
+"69@",
+"69<CR>",
+"69@",
+"69<CR>",
+"69@",
+"69<CR>",
+"69@",
+"69<CR>",
+"69@",
+"7@",
+"7<CR>",
+"7@",
+"70@",
+"70<CR>",
+"70@",
+"71@",
+"72@",
+"73@",
+"74@",
+"75@",
+"76@",
+"77@",
+"77<CR>",
+"77@",
+"78@",
+"79@",
+"8@",
+"8<CR>",
+"8@",
+"80@",
+"80<CR>",
+"80@",
+"81@",
+"82@",
+"83@",
+"84@",
+"85@",
+"86@",
+"87@",
+"88@",
+"89@",
+"9@",
+"9<CR>",
+"9@",
+"9@#",
+"90@",
+"91@",
+"92@",
+"93@",
+"94@",
+"95@",
+"96@",
+"97@",
+"98@",
+"99@",
+"9L@#",
+"9LC@#",
+"9R@#",
+"9RC@#",
+"ATE0V0",
+"AUTOSTREAM: LEVEL 1",
+"AUTOSTREAM: LEVEL 2",
+"AUTOSTREAM: LEVEL 3",
+"BLACKLISTED",
+"BUSY",
+"CARRIER",
+"CARRIER 0300",
+"CARRIER 1200",
+"CARRIER 1200/75",
+"CARRIER 1200/75/VFC",
+"CARRIER 1200/VFC",
+"CARRIER 12000",
+"CARRIER 12000/VFC",
+"CARRIER 14400",
+"CARRIER 14400/VFC",
+"CARRIER 16800",
+"CARRIER 16800 V.34",
+"CARRIER 16800/VFC",
+"CARRIER 19200",
+"CARRIER 19200 V.34",
+"CARRIER 19200/VFC",
+"CARRIER 21600",
+"CARRIER 21600 V.34",
+"CARRIER 21600/VFC",
+"CARRIER 2400",
+"CARRIER 2400/VFC",
+"CARRIER 24000",
+"CARRIER 24000 V.34",
+"CARRIER 24000/VFC",
+"CARRIER 26400",
+"CARRIER 26400 V.34",
+"CARRIER 26400/VFC",
+"CARRIER 28800",
+"CARRIER 28800 V.34",
+"CARRIER 28800/VFC",
+"CARRIER 300",
+"CARRIER 300/VFC",
+"CARRIER 4800",
+"CARRIER 4800/VFC",
+"CARRIER 7200",
+"CARRIER 7200/VFC",
+"CARRIER 75/1200",
+"CARRIER 75/1200/VFC",
+"CARRIER 9600",
+"CARRIER 9600/VFC",
+"CLIENT",
+"CLIENTSERVER",
+"COMPRESSION: ADC",
+"COMPRESSION: CLASS 5",
+"COMPRESSION: CLASS5",
+"COMPRESSION: MNP5",
+"COMPRESSION: NONE",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42 bis",
+"COMPRESSION: V.42 BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V.42bis",
+"COMPRESSION: V.42BIS",
+"COMPRESSION: V42BIS",
+"COMPRESSION:CLASS5",
+"COMPRESSION:MNP5",
+"COMPRESSION:NONE",
+"COMPRESSION:V.42bis",
+"CONNECT",
+"CONNECT 0300",
+"CONNECT 0300/ARQ",
+"CONNECT 0300/LAP-M",
+"CONNECT 0300/MNP",
+"CONNECT 0300/REL",
+"CONNECT 0300/REL-5",
+"CONNECT 0300/REL-LAPM",
+"CONNECT 0300/REL-LAPM-COMP",
+"CONNECT 0300/REL-MNP",
+"CONNECT 0300/REL-MNP-COMP",
+"CONNECT 0300/REL-V.42",
+"CONNECT 0300/V42b",
+"CONNECT 0300/V42BIS",
+"CONNECT 0600",
+"CONNECT 0600/ARQ",
+"CONNECT 0600/LAP-M",
+"CONNECT 0600/LAPM",
+"CONNECT 0600/MNP",
+"CONNECT 0600/NONE",
+"CONNECT 0600/REL",
+"CONNECT 0600/REL-5",
+"CONNECT 0600/REL-LAPM",
+"CONNECT 0600/REL-LAPM-COMP",
+"CONNECT 0600/REL-MNP",
+"CONNECT 0600/REL-MNP-COMP",
+"CONNECT 0600/REL-V.42",
+"CONNECT 0600/V42",
+"CONNECT 0600/V42b",
+"CONNECT 0600/V42BIS",
+"CONNECT 115,200",
+"CONNECT 115,200/ARQ",
+"CONNECT 115,200/LAP-M",
+"CONNECT 115,200/MNP",
+"CONNECT 115,200/NONE",
+"CONNECT 115,200/REL",
+"CONNECT 115,200/REL-5",
+"CONNECT 115,200/REL-V.42",
+"CONNECT 115,200/V42",
+"CONNECT 115,200/V42b",
+"CONNECT 115,200/V42BIS",
+"CONNECT 115200",
+"CONNECT 115200/ARQ",
+"CONNECT 115200/LAP-M",
+"CONNECT 115200/LAPM",
+"CONNECT 115200/MNP",
+"CONNECT 115200/NONE",
+"CONNECT 115200/REL",
+"CONNECT 115200/REL-5",
+"CONNECT 115200/REL-LAPM",
+"CONNECT 115200/REL-LAPM-COMP",
+"CONNECT 115200/REL-MNP",
+"CONNECT 115200/REL-MNP-COMP",
+"CONNECT 115200/REL-V.42",
+"CONNECT 115200/REL/VFC",
+"CONNECT 115200/V42",
+"CONNECT 115200/V42b",
+"CONNECT 115200/V42BIS",
+"CONNECT 115200/VFC",
+"CONNECT 1200",
+"CONNECT 1200/75",
+"CONNECT 1200/75/ARQ",
+"CONNECT 1200/75/LAP-M",
+"CONNECT 1200/75/LAPM",
+"CONNECT 1200/75/MNP",
+"CONNECT 1200/75/NONE",
+"CONNECT 1200/75/REL",
+"CONNECT 1200/75/REL-5",
+"CONNECT 1200/75/REL-LAPM",
+"CONNECT 1200/75/REL-LAPM-COMP",
+"CONNECT 1200/75/REL-MNP",
+"CONNECT 1200/75/REL-MNP-COMP",
+"CONNECT 1200/75/REL-V.42",
+"CONNECT 1200/75/V42",
+"CONNECT 1200/75/V42b",
+"CONNECT 1200/75/V42BIS",
+"CONNECT 1200/ARQ",
+"CONNECT 1200/ECL",
+"CONNECT 1200/ECLC",
+"CONNECT 1200/LAP-M",
+"CONNECT 1200/LAPM",
+"CONNECT 1200/MNP",
+"CONNECT 1200/NONE",
+"CONNECT 1200/REL",
+"CONNECT 1200/REL-5",
+"CONNECT 1200/REL-LAPM",
+"CONNECT 1200/REL-LAPM-COMP",
+"CONNECT 1200/REL-LAPM V.42 BIS",
+"CONNECT 1200/REL-MNP",
+"CONNECT 1200/REL-MNP-COMP",
+"CONNECT 1200/REL-MNP 5",
+"CONNECT 1200/REL-V.42",
+"CONNECT 1200/V42",
+"CONNECT 1200/V42b",
+"CONNECT 1200/V42BIS",
+"CONNECT 12000",
+"CONNECT 12000/ARQ",
+"CONNECT 12000/ECL",
+"CONNECT 12000/ECLC",
+"CONNECT 12000/LAP-M",
+"CONNECT 12000/LAPM",
+"CONNECT 12000/MNP",
+"CONNECT 12000/NONE",
+"CONNECT 12000/REL",
+"CONNECT 12000/REL-5",
+"CONNECT 12000/REL-LAPM",
+"CONNECT 12000/REL-LAPM-COMP",
+"CONNECT 12000/REL-LAPM V.42 BIS",
+"CONNECT 12000/REL-MNP",
+"CONNECT 12000/REL-MNP-COMP",
+"CONNECT 12000/REL-MNP 5",
+"CONNECT 12000/REL-V.42",
+"CONNECT 12000/V42",
+"CONNECT 12000/V42b",
+"CONNECT 12000/V42BIS",
+"CONNECT 1200TX/75RX",
+"CONNECT 1200TX/75RX/ARQ",
+"CONNECT 1200TX/75RX/LAP-M",
+"CONNECT 1200TX/75RX/LAPM",
+"CONNECT 1200TX/75RX/MNP",
+"CONNECT 1200TX/75RX/NONE",
+"CONNECT 1200TX/75RX/REL",
+"CONNECT 1200TX/75RX/REL-5",
+"CONNECT 1200TX/75RX/REL-LAPM",
+"CONNECT 1200TX/75RX/REL-LAPM-COMP",
+"CONNECT 1200TX/75RX/REL-MNP",
+"CONNECT 1200TX/75RX/REL-MNP-COMP",
+"CONNECT 1200TX/75RX/REL-V.42",
+"CONNECT 1200TX/75RX/V42",
+"CONNECT 1200TX/75RX/V42b",
+"CONNECT 1200TX/75RX/V42BIS",
+"CONNECT 14400",
+"CONNECT 14400/ARQ",
+"CONNECT 14400/ECL",
+"CONNECT 14400/ECLC",
+"CONNECT 14400/LAP-M",
+"CONNECT 14400/LAPM",
+"CONNECT 14400/MNP",
+"CONNECT 14400/NONE",
+"CONNECT 14400/REL",
+"CONNECT 14400/REL-5",
+"CONNECT 14400/REL-LAPM",
+"CONNECT 14400/REL-LAPM-COMP",
+"CONNECT 14400/REL-LAPM V.42 BIS",
+"CONNECT 14400/REL-MNP",
+"CONNECT 14400/REL-MNP-COMP",
+"CONNECT 14400/REL-MNP 5",
+"CONNECT 14400/REL-V.42",
+"CONNECT 14400/V42",
+"CONNECT 14400/V42b",
+"CONNECT 14400/V42BIS",
+"CONNECT 14400/VFC",
+"CONNECT 16800",
+"CONNECT 16800/ARQ",
+"CONNECT 16800/ECL",
+"CONNECT 16800/ECLC",
+"CONNECT 16800/LAP-M",
+"CONNECT 16800/LAPM",
+"CONNECT 16800/MNP",
+"CONNECT 16800/NONE",
+"CONNECT 16800/REL",
+"CONNECT 16800/REL-5",
+"CONNECT 16800/REL-LAPM",
+"CONNECT 16800/REL-LAPM-COMP",
+"CONNECT 16800/REL-MNP",
+"CONNECT 16800/REL-MNP-COMP",
+"CONNECT 16800/REL-V.42",
+"CONNECT 16800/V42",
+"CONNECT 16800/V42b",
+"CONNECT 16800/V42BIS",
+"CONNECT 16800/VFC",
+"CONNECT 19200",
+"CONNECT 19200/ARQ",
+"CONNECT 19200/ECL",
+"CONNECT 19200/ECLC",
+"CONNECT 19200/LAP-M",
+"CONNECT 19200/LAPM",
+"CONNECT 19200/MNP",
+"CONNECT 19200/NONE",
+"CONNECT 19200/REL",
+"CONNECT 19200/REL-5",
+"CONNECT 19200/REL-LAPM",
+"CONNECT 19200/REL-LAPM-COMP",
+"CONNECT 19200/REL-MNP",
+"CONNECT 19200/REL-MNP-COMP",
+"CONNECT 19200/REL-V.42",
+"CONNECT 19200/V42",
+"CONNECT 19200/V42b",
+"CONNECT 19200/V42BIS",
+"CONNECT 19200/VFC",
+"CONNECT 21600",
+"CONNECT 21600/ARQ",
+"CONNECT 21600/ECL",
+"CONNECT 21600/ECLC",
+"CONNECT 21600/LAP-M",
+"CONNECT 21600/LAPM",
+"CONNECT 21600/MNP",
+"CONNECT 21600/NONE",
+"CONNECT 21600/REL",
+"CONNECT 21600/REL-5",
+"CONNECT 21600/REL-LAPM-COMP",
+"CONNECT 21600/REL-MNP",
+"CONNECT 21600/REL-MNP-COMP",
+"CONNECT 21600/REL-REL-LAPM",
+"CONNECT 21600/REL-V.42",
+"CONNECT 21600/V42",
+"CONNECT 21600/V42b",
+"CONNECT 21600/V42BIS",
+"CONNECT 21600/VFC",
+"CONNECT 230400",
+"CONNECT 230400/ARQ",
+"CONNECT 230400/LAP-M",
+"CONNECT 230400/MNP",
+"CONNECT 230400/NONE",
+"CONNECT 230400/REL",
+"CONNECT 230400/V42",
+"CONNECT 230400/V42b",
+"CONNECT 230400/V42BIS",
+"CONNECT 2400",
+"CONNECT 2400/ARQ",
+"CONNECT 2400/ECL",
+"CONNECT 2400/ECLC",
+"CONNECT 2400/LAP-M",
+"CONNECT 2400/LAPM",
+"CONNECT 2400/MNP",
+"CONNECT 2400/NONE",
+"CONNECT 2400/REL",
+"CONNECT 2400/REL-5",
+"CONNECT 2400/REL-LAPM",
+"CONNECT 2400/REL-LAPM-COMP",
+"CONNECT 2400/REL-LAPM V.42 BIS",
+"CONNECT 2400/REL-MNP",
+"CONNECT 2400/REL-MNP-COMP",
+"CONNECT 2400/REL-MNP 5",
+"CONNECT 2400/REL-V.42",
+"CONNECT 2400/V42",
+"CONNECT 2400/V42b",
+"CONNECT 2400/V42BIS",
+"CONNECT 24000",
+"CONNECT 24000/ARQ",
+"CONNECT 24000/ECL",
+"CONNECT 24000/ECLC",
+"CONNECT 24000/LAP-M",
+"CONNECT 24000/LAPM",
+"CONNECT 24000/MNP",
+"CONNECT 24000/NONE",
+"CONNECT 24000/REL",
+"CONNECT 24000/REL-5",
+"CONNECT 24000/REL-LAPM",
+"CONNECT 24000/REL-LAPM-COMP",
+"CONNECT 24000/REL-MNP",
+"CONNECT 24000/REL-MNP-COMP",
+"CONNECT 24000/REL-V.42",
+"CONNECT 24000/V42",
+"CONNECT 24000/V42b",
+"CONNECT 24000/V42BIS",
+"CONNECT 24000/VFC",
+"CONNECT 26400",
+"CONNECT 26400/ARQ",
+"CONNECT 26400/ECL",
+"CONNECT 26400/ECLC",
+"CONNECT 26400/LAP-M",
+"CONNECT 26400/LAPM",
+"CONNECT 26400/MNP",
+"CONNECT 26400/NONE",
+"CONNECT 26400/REL",
+"CONNECT 26400/REL-5",
+"CONNECT 26400/REL-LAPM",
+"CONNECT 26400/REL-LAPM-COMP",
+"CONNECT 26400/REL-MNP",
+"CONNECT 26400/REL-MNP-COMP",
+"CONNECT 26400/REL-V.42",
+"CONNECT 26400/V42",
+"CONNECT 26400/V42b",
+"CONNECT 26400/V42BIS",
+"CONNECT 26400/VFC",
+"CONNECT 28800",
+"CONNECT 28800/ARQ",
+"CONNECT 28800/ARQ/VFC",
+"CONNECT 28800/ECL",
+"CONNECT 28800/ECLC",
+"CONNECT 28800/LAP-M",
+"CONNECT 28800/LAPM",
+"CONNECT 28800/MNP",
+"CONNECT 28800/NONE",
+"CONNECT 28800/REL",
+"CONNECT 28800/REL-5",
+"CONNECT 28800/REL-LAPM",
+"CONNECT 28800/REL-LAPM-COMP",
+"CONNECT 28800/REL-MNP",
+"CONNECT 28800/REL-MNP-COMP",
+"CONNECT 28800/REL-V.42",
+"CONNECT 28800/REL/VFC",
+"CONNECT 28800/V42",
+"CONNECT 28800/V42b",
+"CONNECT 28800/V42BIS",
+"CONNECT 28800/VFC",
+"CONNECT 300",
+"CONNECT 300/ARQ",
+"CONNECT 300/ECL",
+"CONNECT 300/ECLC",
+"CONNECT 300/LAP-M",
+"CONNECT 300/LAPM",
+"CONNECT 300/MNP",
+"CONNECT 300/NONE",
+"CONNECT 300/REL",
+"CONNECT 300/REL-5",
+"CONNECT 300/REL-LAPM",
+"CONNECT 300/REL-LAPM-COMP",
+"CONNECT 300/REL-LAPM V.42 BIS",
+"CONNECT 300/REL-MNP",
+"CONNECT 300/REL-MNP-COMP",
+"CONNECT 300/REL-MNP 5",
+"CONNECT 300/REL-V.42",
+"CONNECT 300/V42",
+"CONNECT 300/V42b",
+"CONNECT 300/V42BIS",
+"CONNECT 38400",
+"CONNECT 38400/ARQ",
+"CONNECT 38400/LAP-M",
+"CONNECT 38400/LAPM",
+"CONNECT 38400/MNP",
+"CONNECT 38400/NONE",
+"CONNECT 38400/REL",
+"CONNECT 38400/REL-5",
+"CONNECT 38400/REL-LAPM",
+"CONNECT 38400/REL-LAPM-COMP",
+"CONNECT 38400/REL-MNP",
+"CONNECT 38400/REL-MNP-COMP",
+"CONNECT 38400/REL-V.42",
+"CONNECT 38400/REL/VFC",
+"CONNECT 38400/V42",
+"CONNECT 38400/V42b",
+"CONNECT 38400/V42BIS",
+"CONNECT 38400/VFC",
+"CONNECT 4800",
+"CONNECT 4800/ARQ",
+"CONNECT 4800/ECL",
+"CONNECT 4800/ECLC",
+"CONNECT 4800/LAP-M",
+"CONNECT 4800/LAPM",
+"CONNECT 4800/MNP",
+"CONNECT 4800/NONE",
+"CONNECT 4800/REL",
+"CONNECT 4800/REL-5",
+"CONNECT 4800/REL-LAPM",
+"CONNECT 4800/REL-LAPM-COMP",
+"CONNECT 4800/REL-LAPM V.42 BIS",
+"CONNECT 4800/REL-MNP",
+"CONNECT 4800/REL-MNP-COMP",
+"CONNECT 4800/REL-MNP 5",
+"CONNECT 4800/REL-V.42",
+"CONNECT 4800/V42",
+"CONNECT 4800/V42b",
+"CONNECT 4800/V42BIS",
+"CONNECT 57600",
+"CONNECT 57600/ARQ",
+"CONNECT 57600/LAP-M",
+"CONNECT 57600/LAPM",
+"CONNECT 57600/MNP",
+"CONNECT 57600/NONE",
+"CONNECT 57600/REL",
+"CONNECT 57600/REL-5",
+"CONNECT 57600/REL-LAPM",
+"CONNECT 57600/REL-LAPM-COMP",
+"CONNECT 57600/REL-MNP",
+"CONNECT 57600/REL-MNP-COMP",
+"CONNECT 57600/REL-V.42",
+"CONNECT 57600/REL/VFC",
+"CONNECT 57600/V42",
+"CONNECT 57600/V42b",
+"CONNECT 57600/V42BIS",
+"CONNECT 57600/VFC",
+"CONNECT 600",
+"CONNECT 600/ARQ",
+"CONNECT 600/ECL",
+"CONNECT 600/ECLC",
+"CONNECT 600/LAP-M",
+"CONNECT 600/LAPM",
+"CONNECT 600/MNP",
+"CONNECT 600/NONE",
+"CONNECT 600/REL",
+"CONNECT 600/REL-5",
+"CONNECT 600/REL-LAPM",
+"CONNECT 600/REL-LAPM-COMP",
+"CONNECT 600/REL-LAPM V.42 BIS",
+"CONNECT 600/REL-MNP",
+"CONNECT 600/REL-MNP-COMP",
+"CONNECT 600/REL-MNP 5",
+"CONNECT 600/REL-V.42",
+"CONNECT 600/V42",
+"CONNECT 600/V42b",
+"CONNECT 600/V42BIS",
+"CONNECT 7200",
+"CONNECT 7200/ARQ",
+"CONNECT 7200/ECL",
+"CONNECT 7200/ECLC",
+"CONNECT 7200/LAP-M",
+"CONNECT 7200/LAPM",
+"CONNECT 7200/MNP",
+"CONNECT 7200/NONE",
+"CONNECT 7200/REL",
+"CONNECT 7200/REL-5",
+"CONNECT 7200/REL-LAPM",
+"CONNECT 7200/REL-LAPM-COMP",
+"CONNECT 7200/REL-LAPM V.42 BIS",
+"CONNECT 7200/REL-MNP",
+"CONNECT 7200/REL-MNP-COMP",
+"CONNECT 7200/REL-MNP 5",
+"CONNECT 7200/REL-V.42",
+"CONNECT 7200/V42",
+"CONNECT 7200/V42b",
+"CONNECT 7200/V42BIS",
+"CONNECT 75/1200",
+"CONNECT 75/1200/ARQ",
+"CONNECT 75/1200/LAP-M",
+"CONNECT 75/1200/MNP",
+"CONNECT 75/1200/NONE",
+"CONNECT 75/1200/REL",
+"CONNECT 75/1200/REL-5",
+"CONNECT 75/1200/REL-LAPM",
+"CONNECT 75/1200/REL-LAPM-COMP",
+"CONNECT 75/1200/REL-MNP",
+"CONNECT 75/1200/REL-MNP-COMP",
+"CONNECT 75/1200/REL-V.42",
+"CONNECT 75/1200/V42",
+"CONNECT 75/1200/V42b",
+"CONNECT 75/1200/V42BIS",
+"CONNECT 75TX/1200RX",
+"CONNECT 75TX/1200RX/ARQ",
+"CONNECT 75TX/1200RX/LAP-M",
+"CONNECT 75TX/1200RX/LAPM",
+"CONNECT 75TX/1200RX/MNP",
+"CONNECT 75TX/1200RX/NONE",
+"CONNECT 75TX/1200RX/REL",
+"CONNECT 75TX/1200RX/REL-5",
+"CONNECT 75TX/1200RX/REL-LAPM",
+"CONNECT 75TX/1200RX/REL-LAPM-COMP",
+"CONNECT 75TX/1200RX/REL-MNP",
+"CONNECT 75TX/1200RX/REL-MNP-COMP",
+"CONNECT 75TX/1200RX/REL-V.42",
+"CONNECT 75TX/1200RX/V42",
+"CONNECT 75TX/1200RX/V42b",
+"CONNECT 75TX/1200RX/V42BIS",
+"CONNECT 9600",
+"CONNECT 9600/ARQ",
+"CONNECT 9600/ECL",
+"CONNECT 9600/ECLC",
+"CONNECT 9600/LAP-M",
+"CONNECT 9600/LAPM",
+"CONNECT 9600/MNP",
+"CONNECT 9600/NONE",
+"CONNECT 9600/REL",
+"CONNECT 9600/REL-5",
+"CONNECT 9600/REL-LAPM",
+"CONNECT 9600/REL-LAPM-COMP",
+"CONNECT 9600/REL-LAPM V.42 BIS",
+"CONNECT 9600/REL-MNP",
+"CONNECT 9600/REL-MNP-COMP",
+"CONNECT 9600/REL-MNP 5",
+"CONNECT 9600/REL-V.42",
+"CONNECT 9600/V42",
+"CONNECT 9600/V42b",
+"CONNECT 9600/V42BIS",
+"CONNECT ECL",
+"CONNECT ECLC",
+"CONNECT/ARQ",
+"CONNECT/LAP-M",
+"CONNECT/LAPM",
+"CONNECT/MNP",
+"CONNECT/NONE",
+"CONNECT/REL",
+"CONNECT/V42",
+"CONNECT/V42b",
+"CONNECT/V42BIS",
+"DATA",
+"DELAYED",
+"DIALING",
+"ERROR",
+"FAX",
+"HOST DRIVER TIMEOUT",
+"mdmblatz.inf:HKR, Responses,",
+"mdmbsb.inf:HKR, Responses,",
+"mdmbsch.inf:HKR, Responses,",
+"mdmhaeus.inf:HKR, Responses,",
+"mdmico.inf:HKR, Responses,",
+"mdminsys.inf:HKR, Responses,",
+"mdmke.inf:HKR, Responses,",
+"mdmmart.inf:HKR, Responses,",
+"mdmneuhs.inf:HKR, Responses,",
+"mdmrfi.inf:HKR, Responses,",
+"mdmtelnk.inf:HKR, Responses,",
+"mdmtger.inf:HKR, Responses,",
+"mdmtkr.inf:HKR, Responses,",
+"mdmusrcr.inf:HKR,Responses,",
+"mdmusrg.inf:HKR,Responses,",
+"mdmusrsp.inf:HKR,Responses,",
+"mdmusrwp.inf:HKR,Responses,",
+"mdmwoer.inf:HKR, Responses,",
+"MESG = ",
+"NAME = ",
+"NMBR = ",
+"NO ANSWER",
+"NO CARRIER",
+"NO DIAL TONE",
+"NO DIALTONE",
+"NoResponse",
+"OK",
+"PROTOCOL: ALT",
+"PROTOCOL: ALT-CELLULAR",
+"PROTOCOL: ALT - CELLULAR",
+"PROTOCOL: ERROR-CONTROL/LAPB",
+"PROTOCOL: ERROR-CONTROL/LAPB/AFT",
+"PROTOCOL: ERROR-CONTROL/LAPB/HDX",
+"PROTOCOL: LAP-M",
+"PROTOCOL: LAP-M/AFT",
+"PROTOCOL: LAP-M/ETC",
+"PROTOCOL: LAP-M/HDX",
+"PROTOCOL: LAPM",
+"PROTOCOL: LAPM/AFT",
+"PROTOCOL: LAPM/HDX",
+"PROTOCOL: MNP",
+"PROTOCOL: MNP 2",
+"PROTOCOL: MNP 2, 4",
+"PROTOCOL: MNP 3",
+"PROTOCOL: MNP 3, 4",
+"PROTOCOL: MNP 4",
+"PROTOCOL: MNP10",
+"PROTOCOL: MNP2",
+"PROTOCOL: MNP3",
+"PROTOCOL: MNP4",
+"PROTOCOL: NONE",
+"PROTOCOL: X.25/LAPB",
+"PROTOCOL: X.25/LAPB/AFT",
+"PROTOCOL: X.25/LAPB/HDX",
+"PROTOCOL:MNP 2, 4",
+"PROTOCOL:MNP 3, 4",
+"PROTOCOL:NONE",
+"RING",
+"RINGING",
+"RRING",
+"TIME = ",
+"VOICE",
+NULL
+};
+
+
+const TCHAR *rgpszActualResp[] =
+{
+ "0@",
+ "2@",
+ "3@",
+ "4@",
+ "6@",
+ "7@",
+ "8@",
+ "@",
+ "@#BUSY@#",
+ "@#CONNECT 1200/ARQ/HST/HST/V42BIS@#",
+ "@#CONNECT 1200/ARQ/LAPM/MNP5@#",
+ "@#CONNECT 1200/ARQ/LAPM/V42BIS@#",
+ "@#CONNECT 1200/ARQ/LAPM@#",
+ "@#CONNECT 1200/ARQ/MNP/MNP5@#",
+ "@#CONNECT 1200/ARQ/MNP/V42BIS@#",
+ "@#CONNECT 1200/ARQ/V32/LAPM/V42BIS@#",
+ "@#CONNECT 1200/ARQ/V32/LAPM@#",
+ "@#CONNECT 1200/ARQ/V32/MNP@#",
+ "@#CONNECT 1200/ARQ/V34/LAPM@#",
+ "@#CONNECT 1200/ARQ/V34/MNP@#",
+ "@#CONNECT 1200/ARQ@#",
+ "@#CONNECT 1200/NONE@#",
+ "@#CONNECT 12000/ARQ/HST/HST/CELLULAR/MNP5@#",
+ "@#CONNECT 12000/ARQ/HST/HST/CELLULAR/V42BIS@#",
+ "@#CONNECT 12000/ARQ/HST/HST/CELLULAR@#",
+ "@#CONNECT 12000/ARQ/HST/HST/V42BIS@#",
+ "@#CONNECT 12000/ARQ/HST/LAPM/MNP5@#",
+ "@#CONNECT 12000/ARQ/HST/LAPM/NONE@#",
+ "@#CONNECT 12000/ARQ/HST/LAPM/V42BIS@#",
+ "@#CONNECT 12000/ARQ/HST/MNP/MNP5@#",
+ "@#CONNECT 12000/ARQ/HST/MNP/NONE@#",
+ "@#CONNECT 12000/ARQ/HST/MNP/V42BIS@#",
+ "@#CONNECT 12000/ARQ/LAPM/V42BIS@#",
+ "@#CONNECT 12000/ARQ/MNP/MNP5@#",
+ "@#CONNECT 12000/ARQ/V32/LAPM/MNP5@#",
+ "@#CONNECT 12000/ARQ/V32/LAPM/NONE@#",
+ "@#CONNECT 12000/ARQ/V32/LAPM/V42BIS@#",
+ "@#CONNECT 12000/ARQ/V32/LAPM@#",
+ "@#CONNECT 12000/ARQ/V32/MNP/MNP5@#",
+ "@#CONNECT 12000/ARQ/V32/MNP/NONE@#",
+ "@#CONNECT 12000/ARQ/V32/MNP/V42BIS@#",
+ "@#CONNECT 12000/ARQ/V32/MNP@#",
+ "@#CONNECT 12000/ARQ/V34/LAPM/MNP5@#",
+ "@#CONNECT 12000/ARQ/V34/LAPM/NONE@#",
+ "@#CONNECT 12000/ARQ/V34/LAPM/V42BIS@#",
+ "@#CONNECT 12000/ARQ/V34/LAPM@#",
+ "@#CONNECT 12000/ARQ/V34/MNP/MNP5@#",
+ "@#CONNECT 12000/ARQ/V34/MNP/NONE@#",
+ "@#CONNECT 12000/ARQ/V34/MNP/V42BIS@#",
+ "@#CONNECT 12000/ARQ/V34/MNP@#",
+ "@#CONNECT 12000/ARQ/VFC/LAPM/MNP5@#",
+ "@#CONNECT 12000/ARQ/VFC/LAPM/NONE@#",
+ "@#CONNECT 12000/ARQ/VFC/LAPM/V42BIS@#",
+ "@#CONNECT 12000/ARQ/VFC/LAPM@#",
+ "@#CONNECT 12000/ARQ/VFC/MNP/MNP5@#",
+ "@#CONNECT 12000/ARQ/VFC/MNP/NONE@#",
+ "@#CONNECT 12000/ARQ/VFC/MNP/V42BIS@#",
+ "@#CONNECT 12000/ARQ@#",
+ "@#CONNECT 12000/HST/NONE@#",
+ "@#CONNECT 12000/V32/NONE@#",
+ "@#CONNECT 12000/V34/NONE@#",
+ "@#CONNECT 12000/VFC/NONE@#",
+ "@#CONNECT 14000/ARQ/HST/HST/CELLULAR/MNP5@#",
+ "@#CONNECT 14000/ARQ/HST/HST/CELLULAR/V42BIS@#",
+ "@#CONNECT 14000/ARQ/HST/HST/CELLULAR@#",
+ "@#CONNECT 14400/ARQ/HST/HST/V42BIS@#",
+ "@#CONNECT 14400/ARQ/HST/LAPM/MNP5@#",
+ "@#CONNECT 14400/ARQ/HST/LAPM/NONE@#",
+ "@#CONNECT 14400/ARQ/HST/LAPM/V42BIS@#",
+ "@#CONNECT 14400/ARQ/HST/MNP/MNP5@#",
+ "@#CONNECT 14400/ARQ/HST/MNP/NONE@#",
+ "@#CONNECT 14400/ARQ/HST/MNP/V42BIS@#",
+ "@#CONNECT 14400/ARQ/LAPM/V42BIS@#",
+ "@#CONNECT 14400/ARQ/MNP/MNP5@#",
+ "@#CONNECT 14400/ARQ/V32/LAPM/MNP5@#",
+ "@#CONNECT 14400/ARQ/V32/LAPM/NONE@#",
+ "@#CONNECT 14400/ARQ/V32/LAPM/V42BIS@#",
+ "@#CONNECT 14400/ARQ/V32/LAPM@#",
+ "@#CONNECT 14400/ARQ/V32/MNP/MNP5@#",
+ "@#CONNECT 14400/ARQ/V32/MNP/NONE@#",
+ "@#CONNECT 14400/ARQ/V32/MNP/V42BIS@#",
+ "@#CONNECT 14400/ARQ/V32/MNP@#",
+ "@#CONNECT 14400/ARQ/V34/LAPM/MNP5@#",
+ "@#CONNECT 14400/ARQ/V34/LAPM/NONE@#",
+ "@#CONNECT 14400/ARQ/V34/LAPM/V42BIS@#",
+ "@#CONNECT 14400/ARQ/V34/LAPM@#",
+ "@#CONNECT 14400/ARQ/V34/MNP/MNP5@#",
+ "@#CONNECT 14400/ARQ/V34/MNP/NONE@#",
+ "@#CONNECT 14400/ARQ/V34/MNP/V42BIS@#",
+ "@#CONNECT 14400/ARQ/V34/MNP@#",
+ "@#CONNECT 14400/ARQ/VFC/LAPM/MNP5@#",
+ "@#CONNECT 14400/ARQ/VFC/LAPM/NONE@#",
+ "@#CONNECT 14400/ARQ/VFC/LAPM/V42BIS@#",
+ "@#CONNECT 14400/ARQ/VFC/LAPM@#",
+ "@#CONNECT 14400/ARQ/VFC/MNP/MNP5@#",
+ "@#CONNECT 14400/ARQ/VFC/MNP/NONE@#",
+ "@#CONNECT 14400/ARQ/VFC/MNP/V42BIS@#",
+ "@#CONNECT 14400/ARQ@#",
+ "@#CONNECT 14400/HST/NONE@#",
+ "@#CONNECT 14400/V32/NONE@#",
+ "@#CONNECT 14400/V34/NONE@#",
+ "@#CONNECT 14400/VFC/NONE@#",
+ "@#CONNECT 16800/ARQ/HST/HST/CELLULAR/MNP5@#",
+ "@#CONNECT 16800/ARQ/HST/HST/CELLULAR/V42BIS@#",
+ "@#CONNECT 16800/ARQ/HST/HST/CELLULAR@#",
+ "@#CONNECT 16800/ARQ/HST/HST/V42BIS@#",
+ "@#CONNECT 16800/ARQ/HST/LAPM/MNP5@#",
+ "@#CONNECT 16800/ARQ/HST/LAPM/NONE@#",
+ "@#CONNECT 16800/ARQ/HST/LAPM/V42BIS@#",
+ "@#CONNECT 16800/ARQ/HST/MNP/MNP5@#",
+ "@#CONNECT 16800/ARQ/HST/MNP/NONE@#",
+ "@#CONNECT 16800/ARQ/HST/MNP/V42BIS@#",
+ "@#CONNECT 16800/ARQ/LAPM/V42BIS@#",
+ "@#CONNECT 16800/ARQ/MNP/MNP5@#",
+ "@#CONNECT 16800/ARQ/V32/LAPM/MNP5@#",
+ "@#CONNECT 16800/ARQ/V32/LAPM/NONE@#",
+ "@#CONNECT 16800/ARQ/V32/LAPM/V42BIS@#",
+ "@#CONNECT 16800/ARQ/V32/LAPM@#",
+ "@#CONNECT 16800/ARQ/V32/MNP/MNP5@#",
+ "@#CONNECT 16800/ARQ/V32/MNP/NONE@#",
+ "@#CONNECT 16800/ARQ/V32/MNP/V42BIS@#",
+ "@#CONNECT 16800/ARQ/V32/MNP@#",
+ "@#CONNECT 16800/ARQ/V34/LAPM/MNP5@#",
+ "@#CONNECT 16800/ARQ/V34/LAPM/NONE@#",
+ "@#CONNECT 16800/ARQ/V34/LAPM/V42BIS@#",
+ "@#CONNECT 16800/ARQ/V34/LAPM@#",
+ "@#CONNECT 16800/ARQ/V34/MNP/MNP5@#",
+ "@#CONNECT 16800/ARQ/V34/MNP/NONE@#",
+ "@#CONNECT 16800/ARQ/V34/MNP/V42BIS@#",
+ "@#CONNECT 16800/ARQ/V34/MNP@#",
+ "@#CONNECT 16800/ARQ/VFC/LAPM/MNP5@#",
+ "@#CONNECT 16800/ARQ/VFC/LAPM/NONE@#",
+ "@#CONNECT 16800/ARQ/VFC/LAPM/V42BIS@#",
+ "@#CONNECT 16800/ARQ/VFC/MNP/MNP5@#",
+ "@#CONNECT 16800/ARQ/VFC/MNP/NONE@#",
+ "@#CONNECT 16800/ARQ/VFC/MNP/V42BIS@#",
+ "@#CONNECT 16800/ARQ@#",
+ "@#CONNECT 16800/HST/NONE@#",
+ "@#CONNECT 16800/V32/NONE@#",
+ "@#CONNECT 16800/V34/NONE@#",
+ "@#CONNECT 16800/VFC/NONE@#",
+ "@#CONNECT 19200/ARQ/HST/HST/V42BIS@#",
+ "@#CONNECT 19200/ARQ/LAPM/V42BIS@#",
+ "@#CONNECT 19200/ARQ/MNP/MNP5@#",
+ "@#CONNECT 19200/ARQ/V32/LAPM/MNP5@#",
+ "@#CONNECT 19200/ARQ/V32/LAPM/NONE@#",
+ "@#CONNECT 19200/ARQ/V32/LAPM/V42BIS@#",
+ "@#CONNECT 19200/ARQ/V32/LAPM@#",
+ "@#CONNECT 19200/ARQ/V32/MNP/MNP5@#",
+ "@#CONNECT 19200/ARQ/V32/MNP/NONE@#",
+ "@#CONNECT 19200/ARQ/V32/MNP/V42BIS@#",
+ "@#CONNECT 19200/ARQ/V32/MNP@#",
+ "@#CONNECT 19200/ARQ/V34/LAPM/MNP5@#",
+ "@#CONNECT 19200/ARQ/V34/LAPM/NONE@#",
+ "@#CONNECT 19200/ARQ/V34/LAPM/V42BIS@#",
+ "@#CONNECT 19200/ARQ/V34/LAPM@#",
+ "@#CONNECT 19200/ARQ/V34/MNP/MNP5@#",
+ "@#CONNECT 19200/ARQ/V34/MNP/NONE@#",
+ "@#CONNECT 19200/ARQ/V34/MNP/V42BIS@#",
+ "@#CONNECT 19200/ARQ/V34/MNP@#",
+ "@#CONNECT 19200/ARQ/VFC/LAPM/MNP5@#",
+ "@#CONNECT 19200/ARQ/VFC/LAPM/NONE@#",
+ "@#CONNECT 19200/ARQ/VFC/LAPM/V42BIS@#",
+ "@#CONNECT 19200/ARQ/VFC/MNP/MNP5@#",
+ "@#CONNECT 19200/ARQ/VFC/MNP/NONE@#",
+ "@#CONNECT 19200/ARQ/VFC/MNP/V42BIS@#",
+ "@#CONNECT 19200/ARQ@#",
+ "@#CONNECT 19200/V32/NONE@#",
+ "@#CONNECT 19200/V34/NONE@#",
+ "@#CONNECT 19200/VFC/NONE@#",
+ "@#CONNECT 21600/ARQ/HST/HST/V42BIS@#",
+ "@#CONNECT 21600/ARQ/LAPM/V42BIS@#",
+ "@#CONNECT 21600/ARQ/MNP/MNP5@#",
+ "@#CONNECT 21600/ARQ/V32/LAPM/MNP5@#",
+ "@#CONNECT 21600/ARQ/V32/LAPM/NONE@#",
+ "@#CONNECT 21600/ARQ/V32/LAPM/V42BIS@#",
+ "@#CONNECT 21600/ARQ/V32/LAPM@#",
+ "@#CONNECT 21600/ARQ/V32/MNP/MNP5@#",
+ "@#CONNECT 21600/ARQ/V32/MNP/NONE@#",
+ "@#CONNECT 21600/ARQ/V32/MNP/V42BIS@#",
+ "@#CONNECT 21600/ARQ/V32/MNP@#",
+ "@#CONNECT 21600/ARQ/V34/LAPM/MNP5@#",
+ "@#CONNECT 21600/ARQ/V34/LAPM/NONE@#",
+ "@#CONNECT 21600/ARQ/V34/LAPM/V42BIS@#",
+ "@#CONNECT 21600/ARQ/V34/LAPM@#",
+ "@#CONNECT 21600/ARQ/V34/MNP/MNP5@#",
+ "@#CONNECT 21600/ARQ/V34/MNP/NONE@#",
+ "@#CONNECT 21600/ARQ/V34/MNP/V42BIS@#",
+ "@#CONNECT 21600/ARQ/V34/MNP@#",
+ "@#CONNECT 21600/ARQ/VFC/LAPM/MNP5@#",
+ "@#CONNECT 21600/ARQ/VFC/LAPM/NONE@#",
+ "@#CONNECT 21600/ARQ/VFC/LAPM/V42BIS@#",
+ "@#CONNECT 21600/ARQ/VFC/MNP/MNP5@#",
+ "@#CONNECT 21600/ARQ/VFC/MNP/NONE@#",
+ "@#CONNECT 21600/ARQ/VFC/MNP/V42BIS@#",
+ "@#CONNECT 21600/ARQ@#",
+ "@#CONNECT 21600/V32/NONE@#",
+ "@#CONNECT 21600/V34/NONE@#",
+ "@#CONNECT 21600/VFC/NONE@#",
+ "@#CONNECT 2400/ARQ/HST/HST/V42BIS@#",
+ "@#CONNECT 2400/ARQ/LAPM/V42BIS@#",
+ "@#CONNECT 2400/ARQ/LAPM@#",
+ "@#CONNECT 2400/ARQ/MNP/MNP5@#",
+ "@#CONNECT 2400/ARQ/V32/LAPM/V42BIS@#",
+ "@#CONNECT 2400/ARQ/V32/LAPM@#",
+ "@#CONNECT 2400/ARQ/V32/MNP@#",
+ "@#CONNECT 2400/ARQ/V34/LAPM/MNP5@#",
+ "@#CONNECT 2400/ARQ/V34/LAPM/NONE@#",
+ "@#CONNECT 2400/ARQ/V34/LAPM/V42BIS@#",
+ "@#CONNECT 2400/ARQ/V34/LAPM@#",
+ "@#CONNECT 2400/ARQ/V34/MNP/MNP5@#",
+ "@#CONNECT 2400/ARQ/V34/MNP/NONE@#",
+ "@#CONNECT 2400/ARQ/V34/MNP/V42BIS@#",
+ "@#CONNECT 2400/ARQ/V34/MNP@#",
+ "@#CONNECT 2400/ARQ@#",
+ "@#CONNECT 2400/NONE@#",
+ "@#CONNECT 2400/V34/NONE@#",
+ "@#CONNECT 24000/ARQ/HST/HST/V42BIS@#",
+ "@#CONNECT 24000/ARQ/LAPM/V42BIS@#",
+ "@#CONNECT 24000/ARQ/MNP/MNP5@#",
+ "@#CONNECT 24000/ARQ/V32/LAPM/V42BIS@#",
+ "@#CONNECT 24000/ARQ/V32/LAPM@#",
+ "@#CONNECT 24000/ARQ/V32/MNP@#",
+ "@#CONNECT 24000/ARQ/V34/LAPM/MNP5@#",
+ "@#CONNECT 24000/ARQ/V34/LAPM/NONE@#",
+ "@#CONNECT 24000/ARQ/V34/LAPM/V42BIS@#",
+ "@#CONNECT 24000/ARQ/V34/LAPM@#",
+ "@#CONNECT 24000/ARQ/V34/MNP/MNP5@#",
+ "@#CONNECT 24000/ARQ/V34/MNP/NONE@#",
+ "@#CONNECT 24000/ARQ/V34/MNP/V42BIS@#",
+ "@#CONNECT 24000/ARQ/V34/MNP@#",
+ "@#CONNECT 24000/ARQ/VFC/LAPM/MNP5@#",
+ "@#CONNECT 24000/ARQ/VFC/LAPM/NONE@#",
+ "@#CONNECT 24000/ARQ/VFC/LAPM/V42BIS@#",
+ "@#CONNECT 24000/ARQ/VFC/LAPM@#",
+ "@#CONNECT 24000/ARQ/VFC/MNP/MNP5@#",
+ "@#CONNECT 24000/ARQ/VFC/MNP/NONE@#",
+ "@#CONNECT 24000/ARQ/VFC/MNP/V42BIS@#",
+ "@#CONNECT 24000/ARQ@#",
+ "@#CONNECT 24000/V34/NONE@#",
+ "@#CONNECT 24000/VFC/NONE@#",
+ "@#CONNECT 26400/ARQ/HST/HST/V42BIS@#",
+ "@#CONNECT 26400/ARQ/LAPM/V42BIS@#",
+ "@#CONNECT 26400/ARQ/MNP/MNP5@#",
+ "@#CONNECT 26400/ARQ/V32/LAPM/V42BIS@#",
+ "@#CONNECT 26400/ARQ/V32/LAPM@#",
+ "@#CONNECT 26400/ARQ/V32/MNP@#",
+ "@#CONNECT 26400/ARQ/V34/LAPM/MNP5@#",
+ "@#CONNECT 26400/ARQ/V34/LAPM/NONE@#",
+ "@#CONNECT 26400/ARQ/V34/LAPM/V42BIS@#",
+ "@#CONNECT 26400/ARQ/V34/LAPM@#",
+ "@#CONNECT 26400/ARQ/V34/MNP/MNP5@#",
+ "@#CONNECT 26400/ARQ/V34/MNP/NONE@#",
+ "@#CONNECT 26400/ARQ/V34/MNP/V42BIS@#",
+ "@#CONNECT 26400/ARQ/V34/MNP@#",
+ "@#CONNECT 26400/ARQ/VFC/LAPM/MNP5@#",
+ "@#CONNECT 26400/ARQ/VFC/LAPM/NONE@#",
+ "@#CONNECT 26400/ARQ/VFC/LAPM/V42BIS@#",
+ "@#CONNECT 26400/ARQ/VFC/LAPM@#",
+ "@#CONNECT 26400/ARQ/VFC/MNP/MNP5@#",
+ "@#CONNECT 26400/ARQ/VFC/MNP/NONE@#",
+ "@#CONNECT 26400/ARQ/VFC/MNP/V42BIS@#",
+ "@#CONNECT 26400/ARQ@#",
+ "@#CONNECT 26400/V34/NONE@#",
+ "@#CONNECT 26400/VFC/NONE@#",
+ "@#CONNECT 28800/ARQ/HST/HST/V42BIS@#",
+ "@#CONNECT 28800/ARQ/LAPM/V42BIS@#",
+ "@#CONNECT 28800/ARQ/MNP/MNP5@#",
+ "@#CONNECT 28800/ARQ/V32/LAPM/V42BIS@#",
+ "@#CONNECT 28800/ARQ/V32/LAPM@#",
+ "@#CONNECT 28800/ARQ/V32/MNP@#",
+ "@#CONNECT 28800/ARQ/V34/LAPM/MNP5@#",
+ "@#CONNECT 28800/ARQ/V34/LAPM/NONE@#",
+ "@#CONNECT 28800/ARQ/V34/LAPM/V42BIS@#",
+ "@#CONNECT 28800/ARQ/V34/LAPM@#",
+ "@#CONNECT 28800/ARQ/V34/MNP/MNP5@#",
+ "@#CONNECT 28800/ARQ/V34/MNP/NONE@#",
+ "@#CONNECT 28800/ARQ/V34/MNP/V42BIS@#",
+ "@#CONNECT 28800/ARQ/V34/MNP@#",
+ "@#CONNECT 28800/ARQ/VFC/LAPM/MNP5@#",
+ "@#CONNECT 28800/ARQ/VFC/LAPM/NONE@#",
+ "@#CONNECT 28800/ARQ/VFC/LAPM/V42BIS@#",
+ "@#CONNECT 28800/ARQ/VFC/LAPM@#",
+ "@#CONNECT 28800/ARQ/VFC/MNP/MNP5@#",
+ "@#CONNECT 28800/ARQ/VFC/MNP/NONE@#",
+ "@#CONNECT 28800/ARQ/VFC/MNP/V42BIS@#",
+ "@#CONNECT 28800/ARQ@#",
+ "@#CONNECT 28800/V34/NONE@#",
+ "@#CONNECT 28800/VFC/NONE@#",
+ "@#CONNECT 4800/ARQ/HST/HST/CELLULAR/MNP5@#",
+ "@#CONNECT 4800/ARQ/HST/HST/CELLULAR/V42BIS@#",
+ "@#CONNECT 4800/ARQ/HST/HST/CELLULAR@#",
+ "@#CONNECT 4800/ARQ/HST/HST/V42BIS@#",
+ "@#CONNECT 4800/ARQ/HST/LAPM/MNP5@#",
+ "@#CONNECT 4800/ARQ/HST/LAPM/NONE@#",
+ "@#CONNECT 4800/ARQ/HST/LAPM/V42BIS@#",
+ "@#CONNECT 4800/ARQ/HST/MNP/MNP5@#",
+ "@#CONNECT 4800/ARQ/HST/MNP/NONE@#",
+ "@#CONNECT 4800/ARQ/HST/MNP/V42BIS@#",
+ "@#CONNECT 4800/ARQ/LAPM/V42BIS@#",
+ "@#CONNECT 4800/ARQ/LAPM@#",
+ "@#CONNECT 4800/ARQ/MNP/MNP5@#",
+ "@#CONNECT 4800/ARQ/V32/LAPM/MNP5@#",
+ "@#CONNECT 4800/ARQ/V32/LAPM/V42BIS@#",
+ "@#CONNECT 4800/ARQ/V32/LAPM@#",
+ "@#CONNECT 4800/ARQ/V32/MNP/MNP5@#",
+ "@#CONNECT 4800/ARQ/V32/MNP/NONE@#",
+ "@#CONNECT 4800/ARQ/V32/MNP/V42BIS@#",
+ "@#CONNECT 4800/ARQ/V32/MNP@#",
+ "@#CONNECT 4800/ARQ/V34/LAPM/MNP5@#",
+ "@#CONNECT 4800/ARQ/V34/LAPM/NONE@#",
+ "@#CONNECT 4800/ARQ/V34/LAPM/V42BIS@#",
+ "@#CONNECT 4800/ARQ/V34/LAPM@#",
+ "@#CONNECT 4800/ARQ/V34/MNP/MNP5@#",
+ "@#CONNECT 4800/ARQ/V34/MNP/NONE@#",
+ "@#CONNECT 4800/ARQ/V34/MNP/V42BIS@#",
+ "@#CONNECT 4800/ARQ/V34/MNP@#",
+ "@#CONNECT 4800/ARQ@#",
+ "@#CONNECT 4800/HST/NONE@#",
+ "@#CONNECT 4800/V32/NONE@#",
+ "@#CONNECT 4800/V34/NONE@#",
+ "@#CONNECT 7200/ARQ/HST/HST/CELLULAR/MNP5@#",
+ "@#CONNECT 7200/ARQ/HST/HST/CELLULAR/V42BIS@#",
+ "@#CONNECT 7200/ARQ/HST/HST/CELLULAR@#",
+ "@#CONNECT 7200/ARQ/HST/HST/V42BIS@#",
+ "@#CONNECT 7200/ARQ/HST/LAPM/MNP5@#",
+ "@#CONNECT 7200/ARQ/HST/LAPM/NONE@#",
+ "@#CONNECT 7200/ARQ/HST/LAPM/V42BIS@#",
+ "@#CONNECT 7200/ARQ/HST/MNP/MNP5@#",
+ "@#CONNECT 7200/ARQ/HST/MNP/NONE@#",
+ "@#CONNECT 7200/ARQ/HST/MNP/V42BIS@#",
+ "@#CONNECT 7200/ARQ/LAPM/V42BIS@#",
+ "@#CONNECT 7200/ARQ/LAPM@#",
+ "@#CONNECT 7200/ARQ/MNP/MNP5@#",
+ "@#CONNECT 7200/ARQ/V32/LAPM/MNP5@#",
+ "@#CONNECT 7200/ARQ/V32/LAPM/NONE@#",
+ "@#CONNECT 7200/ARQ/V32/LAPM/V42BIS@#",
+ "@#CONNECT 7200/ARQ/V32/LAPM@#",
+ "@#CONNECT 7200/ARQ/V32/MNP/MNP5@#",
+ "@#CONNECT 7200/ARQ/V32/MNP/NONE@#",
+ "@#CONNECT 7200/ARQ/V32/MNP/V42BIS@#",
+ "@#CONNECT 7200/ARQ/V32/MNP@#",
+ "@#CONNECT 7200/ARQ/V34/LAPM/MNP5@#",
+ "@#CONNECT 7200/ARQ/V34/LAPM/NONE@#",
+ "@#CONNECT 7200/ARQ/V34/LAPM/V42BIS@#",
+ "@#CONNECT 7200/ARQ/V34/LAPM@#",
+ "@#CONNECT 7200/ARQ/V34/MNP/MNP5@#",
+ "@#CONNECT 7200/ARQ/V34/MNP/NONE@#",
+ "@#CONNECT 7200/ARQ/V34/MNP/V42BIS@#",
+ "@#CONNECT 7200/ARQ/V34/MNP@#",
+ "@#CONNECT 7200/ARQ@#",
+ "@#CONNECT 7200/HST/NONE@#",
+ "@#CONNECT 7200/V32/NONE@#",
+ "@#CONNECT 7200/V34/NONE@#",
+ "@#CONNECT 9600/ARQ/HST/HST/CELLULAR/MNP5@#",
+ "@#CONNECT 9600/ARQ/HST/HST/CELLULAR/V42BIS@#",
+ "@#CONNECT 9600/ARQ/HST/HST/CELLULAR@#",
+ "@#CONNECT 9600/ARQ/HST/HST/V42BIS@#",
+ "@#CONNECT 9600/ARQ/HST/LAPM/MNP5@#",
+ "@#CONNECT 9600/ARQ/HST/LAPM/NONE@#",
+ "@#CONNECT 9600/ARQ/HST/LAPM/V42BIS@#",
+ "@#CONNECT 9600/ARQ/HST/MNP/MNP5@#",
+ "@#CONNECT 9600/ARQ/HST/MNP/NONE@#",
+ "@#CONNECT 9600/ARQ/HST/MNP/V42BIS@#",
+ "@#CONNECT 9600/ARQ/LAPM/V42BIS@#",
+ "@#CONNECT 9600/ARQ/MNP/MNP5@#",
+ "@#CONNECT 9600/ARQ/V32/LAPM/MNP5@#",
+ "@#CONNECT 9600/ARQ/V32/LAPM/NONE@#",
+ "@#CONNECT 9600/ARQ/V32/LAPM/V42BIS@#",
+ "@#CONNECT 9600/ARQ/V32/LAPM@#",
+ "@#CONNECT 9600/ARQ/V32/MNP/MNP5@#",
+ "@#CONNECT 9600/ARQ/V32/MNP/NONE@#",
+ "@#CONNECT 9600/ARQ/V32/MNP/V42BIS@#",
+ "@#CONNECT 9600/ARQ/V32/MNP@#",
+ "@#CONNECT 9600/ARQ/V34/LAPM/MNP5@#",
+ "@#CONNECT 9600/ARQ/V34/LAPM/NONE@#",
+ "@#CONNECT 9600/ARQ/V34/LAPM/V42BIS@#",
+ "@#CONNECT 9600/ARQ/V34/LAPM@#",
+ "@#CONNECT 9600/ARQ/V34/MNP/MNP5@#",
+ "@#CONNECT 9600/ARQ/V34/MNP/NONE@#",
+ "@#CONNECT 9600/ARQ/V34/MNP/V42BIS@#",
+ "@#CONNECT 9600/ARQ/V34/MNP@#",
+ "@#CONNECT 9600/ARQ@#",
+ "@#CONNECT 9600/HST/NONE@#",
+ "@#CONNECT 9600/V32/NONE@#",
+ "@#CONNECT 9600/V34/NONE@#",
+ "@#CONNECT@#",
+ "@#ERROR@#",
+ "@#NO ANSWER@#",
+ "@#NO CARRIER@#",
+ "@#NO DIAL TONE@#",
+ "@#NO DIALTONE@#",
+ "@#OK@#",
+ "@#RING@#",
+ "@#RINGING@#",
+ "@#VOICE@#",
+ "#",
+ NULL
+};
diff --git a/private/unimodem/new/mic/sample.inf b/private/unimodem/new/mic/sample.inf
new file mode 100644
index 000000000..b07c29174
--- /dev/null
+++ b/private/unimodem/new/mic/sample.inf
@@ -0,0 +1,64 @@
+; OUT.INF
+;
+; Inf generated for a single modem.
+;
+; Created: Fri 05-24-1996 12:13:42
+; Original Inf: mdmgen.inf/[Rockwell]/%Rockwell1%
+; Manufacturer: "Rockwell"
+; Model: "14400 bps PCMCIA Data-Fax Modem"
+; Rank0ID: GEN_Apex1
+; Rank1ID: PCMCIA\RIPICAA-RC144ACL-845A
+;
+; Signature:
+; Rank0 Version M&M Flags AddReg CopyFile Ranks
+; 12342412 12222233 12334444 12234444 12244444 53265123 52366664 23466666
+
+[Version]
+LayoutFile = layout.inf
+Signature = "$CHICAGO$"
+Class = Modem
+ClassGUID = {4D36E96D-E325-11CE-BFC1-08002BE10318}
+Provider = %provider%
+
+
+[ControlFlags]
+ExcludeFromSelect = GEN_Apex1
+
+
+[Manufacturer]
+%manufacturer0% = Manufacturer0
+
+
+[Manufacturer0]
+%model0% = Model0.Install, GEN_Apex1, PCMCIA\RIPICAA-RC144ACL-845A
+
+
+[Model0.Install]
+AddReg = Model0.AddReg
+
+
+[Model0.AddReg]
+HKR,,FriendlyDriver,,Unimodem.vxd
+HKR,,DevLoader,,*VCOMM
+HKR,,ConfigDialog,,modemui.dll
+HKR,,PortSubClass,1,02
+HKR,,EnumPropPages,,"modemui.dll,EnumPropPages"
+HKR,,PortDriver,,Serial.vxd
+HKR,,Contention,,*vcd
+HKR,, DeviceType, 1, 03
+HKR, Settings, SpeakerMode_Setup,, "M3"
+HKR, Init, 1,, "AT<cr>"
+HKR, Init, 2,, "ATE0V1<cr>"
+HKR, Monitor, 1,, "ATS0=0<cr>"
+HKR, Monitor, 2,, "None"
+HKR, Answer, 1,, "ATA<cr>"
+HKR, Hangup, 1,, "ATH<cr>"
+HKR,, Reset,, "ATZ<cr>"
+HKR, Settings, Prefix,, "AT"
+HKR, Responses, "AUTOSTREAM: LEVEL 3", 1, 01, 00, 00,00,00,00, 00,00,00,00
+
+
+[Strings]
+provider = "Microsoft"
+manufacturer0 = "Rockwell"
+model0 = "14400 bps PCMCIA Data-Fax Modem"
diff --git a/private/unimodem/new/mic/sources b/private/unimodem/new/mic/sources
new file mode 100644
index 000000000..fb24df25b
--- /dev/null
+++ b/private/unimodem/new/mic/sources
@@ -0,0 +1,36 @@
+MAJORCOMP=net
+MINORCOMP=unimodem
+
+TARGETNAME=tsym
+TARGETPATH=obj
+TARGETTYPE=PROGRAM
+TARGETLIBS=\
+ $(BASEDIR)\public\sdk\lib\*\kernel32.lib \
+ $(BASEDIR)\public\sdk\lib\*\user32.lib
+
+
+INCLUDES=$(BASEDIR)\public\sdk\inc;.
+
+C_DEFINES=-DWINVER=0x0400
+
+USE_CRTDLL=1
+
+SOURCES= CHKSUM.CPP \
+ SYNC.CPP \
+ ILIST.CPP \
+ sym.cpp \
+ INI.CPP \
+ INF.CPP \
+ globals.CPP \
+ DEV.CPP \
+ tsym.CPP \
+ resp.cpp \
+ tdev.CPP \
+ mic.cpp \
+ main.cpp
+
+UMTYPE=console
+
+!IFNDEF 386_WARNING_LEVEL
+386_WARNING_LEVEL=/W3
+!ENDIF
diff --git a/private/unimodem/new/mic/sym.cpp b/private/unimodem/new/mic/sym.cpp
new file mode 100644
index 000000000..81d76e0c9
--- /dev/null
+++ b/private/unimodem/new/mic/sym.cpp
@@ -0,0 +1,316 @@
+//
+// Copyright (c) 1996 Microsoft Corporation
+//
+//
+// SYM.C -- Implemtation for Classes:
+// CInfSymbolTable
+// CInfSymbol
+//
+// History:
+// 05/21/96 JosephJ Created
+//
+//
+#include "common.h"
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CInfSymbol
+///////////////////////////////////////////////////////////////////////////
+
+
+CInfSymbol::CInfSymbol
+(
+ const TCHAR rgchName[],
+ UINT cchName,
+ DWORD dwChecksum,
+ const CInfSymbol * pNext
+)
+: m_rgchText(rgchName),
+ m_cchText(cchName),
+ m_dwChecksum(dwChecksum),
+ m_pNext(pNext),
+ m_pPropList(NULL)
+{
+}
+
+
+CInfSymbol::~CInfSymbol()
+{
+ // BUGBUG -- delete all the InfSymbols allocated!
+}
+
+
+// Return the text associated with this symbol as a null-terminated
+// string
+const TCHAR * CInfSymbol::GetText(void) const
+{
+ return (this) ? m_rgchText : TEXT("");
+}
+
+
+// Return the length of the text associated with this symbol
+UINT CInfSymbol::GetTextLength() const
+{
+ return (this) ? m_cchText : 0;
+}
+
+
+// Release (decrement ref-count) of this symbol
+void CInfSymbol::Release(void) const
+{
+}
+
+
+// Dump state
+void CInfSymbol::Dump(void) const
+{
+ printf("Symbol(0x%08lx) = [%s]\n", this, (this) ? m_rgchText : TEXT(""));
+}
+
+
+// --------------- SetProp ------------------
+// Not really const -- it modifies the property list
+BOOL
+CInfSymbol::SetProp(const CInfSymbol *pSymPropName, void *pvProp)
+const
+// TODO
+{
+#if 0
+ CInfSymProp * pPropRec = (CInfSymProp *) m_pPropList;
+ DWORD dwSig = pSymPropName->Checksum();
+ BOOL fRet=FALSE;
+
+ // Search for property
+ while(pPropRec)
+ {
+ const CInfSymbol *pSym = pPropRec->pSymPropName;
+ if (dwChecksum == pSym->Checksum())
+ {
+ if (!lstrcmp(pSymPropName->GetText(), pSym->GetText()))
+ {
+ // currently we don't allow you to set an already set prop.
+ ASSERT(FALSE);
+ goto end;
+ }
+ }
+ pPropRec = pPropRec->m_pNext;
+ }
+
+ // Insert property
+ pPropRec = new CInfSymProp
+ (
+ pSymPropName,
+ pvProp,
+ (CInfSymProp *) m_pPropList
+ );
+ m_pPropList = (void *) pPropRec;
+
+end:
+ return fRet;
+#endif // 0
+
+ return FALSE;
+}
+
+// --------------- GetProp ------------------
+// TODO
+BOOL
+CInfSymbol::GetProp(const CInfSymbol *pSymPropName, void **ppvProp)
+const
+{
+ return FALSE;
+}
+
+// --------------- DelProp ------------------
+// Not really const -- it modifies the property list
+// TODO
+BOOL
+CInfSymbol::DelProp(const CInfSymbol *pSymPropName)
+const
+{
+ return FALSE;
+}
+
+
+// --------------- GetOrCreatePropLoc --------------
+// Not really const -- it could modify the property list
+// TODO
+BOOL
+CInfSymbol::GetOrCreatePropLoc(
+ const CInfSymbol *pSymPropName,
+ void ***ppvProp,
+ BOOL *pfExists
+ )
+const
+{
+ static void *pv;
+ *pfExists=FALSE;
+ *ppvProp = &pv;
+
+ return TRUE;
+}
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CInfSymbolTable
+///////////////////////////////////////////////////////////////////////////
+
+
+CInfSymbolTable::CInfSymbolTable(void)
+{
+ FillMemory((void*)m_rgpSym, sizeof(m_rgpSym), 0);
+ m_cSymbols=0;
+ m_pchFree = m_rgchTextStore;
+ m_pchLastFree = m_pchFree +
+ sizeof(m_rgchTextStore)/sizeof(*m_rgchTextStore)-1;
+}
+
+
+CInfSymbolTable::~CInfSymbolTable()
+{
+ mfn_EnterCrit();
+
+ // Free resources
+}
+
+
+// Look up and return the symbol with the specified text.
+// If symbol is not prestent, return NULL if (!fInsert), else
+// insert new symbol and return it.
+// This symbol MUST be released by calling its Release function
+// when it is no longer needed.
+// NULL is returned for the empty string ("")
+const CInfSymbol * CInfSymbolTable::Lookup(const TCHAR rgchName[], BOOL fInsert)
+{
+ const TCHAR *pch = rgchName;
+ const CInfSymbol *pSym = NULL;
+ const UINT cchName = lstrlen(rgchName);
+ const DWORD dwChecksum = ::Checksum
+ (
+ (BYTE *) rgchName,
+ cchName*sizeof(TCHAR)
+ );
+ const UINT u = dwChecksum % SYMTABSIZE; // we use checksum to compute hash.
+
+ if (!cchName) { goto end; }
+
+ mfn_EnterCrit();
+
+ // Look for it
+ for (pSym = m_rgpSym[u]; pSym; pSym = pSym->Next())
+ {
+ // may as well use the checksum as a quick check...
+ if (dwChecksum==pSym->Checksum())
+ {
+ if (!lstrcmp(rgchName, pSym->GetText())) goto end;
+
+ printf
+ (
+ "WARNING: CS(%s) == CS(%s) = 0x%08lx\n",
+ rgchName,
+ pSym->GetText(),
+ dwChecksum
+ );
+ }
+ }
+
+ // Didn't find it -- insert if necessary
+ ASSERT(pSym==NULL);
+ if (fInsert)
+ {
+ if ( (m_pchFree+cchName) < m_pchLastFree)
+ {
+ CopyMemory (
+ (void *) m_pchFree,
+ (const void *) rgchName,
+ (cchName+1)*sizeof(*rgchName) // incl. null term.
+ );
+ pSym = new CInfSymbol(m_pchFree, cchName, dwChecksum, m_rgpSym[u]);
+ if (pSym)
+ {
+ printf("Inserting. %s @ 0x%08lx..\n", m_pchFree, (DWORD) pSym);
+ m_pchFree += (cchName+1);
+ ASSERT(m_pchFree<=m_pchLastFree);
+ m_rgpSym[u] = pSym;
+ }
+ }
+ }
+
+ mfn_LeaveCrit();
+
+end:
+ return pSym;
+}
+
+
+// Dump state
+void CInfSymbolTable::Dump(void) const
+{
+ mfn_EnterCrit();
+
+ printf("[BEGIN SYMBOL TABLE DUMP]\n");
+ for (UINT u=0; u<SYMTABSIZE; u++)
+ {
+ const CInfSymbol *pSym = m_rgpSym[u];
+
+ if (pSym)
+ {
+ printf("---- Location 0x%08lx -----\n", u);
+ for (; pSym ; pSym = pSym->Next())
+ {
+ pSym->Dump();
+ }
+ }
+ }
+ printf("[End symbol table dump]\n");
+
+ mfn_LeaveCrit();
+
+}
+
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CInfSymbolList
+///////////////////////////////////////////////////////////////////////////
+
+
+// --------------------------- Find -----------------------------
+// Looks for the specified symbol, returns the list element with that symbol.
+// If ppListPrev is non-NULL, sets it to the previous list element
+// (if no previous element, sets it to NULL). If the symbol is not found,
+// *ppListPrev is not touched.
+//
+const CInfSymbolList *
+CInfSymbolList::Find
+(
+ const CInfSymbolList *pList,
+ const CInfSymbol *pSym,
+ const CInfSymbolList **ppListPrev
+)
+{
+ DWORD dwChecksum = pSym->Checksum();
+ const CInfSymbolList *pListPrev=NULL;
+
+ while(pList)
+ {
+ const CInfSymbol *pSym1 = pList->m_pSym;
+ if (dwChecksum == pSym1->Checksum())
+ {
+ if (!lstrcmp(pSym->GetText(), pSym1->GetText()))
+ {
+ // Found it ...
+ if (ppListPrev)
+ {
+ // Note, if we find the 1st element, *ppListPrev is set
+ // to NULL.
+ *ppListPrev = pListPrev;
+ }
+ goto end;
+ }
+ }
+ pListPrev = pList;
+ pList = pList->Next();
+ }
+
+end:
+
+ return pList;
+}
diff --git a/private/unimodem/new/mic/sym.h b/private/unimodem/new/mic/sym.h
new file mode 100644
index 000000000..054fcb569
--- /dev/null
+++ b/private/unimodem/new/mic/sym.h
@@ -0,0 +1,215 @@
+//
+// Copyright (c) 1996 Microsoft Corporation
+//
+//
+// SYM.H -- Header for Classes:
+// CInfSymbolTable
+// CInfSymbol
+//
+// History:
+// 05/21/96 JosephJ Created
+//
+//
+#ifndef _SYM_H_
+#define _SYM_H_
+
+class CInfSymbolList;
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CInfSymbol
+///////////////////////////////////////////////////////////////////////////
+
+// Represents a symbol in the symbol table.
+// Note: Only CInfSymbolTable member functions can construct/destruct these
+// objects.
+//
+// Empty string maps to NULL symbol. So a NULL pointer is perfectly valid for
+// all member functions.
+// GetText(NULL) returns the empty string, and Checksum returns 0x0.
+// Strcmpi treats NULL pointer as the empty string.
+
+class CInfSymbol
+{
+
+public:
+
+ //-------------- GetText ------------------
+ // Return the text associated with this symbol as a null-terminated
+ // string
+ const TCHAR * GetText(void) const;
+
+ //-------------- GetTextLength ------------------
+ // Return the length of the text associated with this symbol,
+ // not counting terminating zero.
+ UINT GetTextLength() const;
+
+ //-------------- Strcmpi ------------------
+ // Case-insensitive equal
+ // -ve implies this is less-than pSym
+ int Strcmpi(const CInfSymbol *pSym) const
+ {
+ if (this && pSym)
+ {
+ return lstrcmpi(m_rgchText, pSym->m_rgchText);
+ }
+ else if (this && !pSym)
+ {
+ return 1;
+ }
+ else if (!this && pSym)
+ {
+ return -1;
+ }
+ else
+ {
+ return 0;
+ }
+ }
+
+ //-------------- Release ------------------
+ // Release (decrement ref-count) of this symbol
+ void Release(void) const;
+
+ //-------------- Dump ------------------
+ // Dump state
+ void Dump(void) const;
+
+ // --------------- Checksum ------------------
+ // Return checksum of contents
+ DWORD Checksum(void) const {return (this) ? m_dwChecksum : 0;}
+
+ // --------------- SetProp ------------------
+ BOOL SetProp(const CInfSymbol *pSymPropName, void *pvProp) const;
+
+ // --------------- GetProp ------------------
+ BOOL GetProp(const CInfSymbol *pSymPropName, void **ppvProp) const;
+
+ // --------------- GetOrCreatePropLoc --------------
+ BOOL
+ GetOrCreatePropLoc(
+ const CInfSymbol *pSymPropName,
+ void ***ppvProp,
+ BOOL *pfExists
+ )
+ const;
+
+ // --------------- DelProp ------------------
+ BOOL DelProp(const CInfSymbol *pSymPropName) const;
+
+private:
+
+ friend class CInfSymbolTable;
+
+ CInfSymbol
+ (
+ const TCHAR rgchName[],
+ UINT cchName,
+ DWORD dwChecksum,
+ const CInfSymbol *pNext
+ );
+
+ ~CInfSymbol();
+
+ const CInfSymbol *Next(void) const {return m_pNext;}
+
+ const TCHAR * m_rgchText;
+ const UINT m_cchText;
+ const DWORD m_dwChecksum;
+ const CInfSymbol * m_pNext;
+ CInfSymbolList * m_pPropList;
+
+};
+
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CInfSymbolTable
+///////////////////////////////////////////////////////////////////////////
+
+// A symbol table.
+
+static const UINT SYMTABSIZE = 1000;
+static const UINT TEXTSTORESIZE = 1000*1000;
+
+
+class CInfSymbolTable
+{
+
+public:
+
+ CInfSymbolTable(void);
+ ~CInfSymbolTable();
+
+ // TODO -- add "context" parameter to symbols -- symbols with different
+ // context will be stored separately even if their name is the same.
+ // Context is not interpreted by the symbol table, except to test for
+ // equality. When implementing this, add a context parameter to
+ // InfSymbols's constructor, and a member fn "GetContext()" to InfSymbol.
+
+ //-------------- Lookup ------------------
+ // Look up and return the symbol with the specified text
+ // This symbol must be released by calling its Release function
+ // when it is no longer needed.
+ const CInfSymbol * Lookup(const TCHAR rgchName[], BOOL fInsert);
+
+ //-------------- Dump ------------------
+ // Dump state
+ void Dump(void) const;
+
+private:
+
+ const CInfSymbol * m_rgpSym[SYMTABSIZE];
+ TCHAR m_rgchTextStore[TEXTSTORESIZE];
+ TCHAR * m_pchFree;
+ TCHAR * m_pchLastFree;
+
+ CSync m_sync;
+ UINT m_cSymbols;
+
+ void mfn_EnterCrit(void) const {m_sync.EnterCrit();}
+ void mfn_LeaveCrit(void) const {m_sync.LeaveCrit();}
+
+};
+
+
+class CInfSymbolList : private CInfList
+{
+ CInfSymbolList
+ (
+ const CInfSymbol *pSym,
+ void *pvData,
+ const CInfSymbolList *pNext
+ )
+ : CInfList(pvData, pNext), m_pSym(pSym)
+ {
+ }
+
+ const CInfSymbolList *
+ Next (void)
+ const
+ {
+ return (const CInfSymbolList *) CInfList::Next();
+ }
+
+ const CInfSymbol * GetSym(void) {return m_pSym;}
+
+ ~CInfSymbolList () {}
+
+ // --------------------------- Find -----------------------------
+ // Looks for the specified symbol, returns the list element with that
+ // symbol. If ppListPrev is non-NULL, sets it to the previous list element
+ // (if no previous element, sets it to NULL). If the symbol is not found,
+ // *ppListPrev is not touched.
+ static
+ const CInfSymbolList *
+ Find
+ (
+ const CInfSymbolList *pList,
+ const CInfSymbol *pSym,
+ const CInfSymbolList **ppListPrev
+ );
+
+private:
+ const CInfSymbol *m_pSym;
+};
+
+#endif // _SYM_H_
diff --git a/private/unimodem/new/mic/sync.cpp b/private/unimodem/new/mic/sync.cpp
new file mode 100644
index 000000000..10f58f263
--- /dev/null
+++ b/private/unimodem/new/mic/sync.cpp
@@ -0,0 +1,35 @@
+//
+// Copyright (c) 1996 Microsoft Corporation
+//
+#include "common.h"
+//
+// SYNC.CPP -- Implemtation for Classes:
+// CSync
+//
+// History:
+// 05/22/96 JosephJ Created
+//
+//
+
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CSync
+///////////////////////////////////////////////////////////////////////////
+
+#if (TODO)
+
+//
+// Signals all the events specified in the event list and at the same
+// time distroys the list.
+//
+void CSync::mfn_SignalAndFree(SLIST *pEventList)
+{
+ while(m_pEventList)
+ {
+ SLIST pOld = m_pEventList;
+ SetEvent((HANDLE) m_pEventList->pv);
+ m_pEventList = m_pEventList->Next();
+ delete m_pOld;
+ }
+}
+#endif // TODO
diff --git a/private/unimodem/new/mic/sync.h b/private/unimodem/new/mic/sync.h
new file mode 100644
index 000000000..95f9bbe48
--- /dev/null
+++ b/private/unimodem/new/mic/sync.h
@@ -0,0 +1,148 @@
+//
+// Copyright (c) 1996 Microsoft Corporation
+//
+//
+// SYNC.H -- Header for Classes:
+// CSync
+//
+// History:
+// 05/21/96 JosephJ Created
+//
+//
+#ifndef _SYNC_H_
+#define _SYNC_H_
+
+
+///////////////////////////////////////////////////////////////////////////
+// CLASS CSync
+///////////////////////////////////////////////////////////////////////////
+
+// Controls access to its parent object. Includes a critical section, and
+// (TODO) mechanism for waiting until all threads have finished using
+// the parent object.
+
+// Sample session (pObj is a ptr to a hypothetical parent, which implements
+// methods Load, Unload, OpenSession, CloseSession using the member CSymc
+// object):
+// pObj->Load("mdmusr.inf");
+// hSession = pObj->OpenSession();
+// ... do stuff ...
+// pObj->CloseSession(hSession);
+// hSync = pObj->Unload();
+// if (hSync) WaitForSingleObject(hSync, INFINITE);
+// CloseHandle(hSync);
+
+class CSync
+{
+
+public:
+
+ CSync(void) {InitializeCriticalSection(&m_crit);}
+
+ ~CSync()
+ {
+ EnterCriticalSection(&m_crit);
+ DeleteCriticalSection(&m_crit);
+ }
+
+ //-------------- EnterCrit ------------------
+ // Claim our critical section
+ void EnterCrit(void) const
+ {
+ EnterCriticalSection((CRITICAL_SECTION *)&m_crit);
+ }
+
+ //-------------- LeaveCrit ------------------
+ // Release our critical section
+ void LeaveCrit(void) const
+ {
+ LeaveCriticalSection((CRITICAL_SECTION *)&m_crit);
+ }
+
+#if (TODO)
+
+ BOOL BeginLoad(void)
+ {
+ }
+
+ void EndLoad(void)
+ {
+ EnterCrit();
+ ASSERT (m_eState == CSYNC_LOADING);
+ m_eState = CSYNC_LOADED;
+ LeaveCrit();
+ }
+
+ HANDLE BeginUnload(void)
+ {
+ HANDLE h=NULL;
+ EnterCrit();
+ if (m_eState == CSYNC_LOADED)
+ {
+ m_eState = CSYNC_UNLOADING;
+ }
+ else
+ {
+ fRet = FALSE;
+ }
+ LeaveCrit();
+
+ return fRet;
+ }
+
+ void EndUnload(void);
+
+ HSESSION BeginSession(void)
+ {
+ HSESSION hRet = 1;
+ EnterCrit();
+ if (m_eState==SYNC_LOADED)
+ {
+ m_uRefCount++;
+ }
+ else
+ {
+ hRet = 0;
+ }
+ LeaveCrit();
+
+ return hRet;
+ }
+
+ void EndSession(HSESSION hSession)
+ {
+ SLINST *pEventList=NULL;
+ EnterCrit();
+ ASSERT(hSession==1 && m_uRefCount);
+ m_uRefCount--;
+ if (m_eState==SYNC_UNLOADING && m_pEventList)
+ {
+ pEventList = m_pEventList;
+ m_pEventList=NULL;
+ }
+ LeaveCrit();
+
+ mfn_SignalAndFree(m_pEventList);
+ }
+
+ BOOL AddContext(HSESSION hS)
+ {
+ return FALSE;
+ }
+#endif // TODO
+
+private:
+
+ CRITICAL_SECTION m_crit;
+
+#if (TODO)
+ UINT m_uRefCount;
+ enum {CSYNC_UNLOADED, CSYNC_LOADING, CSYNC_UNLOADING, CSYNC_UNLOADED}
+ m_eState;
+ SLIST* pUnloadEventList;
+#endif // TODO
+
+};
+
+
+#endif // _SYNC_H_
diff --git a/private/unimodem/new/mic/tdev.cpp b/private/unimodem/new/mic/tdev.cpp
new file mode 100644
index 000000000..2e32384f1
--- /dev/null
+++ b/private/unimodem/new/mic/tdev.cpp
@@ -0,0 +1,84 @@
+//
+// Copyright (c) 1996 Microsoft Corporation
+//
+//
+// TDEV.CPP -- Component tests for classes:
+// CIndDevice
+//
+// Copyright (c) 1996 Microsoft Corporation
+//
+//
+// History:
+// 05/22/96 JosephJ Created
+//
+#include "common.h"
+#include "ini.h"
+#include "inf.h"
+#include "dev.h"
+#include "test.h"
+
+#define SIMPLE 0
+#define COMPLEX 1
+#define ACTUAL 2
+
+//#define TEST_TYPE (SIMPLE)
+#define TEST_TYPE (COMPLEX)
+//#define TEST_TYPE (ACTUAL)
+
+
+#if (TEST_TYPE==SIMPLE)
+#elif (TEST_TYPE==COMPLEX)
+#elif (TEST_TYPE==ACTUAL)
+#endif
+
+int main_tdev(int argc, char * argv[])
+{
+ CInfFile *pInf= new CInfFile();
+ CInfDevice *pDev = new CInfDevice(NULL);
+
+ const CInfManufacturerEntry *pManuE = NULL;
+ const CInfManufacturerSection *pManuS = NULL;
+ const CInfModelEntry *pModelE = NULL;
+
+ //__try
+ {
+ //__try
+ {
+ if (pInf->Load("test.inf"))
+ {
+ pManuE = pInf->GetFirstManufacturerEntry();
+ }
+ if (pManuE)
+ {
+ pManuS = pManuE->GetManufacturerSection();
+ }
+ if (pManuS)
+ {
+ pModelE = pManuS->GetFirstModelEntry();
+ }
+ if (pModelE)
+ {
+ if (pDev->Load(pInf, pManuE, pModelE))
+ {
+ pDev->Dump();
+ pDev->WriteInf(TEXT("out.inf"));
+ }
+ }
+
+ }
+ //__finally
+ {
+ // printf("in finally\n");
+ if (pDev) {pDev->Unload(); delete pDev; pDev=NULL;}
+ if (pInf) {pInf->Unload(); delete pInf; pInf=NULL;}
+ }
+ }
+ //__except(printf("in filter\n"), EXCEPTION_EXECUTE_HANDLER)
+ if (0) {
+ printf("in except\n");
+ ASSERT(FALSE);
+ }
+
+
+ return 0;
+}
diff --git a/private/unimodem/new/mic/test.h b/private/unimodem/new/mic/test.h
new file mode 100644
index 000000000..d5064c9d0
--- /dev/null
+++ b/private/unimodem/new/mic/test.h
@@ -0,0 +1,2 @@
+int main_tsym(int argc, char * argv[]);
+int main_tdev(int argc, char * argv[]);
diff --git a/private/unimodem/new/mic/tsym.cpp b/private/unimodem/new/mic/tsym.cpp
new file mode 100644
index 000000000..ab6712aa5
--- /dev/null
+++ b/private/unimodem/new/mic/tsym.cpp
@@ -0,0 +1,65 @@
+//
+// Copyright (c) 1996 Microsoft Corporation
+//
+//
+// TSYM.CPP -- Component tests for classes:
+// CInfSymbolTable
+// CInfSymbol
+//
+// Copyright (c) 1996 Microsoft Corporation
+//
+//
+// History:
+// 05/21/96 JosephJ Created
+//
+#include "common.h"
+#include "test.h"
+
+
+#define SIMPLE 0
+#define COMPLEX 1
+#define ACTUAL 2
+
+//#define TEST_TYPE (SIMPLE)
+#define TEST_TYPE (COMPLEX)
+//#define TEST_TYPE (ACTUAL)
+
+extern const TCHAR *rgpszSimpleResp[];
+extern const TCHAR *rgpszComplexResp[];
+extern const TCHAR *rgpszActualResp[];
+
+
+#if (TEST_TYPE==SIMPLE)
+# define TEST_RESP_ARRAY rgpszSimpleResp
+#elif (TEST_TYPE==COMPLEX)
+# define TEST_RESP_ARRAY rgpszComplexResp
+#elif (TEST_TYPE==ACTUAL)
+# define TEST_RESP_ARRAY rgpszActualResp
+#endif
+
+static const TCHAR **rgpchStrings = TEST_RESP_ARRAY;
+
+int main_tsym(int argc, char * argv[])
+{
+ const TCHAR **pch = NULL;
+
+ for (pch = rgpchStrings; *pch; pch++)
+ {
+ const CInfSymbol *pSym = gSymtab.Lookup(*pch, TRUE);
+ if (pSym) {pSym->Dump(); pSym->Release(); pSym=0;}
+ }
+
+ printf("+++\n");
+
+ for (pch = rgpchStrings; *pch; pch++)
+ {
+ const CInfSymbol *pSym = gSymtab.Lookup(*pch, TRUE);
+ if (pSym) {pSym->Dump(); pSym->Release(); pSym=0;}
+ }
+
+ printf("+++\n");
+
+ gSymtab.Dump();
+
+ return 0;
+}