線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:6849
推到 Plurk!
推到 Facebook!

如何由AP來停止USB裝置 ?

答題得分者是:conundrum
greatcat
一般會員


發表:7
回覆:9
積分:3
註冊:2005-01-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-10-13 17:35:08 IP:220.130.xxx.xxx 未訂閱
以USB姆指碟裝置而言,要拔出時,會先用Applet"Safely Remove Hareware"來移除. 使得主機寫回資料到USB姆指碟裝置,以免有未寫入的資料還在快取記憶體中, 使得USB姆指碟裝置錯亂. (參考,執行,%windir%\system32\rundll32.exe shell32.dll,Control_RunDLL hotplug.dll_ ) 根據測試瞭解,Applet"Safely Remove Hareware" 會使USB姆指碟裝置收到如下IRP IRP_MN_QUERY_REMOVE_DEVICE IRP_MN_REMOVE_DEVICE 好奇的,AP層如何對driver層發出IRP呢? 還是是透過PnP/IO/Device manager來發呢? 我喵故我在
------
我喵故我在
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-10-14 09:23:04 IP:59.104.xxx.xxx 未訂閱
IRP 是 Driver 在幹的事
greatcat
一般會員


發表:7
回覆:9
積分:3
註冊:2005-01-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-10-14 16:25:05 IP:220.130.xxx.xxx 未訂閱
打漏了 會使USB姆指碟裝置 "的driver" 收到如下IRP ... IRP IO request package,WDM driver內的東東... 我喵故我在
------
我喵故我在
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-10-15 04:25:30 IP:59.104.xxx.xxx 未訂閱
引言: 打漏了 會使USB姆指碟裝置 "的driver" 收到如下IRP ... IRP IO request package,WDM driver內的東東...
你可以去看看書局寫 WDM 的書。只有兩三本。 先了解後再來看這個問題。
greatcat
一般會員


發表:7
回覆:9
積分:3
註冊:2005-01-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-10-15 10:24:03 IP:220.137.xxx.xxx 未訂閱
嗯嗯, WDM的書,有些書是出來串場的, 實際上有用的, 大約四~五本吧... 但是,都沒說到, 如何從AP層,如何使裝置卸載的寫法. 只有提到,AP層的"裝置管理員"及"安全移除"會發IRP使裝置drvier啟動卸載機制,但沒提到如何使AP能發出訊息來卸載其它的drvier. 目前想到可行的, 是先掛上一只dummy driver,AP與這隻dummy driver通訊,由dummy driver對USB USB disk driver丟 remove IRP,使USB disk driver啟動卸載機制,超麻煩的. 我喵故我在
------
我喵故我在
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-10-16 18:06:16 IP:59.104.xxx.xxx 未訂閱
有沒有想過 driver 用來做什麼? driver 對上做介面。對下做工作。 對上。就是對應 open, close, read, write 這些東西。 而對下就是完成那些函數的工作。 這樣 AP 才可以只叫用 open, close 就能使用 device 如果要 AP 去做那樣的事。。。。。。好像。。。。。。
conundrum
尊榮會員


發表:893
回覆:1272
積分:643
註冊:2004-01-06

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-10-16 23:47:50 IP:218.175.xxx.xxx 未訂閱
【轉貼】yeahware 網站的停用usb範例 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=74628 試改看看 台灣災難都是事後算帳 無人飛行載具(Unmanned Aerial Vehicle,UAV)為什麼沒大量應用於救災行列
greatcat
一般會員


發表:7
回覆:9
積分:3
註冊:2005-01-12

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-10-17 11:08:49 IP:220.130.xxx.xxx 未訂閱
感謝conundrum大大及暗黑破壞神大大. 下載鏈結中的enable,eject範例, 可以知道如何用AP去enable/disable device. eject範例中,可以解出如何unload driver by AP. 技術範圍感覺和列舉HID joystick差不多,使用同一系列的API, 有列舉HID基礎的人,可以看一看 ^^~ 我喵故我在
------
我喵故我在
conundrum
尊榮會員


