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
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, ¶ms.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.