ncpa.c

来自「一个类似windows」· C语言 代码 · 共 728 行 · 第 1/2 页

C
728
字号
	}
	return FALSE;
}


static void
DisplayNICProperties(HWND hParent,TCHAR *tpszCfgInstanceID)
{
	PROPSHEETPAGE psp[1];
	PROPSHEETHEADER psh;
	TCHAR tpszSubKey[MAX_PATH];
	HKEY hKey;
	DWORD dwType = REG_SZ;
	TCHAR tpszName[MAX_PATH];
	DWORD dwSize = sizeof(tpszName);

	// Get the "Name" for this Connection
	_stprintf(tpszSubKey,_T("System\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\%s\\Connection"),tpszCfgInstanceID);
	if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,tpszSubKey,0,KEY_QUERY_VALUE,&hKey)!=ERROR_SUCCESS)
		return;
	if(RegQueryValueEx(hKey,_T("Name"),NULL,&dwType,(BYTE*)tpszName,&dwSize)!=ERROR_SUCCESS)
		_stprintf(tpszName,_T("[ERROR]"));
	else
		_tcscat(tpszName,_T(" Properties"));
	RegCloseKey(hKey);
	
	
	ZeroMemory(&psh, sizeof(PROPSHEETHEADER));
	psh.dwSize = sizeof(PROPSHEETHEADER);
	psh.dwFlags =  PSH_PROPSHEETPAGE | PSH_NOAPPLYNOW;
	psh.hwndParent = hParent;
	psh.hInstance = hApplet;
	psh.hIcon = LoadIcon(hApplet, MAKEINTRESOURCE(IDI_CPLSYSTEM));
	psh.pszCaption = tpszName;
	psh.nPages = sizeof(psp) / sizeof(PROPSHEETPAGE);
	psh.nStartPage = 0;
	psh.ppsp = psp;
	psh.pfnCallback = NULL;
	

	InitPropSheetPage(&psp[0], IDD_NETPROPERTIES, NICPropertyPageProc,(LPARAM)tpszCfgInstanceID);
	PropertySheet(&psh);
	return;
}



static INT_PTR CALLBACK
NICStatusPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch(uMsg)
	{
	case WM_INITDIALOG:
		{
			PROPSHEETPAGE *psp= (PROPSHEETPAGE *)lParam;
			EnableWindow(GetDlgItem(hwndDlg,IDC_ENDISABLE),FALSE);
			SetWindowLongPtr(hwndDlg,DWL_USER,(DWORD_PTR)psp->lParam);
		}
		break;
	case WM_COMMAND:
		switch(LOWORD(wParam))
		{
		case IDC_PROPERTIES:
			{
				TCHAR *tpszCfgInstance;
				tpszCfgInstance = (TCHAR*)GetWindowLong(hwndDlg,DWL_USER);
				DisplayNICProperties(hwndDlg,tpszCfgInstance);
			}
			break;
		}
		break;
	}
	return FALSE;
}

static VOID
DisplayNICStatus(HWND hParent,TCHAR *tpszCfgInstanceID)
{
	PROPSHEETPAGE psp[1];
	PROPSHEETHEADER psh;
	TCHAR tpszSubKey[MAX_PATH];
	HKEY hKey;
	DWORD dwType = REG_SZ;
	TCHAR tpszName[MAX_PATH];
	DWORD dwSize = sizeof(tpszName);

	// Get the "Name" for this Connection
	_stprintf(tpszSubKey,_T("System\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\%s\\Connection"),tpszCfgInstanceID);
	if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,tpszSubKey,0,KEY_QUERY_VALUE,&hKey)!=ERROR_SUCCESS)
		return;

	if (RegQueryValueEx(hKey,_T("Name"),NULL,&dwType,(BYTE*)tpszName,&dwSize)!=ERROR_SUCCESS)
		_stprintf(tpszName,_T("[ERROR]"));
		//_stprintf(tpszName,_T("[ERROR]") _T(__FILE__) _T(" %d"),__LINE__ );
	else
		_tcscat(tpszName,_T(" Status"));
	RegCloseKey(hKey);

	ZeroMemory(&psh, sizeof(PROPSHEETHEADER));
	psh.dwSize = sizeof(PROPSHEETHEADER);
	psh.dwFlags =  PSH_PROPSHEETPAGE | PSH_NOAPPLYNOW;
	psh.hwndParent = hParent;
	psh.hInstance = hApplet;
	// FIX THESE REACTOS HEADERS !!!!!!!!!
	psh.hIcon = LoadIcon(hApplet, MAKEINTRESOURCE(IDI_CPLSYSTEM));
	psh.pszCaption = tpszName;//Caption;
	psh.nPages = sizeof(psp) / sizeof(PROPSHEETPAGE);
	psh.nStartPage = 0;
	psh.ppsp = psp;
	psh.pfnCallback = NULL;
	

	InitPropSheetPage(&psp[0], IDD_CARDPROPERTIES, NICStatusPageProc,(LPARAM)tpszCfgInstanceID);
	PropertySheet(&psh);
	return;
}

