www.pudn.com > 17551_portion.rar > dev.cpp
#include "stdafx.h" #include#include #include "GPIOCTL.h" #include "dev.h" bool IsInitialized = false; char szDriverPath[MAX_PATH]; bool dev::GetDriverPath() { PSTR pszSlash; if (!GetModuleFileName(GetModuleHandle(NULL), szDriverPath, sizeof(szDriverPath))) return false; pszSlash = strrchr(szDriverPath, '\\'); if (pszSlash) pszSlash[1] = 0; else return false; strcat(szDriverPath, "genport.sys"); return true; } bool dev::StartDriver() { SC_HANDLE hSCManager; SC_HANDLE hService; bool bResult; hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); if (hSCManager) { hService = OpenService(hSCManager, "AthDev", SERVICE_ALL_ACCESS); CloseServiceHandle(hSCManager); if (hService) { bResult = StartService(hService, 0, NULL) || GetLastError() == ERROR_SERVICE_ALREADY_RUNNING; CloseServiceHandle(hService); } else return false; } else return false; return bResult; } bool dev::Initialize() { bool bResult; DWORD dwBytesReturned; hDriver = CreateFile("\\\\.\\AthDev", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); // If the driver is not running, install it if (hDriver == INVALID_HANDLE_VALUE) { GetDriverPath(); bResult = InstallDriver(szDriverPath, true); if (!bResult) return false; bResult = StartDriver(); if (!bResult) return false; hDriver = CreateFile("\\\\.\\AthDev", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hDriver == INVALID_HANDLE_VALUE) return false; } IsInitialized = true; return true; } bool dev::StopDriver() { SC_HANDLE hSCManager; SC_HANDLE hService; SERVICE_STATUS ServiceStatus; hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); if (hSCManager) { hService = OpenService(hSCManager, "AthDev", SERVICE_ALL_ACCESS); CloseServiceHandle(hSCManager); else return false; } else return false; return true; } bool RemoveDriver() { SC_HANDLE hSCManager; SC_HANDLE hService; bool bResult; StopDriver(); hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); if (hSCManager) { hService = OpenService(hSCManager, "AthDev", SERVICE_ALL_ACCESS); CloseServiceHandle(hSCManager); if (hService) { bResult = DeleteService(hService); CloseServiceHandle(hService); } else return false; } else return false; return bResult; } bool InstallDriver(PSTR pszDriverPath, bool IsDemandLoaded) { SC_HANDLE hSCManager; SC_HANDLE hService; // Remove any previous instance of the driver RemoveDriver(); hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); if (hSCManager) { // Install the driver hService = CreateService(hSCManager, "AthDev", "AthDev", SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, (IsDemandLoaded == true) ? SERVICE_DEMAND_START : SERVICE_SYSTEM_START, SERVICE_ERROR_NORMAL, pszWinIoDriverPath, NULL, NULL, NULL, NULL, NULL); CloseServiceHandle(hSCManager); if (hService == NULL) return false; } else return false; CloseServiceHandle(hService); return true; }