昨天介紹完讀取CPU風扇轉速的實作後,今天接著介紹安裝及移除驅動程式的函式。原則上大部分函式與流程跟Day07所介紹的相同,相同的部分就簡單帶過,這裡我們區分為三個函式實作。
SioSdk.h
extern "C"
匯出函式並配合Day16所提的__declspec(dllexport)
和__declspec(dllimport)
來區分編譯動態函庫或應用程式使用。pragma once
ifdef SIOSDK_EXPORTS
define SIO_API __declspec(dllexport)
else
define SIO_API __declspec(dllimport)
endif
..
xtern "C"
SIO_API HANDLE hDevice;
SIO_API bool Install();
SIO_API bool Open();
SIO_API bool Close();
SIO_API unsigned int GetCpuFanSpeed();
``
SioSdk.cpp
Install
GetModuleFileName
用來抓取當前應用程式運行的目錄。PathCchRemoveFileSpec
將路徑尾端的檔案名跟反斜線移除。TEXT("\\resources\\lib\\Sio.sys")
,這個路徑是為了讓Electron能夠存取驅動程式Sio.sys
。f (!GetModuleFileName(NULL, szUnquotedPath, MAX_PATH))
printf("Cannot install service (%d)\n", GetLastError());
return Result;
athCchRemoveFileSpec(szUnquotedPath);
tringCbCat(szUnquotedPath, MAX_PATH, TEXT("\\resources\\lib\\Sio.sys"));
tringCbPrintf(szPath, MAX_PATH, TEXT("%s"), szUnquotedPath);
rintf("System file path: %S\n", szPath);
``
開啟服務控制管理。
``c
chSCManager = OpenSCManager(
NULL, // local computer
NULL, // servicesActive database
SC_MANAGER_ALL_ACCESS); // full access rights
``
使用先前設定的驅動程式路徑及名稱建立服務。
``c
chService = CreateService(
schSCManager, // SCM database
SVCNAME, // name of service
SVCNAME, // service name to display
SERVICE_ALL_ACCESS, // desired access
SERVICE_KERNEL_DRIVER, // service type
SERVICE_DEMAND_START, // start type
SERVICE_ERROR_NORMAL, // error control type
szPath, // path to service's binary
NULL, // no load ordering group
NULL, // no tag identifier
NULL, // no dependencies
NULL, // LocalSystem account
NULL); // no password
``
使用驅動程式名稱開啟服務。
``c
chService = OpenService(schSCManager, SVCNAME, SERVICE_ALL_ACCESS);
``
最後開始服務。
``c
k = StartService(schService, 0, NULL);
``
Open
CreateFile
存取驅動程式。Device = CreateFile(DEVICE_NAME,
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
``
Close
schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT);
``
使用驅動程式名稱開啟服務。
``c
chService = OpenService(schSCManager, SVCNAME, SERVICE_ALL_ACCESS);
``
停止服務。
``c
ontrolService(schService, SERVICE_CONTROL_STOP, &Status);
``
刪除服務。
``c
eleteService(schService);
``
以上就是安裝及移除驅動程式的函式,必須透過這些步驟才能讓應用程式透過動態連結函庫來存取驅動程式,最後讀取環控晶片的數值。