mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
373 lines
11 KiB
373 lines
11 KiB
/*++
|
|
|
|
Copyright (c) 1994 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
Networks.c
|
|
|
|
Abstract:
|
|
|
|
functions that detect the presence of network services
|
|
|
|
Author:
|
|
|
|
Bob Watson (a-robw)
|
|
|
|
Revision History:
|
|
|
|
23 Dec 94
|
|
|
|
--*/
|
|
#include <windows.h>
|
|
#include <tchar.h>
|
|
#include <cpl.h>
|
|
#include <stdio.h>
|
|
#include <c2dll.h>
|
|
#include <c2inc.h>
|
|
#include <c2utils.h>
|
|
#include "c2funcs.h"
|
|
#include "c2funres.h"
|
|
|
|
// define action codes here. They are only meaningful in the
|
|
// context of this module.
|
|
#define AC_NO_CHANGE 0
|
|
#define AC_SHOW_NCPA 1
|
|
|
|
static WCHAR wszNetwork[] = L"Network";
|
|
|
|
#define SECURE C2DLL_C2
|
|
|
|
static
|
|
BOOL
|
|
NetworkServicesFound (
|
|
)
|
|
{
|
|
HKEY hkeySoftware;
|
|
HKEY hkeyLevel1;
|
|
HKEY hkeyLevel2;
|
|
HKEY hkeyNetId;
|
|
|
|
DWORD dwSwIndex;
|
|
DWORD dwLevel1Index;
|
|
|
|
LONG lStatus;
|
|
LONG lBufLen;
|
|
LONG lLevel1BufLen;
|
|
|
|
TCHAR szSoftwareKeyNameBuffer [MAX_PATH];
|
|
TCHAR szLevel1KeyNameBuffer [MAX_PATH];
|
|
|
|
BOOL bReturn = FALSE;
|
|
|
|
// open top key under root to begin search
|
|
|
|
SET_WAIT_CURSOR;
|
|
|
|
lStatus = RegOpenKeyEx (
|
|
HKEY_LOCAL_MACHINE,
|
|
GetStringResource (GetDllInstance(), IDS_SOFTWARE_KEY),
|
|
0L,
|
|
KEY_READ,
|
|
&hkeySoftware);
|
|
|
|
if (lStatus == ERROR_SUCCESS) {
|
|
//
|
|
// if top key opened, then search each sub-key under it for
|
|
// network service entries
|
|
//
|
|
dwSwIndex = 0;
|
|
lBufLen = MAX_PATH;
|
|
while (RegEnumKeyEx(hkeySoftware,
|
|
dwSwIndex,
|
|
szSoftwareKeyNameBuffer,
|
|
&lBufLen,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL) == ERROR_SUCCESS) {
|
|
// try to open this key
|
|
lStatus = RegOpenKeyEx (
|
|
hkeySoftware,
|
|
szSoftwareKeyNameBuffer,
|
|
0L,
|
|
KEY_READ,
|
|
&hkeyLevel1);
|
|
if (lStatus == ERROR_SUCCESS) {
|
|
// now enumerate the sub keys to this key and look for
|
|
// network services
|
|
dwLevel1Index = 0;
|
|
lLevel1BufLen = MAX_PATH;
|
|
while (RegEnumKeyEx(hkeyLevel1,
|
|
dwLevel1Index,
|
|
szLevel1KeyNameBuffer,
|
|
&lLevel1BufLen,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL) == ERROR_SUCCESS) {
|
|
// try to open this key
|
|
lStatus = RegOpenKeyEx (
|
|
hkeyLevel1,
|
|
szLevel1KeyNameBuffer,
|
|
0L,
|
|
KEY_READ,
|
|
&hkeyLevel2);
|
|
if (lStatus == ERROR_SUCCESS) {
|
|
// now enumerate the sub keys to this key and look for
|
|
// network services
|
|
// if that worked, then try to open the "Find" key
|
|
lStatus = RegOpenKeyEx (
|
|
hkeyLevel2,
|
|
GetStringResource (GetDllInstance(), IDS_NETWORK_SERVICE_ID_KEY),
|
|
0L,
|
|
KEY_READ,
|
|
&hkeyNetId);
|
|
if (lStatus == ERROR_SUCCESS){
|
|
// network service of some kind found
|
|
bReturn = TRUE;
|
|
RegCloseKey (hkeyNetId);
|
|
break;
|
|
} // end if network service ID key opened
|
|
RegCloseKey (hkeyLevel2);
|
|
} // end if Level 2 key opened
|
|
dwLevel1Index++;
|
|
lLevel1BufLen = MAX_PATH;
|
|
} // end while enum level1 sub keys (level 2 keys)
|
|
RegCloseKey (hkeyLevel1);
|
|
} // end if Level 1 key opened
|
|
if (bReturn) break;
|
|
dwSwIndex++;
|
|
lBufLen = MAX_PATH;
|
|
} // end while enum Software subkeys (level 1 keys)
|
|
RegCloseKey (hkeySoftware);
|
|
SetLastError (ERROR_SUCCESS);
|
|
} else { // end if software key opened
|
|
SetLastError (lStatus);
|
|
}
|
|
|
|
SET_ARROW_CURSOR;
|
|
|
|
return bReturn;
|
|
}
|
|
|
|
LONG
|
|
C2QueryNetworkServices (
|
|
IN LPARAM lParam
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Function called to find out the current state of this configuration
|
|
item. This function reads the current state of the item and
|
|
sets the C2 Compliance flag and the Status string to reflect
|
|
the current value of the configuration item.
|
|
|
|
Arguments:
|
|
|
|
Pointer to the Dll data block passed as an LPARAM.
|
|
|
|
ReturnValue:
|
|
|
|
ERROR_SUCCESS if the function succeeds otherwise a
|
|
WIN32 error is returned if an error occurs
|
|
|
|
--*/
|
|
{
|
|
PC2DLL_DATA pC2Data;
|
|
UINT nMsgId = 0;
|
|
|
|
if (lParam != 0) {
|
|
pC2Data = (PC2DLL_DATA)lParam;
|
|
if (NetworkServicesFound()) {
|
|
pC2Data->lC2Compliance = C2DLL_NOT_SECURE;
|
|
nMsgId = IDS_NETWORK_SERVICE_FOUND;
|
|
} else {
|
|
pC2Data->lC2Compliance = SECURE;
|
|
nMsgId = IDS_NETWORK_SERVICE_NOT_FOUND;
|
|
}
|
|
_stprintf (pC2Data->szStatusName,
|
|
GetStringResource (GetDllInstance(), nMsgId));
|
|
return ERROR_SUCCESS;
|
|
} else {
|
|
return ERROR_BAD_ARGUMENTS;
|
|
}
|
|
}
|
|
|
|
LONG
|
|
C2SetNetworkServices (
|
|
IN LPARAM lParam
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Function called to change the current state of this configuration
|
|
item based on an action code passed in the DLL data block. If
|
|
this function successfully sets the state of the configuration
|
|
item, then the C2 Compliance flag and the Status string to reflect
|
|
the new value of the configuration item.
|
|
|
|
Arguments:
|
|
|
|
Pointer to the Dll data block passed as an LPARAM.
|
|
|
|
ReturnValue:
|
|
|
|
ERROR_SUCCESS if the function succeeds otherwise a
|
|
WIN32 error is returned if an error occurs
|
|
|
|
--*/
|
|
{
|
|
#define MAX_CPL_DLGS 4
|
|
PC2DLL_DATA pC2Data;
|
|
HINSTANCE hNcpaDll;
|
|
APPLET_PROC CPlApplet;
|
|
LONG lNcpaResult;
|
|
LONG lDlgCount;
|
|
LONG lDlgId;
|
|
LONG lNetworksDlgId;
|
|
UINT nMsgId;
|
|
WNEWCPLINFO ncpaDlgInfo[MAX_CPL_DLGS];
|
|
|
|
if (lParam != 0) {
|
|
pC2Data = (PC2DLL_DATA)lParam;
|
|
if (pC2Data->lActionCode == AC_SHOW_NCPA) {
|
|
SET_WAIT_CURSOR;
|
|
// load NCPA DLL
|
|
hNcpaDll = LoadLibrary (
|
|
GetStringResource (GetDllInstance(), IDS_NCPA_DLL));
|
|
if (hNcpaDll != NULL) {
|
|
// look up Control Panel function
|
|
CPlApplet = (APPLET_PROC)GetProcAddressT ((HMODULE)hNcpaDll,
|
|
GetStringResource (GetDllInstance(), IDS_NCPA_CPL_APPLET));
|
|
if (CPlApplet != NULL) {
|
|
// init control panel applet
|
|
if ((*CPlApplet)(pC2Data->hWnd, CPL_INIT, 0, 0) != 0) {
|
|
lDlgCount = (*CPlApplet)(pC2Data->hWnd, CPL_GETCOUNT, 0, 0);
|
|
if (lDlgCount > MAX_CPL_DLGS) lDlgCount = MAX_CPL_DLGS; // set limit
|
|
for (lDlgId = 0; lDlgId < lDlgCount; lDlgId++) {
|
|
(*CPlApplet)(pC2Data->hWnd, CPL_NEWINQUIRE,
|
|
lDlgId, (LONG)&ncpaDlgInfo[lDlgId]);
|
|
if (lstrcmpW (ncpaDlgInfo[lDlgId].szName,
|
|
wszNetwork) == 0) {
|
|
lNetworksDlgId = lDlgId;
|
|
}
|
|
}
|
|
// call Network dialog
|
|
SET_ARROW_CURSOR;
|
|
lNcpaResult = (*CPlApplet)(pC2Data->hWnd, CPL_DBLCLK,
|
|
lNetworksDlgId, ncpaDlgInfo[lNetworksDlgId].lData);
|
|
SET_WAIT_CURSOR;
|
|
// update networking status
|
|
|
|
if (NetworkServicesFound()) {
|
|
pC2Data->lC2Compliance = C2DLL_NOT_SECURE;
|
|
nMsgId = IDS_NETWORK_SERVICE_FOUND;
|
|
} else {
|
|
pC2Data->lC2Compliance = SECURE;
|
|
nMsgId = IDS_NETWORK_SERVICE_NOT_FOUND;
|
|
}
|
|
_stprintf (pC2Data->szStatusName,
|
|
GetStringResource (GetDllInstance(), nMsgId));
|
|
|
|
// close control panel dialogs and applet
|
|
for (lDlgId = 1; lDlgId <= lDlgCount; lDlgId++) {
|
|
(*CPlApplet)(pC2Data->hWnd, CPL_STOP,
|
|
lDlgId, (LONG)&ncpaDlgInfo[lDlgId-1]);
|
|
}
|
|
(*CPlApplet)(pC2Data->hWnd, CPL_EXIT, 0, 0);
|
|
} else {
|
|
// Applet could not initialize
|
|
DisplayDllMessageBox (
|
|
pC2Data->hWnd,
|
|
IDS_NETWORK_ERROR_INIT_CPL,
|
|
IDS_NETWORK_CAPTION,
|
|
MBOK_EXCLAIM);
|
|
}
|
|
} else {
|
|
// unable to find control panel entry point
|
|
DisplayDllMessageBox (
|
|
pC2Data->hWnd,
|
|
IDS_NETWORK_ERROR_FIND_CPL,
|
|
IDS_NETWORK_CAPTION,
|
|
MBOK_EXCLAIM);
|
|
}
|
|
// free DLL
|
|
FreeLibrary (hNcpaDll);
|
|
} else {
|
|
// unable to load DLL
|
|
DisplayDllMessageBox (
|
|
pC2Data->hWnd,
|
|
IDS_NETWORK_ERROR_LOAD_DLL,
|
|
IDS_NETWORK_CAPTION,
|
|
MBOK_EXCLAIM);
|
|
}
|
|
SET_ARROW_CURSOR;
|
|
}
|
|
return ERROR_SUCCESS;
|
|
} else {
|
|
return ERROR_BAD_ARGUMENTS;
|
|
}
|
|
}
|
|
|
|
LONG
|
|
C2DisplayNetworkServices (
|
|
IN LPARAM lParam
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Function called to display more information on the configuration
|
|
item and provide the user with the option to change the current
|
|
setting (if appropriate). If the User "OK's" out of the UI,
|
|
then the action code field in the DLL data block is set to the
|
|
appropriate (and configuration item-specific) action code so the
|
|
"Set" function can be called to perform the desired action. If
|
|
the user Cancels out of the UI, then the Action code field is
|
|
set to 0 (no action) and no action is performed.
|
|
|
|
Arguments:
|
|
|
|
Pointer to the Dll data block passed as an LPARAM.
|
|
|
|
ReturnValue:
|
|
|
|
ERROR_SUCCESS if the function succeeds otherwise a
|
|
WIN32 error is returned if an error occurs
|
|
|
|
--*/
|
|
{
|
|
PC2DLL_DATA pC2Data;
|
|
|
|
if (lParam != 0) {
|
|
pC2Data = (PC2DLL_DATA)lParam;
|
|
if (NetworkServicesFound()) {
|
|
if (DisplayDllMessageBox (
|
|
pC2Data->hWnd,
|
|
IDS_NETWORK_SHOW_NCPA,
|
|
IDS_NETWORK_CAPTION,
|
|
MBOKCANCEL_QUESTION) == IDOK){
|
|
pC2Data->lActionCode = AC_SHOW_NCPA;
|
|
} else {
|
|
pC2Data->lActionCode = AC_NO_CHANGE;
|
|
}
|
|
} else {
|
|
DisplayDllMessageBox (
|
|
pC2Data->hWnd,
|
|
IDS_NETWORK_SERVICE_NOT_FOUND,
|
|
IDS_NETWORK_CAPTION,
|
|
MBOK_INFO);
|
|
pC2Data->lActionCode = AC_NO_CHANGE;
|
|
}
|
|
return ERROR_SUCCESS;
|
|
} else {
|
|
return ERROR_BAD_ARGUMENTS;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|