📄 registry.c
字号:
(LPBYTE)&dwTemp, &dwSize);
if( ERROR_SUCCESS != dwRetCode ) {
// Look in the root key as well, since the QFE for this feature had it there.
dwSize = sizeof( DWORD );
dwRetCode = MdmRegGetValue(ptLineDev, NULL, szCmdSendDelay, REG_DWORD,
(LPBYTE)&dwTemp, &dwSize);
if( dwRetCode == ERROR_SUCCESS ) {
DEBUGMSG(ZONE_MISC|ZONE_INIT, (TEXT("UNIMODEM:MdmRegGetLineValues - CmdSendDelay not in Settings key!!\r\n")));
}
}
if( dwRetCode == ERROR_SUCCESS ) {
DEBUGMSG(ZONE_MISC|ZONE_INIT,
(TEXT("UNIMODEM:MdmRegGetLineValues - Command Send Delay %d ms.\r\n"), dwTemp));
ptLineDev->dwCmdSendDelay = min(MAX_CMD_SEND_DELAY, dwTemp);
} else {
DEBUGMSG(ZONE_MISC|ZONE_INIT,
(TEXT("UNIMODEM:MdmRegGetLineValues - Command Send Delay defaulting to %d ms.\r\n"), DEF_CMD_SEND_DELAY));
ptLineDev->dwCmdSendDelay = DEF_CMD_SEND_DELAY;
}
// See if we need to log modem commands to a file
ptLineDev->bMdmLogFile = FALSE; // default to no logging of modem commands and responses
dwSize = sizeof( DWORD );
dwRetCode = MdmRegGetValue(ptLineDev, szSettings, szMdmLogFile, REG_DWORD,
(LPBYTE)&dwTemp, &dwSize);
if( dwRetCode == ERROR_SUCCESS ) {
DEBUGMSG(ZONE_MISC|ZONE_INIT,
(TEXT("UNIMODEM:MdmRegGetLineValues - MdmLogFile control=x%X.\r\n"), dwTemp));
ptLineDev->bMdmLogFile = (dwTemp) ? TRUE : FALSE;
}
// Get modem command continuation character - assume it is the first character of the dial suffix
dwSize = sizeof( szContinuation );
if (ERROR_SUCCESS != MdmRegGetValue(ptLineDev, szSettings, szDialSuffix,
REG_SZ, (PUCHAR)szContinuation, &dwSize) ) {
ptLineDev->chContinuation = ';';
} else {
ptLineDev->chContinuation = szContinuation[0];
}
} // MdmRegGetLineValues
#define DEVNAME_LEN 128
#define DEFAULT_EXTMODEM_ORDER -1
typedef struct _EXTMODEM_ENTRY {
struct _EXTMODEM_ENTRY * pNext;
DWORD dwOrder;
WCHAR szDevName[DEVNAME_LEN];
} EXTMODEM_ENTRY, * PEXTMODEM_ENTRY;
//
// This routine walks the [HKEY_LOCAL_MACHINE\ExtModems] key and
// adds any of the external modems which it finds there.
//
VOID
EnumExternModems( )
{
HKEY hExtKey; // hKey for HKEY_LOCAL_MACHINE\ExtModms
HKEY hExtMdm;
DWORD RegEnum;
DWORD status;
DWORD ValLen;
DWORD ValType;
WCHAR DevName[DEVNAME_LEN]; // Name i.e. HayesCompatible
WCHAR DevPath[DEVNAME_LEN*2]; // Path i.e. ExtModems\HayesCompat
WCHAR *szExtName = TEXT("ExtModems");
LPWSTR pEnd;
PEXTMODEM_ENTRY pExtList;
PEXTMODEM_ENTRY pExtEntry;
PEXTMODEM_ENTRY pCur;
PEXTMODEM_ENTRY pPrev;
pExtList = NULL;
//
// Open the external modem key if it exists.
//
status = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
szExtName,
0,
KEY_READ,
&hExtKey);
if (status)
{
// If we can't open the key, we can't enumerate any modems
DEBUGMSG(ZONE_ERROR|ZONE_INIT,
(TEXT("UNIMODEM:EnumExternModems RegOpenKey %s returned %d.\r\n"),
szExtName, status));
return;
}
//
// Build list of external modems and keep it sorted by order.
// We keep enumerating until we eget an error from regenumkey indicating that
// we have seen the last value.
//
RegEnum = 0; // Start with the first device.
while (TRUE)
{
ValLen = sizeof(DevName) / sizeof(DevName[0]);
status = RegEnumKeyEx(
hExtKey,
RegEnum,
DevName,
&ValLen,
NULL,
NULL,
NULL,
NULL);
if (status != ERROR_SUCCESS)
{
//
// Assume all keys have been enumerated, so we are done
//
DEBUGMSG(ZONE_ERROR|ZONE_INIT,
(TEXT("UNIMODEM:EnumExternModems RegEnumKeyEx(%d) returned %d\r\n"),
RegEnum, status));
break;
}
DEBUGMSG(ZONE_ERROR|ZONE_INIT,
(TEXT("UNIMODEM:EnumExternModems RegEnum %d = %s\r\n"), RegEnum, DevName));
pExtEntry = TSPIAlloc(sizeof(EXTMODEM_ENTRY));
if (NULL == pExtEntry) {
DEBUGMSG(ZONE_ERROR|ZONE_INIT,
(TEXT("UNIMODEM:EnumExternModems No memory for %s\r\n"), DevName));
break;
}
wcscpy(pExtEntry->szDevName, DevName);
pExtEntry->dwOrder = DEFAULT_EXTMODEM_ORDER; // Assume end of list if no order specified
//
// Read order value if it exists
//
status = RegOpenKeyEx( hExtKey,
DevName,
0,
KEY_READ,
&hExtMdm);
if (ERROR_SUCCESS == status) {
ValLen = sizeof(pExtEntry->dwOrder);
RegQueryValueEx(hExtMdm,
L"Order",
NULL,
&ValType,
(LPBYTE)&pExtEntry->dwOrder,
&ValLen
);
RegCloseKey(hExtMdm);
}
//
// Insert in sorted order
//
if (pExtList == NULL) {
pExtList = pExtEntry; // head of empty list
pExtEntry->pNext = NULL;
} else {
pCur = pPrev = pExtList;
while (pCur) {
if (pExtEntry->dwOrder < pCur->dwOrder) {
pExtEntry->pNext = pCur;
if (pCur == pPrev) {
pExtList = pExtEntry; // insert at head
break;
}
pPrev->pNext = pExtEntry; // insert in middle
break;
}
pPrev = pCur;
pCur = pCur->pNext;
}
if (NULL == pCur) {
pExtEntry->pNext = NULL; // insert at end
pPrev->pNext = pExtEntry;
}
}
#ifdef DEBUG
pExtEntry = pExtList;
while (pExtEntry) {
DEBUGMSG(1, (L"UNIMODEM: %s: order = 0x%x\n", pExtEntry->szDevName, pExtEntry->dwOrder));
pExtEntry = pExtEntry->pNext;
}
#endif
RegEnum++;
} // while (more device keys to try)
RegCloseKey(hExtKey);
if (pExtList) {
// OK, if we just create a Registry path for this device then
// we can use CreateLineDev to do everything else for us.
wcscpy( DevPath, szExtName);
wcscat( DevPath, TEXT("\\"));
pEnd = DevPath + wcslen(DevPath);
}
//
// Walk sorted list of external modems and create them in order.
//
while (pExtList) {
pExtEntry = pExtList;
pExtList = pExtEntry->pNext;
wcscpy(pEnd, pExtEntry->szDevName);
createLineDev(NULL, // LPCWSTR hActiveKey, NULL = no associated active device
DevPath, // LPCWSTR lpszDevPath
NULL); // LPCWSTR lpszDeviceName, NULL = read it for me
TSPIFree(pExtEntry);
}
} // EnumExternModems
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -