1

我們的嵌入式系統程序員爲我們的移動硬件開發了一個虛擬串行端口驅動程序的外殼,並且我一直在填充使其運行的方法。驅動程序按預期工作,它模擬噴出NMEA字符串(GPS數據)的USB設備的COM端口。啓動時加載設備驅動程序的問題 - WM6.1

我簡稱爲WM6,但如果它有區別,則操作系統是WM6.1。

我遇到的問題是驅動程序不能在WM6上啓動設備時加載。該驅動程序是爲CE5和WM6開發的,但是在CE5上,驅動程序「確實」在啓動時加載,這指向了WM6配置問題。 也許值得注意的是,在這一點上,驅動程序將使用ActivateDevice()方法加載WM6和CE5,這是我迄今爲止使用的WM6,一個小型測試應用程序啓動驅動程序,所以我至少可以測試司機正在研究WM6。

註冊表已經填充了驅動程序啓動所需的密鑰。所以驅動程序應該在啓動時加載,沒有任何問題。 HKEY_LOCAL_MACHINE \ Drivers \ BuiltIn包含一個子密鑰A36D_GPS_COM,並且包含該密鑰。

DeviceArrayIndex:0

設備類型:0

DLL:A36D.dll

標誌:0

友好名稱:A36D GPS COM端口

指數:8

訂購:3

前綴:COM

優先級:0

優先級:256

從我可以告訴有一般2到這個問題,我已經研究了共同的答案。這些想法是由嵌入式程序員給我的,但我研究瞭如何自己做。

1)當驅動程序嘗試加載時,COM端口已經在使用,即使該設備加載後該COM端口最終是空閒的。我已將註冊表中的索引值從1更改爲20,並重新引導設備,並且驅動程序不會加載到指定的COM端口。因此,爲了更徹底地嘗試和測試,我將另一臺設備從COM9移到了COM8,並將我的驅動程序移動到COM9(使用上述註冊表設置)。其他設備驅動程序在COM8上啓動時加載非常愉快,但我的設備驅動程序無法在COM9上啓動。我甚至嘗試調整其他設置,但仍然無法加載啓動時。

2)CE5和WM6之間的另一個可能的問題和區別是安全性。因此,使用MSDN文章http://msdn.microsoft.com/en-us/library/bb737570.aspx我已經開始了簽名和XML配置。使用特權密鑰(未過期),A36D.dll在Visual Studio中籤名,並且創建的安裝CAB文件也使用相同的密鑰進行簽名。創建_setup.xml文件並將其附加到cab文件,以便將簽名密鑰添加到證書存儲區。使用相同的密鑰再次對CAB文件進行簽名以確保它仍然有效。另外_setup.xml被打包到它自己的.CPF文件中。 CAB和CPF文件都將密鑰添加到證書存儲「HKEY_LOCAL_MACHINE \ Comm \ Security \ SystemCertificates」,因此知道這是行得通的。謹慎地說,我已將它安裝到特權,非特權,ROOT和SPC證書商店。但是當移動設備啓動時,設備驅動程序仍然不會加載到device.exe中。

除了在驅動程序上調用ActivateDevice()的啓動應用程序的解決方法之外,我很難理解如何讓這個驅動程序在啓動時加載。

我覺得它非常奇怪,它在CE5但不在WM6中,我只是不知道其他任何可能導致問題。

有沒有人有任何進一步的建議,可以嘗試。

所有幫助表示讚賞。

+0

小的更新,這仍然是一個進步的工作。 – JonWillis 2010-09-07 16:27:25

回答

1

我更熟悉Windows CE,但這裏有幾件事情:

  • 你的DllMain函數添加調試打印,看其是否被稱爲?
  • 您是否檢查依賴項中斷?難道你不知道在CE6下有沒有WM6下的DLL?
+0

嗨Shaihi, 我已經看過DllMain,並且沒有調試打印,我添加了一個,並且將在週二早上再次訪問WM6設備時進行測試。我知道一個事實,在啓動時沒有其他調試打印被寫入,因此如果dll被加載,那麼可能會立即調試可能會導致問題發生。 至於依賴中斷,我不知道如何在移動操作系統上執行此操作。但是在考慮這個問題時,可以用ActiviateDevice手動激活驅動程序,那麼所有需要的依賴關係都已經安裝好了,不是嗎? 謝謝你的建議。 – JonWillis 2010-08-29 09:45:06

+0

我錯過了使用ActivateDevice在WM下加載的部分。這排除了依賴關係。您是否嘗試更改註冊表中提交的'訂單'?也許驅動程序試圖在它需要準備好的某些功能之前加載。 – Shaihi 2010-08-29 10:27:58

+0

嗨Shaihi,沒問題,所有幫助表示讚賞。 我確實考慮過順序,並且實際上試圖讓它加載得更快,而不是後來使用COM端口,而不是其他文件尚未加載的依賴性問題,而當我下次遇到問題時將它設置爲255,看看是否有幫助。 也許值得一提的是,有人指出了簽名的可能問題。雖然我已經用我們的證書籤名了,但他們建議重新下載到新的(2010年1月)SDK證書,並使用cabsigner.exe而不是signtool.exe,並查看它是否加載。你能否看到這是一個可能的問題? Thx – JonWillis 2010-08-30 10:04:02

0

這是一個答案,但不是'正確的'。這只是一個圍繞加載問題的工作。我在一週之前就想出了這一點,但不想將其用作解決方案。所以這只是一個臨時解決方案。

以下代碼用於手動加載驅動程序,它使用C++調用C#編寫,我習慣於C#,這就是爲什麼我做了C#項目而不是C++項目。那些使用C++的人無疑會在C++應用程序中創建它。

public class LoadDriver 
{ 
    [DllImport("coredll.dll", SetLastError = true)] 
    public extern static IntPtr ActivateDevice(string lpszDevKey, int dwClientInfo); 
    [DllImport("coredll.dll", SetLastError = true)] 
    public static extern void SignalStarted(uint dw); 

    public static void Main(string[] args) 
    { 
     Cursor.Current = Cursors.Default; 
     IntPtr handle = ActivateDevice("Drivers\\BuiltIn\\A36D_GPS_COM", 0); 
     if(handle != IntPtr.Zero) 
     { 
      Console.Write("Success"); 
     } 

     if (args.Length > 0) 
     { 
      try 
      { 
       SignalStarted(uint.Parse(args[0])); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
     } 
    } 
} 

現在爲了這個工作需要在啓動時運行,所以我添加了所需的註冊表項。

"HKEY_LOCAL_MACHINE/init" 
Launch62 = A36D_loaddriver.exe 
Depend62 = "32 00" 

「32 00」是確保shell32.exe

現在該裝置的啓動時,驅動程序被激活DEVICE.EXE後它加載。

至於簽名/註冊表問題,這仍在研究中。