/* Install and start the NetHalt service * Copyright (C) 2008 Daniel Collins * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of the author nor the names of its contributors may * be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include static char *w32_error(DWORD errnum) { static char buf[256]; FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, errnum, 0, buf, 255, NULL); buf[strcspn(buf, "\r\n")] = '\0'; return buf; } static void die(char const *fmt, ...) { char msgbuf[256]; va_list argv; va_start(argv, fmt); vsnprintf(msgbuf, 256, fmt, argv); va_end(argv); MessageBox(NULL, msgbuf, NULL, MB_OK | MB_ICONERROR); exit(1); } static void check_file(char const *prefix, char const *file) { char filename[512]; snprintf(filename, 512, "%s%s", prefix, file); if(GetFileAttributes(filename) == INVALID_FILE_ATTRIBUTES) { die("Missing file: %s", filename, (int)GetLastError()); } } int main(int argc, char **argv) { char prefix[512], msgbuf[256], exename[512]; int n; SC_HANDLE SCMHandle, SVCHandle; FreeConsole(); GetModuleFileName(NULL, prefix, 512); n = strlen(prefix) - 1; while(n > 0 && prefix[n] != '\\') { prefix[n--] = '\0'; } check_file(prefix, "nethalt.exe"); check_file(prefix, "nethalt.ini"); n = MessageBox( NULL, "Install and start the NetHalt service?", "Confirm", MB_YESNO | MB_ICONQUESTION | MB_DEFBUTTON2 ); if(n == IDNO) { return 0; } if(strncmp(prefix, "\\\\", 2) != 0) { snprintf( msgbuf, 256, "%s is not a UNC path!\n" "Are you SURE you want to install the service here?", prefix ); n = MessageBox( NULL, msgbuf, "Warning", MB_YESNO | MB_ICONWARNING | MB_DEFBUTTON2 ); if(n == IDNO) { return 0; } } snprintf(exename, 512, "\"%snethalt.exe\"", prefix); SCMHandle = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); if(!SCMHandle) { die("Failed to connect to SCM: %s", w32_error(GetLastError())); } SVCHandle = CreateService( SCMHandle, "NetHalt", "NetHalt", SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL, exename, NULL, NULL, NULL, "LocalSystem", "" ); if(!SVCHandle) { die("Failed to install service: %s", w32_error(GetLastError())); } StartService(SVCHandle, 0, NULL); MessageBox( NULL, "NetHalt service installed and started", "Finished", MB_OK | MB_ICONINFORMATION ); return 0; }