討論區快速選單
知識庫快速選單
程式設計俱樂部Facebook粉絲團 掌握Salesforce雲端管理秘訣 軟體開發過程中有哪些資安漏洞?
[ 回上頁 ] [ 討論區發言規則 ]
有關Keyboard 8042 [60,64] Port..
更改我的閱讀文章字型大小
作者 : netsaver(Andrew)
[ 貼文 15 | 人氣 2286 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/1/6 下午 04:07:17
Dear All:

請問利用2KDDK所定義的routine ->
WRITE_PORT_UCHAR(IN PUCHAR, IN UCHAR)
去access [60,64] Port,
為什麼會出現Mouse Cursor不受控制 (亂跑)?

在access [60,64] port 的時候有什麼要注意的地方嗎?

請指教, 謝謝!!
作者 : jc_23(掌握文武半邊天)
[ 貼文 119 | 人氣 7450 | 評價 530 | 評價/貼文 4.45 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/1/10 上午 10:37:09
基本上您想作任何直接的 I/O 動作在一般的 Windows 的程式下是不允許的
除非您寫了一個 kernel mode 的 driver ,在那個 driver 內才可以作 I/O
還有一些特殊的指令, 如 rdmsr 等, 這些都要在 ring0 下才可以
作者 : maxmax(超級賽亞人) 貼文超過200則
[ 貼文 436 | 人氣 385 | 評價 260 | 評價/貼文 0.6 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/1/11 下午 01:46:32

>基本上您想作任何直接的 I/O 動作在一般的 Windows 的程式下是不允許的
>除非您寫了一個 kernel mode 的 driver ,在那個 driver 內才可以作 I/O
>還有一些特殊的指令, 如 rdmsr 等, 這些都要在 ring0 下才可以

呵呵! 答非所問, 他都說了, 用DDK的指令, 想當然而當然是在
driver裡做這樣的事, 所以你的回答有點奇怪.

他想要知道的是那個port的定義, 而不是存取那個port的方法.
我想他需要的是硬體的規格說明.
作者 : seanchang(H) Assembly卓越專家貼文超過1000則
[ 貼文 1200 | 人氣 773 | 評價 3240 | 評價/貼文 2.7 | 送出評價 43 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/1/13 上午 09:16:26
>請問利用2KDDK所定義的routine ->
>WRITE_PORT_UCHAR(IN PUCHAR, IN UCHAR)
>去access [60,64] Port,
>為什麼會出現Mouse Cursor不受控制 (亂跑)?
>
>在access [60,64] port 的時候有什麼要注意的地方嗎?

我是沒寫過DDk啦!
不過以前在DOS下寫程式的時候,在對 8042下command之前,先從64h讀入status要確認 bit1 的status 是 0才可以發command.
作者 : jc_23(掌握文武半邊天)
[ 貼文 119 | 人氣 7450 | 評價 530 | 評價/貼文 4.45 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/1/13 下午 03:12:48

>
>>基本上您想作任何直接的 I/O 動作在一般的 Windows 的程式下是不允許的
>>除非您寫了一個 kernel mode 的 driver ,在那個 driver 內才可以作 I/O
>>還有一些特殊的指令, 如 rdmsr 等, 這些都要在 ring0 下才可以
>
>呵呵! 答非所問, 他都說了, 用DDK的指令, 想當然而當然是在
>driver裡做這樣的事, 所以你的回答有點奇怪.
>
>他想要知道的是那個port的定義, 而不是存取那個port的方法.
>我想他需要的是硬體的規格說明.
>
Sorry, 我會錯意了
根據你想要的資料, 在對 Port64/60 write 之前, 要先檢查 Port64 的 bit1 是不是
為0, 是的話表示 KBC 現在可以接受資料 or 命令
在對 Port60 read 之前, 要先檢查 Port64 的 bit0 是不是
為1, 是的話表示 KBC 現在的資料已經 ready, 可以收了
至於 mouse crazy 的問題, 在你要對 Port64/60 read/write 之前, 要先檢查
目前在 KBC 上是不是有 mouse or keyboard 的資料,有的話要先保留起來
離開時再回填回去這樣就不會有 mouse crazy 的問題了
作者 : eboytw2002(eBoy) 驅動程式優秀好手貼文超過200則人氣指數超過70000點
[ 貼文 338 | 人氣 70186 | 評價 2000 | 評價/貼文 5.92 | 送出評價 4 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/1/14 上午 10:36:17

我記的 , Mouse 和 kEYBOARD 好像是同一組 PORT 的樣子

即 PORT 60 是 mOUSE 和 KB 的 STATUS BYTE 讀取 PORT, 
PORT 64 是 MOUSE 和 KB 的 data byte 讀取 port , 當然, 這些 port 都必須在
ISR 內動作...

我想你可能在 ISR 內, 只對 KB 作動作, 使的 MOUSE 當 Interrupt 時 , 無法在 isr 中找到相對應的 code, 所以 cursor 亂跳..........

[eBoy]
作者 : jc_23(掌握文武半邊天)
[ 貼文 119 | 人氣 7450 | 評價 530 | 評價/貼文 4.45 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/1/14 上午 11:32:46

>
>我記的 , Mouse 和 kEYBOARD 好像是同一組 PORT 的樣子
>
>即 PORT 60 是 mOUSE 和 KB 的 STATUS BYTE 讀取 PORT, 
>PORT 64 是 MOUSE 和 KB 的 data byte 讀取 port , 當然, 這些 port 都必須在
>ISR 內動作...
>
>我想你可能在 ISR 內, 只對 KB 作動作, 使的 MOUSE 當 Interrupt 時 , 無法在 isr 中找到相對應的 code, 所以 cursor 亂跳..........
>
>[eBoy]

上面的 eBoy 兄:
你的資料有點錯誤哦, mouse/kb 它們都是用同一組 port 在 access 沒錯
但是 status 和 command 是用 Port64 , data 則是用 Port60
cursor 亂跳的問題就像我之前說的, 你在存取 Port64 or Port60 時, 除了
Port64 的 bit0 or bit1 之外,一定
要檢查現在有沒有資料在 Port60 上,有的話還要檢查是 mouse or kb 的資
料, 在你的程式離開時再回填回去
為什麼我這清楚這些, 因為我曾寫過在 Win98/XP 下存取 keobyard RAM 
資料的driver,為了 mouse crazy 的問題搞了好久才解決
作者 : netsaver(Andrew)
[ 貼文 15 | 人氣 2286 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/1/15 上午 09:27:20
>Sorry, 我會錯意了
沒關係, 謝謝你的回答.
>根據你想要的資料, 在對 Port64/60 write 之前, 要先檢查 Port64 的 bit1 是不是
>為0, 是的話表示 KBC 現在可以接受資料 or 命令
請問...那是不是在Write Port 64/60 之前除了要檢查bit 1 是否為0之外...
還要檢查是不是Keyboard or Mouse 的資料嗎 ? 要如何知道現在的資料是
Keyboad or Mouse 的 ? 謝謝!!!

>在對 Port60 read 之前, 要先檢查 Port64 的 bit0 是不是
>為1, 是的話表示 KBC 現在的資料已經 ready, 可以收了
也就是IBF Flag 為1時才去得 Port 60 裡的 Data 對嗎?

>至於 mouse crazy 的問題, 在你要對 Port64/60 read/write 之前, 要先檢查
>目前在 KBC 上是不是有 mouse or keyboard 的資料,有的話要先保留起來
請問如何確定目前 Port 60 裡的 Data 是 Keyboard or Mouse 的資料呢 ?
還是不管, 只要動作完成後就把原先的值回填 ! 對嗎 ?

>離開時再回填回去這樣就不會有 mouse crazy 的問題了
>

再一次謝謝各位的熱心幫忙 !!!
作者 : eboytw2002(eBoy) 驅動程式優秀好手貼文超過200則人氣指數超過70000點
[ 貼文 338 | 人氣 70186 | 評價 2000 | 評價/貼文 5.92 | 送出評價 4 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/1/15 上午 10:17:33
我很確定 
port 60 是 Status byte
port 64 是 Data byte
你可以參考 & search 一下 "Keyboard IsrRoutine" 或 "Mouse IsrRoutine"

制於在 Staus port 送的 data , 將 KB 或 mOUSE 的 ENABLE/DISABLE, 我想 8042 的Specification 都應該有吧  !!

[eBoy]
作者 : jc_23(掌握文武半邊天)
[ 貼文 119 | 人氣 7450 | 評價 530 | 評價/貼文 4.45 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/1/15 上午 11:40:49
相信我吧, 因為我是寫 BIOS 的, 所以那些 int09h 我很熟的
至於 MSDN 上的資料, 沒錯, 就像 eBoy 所說的一樣, 但是我認為那
是從另外一個角度的觀點, 才會是這樣, 但如果真正要寫程式時
 Port64 -> command/status port
 Port60 -> data port 這樣才是對的
由 Port64 的 bit0 來得知現在 Port60有沒有資料
至於如何得知現在 Port60 的資料是 kb or mouse
由 Port64 的 bit5 , 0 -> kb 資料, 1-> mouse 資料
作者 : netsaver(Andrew)
[ 貼文 15 | 人氣 2286 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/1/15 下午 11:38:39
>相信我吧, 因為我是寫 BIOS 的, 所以那些 int09h 我很熟的
>至於 MSDN 上的資料, 沒錯, 就像 eBoy 所說的一樣, 但是我認為那
>是從另外一個角度的觀點, 才會是這樣, 但如果真正要寫程式時
> Port64 -> command/status port
> Port60 -> data port 這樣才是對的
就我目前的參考資料來看, 的確如 掌握文武半邊天 所說的...

>由 Port64 的 bit0 來得知現在 Port60有沒有資料
>至於如何得知現在 Port60 的資料是 kb or mouse
>由 Port64 的 bit5 , 0 -> kb 資料, 1-> mouse 資料

請問 一 :
如果我在 Status Byte 的 Bit 1 為0時Write Port 64/60,
這時候Mouse也同時被移動或Keyboard鍵被按下了,
有沒有可能會造成Mouse or Keyboard 錯亂呢?

請問 二:
我目前有一個案例, 當我 Output Port 64/60 一組 Data 後,
KBC 會回填一個 Byte 的資料到 Port 60, 我再去 Input Port 60
得到這個 Data, 可是Windows同時也收到這個 Byte 當做是一個
Keyboard Scancode, 這樣極有可能會造成錯亂, 如果回填 Data
至 Port 60, Windows 一定會收到這個 Data 嗎?

再一次感謝各位的回答 !!!
作者 : cannibal(Cannibal)
[ 貼文 102 | 人氣 3129 | 評價 40 | 評價/貼文 0.39 | 送出評價 1 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/1/19 下午 10:40:04
插花一下

小弟想到一個問題
就是妳這個driver 是屬於legacy driver 還是 pnp driver 呢?
如果算是legacy driver....請問自己的driver直接對i/o動作會不會和
windows 裡面已經掛上去的 driver 相衝呢?

也就是windows 已經有driver 在負責 某device 的 i/o
而偶們又寫一個去動相同的i/o 
這樣會不會有問題呢?

因為小弟也都試用這樣的方式在coding
很害怕會有問題說
作者 : jc_23(掌握文武半邊天)
[ 貼文 119 | 人氣 7450 | 評價 530 | 評價/貼文 4.45 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/1/20 下午 03:33:14
post 一下我寫的 access port60/64 的大約流程

1. disable IRQ1 & IRQ12
2. disable KB & Mouse interface (ADh & A7h command)
3. check if any data at port60, if yes, save it
4. disable KB & Mouse's IRQ & interface by using KCCB command

5. Do any Port64 or Port60 command

6. Restore KCCB data
7. enable KB & Mouse interface (AEh & A8h command)
8. enable IRQ1 & IRQ12
9. check if any data save ?? if yes, restore it

如此的作法就避免了如果你在下命令時, 又按下 KB or Mouse 會有衝突的問
題, 因為那時你的 KB & Mouse 都是不能動的
作者 : netsaver(Andrew)
[ 貼文 15 | 人氣 2286 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/1/20 下午 11:35:27

>post 一下我寫的 access port60/64 的大約流程
>
>1. disable IRQ1 & IRQ12
>2. disable KB & Mouse interface (ADh & A7h command)
>3. check if any data at port60, if yes, save it
>4. disable KB & Mouse''s IRQ & interface by using KCCB command
>
>5. Do any Port64 or Port60 command
>
>6. Restore KCCB data
>7. enable KB & Mouse interface (AEh & A8h command)
>8. enable IRQ1 & IRQ12
>9. check if any data save ?? if yes, restore it
>
>如此的作法就避免了如果你在下命令時, 又按下 KB or Mouse 會有衝突的問
>題, 因為那時你的 KB & Mouse 都是不能動的
請問一下....
1.以上這些動作會造成 KB & Mouse 不能動...
那是不是說不太可能用polling的方式一直對 60/64 做io動作 ?

2.如果我是要在 Make Code 送出來的時候做 60/64 IO 動作(Polling),
而要在 Break Code 送出來的時候停止Polling, 會不會造成收不到Break Code ?

謝謝 !!!
作者 : jc_23(掌握文武半邊天)
[ 貼文 119 | 人氣 7450 | 評價 530 | 評價/貼文 4.45 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/1/22 下午 04:28:06

  >1.以上這些動作會造成 KB & Mouse 不能動...
  >那是不是說不太可能用polling的方式一直對 60/64 做io動作 ?
KB & Mouse 都是屬於被動的, 如果你要一直 polling 的話, 當然可以, 不過
你的 O/S 大概什麼也不能作, 因為要一直在那等你的 polling 程式

  >2.如果我是要在 Make Code 送出來的時候做 60/64 IO 動作(Polling),
  >而要在 Break Code 送出來的時候停止Polling, 會不會造成收不到Break Code ?
要達成這點, 我個人認為要寫一個最上層 Windows KB service 的 driver,
也就是當 Make/Break code 送出來時, 你的 driver 要比 Windows 原來的
KB driver 還早收到, 免得經過 Windows 的 KB driver 後, 一些值會改變
因為當你要作這些事時, 你的 KB 都是正常動作的, 即然是正常動作, Windows
的 KB driver 會第一個收到, 所以要在 Windows 之前才有機會作你想要的

以上第二點的回答純屬理論 , 沒實作過
作者 : netsaver(Andrew)
[ 貼文 15 | 人氣 2286 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/9/18 下午 04:39:32

>post 一下我寫的 access port60/64 的大約流程
>
>1. disable IRQ1 & IRQ12
>2. disable KB & Mouse interface (ADh & A7h command)
>3. check if any data at port60, if yes, save it
>4. disable KB & Mouse''s IRQ & interface by using KCCB command
>
>5. Do any Port64 or Port60 command
>
>6. Restore KCCB data
>7. enable KB & Mouse interface (AEh & A8h command)
>8. enable IRQ1 & IRQ12
>9. check if any data save ?? if yes, restore it
>
>如此的作法就避免了如果你在下命令時, 又按下 KB or Mouse 會有衝突的問
>題, 因為那時你的 KB & Mouse 都是不能動的

Hi,

我目前也是用這樣的做法.

不過,我想請問幾個問題.

我先簡單描述一下我的作法,

我的Driver是一個Keyboard Device Upper Filter driver,
我需做一個[Access 8042port(64,60)] 的動作,從User Mode透過DeviceIoControl()
送給Kernel Mode driver, Driver 會收到一個IRP_MJ_DEVICE_CONTROL request,
我的問題是:

1.我的IO動作應該直接在IRP_MJ_DEVICE_CONTROL的routine裡直接做呢?還是要
在StartIo routine裡做?

2.Access 8042 port需要用到Controller Object嗎?還是需要做其它的同步的動作?

如果我的描述不清楚,請讓我知道!!

謝謝回答!!
作者 : kennytsai(Kenny) C++卓越專家貼文超過500則
[ 貼文 720 | 人氣 2903 | 評價 2840 | 評價/貼文 3.94 | 送出評價 140 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/9/19 下午 01:53:37
>KB & Mouse 都是屬於被動的, 如果你要一直 polling 的話, 當然可以?
Keyboard上面有一個很小的處理器,他會在使用者按鍵後,'主動'的將資料透過SPI(CLK/DATA)送給系統(HOST/PC),HOST能下達的命令有點燈、ECHO、選擇掃瞄碼、讀取ID、設定打字時間及方式、重送、重置等,但就是沒辦法要求他告訴你目前按鍵的狀況(Polling),鍵盤會將按鍵儲存在FIFO內,在READY(CLK and DATA 高準位)狀態時主動上傳。
作者 : netsaver(Andrew)
[ 貼文 15 | 人氣 2286 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/9/19 下午 05:02:18
Dear All,

我現在面臨一個問題,

在我Disable IRQ之後,如果60 port還有資料(Keyboard or Mouse),
我應該把它存起來,等我的動作完成之後再把它"還"回去. 我的問題是
要怎麼"還"回去,我可以直接call port driver 的ISR routine嗎?
或者還有其它方式?? 我有試過直接把它寫到60 port去,不過很顯然
是不行!!

重述:我的driver是 Keyboard Upper Filter Driver.


謝謝!!
作者 : linwn(linwn)
[ 貼文 30 | 人氣 1033 | 評價 20 | 評價/貼文 0.67 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/9/21 上午 11:09:17
IoCallDriver()試過嗎?
作者 : jc_23(掌握文武半邊天)
[ 貼文 119 | 人氣 7450 | 評價 530 | 評價/貼文 4.45 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2003/9/29 下午 03:42:31
>我的Driver是一個Keyboard Device Upper Filter driver,
>我需做一個[Access 8042port(64,60)] 的動作,從User Mode透過DeviceIoControl()
>送給Kernel Mode driver, Driver 會收到一個IRP_MJ_DEVICE_CONTROL request,
>我的問題是:
>
>1.我的IO動作應該直接在IRP_MJ_DEVICE_CONTROL的routine裡直接做呢?還是要
>在StartIo routine裡做?
>
>2.Access 8042 port需要用到Controller Object嗎?還是需要做其它的同步的動作?

1.我的作法是在 IRP_MJ_DEVICE_CONTROL 的 routine 塈@動作
2.沒有用 Controller Object

>在我Disable IRQ之後,如果60 port還有資料(Keyboard or Mouse),
>我應該把它存起來,等我的動作完成之後再把它"還"回去. 我的問題是
>要怎麼"還"回去,我可以直接call port driver 的ISR routine嗎?
>或者還有其它方式?? 我有試過直接把它寫到60 port去,不過很顯然
>是不行!!

所謂填回去就是寫 Port60, 但在寫之前要判斷是屬 KB or MS 的資料後
先對 Port64 下 D2 or D3 , 再將保存的資料寫到 Port60

 由 Port64 的 bit1 可以知道目前 Port60 有沒有資料
 由 Port64 的 bit5 可以知道目前 Port60 的資料是 MS or KB, 1-> MS, 0-> KB
 要把資料回填到 Port60 前, 如果回填的資料屬於 KB 的, 那要先對 Port64 下
  D2 command, 如果回填的資料屬於 MS 的, 那要先對 Port64 下 D3 command
作者 : andachen(全真教)
[ 貼文 2 | 人氣 5 | 評價 50 | 評價/貼文 25 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/6/21 下午 01:55:06
我想你需要知道keyboard interface 的規定,
在 access port 60 之前,必須先確認 input buffer empty
和 output buffer empty 不然你會中斷了 mouse 及 keyboard
的資料,造成 mouse 亂跑
作者 : netsaver(Andrew)
[ 貼文 15 | 人氣 2286 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/6/21 下午 06:38:31

>我想你需要知道keyboard interface 的規定,
>在 access port 60 之前,必須先確認 input buffer empty
>和 output buffer empty 不然你會中斷了 mouse 及 keyboard
>的資料,造成 mouse 亂跑

我現在實作出來的方法都有Check OBF and IBF,但有時還是會造成Mouse Crazy,最常發生的時機有:
1. 當我寫完60 port的data後,對方回填一個response至60 port,然後就會出問題。
2. 當寫入的資料很大時(有多筆資料需寫至60 Port)。

由於目前我是利用HAL routine WRITE_PORT_UCHAR() 直接對[64,60] port 做I/O動作,因此才會造成synchronizes方面的問題,不過是否是導至Mouse Crazy的主因,我就不確定了。

一些Windows WDM Driver的書有提到NT Based的OS不允許Filter Driver直接Access I/O port,必須透過Port Driver來完成。因此,我去找了一個i8042prt.sys提供的IOCTL_INTERNAL_I8042_KEYBOARD_WRITE_BUFFER request,透過它,i8042prt會去處理相關的synchronizes問題,我以為這樣做才是「正道(正常管道)」,不知是否有誤?
 板主 : 徵求中
 > 驅動程式 - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - 驅動程式 - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
驅動程式
1 新兵衛 1240 
2 eBoy 980 
3 牧童哥 780 
4 北極熊 580 
5 天行者 580 
6 燒酒仙 440 
7 weber 380 
8 KEN 350 
9 jonay 180 
10 掌握文武半邊天 180 
驅動程式
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
0.09375