最新消息

[公告2014/05/30] 如有需要將部落格中,任何一篇文章的程式碼使用在商業用途,請與我聯繫。

[公告2015/04/26] Line版的 iInfo程式與投資應用 群組已上線想加入的朋友們,請先查看 "入群須知" 再與我聯繫 Line : aminwhite5168,加入請告知身分與回答 "入群須知" 的問題。

[公告2018/04/22] 台北 Python + Excel VBA 金融資訊爬蟲課程,課程如網頁內容 金融資訊爬蟲班:台北班 Python 金融資訊爬蟲、EXCEL VBA 金融資訊爬蟲

[公告2019/01/08] 請注意:我再次重申,部落格文章的程式碼,是要提供各位參考與學習,一旦網頁改版請自行修改,別要求東要求西要我主動修改,你們用我寫東西賺錢了、交差了,請問有分我一杯羹嗎?既然賺錢沒分我,請問有什麼理由要求我修改,如果沒能力改,就花錢來找我上課。

[公告2019/12/01] 若各位有 Excel VBA 案子開發需求,歡迎與我聯繫,可接案處理。

[公告2020/05/22] 頁面載入速度慢,起因為部分JS來源(alexgorbatchev.com)失效導致頁面載入變慢,目前已做調整,請多見諒。

2013年4月13日 星期六

使用DLL連結並以WinIo.sys為Driver讀取CMOS資料

工作上遇到需要以WinIo來Debug一些問題,藉WinIo.sys以釐清是否跟工作用的Driver有相關,在網路上,WinIo已到了3.0版作者Yariv Kaplan,舉個簡單的程式碼透過WinIo.sys來讀取CMOS的資訊。
WinIo內有提供32bit/64bit的WinIo32.sys與WinIo64.sys,至於DLL、LIB則需要下載程式碼自行編譯來產生。
以下舉DLL靜態連結、動態連結與WinIo32.sys使用來對CMOS讀取。
CMOS資料夾內容
靜態DLL連結
直接引用  "winio.h" 所以可以直接使用WinIo.h中的函數,這跟動態DLL連結最大的不同
#include "stdafx.h"
#include "winio.h"

#if defined(_WIN64)
#pragma comment(lib, "64/WinIo")//64/WinIo裡面存放64bit WinIo.lib
#elif defined(_WIN32)
#pragma comment(lib, "32/WinIo")//32/WinIo裡面存放32bit WinIo.lib
#endif

int main(int argc, TCHAR* argv[])
{
 BOOL bRet = FALSE;
 DWORD dwTemp = 0;

 bRet = InitializeWinIo();
 if (!bRet) 
 {
  printf("Error during initialization of WinIo. %08X\n", GetLastError()); 
  return bRet;
 }
 
 SetPortVal(0x70, atoi(argv[1]), 1);
 GetPortVal(0x71, &dwTemp, 1);
 printf("%08X\n", dwTemp);

 bRet = RemoveWinIoDriver();
 ShutdownWinIo (); 
 return bRet;
}
執行結果

動態DLL連結
可不需要引用 "winio.h" 即可使用WinIo.h中的函數,但要知道DLL存放位置
#include "stdafx.h"

typedef bool (WINAPI   *  DLL_InitializeWinIo)();
DLL_InitializeWinIo InitializeWinIo;
typedef bool (WINAPI   *  DLL_RemoveWinIoDriver)();
DLL_RemoveWinIoDriver RemoveWinIoDriver;
typedef void (WINAPI   *  DLL_ShutdownWinIo)();
DLL_ShutdownWinIo ShutdownWinIo;
typedef bool (WINAPI   *  DLL_GetPortVal)(WORD wPortAddr, PDWORD pdwPortVal, BYTE bSize);
DLL_GetPortVal GetPortVal;
typedef bool (WINAPI   *  DLL_SetPortVal)(WORD wPortAddr, DWORD dwPortVal, BYTE bSize);
DLL_SetPortVal SetPortVal;

int main(int argc, TCHAR* argv[])
{
 BOOL bRet = FALSE;
 DWORD dwTemp = 0;
 HINSTANCE hDLL;
 
#if defined(_WIN64)
 hDLL = GetModuleHandle("WinIo64.dll");
 if(hDLL == NULL)
  hDLL = LoadLibrary("WinIo64.dll");
#elif defined(_WIN32)
 hDLL = GetModuleHandle("WinIo32.dll");
 if(hDLL == NULL)
  hDLL = LoadLibrary("WinIo32.dll");
#endif

 if (hDLL == NULL)
 {
  printf("Error load winio.dll fail. %08X\n", GetLastError()); 
  return FALSE;
 }

 InitializeWinIo = (DLL_InitializeWinIo)GetProcAddress(hDLL, ("InitializeWinIo"));
 if (!InitializeWinIo)
 {
  // handle the error
  printf("Error InitializeWinIo fail. %08X\n", GetLastError()); 
  FreeLibrary(hDLL);
  return FALSE;
 }

 RemoveWinIoDriver = (DLL_RemoveWinIoDriver)GetProcAddress(hDLL, ("RemoveWinIoDriver"));
 if (!RemoveWinIoDriver)
 {
  // handle the error
  printf("Error RemoveWinIoDriver fail. %08X\n", GetLastError()); 
  FreeLibrary(hDLL);
  return FALSE;
 }

 ShutdownWinIo = (DLL_ShutdownWinIo)GetProcAddress(hDLL, ("ShutdownWinIo"));
 if (!ShutdownWinIo)
 {
  // handle the error
  printf("Error ShutdownWinIo fail. %08X\n", GetLastError()); 
  FreeLibrary(hDLL);
  return FALSE;
 }

 GetPortVal = (DLL_GetPortVal)GetProcAddress(hDLL, ("GetPortVal"));
 if (!GetPortVal)
 {
  // handle the error
  printf("Error GetPortVal fail. %08X\n", GetLastError()); 
  FreeLibrary(hDLL);
  return FALSE;
 }

 SetPortVal = (DLL_SetPortVal)GetProcAddress(hDLL, ("SetPortVal"));
 if (!SetPortVal)
 {
  // handle the error
  printf("Error SetPortVal fail. %08X\n", GetLastError()); 
  FreeLibrary(hDLL);
  return FALSE;
 }

 bRet = InitializeWinIo();
 if (!bRet) 
 {
  printf("Error during initialization of WinIo. %08X\n", GetLastError());
  FreeLibrary(hDLL);
  return bRet;
 }
 
 SetPortVal(0x70, atoi(argv[1]), 1);
 GetPortVal(0x71, &dwTemp, 1);
 printf("%08X\n", dwTemp);

 bRet = RemoveWinIoDriver();
 ShutdownWinIo ();
 FreeLibrary(hDLL); 
 return bRet;
}
執行結果

沒有留言:

張貼留言