//
// IPHLPAPI does not provide a list of all adapters
//
#if 0
static VOID
EnumAdapters(HWND hwndDlg)
{
	TCHAR pszText[MAX_ADAPTER_NAME_LENGTH + 4];
	IP_ADAPTER_INFO *pInfo;
	ULONG size;
	INT nIndex;

	size=sizeof(Info);
	if(GetAdaptersInfo(Info,&size)!=ERROR_SUCCESS)
	{
		MessageBox(hwndDlg,L"IPHLPAPI.DLL failed to provide Adapter information",L"Error",MB_ICONSTOP);
		return;
	}

	pInfo = &Info[0];
	while(pInfo)
	{
		swprintf(pszText,L"%S",Info[0].Description);
		nIndex = SendDlgItemMessage(hwndDlg,IDC_NETCARDLIST,LB_ADDSTRING,0,(LPARAM)pszText);
		SendDlgItemMessage(hwndDlg,IDC_NETCARDLIST,LB_SETITEMDATA,nIndex,(LPARAM)pInfo);
		pInfo = pInfo->Next;
	}
}
#endif



static void
NetAdapterCallback(void *pCookie,HKEY hBaseKey,TCHAR *tpszSubKey)
{
	TCHAR tpszDisplayName[MAX_PATH];
	//TCHAR tpszDeviceID[MAX_PATH];
	TCHAR tpszCfgInstanceID[MAX_PATH];
	TCHAR *ptpszCfgInstanceID;
	HKEY hKey;
	DWORD dwType = REG_SZ;
	DWORD dwSize = sizeof(tpszDisplayName);
	int nIndex;
	HWND hwndDlg = (HWND)pCookie;
	DWORD dwCharacteristics;

	DPRINT("NetAdapterCallback: %S\n", tpszSubKey);
	if(RegOpenKeyEx(hBaseKey,tpszSubKey,0,KEY_QUERY_VALUE,&hKey)!=ERROR_SUCCESS)
		return;

	DPRINT("NetAdapterCallback: Reading Characteristics\n");
	dwType = REG_DWORD;
	dwSize = sizeof(dwCharacteristics);
	if(RegQueryValueEx(hKey,_T("Characteristics"),NULL,&dwType,(BYTE*)&dwCharacteristics,&dwSize)!=ERROR_SUCCESS)
		dwCharacteristics = 0;


	if (dwCharacteristics & NCF_HIDDEN)
		return;
//	if (!(dwCharacteristics & NCF_HAS_UI))
//		return;

	DPRINT("NetAdapterCallback: Reading DriverDesc\n");
	dwType = REG_SZ;
	dwSize = sizeof(tpszDisplayName);
	if (RegQueryValueEx(hKey,_T("DriverDesc"),NULL,&dwType,(BYTE*)tpszDisplayName,&dwSize)!= ERROR_SUCCESS)
		_tcscpy(tpszDisplayName,_T("Unnamed Adapter"));

	// get the link to the Enum Subkey (currently unused)
	//dwType = REG_SZ;
	//dwSize = sizeof(tpszDeviceID);
	//if(RegQueryValueEx(hKey,_T("MatchingDeviceId"),NULL,&dwType,(BYTE*)tpszDeviceID,&dwSize) != ERROR_SUCCESS) {
	//	MessageBox(hwndDlg,_T("Missing MatchingDeviceId Entry"),_T("Registry Problem"),MB_ICONSTOP);
	//	return;
	//}

	// get the card configuration GUID
	dwType = REG_SZ;
	dwSize = sizeof(tpszCfgInstanceID);
	if(RegQueryValueEx(hKey,_T("NetCfgInstanceId"),NULL,&dwType,(BYTE*)tpszCfgInstanceID,&dwSize) != ERROR_SUCCESS) {
		MessageBox(hwndDlg,_T("Missing NetCfgInstanceId Entry"),_T("Registry Problem"),MB_ICONSTOP);
		return;
	}

	ptpszCfgInstanceID = _tcsdup(tpszCfgInstanceID);
	//
	// **TODO** **FIXME** TBD
	// At this point, we should verify, if the device listed here
	// really represents a device that is currently connected to the system
	//
	// How is this done properly ?
	

	nIndex = SendDlgItemMessage(hwndDlg,IDC_NETCARDLIST,LB_ADDSTRING,0,(LPARAM)tpszDisplayName);
	SendDlgItemMessage(hwndDlg,IDC_NETCARDLIST,LB_SETITEMDATA,nIndex,(LPARAM)ptpszCfgInstanceID);
	RegCloseKey(hKey);
}


