Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/prusa3d/PrusaSlicer.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbubnikv <bubnikv@gmail.com>2018-09-19 12:02:24 +0300
committerbubnikv <bubnikv@gmail.com>2018-09-19 12:02:24 +0300
commit0558b53493a77bae44831cf87bb0f59359828ef5 (patch)
treec3e8dbdf7d91a051c12d9ebbf7606d41047fea96 /src/avrdude/windows/loaddrv.c
parent3ddaccb6410478ad02d8c0e02d6d8e6eb1785b9f (diff)
WIP: Moved sources int src/, separated most of the source code from Perl.
The XS was left only for the unit / integration tests, and it links libslic3r only. No wxWidgets are allowed to be used from Perl starting from now.
Diffstat (limited to 'src/avrdude/windows/loaddrv.c')
-rw-r--r--src/avrdude/windows/loaddrv.c460
1 files changed, 460 insertions, 0 deletions
diff --git a/src/avrdude/windows/loaddrv.c b/src/avrdude/windows/loaddrv.c
new file mode 100644
index 000000000..ca92a2a1a
--- /dev/null
+++ b/src/avrdude/windows/loaddrv.c
@@ -0,0 +1,460 @@
+// loaddrv.c - Dynamic driver install/start/stop/remove
+// based on Paula Tomlinson's LOADDRV program.
+// She describes it in her May 1995 article in Windows/DOS Developer's
+// Journal (now Windows Developer's Journal).
+// Modified by Chris Liechti <cliechti@gmx.net>
+// I removed the old/ugly dialog, it now accepts command line options and
+// prints error messages with textual description from the OS.
+
+#include <windows.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include "loaddrv.h"
+
+// globals
+SC_HANDLE hSCMan = NULL;
+
+//get ext messages for windows error codes:
+void DisplayErrorText(DWORD dwLastError) {
+ LPSTR MessageBuffer;
+ DWORD dwBufferLength;
+
+ DWORD dwFormatFlags = FORMAT_MESSAGE_ALLOCATE_BUFFER |
+ FORMAT_MESSAGE_IGNORE_INSERTS |
+ FORMAT_MESSAGE_FROM_SYSTEM;
+
+ dwBufferLength = FormatMessageA(
+ dwFormatFlags,
+ NULL, // module to get message from (NULL == system)
+ dwLastError,
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // default language
+ (LPSTR) &MessageBuffer,
+ 0,
+ NULL
+ );
+ if (dwBufferLength) {
+ // Output message
+ puts(MessageBuffer);
+ // Free the buffer allocated by the system.
+ LocalFree(MessageBuffer);
+ }
+}
+
+int exists(char *filename) {
+ FILE * pFile;
+ pFile = fopen(filename, "r");
+ return pFile != NULL;
+}
+
+void usage(void) {
+ printf("USGAE: loaddrv command drivername [args...]\n\n"
+ "NT/2k/XP Driver and Service modification tool.\n"
+ "(C)2002 Chris Liechti <cliechti@gmx.net>\n\n"
+ "Suported commands:\n\n"
+ " install [fullpathforinstall]\n"
+ " Install new service. Loaded from given path. If path is not present,\n"
+ " the local directory is searched for a .sys file. If the service\n"
+ " already exists, it must be removed first.\n"
+ " start\n"
+ " Start service. It must be installed in advance.\n"
+ " stop\n"
+ " Stop service.\n"
+ " remove\n"
+ " Remove service. It must be stopped in advance.\n"
+ " status\n"
+ " Show status information about service.\n"
+ " starttype auto|manual|system|disable\n"
+ " Change startup type to the given type.\n"
+ );
+}
+
+int main(int argc, char *argv[]) {
+ DWORD status = 0;
+ int level = 0;
+ if (argc < 3) {
+ usage();
+ exit(1);
+ }
+ LoadDriverInit();
+ if (strcmp(argv[1], "start") == 0) {
+ printf("starting %s... ", argv[2]);
+ status = DriverStart(argv[2]);
+ if ( status != OKAY) {
+ printf("start failed (status %ld):\n", status);
+ level = 1;
+ } else {
+ printf("ok.\n");
+ }
+ } else if (strcmp(argv[1], "stop") == 0) {
+ printf("stoping %s... ", argv[2]);
+ status = DriverStop(argv[2]);
+ if ( status != OKAY) {
+ printf("stop failed (status %ld):\n", status);
+ level = 1;
+ } else {
+ printf("ok.\n");
+ }
+ } else if (strcmp(argv[1], "install") == 0) {
+ char path[MAX_PATH*2];
+ if (argc<4) {
+ char cwd[MAX_PATH];
+ getcwd(cwd, sizeof cwd);
+ sprintf(path, "%s\\%s.sys", cwd, argv[2]);
+ } else {
+ strncpy(path, argv[3], MAX_PATH);
+ }
+ if (exists(path)) {
+ printf("installing %s from %s... ", argv[2], path);
+ status = DriverInstall(path, argv[2]);
+ if ( status != OKAY) {
+ printf("install failed (status %ld):\n", status);
+ level = 2;
+ } else {
+ printf("ok.\n");
+ }
+ } else {
+ printf("install failed, file not found: %s\n", path);
+ level = 1;
+ }
+ } else if (strcmp(argv[1], "remove") == 0) {
+ printf("removing %s... ", argv[2]);
+ status = DriverRemove(argv[2]);
+ if ( status != OKAY) {
+ printf("remove failed (status %ld):\n", status);
+ level = 1;
+ } else {
+ printf("ok.\n");
+ }
+ } else if (strcmp(argv[1], "status") == 0) {
+ printf("status of %s:\n", argv[2]);
+ status = DriverStatus(argv[2]);
+ if ( status != OKAY) {
+ printf("stat failed (status %ld):\n", status);
+ level = 1;
+ } else {
+ printf("ok.\n");
+ }
+ } else if (strcmp(argv[1], "starttype") == 0) {
+ if (argc < 4) {
+ printf("Error: need start type (string) as argument.\n");
+ level = 2;
+ } else {
+ DWORD type = 0;
+ printf("set start type of %s to %s... ", argv[2], argv[3]);
+ if (strcmp(argv[1], "boot") == 0) {
+ type = SERVICE_BOOT_START;
+ } else if (strcmp(argv[3], "system") == 0) {
+ type = SERVICE_SYSTEM_START;
+ } else if (strcmp(argv[3], "auto") == 0) {
+ type = SERVICE_AUTO_START;
+ } else if (strcmp(argv[3], "manual") == 0) {
+ type = SERVICE_DEMAND_START;
+ } else if (strcmp(argv[3], "disabled") == 0) {
+ type = SERVICE_DISABLED;
+ } else {
+ printf("unknown type\n");
+ level = 1;
+ }
+ if (level == 0) {
+ status = DriverStartType(argv[2], type);
+ if ( status != OKAY) {
+ printf("set start type failed (status %ld):\n", status);
+ level = 1;
+ } else {
+ printf("ok.\n");
+ }
+ }
+ }
+ } else {
+ usage();
+ level = 1;
+ }
+ if (status) DisplayErrorText(status);
+ LoadDriverCleanup();
+ exit(level);
+ return 0;
+}
+
+
+DWORD LoadDriverInit(void) {
+ // connect to local service control manager
+ if ((hSCMan = OpenSCManager(NULL, NULL,
+ SC_MANAGER_ALL_ACCESS)) == NULL) {
+ return -1;
+ }
+ return OKAY;
+}
+
+void LoadDriverCleanup(void) {
+ if (hSCMan != NULL) CloseServiceHandle(hSCMan);
+}
+
+/**-----------------------------------------------------**/
+DWORD DriverInstall(LPSTR lpPath, LPSTR lpDriver) {
+ BOOL dwStatus = OKAY;
+ SC_HANDLE hService = NULL;
+
+ // add to service control manager's database
+ if ((hService = CreateService(hSCMan, lpDriver,
+ lpDriver, SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER,
+ SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, lpPath,
+ NULL, NULL, NULL, NULL, NULL)) == NULL)
+ dwStatus = GetLastError();
+ else CloseServiceHandle(hService);
+
+ return dwStatus;
+} // DriverInstall
+
+/**-----------------------------------------------------**/
+DWORD DriverStart(LPSTR lpDriver) {
+ BOOL dwStatus = OKAY;
+ SC_HANDLE hService = NULL;
+
+ // get a handle to the service
+ if ((hService = OpenService(hSCMan, lpDriver,
+ SERVICE_ALL_ACCESS)) != NULL)
+ {
+ // start the driver
+ if (!StartService(hService, 0, NULL))
+ dwStatus = GetLastError();
+ } else dwStatus = GetLastError();
+
+ if (hService != NULL) CloseServiceHandle(hService);
+ return dwStatus;
+} // DriverStart
+
+/**-----------------------------------------------------**/
+DWORD DriverStop(LPSTR lpDriver)
+{
+ BOOL dwStatus = OKAY;
+ SC_HANDLE hService = NULL;
+ SERVICE_STATUS serviceStatus;
+
+ // get a handle to the service
+ if ((hService = OpenService(hSCMan, lpDriver,
+ SERVICE_ALL_ACCESS)) != NULL)
+ {
+ // stop the driver
+ if (!ControlService(hService, SERVICE_CONTROL_STOP,
+ &serviceStatus))
+ dwStatus = GetLastError();
+ } else dwStatus = GetLastError();
+
+ if (hService != NULL) CloseServiceHandle(hService);
+ return dwStatus;
+} // DriverStop
+
+/**-----------------------------------------------------**/
+DWORD DriverRemove(LPSTR lpDriver)
+{
+ BOOL dwStatus = OKAY;
+ SC_HANDLE hService = NULL;
+
+ // get a handle to the service
+ if ((hService = OpenService(hSCMan, lpDriver,
+ SERVICE_ALL_ACCESS)) != NULL)
+ { // remove the driver
+ if (!DeleteService(hService))
+ dwStatus = GetLastError();
+ } else dwStatus = GetLastError();
+
+ if (hService != NULL) CloseServiceHandle(hService);
+ return dwStatus;
+} // DriverRemove
+
+/**-----------------------------------------------------**/
+////extensions by Lch
+/**-----------------------------------------------------**/
+DWORD DriverStatus(LPSTR lpDriver) {
+ BOOL dwStatus = OKAY;
+ SC_HANDLE hService = NULL;
+ DWORD dwBytesNeeded;
+
+ // get a handle to the service
+ if ((hService = OpenService(hSCMan, lpDriver,
+ SERVICE_ALL_ACCESS)) != NULL)
+ {
+ LPQUERY_SERVICE_CONFIG lpqscBuf;
+ //~ LPSERVICE_DESCRIPTION lpqscBuf2;
+ // Allocate a buffer for the configuration information.
+ if ((lpqscBuf = (LPQUERY_SERVICE_CONFIG) LocalAlloc(
+ LPTR, 4096)) != NULL)
+ {
+ //~ if ((lpqscBuf2 = (LPSERVICE_DESCRIPTION) LocalAlloc(
+ //~ LPTR, 4096)) != NULL)
+ {
+ // Get the configuration information.
+ if (QueryServiceConfig(
+ hService,
+ lpqscBuf,
+ 4096,
+ &dwBytesNeeded) //&&
+ //~ QueryServiceConfig2(
+ //~ hService,
+ //~ SERVICE_CONFIG_DESCRIPTION,
+ //~ lpqscBuf2,
+ //~ 4096,
+ //~ &dwBytesNeeded
+ )
+ {
+ // Print the configuration information.
+ printf("Type: [0x%02lx] ", lpqscBuf->dwServiceType);
+ switch (lpqscBuf->dwServiceType) {
+ case SERVICE_WIN32_OWN_PROCESS:
+ printf("The service runs in its own process.");
+ break;
+ case SERVICE_WIN32_SHARE_PROCESS:
+ printf("The service shares a process with other services.");
+ break;
+ case SERVICE_KERNEL_DRIVER:
+ printf("Kernel driver.");
+ break;
+ case SERVICE_FILE_SYSTEM_DRIVER:
+ printf("File system driver.");
+ break;
+ case SERVICE_INTERACTIVE_PROCESS:
+ printf("The service can interact with the desktop.");
+ break;
+ default:
+ printf("Unknown type.");
+ }
+ printf("\nStart Type: [0x%02lx] ", lpqscBuf->dwStartType);
+ switch (lpqscBuf->dwStartType) {
+ case SERVICE_BOOT_START:
+ printf("Boot");
+ break;
+ case SERVICE_SYSTEM_START:
+ printf("System");
+ break;
+ case SERVICE_AUTO_START:
+ printf("Automatic");
+ break;
+ case SERVICE_DEMAND_START:
+ printf("Manual");
+ break;
+ case SERVICE_DISABLED:
+ printf("Disabled");
+ break;
+ default:
+ printf("Unknown.");
+ }
+ printf("\nError Control: [0x%02lx] ", lpqscBuf->dwErrorControl);
+ switch (lpqscBuf->dwErrorControl) {
+ case SERVICE_ERROR_IGNORE:
+ printf("IGNORE: Ignore.");
+ break;
+ case SERVICE_ERROR_NORMAL:
+ printf("NORMAL: Display a message box.");
+ break;
+ case SERVICE_ERROR_SEVERE:
+ printf("SEVERE: Restart with last-known-good config.");
+ break;
+ case SERVICE_ERROR_CRITICAL:
+ printf("CRITICAL: Restart w/ last-known-good config.");
+ break;
+ default:
+ printf("Unknown.");
+ }
+ printf("\nBinary path: %s\n", lpqscBuf->lpBinaryPathName);
+
+ if (lpqscBuf->lpLoadOrderGroup != NULL)
+ printf("Load order grp: %s\n", lpqscBuf->lpLoadOrderGroup);
+ if (lpqscBuf->dwTagId != 0)
+ printf("Tag ID: %ld\n", lpqscBuf->dwTagId);
+ if (lpqscBuf->lpDependencies != NULL)
+ printf("Dependencies: %s\n", lpqscBuf->lpDependencies);
+ if (lpqscBuf->lpServiceStartName != NULL)
+ printf("Start Name: %s\n", lpqscBuf->lpServiceStartName);
+ //~ if (lpqscBuf2->lpDescription != NULL)
+ //~ printf("Description: %s\n", lpqscBuf2->lpDescription);
+ }
+ //~ LocalFree(lpqscBuf2);
+ }
+ LocalFree(lpqscBuf);
+ } else {
+ dwStatus = GetLastError();
+ }
+ } else {
+ dwStatus = GetLastError();
+ }
+
+ if (hService != NULL) CloseServiceHandle(hService);
+ return dwStatus;
+} // DriverStatus
+
+/**-----------------------------------------------------**/
+DWORD DriverStartType(LPSTR lpDriver, DWORD dwStartType) {
+ BOOL dwStatus = OKAY;
+ SC_HANDLE hService = NULL;
+
+ SC_LOCK sclLock;
+ LPQUERY_SERVICE_LOCK_STATUS lpqslsBuf;
+ DWORD dwBytesNeeded;
+
+ // Need to acquire database lock before reconfiguring.
+ sclLock = LockServiceDatabase(hSCMan);
+
+ // If the database cannot be locked, report the details.
+ if (sclLock == NULL) {
+ // Exit if the database is not locked by another process.
+ if (GetLastError() == ERROR_SERVICE_DATABASE_LOCKED) {
+
+ // Allocate a buffer to get details about the lock.
+ lpqslsBuf = (LPQUERY_SERVICE_LOCK_STATUS) LocalAlloc(
+ LPTR, sizeof(QUERY_SERVICE_LOCK_STATUS)+256);
+ if (lpqslsBuf != NULL) {
+ // Get and print the lock status information.
+ if (QueryServiceLockStatus(
+ hSCMan,
+ lpqslsBuf,
+ sizeof(QUERY_SERVICE_LOCK_STATUS)+256,
+ &dwBytesNeeded) )
+ {
+ if (lpqslsBuf->fIsLocked) {
+ printf("Locked by: %s, duration: %ld seconds\n",
+ lpqslsBuf->lpLockOwner,
+ lpqslsBuf->dwLockDuration
+ );
+ } else {
+ printf("No longer locked\n");
+ }
+ }
+ LocalFree(lpqslsBuf);
+ }
+ }
+ dwStatus = GetLastError();
+ } else {
+ // The database is locked, so it is safe to make changes.
+ // Open a handle to the service.
+ hService = OpenService(
+ hSCMan, // SCManager database
+ lpDriver, // name of service
+ SERVICE_CHANGE_CONFIG
+ ); // need CHANGE access
+ if (hService != NULL) {
+ // Make the changes.
+ if (!ChangeServiceConfig(
+ hService, // handle of service
+ SERVICE_NO_CHANGE, // service type: no change
+ dwStartType, // change service start type
+ SERVICE_NO_CHANGE, // error control: no change
+ NULL, // binary path: no change
+ NULL, // load order group: no change
+ NULL, // tag ID: no change
+ NULL, // dependencies: no change
+ NULL, // account name: no change
+ NULL, // password: no change
+ NULL) ) // display name: no change
+ {
+ dwStatus = GetLastError();
+ }
+ }
+ // Release the database lock.
+ UnlockServiceDatabase(sclLock);
+ }
+
+ if (hService != NULL) CloseServiceHandle(hService);
+ return dwStatus;
+} // DriverStartType