2012-05-24 77 views
1

我一直在開發c#中的應用程序,並且我想在插入USB大容量存儲時進行一些驗證。用於C#的C庫,用於從操作系統隊列中刪除消息

問題是,在驗證過程中,我想從消息隊列中取出海量存儲的消息。

一個人告訴我,你不能在C#中這樣做,但只能在C語言中使用匯編語言。

你們能幫我找到一個C庫,可以從C#中使用它從操作系統消息隊列中取消消息嗎?

protected override void WndProc(ref Message m) 
     { 
      switch (m.Msg) 
      { 

       case Win32.WM_DEVICECHANGE: 


        //OnDeviceChange(ref m);     

        break; 
      } 
      base.WndProc(ref m); 

     } 

     void OnDeviceChange(ref Message msg) 
     { 
      int wParam = (int)msg.WParam; 

      if (wParam == Win32.DBT_DEVICEARRIVAL) 
      { 
       label1.Text = "Arrival"; 
       //MessageBox.Show("" + wParam); 
       //msg = Message.Create(new IntPtr(),1,new IntPtr(),new IntPtr()); 
      } 
      else if (wParam == Win32.DBT_DEVICEREMOVECOMPLETE) label1.Text = 
      "Remove"; 
     } 

我已經這樣做了,但它只是告訴你發生了什麼事。

我想關閉消息,以便操作系統不會知道與設備相鄰,然後在驗證通過驗證時再次將消息置於其上。

回答

1

操作系統不依賴於WM_DEVICECHANGE來了解設備,因此阻止該消息不會執行任何有用的操作。

您要求做的事情非常困難,因爲必須加載操作系統驅動程序和文件系統才能訪問設備並執行驗證,但聽起來您想阻止任何其他程序使用它。即使在內核中實施的防病毒軟件也不會阻止設備在掃描之前出現。

您可能會實現一個文件系統過濾器驅動程序,報告設備上沒有任何文件,直到掃描完成,但這會嚴重影響看到該設備出現的軟件,但這些文件在稍後纔可用。而C#對於實現Windows驅動程序沒有用處。甚至沒有「在C#中使用C庫」(我假設你的意思是p/invoke)。 C#代碼與內核中的環境不兼容。

2

不會發生,男人。當您收到Win32 WM_DEVICECHANGE消息時,該設備已經非常多。內核已經意識到設備,加載的驅動程序,並在這種情況下作爲大容量存儲設備,已經創建了一個卷。這就是(主要)內核模式活動。然後Win32(用戶模式)將此消息廣播到所有頂層窗口。你完全可以在Win32級別使用任何語言WM_DEVICECHANGE機制。

要做到這一點,你將不得不寫一個設備驅動程序。這些都是用C語言編寫的,以內核模式運行,並且比簡單的C#應用​​程序實現起來要複雜得多。我建議你尋找其他解決方案來完成你正在嘗試做的事情。這是...順便說一下?

「否則丟棄該消息,以便操作系統將不知道這件事」

很抱歉,但你完全錯過了點。 WM_DEVICECHANGE從OS(即Win32子系統)發送到,所有頂級窗口都被髮送。這只是一個通知,沒有與此消息相關的控制權。 WM_DEVICECHANGE對於您阻止訪問設備的目標沒有任何幫助。就像我說的,爲此你需要一個設備驅動程序,很可能是一個文件系統過濾驅動程序。對於那個驅動程序,你可以發送一個允許訪問設備的IOCTL(來自用戶模式)。

+0

我想要做的是當大容量存儲設備插入時,如果密碼正常,它會要求輸入密碼......它將消息轉發給操作系統,否則會消息消息,以便操作系統不知道關於它......(所有這些都要在窗口服務中完成......) – kashifmehmood