⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 giveio-install.cpp

📁 传感器网络中的嵌入式操作系统源代码
💻 CPP
字号:
#include <windows.h>#include <iostream>#include <string>#include <algorithm>using namespace std;int help(){    cout << "usage: giveio-install [option]" << endl;    cout << "    [option] is one of the following:" << endl;    cout << "        --install    Installs GiveIO driver" << endl;    cout << "        --uninstall  Uninstalls GiveIO driver" << endl;    cout << "        --help       Prints this help message" << endl;    return 1;}int error(const char* msg){    cout << "giveio-install: " << msg << endl;    return 0;}class auto_sc_handle {public:    auto_sc_handle(SC_HANDLE h_arg) : h(h_arg) { }    ~auto_sc_handle() { CloseServiceHandle(h); }    operator SC_HANDLE() { return h; }private:    SC_HANDLE h;};bool is_installed(SC_HANDLE scmh){    bool result = false;    size_t ess_size = sizeof(ENUM_SERVICE_STATUS) + 256 + 256;    ENUM_SERVICE_STATUS* essp =	reinterpret_cast<ENUM_SERVICE_STATUS*>(new char[ess_size]);    DWORD bytes_needed = 0;    DWORD services_returned = 0;    DWORD resume_handle = 0;    do {	BOOL success =	    EnumServicesStatus(scmh,			       SERVICE_DRIVER/* | SERVICE_WIN32*/,			       SERVICE_STATE_ALL,			       essp,			       ess_size,			       &bytes_needed,			       &services_returned,			       &resume_handle);	if (success == FALSE && GetLastError() != ERROR_MORE_DATA)	    break;		for (DWORD i = 0; i < services_returned; i++) {	    // cout << essp[i].lpServiceName << endl;	    if (strcasecmp(essp[i].lpServiceName, "GiveIO") == 0		|| strcasecmp(essp[i].lpDisplayName, "GiveIO") == 0) {		result = true;		break;	    }			}    } while (bytes_needed != 0 && ! result);    delete[] essp;    return result;}int install(){    // Taking out the input from stdin -- eases installation and if    // the user chooses N, TOS won't work right.     // -lkw 1/25/2002    //cout << "giveio-install:" << endl;    //cout << "You are about to install the GiveIO driver" << endl;    //cout << "on your computer!  This driver can give applications" << endl;    //cout << "direct access to I/O, circumventing" << endl;    //cout << "Windows NT/Windows 2000 prohibitions." << endl << endl;    //cout << "Do you want to continue?  (Y/N) ";    char c;    //cin >> c;    //cout << endl;    //if (c != 'y' && c != 'Y')	//return error("Installation aborted");    auto_sc_handle scmh = OpenSCManager(0, 0, GENERIC_WRITE | GENERIC_READ);    if (! scmh)	return error("Could not connect to the Service Control Manager");    if (is_installed(scmh))	return error("Driver already installed");    bool copy_failed = false;    string WINDIR = getenv("WINDIR");    if (WINDIR.empty()) {	copy_failed = true;	cout << "giveio-install: warning: "	     << "WINDIR environment variable is not defined." << endl;    } else {	replace(WINDIR.begin(), WINDIR.end(), '\\', '/');	const string cp =	    "cp giveio.sys " + WINDIR + "/system32/drivers/giveio.sys";	cout << cp << endl;	if (system(cp.c_str()) != 0) {	    copy_failed = true;	    cout << "giveio-install: warning: "		 << "Copy failed." << endl;	}    }    if (copy_failed)	cout << "giveio-install: warning: "	     << "Please copy giveio.sys to the "	     << "$WINDIR/system32/drivers directory." << endl;    auto_sc_handle csh =	CreateService(scmh,		      "GiveIO",		      "GiveIO Port Access",		      SERVICE_ALL_ACCESS,		      SERVICE_KERNEL_DRIVER,		      SERVICE_AUTO_START,		      SERVICE_ERROR_NORMAL,		      "system32\\drivers\\giveio.sys",		      0,		      0,		      0,		      0,		      0);    if (csh == 0)      return error("Could not create service");    BOOL result = StartService(csh,0,NULL);    if (!result)      return error("Could not start service");    return 0;}int uninstall(){  SERVICE_STATUS status;    auto_sc_handle scmh = OpenSCManager(0, 0, GENERIC_WRITE | GENERIC_READ);    if (! scmh)	return error("Could not connect to the Service Control Manager");    if (! is_installed(scmh))	return error("Driver has not been installed");    auto_sc_handle csh =	OpenService(scmh,		    "GiveIO",		    SERVICE_ALL_ACCESS);    if (!csh)	return error("Could not access GiveIO driver");    BOOL result = ControlService(csh,				 SERVICE_CONTROL_STOP,				 &status);    if (!result) {      cout << "giveio-install: warning:"	   << "The GiveIO service could not be stopped. "	   << "Uninstall will complete when the system restarts." << endl;    }    DeleteService(csh);    return 0;}int main(int argc, char* argv[]){    enum actions {	a_install,	a_uninstall,	a_help    } action = a_install;    for (int i = 1; i < argc; i++) {	if (strcmp(argv[i], "--install") == 0)	    action = a_install;	else if (strcmp(argv[i], "--uninstall") == 0)	    action = a_uninstall;	else if (strcmp(argv[i], "--help") == 0)	    action = a_help;	else	    action = a_help;    }    switch (action) {    case a_help:	return help();    case a_install:	return install();    case a_uninstall:	return uninstall();    }    return 0;}

⌨️ 快捷键说明

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