iT邦幫忙

2023 iThome 鐵人賽

DAY 19
0

昨天介紹完讀取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);
      ``
      
  • 最後建置方案,若編譯成功可以得到下面的輸出:

以上就是安裝及移除驅動程式的函式,必須透過這些步驟才能讓應用程式透過動態連結函庫來存取驅動程式,最後讀取環控晶片的數值。

參考內容

SioSdk - Repo


上一篇
Day18 使用I/O存取環控晶片-8
下一篇
Day20 使用I/O存取環控晶片-10
系列文
Windows Driver + Electron 學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言