發表:893
回覆:1272
積分:643
註冊:2004-01-06

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-10-18 11:32:14 IP:218.175.xxx.xxx 未訂閱
hi greatcat 請問一個問題 如果以USB姆指碟裝置而言 工作型態 庵要可讀取所有USB任何資料檔案型態 但無法寫入於USB 原因 很多企業公司因PC的便利性 由於USB可以十分方便攜帶大量資料 所以 要求有無這樣 防寫機制 如同1.44的方式 未經授權資料無法由USB攜帶 /////////////////////// 聽你看了這麼多 driver層的書 WDM 不知道是否有提過這樣需求解法 基本上 答案庵知道 等你解看看 台灣災難都是事後算帳 無人飛行載具(Unmanned Aerial Vehicle,UAV)為什麼沒大量應用於救災行列
greatcat
一般會員


發表:7
回覆:9
積分:3
註冊:2005-01-12

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-10-18 12:43:21 IP:60.248.xxx.xxx 未訂閱
嗯,我只玩HID類, storage類就不熟了.就猜看看囉... 我分析USB架構如下 [AP] ---[IO manager]--[file system]---- [USB storage driver] [USB bus driver] ---------------- [HAL] --------------- | | | --------- [USB disk] /////////// 所以,有三種可能的方法, (1)寫類以防毒程式,要寫入時,若為可抽取裝置,就回報錯誤...電腦效能會降低. (2)換掉USB storage driver,接到write 的URB,就回報錯誤...工程大浩大,如果有driver tools中的USB storage driver來改,才可行. (3)在[USB storage driver]上,加一層filter driver,攔掉write 的URB...filter driver不好學. 對嗎? ///// 無人飛行載具為什麼沒大量應用於救災行列...利委不是股東呀,台灣就是這樣子:P ///// 我喵故我在
------
我喵故我在
conundrum
尊榮會員


發表:893
回覆:1272
積分:643
註冊:2004-01-06

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-10-18 13:02:23 IP:218.175.xxx.xxx 未訂閱
基本上 windows2000以上USB防寫功能 OS有提供 只需註冊regedit位置即可使所有usb 執行 防寫功能 不用開機就可以防寫 但是要解除 防寫必須重新開始 因為 在KTOP沒看到這樣需求有人問 也沒有人提過 所以問問你看看 reg位置資料 你試找看看 如有空庵在po上 台灣災難都是事後算帳 無人飛行載具(Unmanned Aerial Vehicle,UAV)為什麼沒大量應用於救災行列
greatcat
一般會員


發表:7
回覆:9
積分:3
註冊:2005-01-12

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-10-20 18:17:46 IP:220.130.xxx.xxx 未訂閱
喔~Conundrum大大,你真拼呀, MIS的一定愛死了這個功能. 接下來要挑戰的,是不是如何不用USB碟拷出資料? 這個我有點子, 用Audio line out接到錄音帶如何? 回到8088小教授時代 只是容量後有限而已. ///
------
我喵故我在
conundrum
尊榮會員


發表:893
回覆:1272
積分:643
註冊:2004-01-06

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-10-20 22:42:01 IP:218.175.xxx.xxx 未訂閱
程式中有兩個bug 
那已經有人修正過了 資料在那 1 某大陸程式討論區 2 google就找的到了 庵不喜歡回這種問題 所以你自己善用 google 的搜索技巧把 庵只給方向 哈哈
接下來要挑戰的,是不是如何不用USB碟拷出資料? 
不用 查查 BS7799 認證標準 就有一車的機制要解決了 導入BS7799 標準─企業責無旁貸 http://delphi.ktop.com.tw/topic.php?topic_id=51644 台灣災難都是事後算帳 無人飛行載具(Unmanned Aerial Vehicle,UAV)為什麼沒大量應用於救災行列
conundrum
尊榮會員


發表:893
回覆:1272
積分:643
註冊:2004-01-06

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-10-20 22:54:55 IP:218.175.xxx.xxx 未訂閱
 http://www.book23.com/data/web5304/20050228/20050228__3530331.html