static void
EnumAdapters(HWND hwndDlg)
{
	LPTSTR lpRegPath = _T("SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002BE10318}");

	EnumRegKeys(NetAdapterCallback,hwndDlg,HKEY_LOCAL_MACHINE,lpRegPath);
	return;
}


static INT_PTR CALLBACK
NetworkPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	NMHDR* pnmh;
	int nIndex;
	switch(uMsg)
	{
	case WM_INITDIALOG:
		{
			EnableWindow(GetDlgItem(hwndDlg,IDC_ADD),FALSE);
			EnableWindow(GetDlgItem(hwndDlg,IDC_REMOVE),FALSE);

			EnumAdapters(hwndDlg);
			SendDlgItemMessage(hwndDlg,IDC_NETCARDLIST,LB_SETCURSEL,0,0);
		}
		break;

	case WM_NOTIFY:
		pnmh=(NMHDR*)lParam;
		switch(pnmh->code)
		{
		case PSN_APPLY:
		case PSN_RESET:
			while(SendDlgItemMessage(hwndDlg,IDC_NETCARDLIST,LB_GETCOUNT,0,0)>0)
			{
				TCHAR *tpszString;

				tpszString = (TCHAR*)SendDlgItemMessage(hwndDlg,IDC_NETCARDLIST,LB_GETITEMDATA,0,0);
				if(tpszString)
					free(tpszString);
				SendDlgItemMessage(hwndDlg,IDC_NETCARDLIST,LB_DELETESTRING,0,0);
			}
			break;
		}
		break;

	case WM_COMMAND:
		switch(LOWORD(wParam))
		{
		case IDC_NETCARDLIST:
			if(HIWORD(wParam)==LBN_DBLCLK) {
				nIndex = SendDlgItemMessage(hwndDlg,IDC_NETCARDLIST,LB_GETCURSEL,0,0);
				if(nIndex!=-1)
					DisplayNICStatus(hwndDlg,(TCHAR*)SendDlgItemMessage(hwndDlg,IDC_NETCARDLIST,LB_GETITEMDATA,nIndex,0));
			}
			break;

		case IDC_PROPERTIES:
			nIndex = SendDlgItemMessage(hwndDlg,IDC_NETCARDLIST,LB_GETCURSEL,0,0);
			if(nIndex!=-1)
				DisplayNICStatus(hwndDlg,(TCHAR*)SendDlgItemMessage(hwndDlg,IDC_NETCARDLIST,LB_GETITEMDATA,nIndex,0));
			break;
		}
		break;
	}

	return FALSE;
}



/* First Applet */
static LONG CALLBACK
DisplayApplet(VOID)
{
	PROPSHEETPAGE psp[1];
	PROPSHEETHEADER psh = {0};
	TCHAR Caption[1024];

	LoadString(hApplet, IDS_CPLSYSTEMNAME, Caption, sizeof(Caption) / sizeof(TCHAR));

	psh.dwSize = sizeof(PROPSHEETHEADER);
	psh.dwFlags =  PSH_PROPSHEETPAGE;
	psh.hwndParent = NULL;
	psh.hInstance = hApplet;
	psh.hIcon = LoadIcon(hApplet, MAKEINTRESOURCE(IDI_CPLSYSTEM));
	psh.pszCaption = Caption;
	psh.nPages = sizeof(psp) / sizeof(PROPSHEETPAGE);
	psh.nStartPage = 0;
	psh.ppsp = psp;
	psh.pfnCallback = NULL;

	InitPropSheetPage(&psp[0], IDD_PROPPAGENETWORK, NetworkPageProc,0);

	return (LONG)(PropertySheet(&psh) != -1);
}

/* Control Panel Callback */
LONG CALLBACK
CPlApplet(HWND hwndCPl, UINT uMsg, LPARAM lParam1, LPARAM lParam2)
{
	switch (uMsg)
	{
	case CPL_INIT:
		{
			return TRUE;
		}

	case CPL_GETCOUNT:
		{
			return sizeof(Applets)/sizeof(APPLET);
		}

	case CPL_INQUIRE:
		{
			CPLINFO *CPlInfo = (CPLINFO*)lParam2;
			CPlInfo->lData = 0;
			CPlInfo->idIcon = Applets[(int)lParam1].idIcon;
			CPlInfo->idName = Applets[(int)lParam1].idName;
			CPlInfo->idInfo = Applets[(int)lParam1].idDescription;
			break;
		}

	case CPL_DBLCLK:
		{
			Applets[(int)lParam1].AppletProc();
			break;
		}
	}

	return FALSE;
}


BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD dwReason, LPVOID lpvReserved)
{
	switch(dwReason)
	{
	case DLL_PROCESS_ATTACH:
	case DLL_THREAD_ATTACH:
		hApplet = hinstDLL;
		break;
	}

	return TRUE;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?