Restart urządzenia PCI w c++

0

Witam!
Mam taki dość ciekawe zadanie dla czytelników, a mianowicie potrzebuje zrestartować sieciówkę ethernetową pod PCI. Wiem że jest masa oprogramowania typu macSpoofer, jednak napisałem swoją wersję takiego narzędzia i chcę zautomatyzować ten proces.
Potrzebuję do tego restartu karty. W jaki sposób zrestarować urządzenie z poziomu c++ ??
GUIDy i inne tego typu dane z rejestru pobrać mogę bez problemu.

0

Był kiedyś taki temat, ale coż

#include <windows.h>
#include <setupapi.h>
#include <cfgmgr32.h>
#pragma comment(lib, "setupapi.lib")

BOOL ShutDownNetworkAdapter(WCHAR *pwszAdapterName, BOOL off);
#pragma warning(disable:4311)
#pragma warning(disable:4312)


int main()
{
	BOOL cancelled = false;
	char strBuf[256];
	WCHAR wszBuf[256];
	DWORD cb;
	BOOL ok   = false;
	int index;

	// enumerate adapters
	if (ShutDownNetworkAdapter(0, 0))
	{
		printf("select adapter to shut down (index or name) >");
		ReadFile(GetStdHandle(STD_INPUT_HANDLE), strBuf, 256, &cb,0);
		index = atoi(strBuf);

		cancelled = true;

		if (cb > 2)
		{
			strBuf[cb-2] = 0;
			cancelled = false;
			if (index)
			{
				ok = ShutDownNetworkAdapter((WCHAR*)index, true);
			}
			else
			{
				MultiByteToWideChar(0,0,strBuf,cb,wszBuf,sizeof(wszBuf));
				ok = ShutDownNetworkAdapter(wszBuf, true);
			}

			if (ok)
				printf("succeeded !\n");
			else
				printf("failed !\n");
		}
	}
	if (!cancelled)
	{
		system("pause");
	}
	return 0;
}
//--------------------------------------------------------------------------------------


struct FINDADAPTERCONTEXT
{
	HDEVINFO        DeviceInfoSet;
	int             index; // start with zero
	union {
		WCHAR*          pwszAdapterName; // adapter to find
		int nAdapterIndex;
	};
	SP_DEVINFO_DATA DeviceInfoData;
	WCHAR           wszBuffer[MAX_PATH]; // buffer for names of enumerated adapter
	void (*callback)(FINDADAPTERCONTEXT*);
	BOOL disabled;
};

BOOL InitFindContext(FINDADAPTERCONTEXT *dictx);
BOOL FindAdapter(FINDADAPTERCONTEXT *dictx);
void DisplayCallback(FINDADAPTERCONTEXT *dictx);


// wszAdapterName - name of the adapter to shut down, or one based index (integer).
// If zero, this function will only enumerate adapters
// off - if false, adapter will be powered off, else on.

BOOL ShutDownNetworkAdapter(WCHAR *pwszAdapterName, BOOL off)
{
	BOOL ok = (!pwszAdapterName);
	FINDADAPTERCONTEXT dictx;

	if (InitFindContext(&dictx))
	{
		dictx.pwszAdapterName = pwszAdapterName;

		// if adapter name is invalid - display all adapters
		if (!pwszAdapterName) dictx.callback = DisplayCallback;

		if (FindAdapter(&dictx))
		{
			SP_PROPCHANGE_PARAMS params;
			
			params.ClassInstallHeader.cbSize          = sizeof(params.ClassInstallHeader);
			params.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
	
			params.StateChange = DICS_ENABLE + (off != 0);
			params.Scope       = DICS_FLAG_CONFIGSPECIFIC;
			params.HwProfile   = 0;
			if (SetupDiSetClassInstallParamsW(dictx.DeviceInfoSet, &dictx.DeviceInfoData, &params.ClassInstallHeader, sizeof(params)))
				if (SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, dictx.DeviceInfoSet, &dictx.DeviceInfoData))
					ok = true;
		}

		SetupDiDestroyDeviceInfoList(dictx.DeviceInfoSet);
	}
	return ok;
}



void DisplayCallback(FINDADAPTERCONTEXT *dictx)
{
	printf("%3d %S", dictx->index, dictx->wszBuffer);

	HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);
	if (dictx->disabled)
	{
		SetConsoleTextAttribute(hCon, 12);
		printf(" [disabled]");
	}
	else
	{
		SetConsoleTextAttribute(hCon, 10);
		printf(" [enabled]");
	}
	SetConsoleTextAttribute(hCon, 7);

	printf("\n");
}



BOOL InitFindContext(FINDADAPTERCONTEXT *dictx)
{
	dictx->index = 0;
	dictx->pwszAdapterName = NULL;
	dictx->wszBuffer[0] = 0;
	dictx->callback = 0;
	dictx->DeviceInfoData.cbSize = sizeof(dictx->DeviceInfoData);

	dictx->DeviceInfoSet = SetupDiCreateDeviceInfoList(NULL, NULL);
	if (dictx->DeviceInfoSet != INVALID_HANDLE_VALUE)
	{
		// create network interfaces class guid
		CLSID network;
		DWORD cb;
		SetupDiClassGuidsFromName(L"Net", &network, 16, &cb);


		HICON icon;
		int index;
		if (SetupDiLoadClassIcon(&network, &icon, &index))
			SendMessage(GetForegroundWindow(), WM_SETICON, ICON_SMALL, (LPARAM)icon);

		dictx->DeviceInfoSet = SetupDiGetClassDevsEx(&network, NULL, NULL, DIGCF_PRESENT, dictx->DeviceInfoSet, NULL, NULL);
	}
	return (dictx->DeviceInfoSet != INVALID_HANDLE_VALUE);
}



BOOL FindAdapter(FINDADAPTERCONTEXT *dictx)
{
	DWORD type, cb;
	BOOL matched = false;

	while (SetupDiEnumDeviceInfo(dictx->DeviceInfoSet, dictx->index++, &dictx->DeviceInfoData))
	{
		// query adapter name
		if (SetupDiGetDeviceRegistryProperty(dictx->DeviceInfoSet, &dictx->DeviceInfoData, SPDRP_DEVICEDESC, &type, (BYTE*)dictx->wszBuffer, MAX_PATH*2, &cb))
		{
			if ((dictx->nAdapterIndex > 0) && (dictx->nAdapterIndex < 65536))
			{
				// compare by index
				matched = (dictx->nAdapterIndex == dictx->index);
			}
			else if (HIWORD(dictx->nAdapterIndex))
			{
				// compare strings
				matched = !wcscmp(dictx->wszBuffer, dictx->pwszAdapterName);
			}

			ULONG ulStatus = 0, ulProblemNumber;

			CM_Get_DevNode_Status(&ulStatus, &ulProblemNumber, dictx->DeviceInfoData.DevInst, 0);
			dictx->disabled = (ulStatus & DN_HAS_PROBLEM);
			//ulProblemNumber = CM_PROB_PARTIAL_LOG_CONF

			if (dictx->callback)
			{
				dictx->callback(dictx);
			}
			if (matched) break;
		}
	}
	return matched;
}
0

No nic dzięki wielkie zaraz będę testował ten kod ;)
Pozdro

ADDED
No niestety mam problemy z kompilacją hmmmm będzie to trzeba przerobić
Spokojnie, kiedyś sie naucze korzystania z WinApi. Obsługe rejestru zrobiłem to i to zrobie;] kiedyś... ;P

0

nie sadze zebys dostal od sapero program ktory sie nie kompiluje ot tak sobie bo jest walniety...

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.