我copy人家的代碼給你:    絕對可用的,100% Delphi代碼!! 
http://www.yeahware.com/download/eject.zip 
選擇Show hidden device後在USB Mass Storage Device處就是Eject了!!!     關鍵代碼     function CM_Get_DevNode_Status(pulStatus: PULong; pulProblemNumber: PULong; 
dnDevInst: DWord; ulFlags: ULong): DWord; stdcall; 
external CfgMgr32ModuleName name 'CM_Get_DevNode_Status';     function CM_Request_Device_Eject(dnDevInst: DWord; out pVetoType: TPNPVetoType; 
pszVetoName: PChar; ulNameLength: ULong; ulFlags: ULong): DWord; stdcall; 
external SetupApiModuleName name 'CM_Request_Device_EjectA';     if (CM_Get_DevNode_Status(@Status, @Problem, DeviceInfoData.DevInst, 0) <> CR_SUCCESS) then 
begin 
exit; 
end; 
VetoName[0] := #0; 
case CM_Request_Device_Eject(DeviceInfoData.DevInst, VetoType, @VetoName, SizeOf(VetoName), 0) of 
CR_SUCCESS: 
begin 
MessageBox(Handle, PChar(’Eject OK (Veto: '   VetoName   ')'), 'Vetoed', MB_OK); end; 
CR_REMOVE_VETOED: 
begin 
MessageBox(Handle, PChar('Failed to eject the Device (Veto: '   VetoName   ')'), 'Vetoed', MB_OK); 
end; 
else 
begin 
MessageBox(Handle, PChar('Failed to eject the Device ('   SysErrorMessage(GetLastError)   ')'), 'Failure', MB_OK); 
end; 
end;     那個Eject原代碼是有Bug的,修正如下     添加 
function TForm1.GetDevInfo(var hDevInfo: hDevInfo): boolean; 
begin 
// Get a handle to all devices in all classes present on system 
hDevInfo := SetupDiGetClassDevs(nil, nil, 0, DIGCF_PRESENT or DIGCF_ALLCLASSES); 
Result := hDevInfo <> Pointer(INVALID_HANDLE_VALUE); 
end;     調用為: 
procedure TForm1.FormCreate(Sender: TObject); 
begin 
if (not LoadSetupAPI) then 
begin 
ShowMessage('Could not load SetupAPI.dll'); 
exit; 
end; 
DevInfo := nil; 
ShowHidden := false; 
// Get a handle to all devices in all classes present on system 
if not GetDevInfo(DevInfo) then 
begin 
ShowMessage('GetClassDevs'); 
exit; 
end; 
// Get the Images for all classes, and bind to the TreeView 
ClassImageListData.cbSize := SizeOf(TSPClassImageListData); 
if (not SetupDiGetClassImageList(ClassImageListData)) then 
begin 
ShowMessage('GetClassImageList'); 
exit; 
end; 
ImageList.Handle := ClassImageListData.ImageList; 
TreeView.Images := ImageList; 
// Add the devices to the TreeView window. 
EnumAddDevices(ShowHidden, TreeView, DevInfo); 
end;     procedure TForm1.mRefreshDisplayClick(Sender: TObject); 
begin 
if not GetDevInfo(DevInfo) then 
begin 
ShowMessage('GetClassDevs'); 
exit; 
end; 
EnumAddDevices(ShowHidden, TreeView, DevInfo); 
end;     case CM_Request_Device_Eject(DeviceInfoData.DevInst, VetoType, @VetoName, SizeOf(VetoName), 0) of 
CR_SUCCESS: 
begin 
MessageBox(Handle, 'Successful to eject the Device', 'Done', MB_OK); 
if not GetDevInfo(DevInfo) then 
begin 
ShowMessage('GetClassDevs'); 
exit; 
end; 
EnumAddDevices(ShowHidden, TreeView, DevInfo); 
end;
試看看 庵以前看的那篇 懶的找了 台灣災難都是事後算帳 無人飛行載具(Unmanned Aerial Vehicle,UAV)為什麼沒大量應用於救災行列
greatcat
一般會員


發表:7
回覆:9
積分:3
註冊:2005-01-12

發送簡訊給我
#15 引用回覆 回覆 發表時間:2005-10-21 00:02:28 IP:220.137.xxx.xxx 未訂閱
感謝你呀... 我試到原來的程式有問題, 就動手改了, 後來才發現, 網路上有人改好了< >< > 現在在努力解bug2... 我喵故我在
------
我喵故我在
系統時間:2024-05-03 11:39:22
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!