Winio64在64位系統中初始化失敗問題
系統是win7 64位。
語言是C#
從http://www.internals.com/下載的winio3.0,下載后的Binaries文件夾中包含WinIo64.dll,WinIo64.sys,將這兩個文件放在debug文件夾下,與執行文件放在一起。
引入winio64.dll和一些基本操作的代碼如下:
//引入一些函數
public const int KBC_KEY_CMD = 0x64;//輸入鍵盤按下消息的端口
public const int KBC_KEY_DATA = 0x60;//輸入鍵盤彈起消息的端口
[DllImport("WinIo64.dll")]
public static extern bool InitializeWinIo();
[DllImport("WinIo64.dll")]
public static extern bool GetPortVal(IntPtr wPortAddr, out int pdwPortVal,
byte bSize);
[DllImport("WinIo64.dll")]
public static extern bool SetPortVal(uint wPortAddr, IntPtr dwPortVal,
byte bSize);
[DllImport("WinIo64.dll")]
public static extern byte MapPhysToLin(byte pbPhysAddr, uint dwPhysSize,
IntPtr PhysicalMemoryHandle);
[DllImport("WinIo64.dll")]
public static extern bool UnmapPhysicalMemory(IntPtr PhysicalMemoryHandle,
byte pbLinAddr);
[DllImport("WinIo64.dll")]
public static extern bool GetPhysLong(IntPtr pbPhysAddr, byte pdwPhysVal);
[DllImport("WinIo64.dll")]
public static extern bool SetPhysLong(IntPtr pbPhysAddr, byte dwPhysVal);
[DllImport("WinIo64.dll")]
public static extern void ShutdownWinIo();
[DllImport("user32.dll")]
public static extern int MapVirtualKey(uint Ucode, uint uMapType);
//初始化,安裝驅動?
public void Initialize()
{
if (InitializeWinIo())
{
b = "1";
KBCWait4IBE();
}
else
{
MessageBox.Show("failed");
b = "3";
}
}
//應該是調用結束要用的,卸載驅動?
public void Shutdown()
{
ShutdownWinIo();
KBCWait4IBE();
}
///等待鍵盤緩沖區為空
public void KBCWait4IBE()
{
int dwVal = 0;
do
{
bool flag = GetPortVal((IntPtr)0x64, out dwVal, 1);
}
//while ((dwVal & 0x2) > 0);
while((dwVal & 0x2)>0);
}
/// 模擬鍵盤標按下
public void KeyDown(Keys vKeyCoad)
{
int btScancode = 0;
btScancode = MapVirtualKey((uint)vKeyCoad, 0);
KBCWait4IBE();
SetPortVal(KBC_KEY_CMD, (IntPtr)0xD2, 1);
KBCWait4IBE();
SetPortVal(KBC_KEY_DATA, (IntPtr)0x60, 1);
KBCWait4IBE();
SetPortVal(KBC_KEY_CMD, (IntPtr)0xD2, 1);
KBCWait4IBE();
SetPortVal(KBC_KEY_DATA, (IntPtr)btScancode, 1);
}
/// 模擬鍵盤彈出
public void KeyUp(Keys vKeyCoad)
{
int btScancode = 0;
btScancode = MapVirtualKey((uint)vKeyCoad, 0);
KBCWait4IBE();
SetPortVal(KBC_KEY_CMD, (IntPtr)0xD2, 1);
KBCWait4IBE();
SetPortVal(KBC_KEY_DATA, (IntPtr)0x60, 1);
KBCWait4IBE();
SetPortVal(KBC_KEY_CMD, (IntPtr)0xD2, 1);
KBCWait4IBE();
SetPortVal(KBC_KEY_DATA, (IntPtr)(btScancode | 0x80), 1);
}
/// 模擬一次按鍵
public void KeyDownUp(Keys vKeyCoad)
{
KeyDown(vKeyCoad);
Thread.Sleep(100);
KeyUp(vKeyCoad);
}
但是發現InitializeWinIo()一直返回的是false。在百度上搜索了N,說要看dll中的代碼,然后改存放文件的地址,但是無果。繼續調試,發現偶爾會有winio64.sys的數字簽名無效的提示。后來在google上搜索了N久發現,果然是這個問題。Winio64.sys沒有正式的數字簽名,只有測試的。需要修改一些東西,具體如下:
cmd->bcdedit /set testsigning on
然后修改WinIo64.sys的測試簽名
1.打開 WinIO64.sys的屬性框,翻到“數字簽名”選項卡,點擊“詳細信息”
2.在新出來的對話框中點擊“查看證書”
3.在又新出來的對話框中點擊“安裝證書”
4.點擊“下一步”,然后選擇“將所有的證書放入下列存儲”
5.點擊瀏覽,選擇“受信任的根證書發布機構”
6.點擊“下一步”,然后點擊“完成”
7.在彈出的“安全性警告”對話框中選擇“是”,才能導入成功
然后重啟。
再調試程序,就可以成功初始化了。
感謝:http://2817071.blog.51cto.com/2807071/740302