2010-10-19 42 views
0

希望找到一些在Windows中有服務經驗的人。CreateFile沒有返回正確的句柄 - 德爾福中的設備

我試圖使用以太網適配器的NdisProt司機德爾福

 
my_Handle := CreateFile(PChar('\\.\NdisProt'), 
    GENERIC_WRITE or GENERIC_READ, 0, nil, 
    OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); 

(有\\.\\NdisProt也試過)執行my_Handle總是後的值是「4008」小數,並且GetLastError總是返回0

如果我試圖讀取或寫入文件我得到acces違規,任何人都知道w我得到這種不想要的行爲?

+0

是'\\。'甚至是一個有效的路徑嗎? – 2010-10-19 21:10:27

+1

它用於直接訪問設備 - 不像文件系統中的普通文件。 http://msdn.microsoft.com/en-us/library/aa363858%28VS.85%29.aspx – 2010-10-19 21:13:11

+1

你嘗試谷歌搜索?我知道設備驅動程序可能很難連接到(我用CD-ROM驅動器做過類似的事情);像這樣的搜索幫助了我很大的時間:http://www.google.com/search?q=createfile+\\.\NdisProt(它可能只是一個權限或命名isssue)。 – 2010-10-19 21:48:36

回答

8

如果CreateFile不返回Invalid_Handle_Value,那麼它給了你一個有效的句柄,否則該設備的驅動程序是嚴重的錯誤。假設前者。

訪問衝突與您的句柄值無關。這意味着您訪問的內存不屬於您的進程(例如,通過取消引用空指針,未初始化的指針,非指針或已釋放的指針)。你的問題在別處,也許在你忽略在這裏展示的閱讀或書寫代碼中。

2

您問題中的代碼不是賦值語句。這是一個比較表達。你應該從編譯器得到一個警告,告訴變量的值是未定義的。如果在執行該代碼後它的值始終爲4008,那麼您應該檢查它是否在之前執行該代碼的值爲。它可能只是CreateFile正在返回一個有效的句柄值,但是你沒有使用它返回的值。

如果4008不是值CreateFile返回,那麼很有可能4008不是有效的句柄值。如果操作系統把句柄當作指針(或者它對句柄執行某種類型的轉換來生成指針),那麼它可能與該句柄對應的指針不是你的進程中的有效地址;這將解釋訪問衝突。

+0

謝謝你的新答案Rob,我忘了把分號放在上面的問題中,所以是這是一個任務。(現在更新)我在Createfile之前調試了my_Handle的值,結果爲0。運行編譯器時,如果IDE不支持調試器,則句柄的值始終爲4000.我在C#中使用了原始源,並且試圖使其成爲本機。在原始代碼中,句柄始終得到250到300之間的值(至少在我的電腦上)原始代碼:http://www.codeproject.com/KB/IP/sendrawpacket.aspx – 2010-10-26 11:52:25

+0

@ Ed.C:句柄值很大程度上不相關;重要的是句柄指的是什麼。如果你始終得到相同的值,那可能只是表明Delphi RTL在處理的分配方面是一致的。 .NET下的可變性似乎表明某種非確定性或類似的東西...... – SamB 2011-04-29 03:27:34