1

私はドライバー開発を始めたばかりで、起動時にオペレーティングシステムを介してデバイスドライバーを初期化しようとしています。ドライバーはWindowsEmbeddedCE6.0用です。

デバイスが初期化されるたびに、シリアルポートを介してPCにメッセージを送信させようとしています。

DWORD MYD_Init(LPCTSTR pContext, LPCVOID lpvBusContext)
{
    DWORD dwResult = 1;

    RETAILMSG(TRUE, (TEXT("MyDriver: Initializing!\n")));
    DEBUGMSG(TRUE, (TEXT("MyDriver: Initializing!\n")));

    return dwResult;
} //end MYD_Init

DLLEntry関数が呼び出されます。

BOOL DllEntry(HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved) 
{
    switch (dwReason) {

        case DLL_PROCESS_ATTACH:
            RETAILMSG(TRUE, (TEXT("MyDriver - Process Attached\n")));
            DEBUGMSG(TRUE, (TEXT("MyDriver - Process Attached\n")));
            break;

        case DLL_PROCESS_DETACH: 
            RETAILMSG(TRUE, (TEXT("MyDriver - Process Detached\n")));
            DEBUGMSG(TRUE, (TEXT("MyDriver - Process Detached\n")));
            break;

        .......

        default:
            break;
    } //end Switch

    return TRUE;

} //end DllEntry

そして、ここにシリアルポートログからの数行があります:

FMD_Init: Blocks reserved for the bootloader/run-time image: 3124
I2C Driver: Intialization Started
MyDriver - Process AttachedMyDriver - Process DetachedTurn on clocks for Device block (in OTG_CTRL)
2589 CUSBFN::IsConfigurationSupportable
2593 CUSBFN::IsEndpointSupportable
2595 CUSBFN::IsEndpointSupportable

3行目は、ドライバーがロードされていることを示していますが(私は思う)、MYD_Initは後で呼び出されません。何が欠けているのかわかりません。別のファイルから参照が欠落している可能性があります。私の.defファイルには、EXPORTSの下にMYD_Initが含まれています。.regキーは、BuiltInパス[HKEY_LOCAL_MACHINE \ Drivers \ BuiltIn\MyDriver]内にあります。他にあるかどうかわからない。

私の本当の質問は、MYD_Init関数を呼び出すために私が見逃している/忘れている可能性のあるものは何ですか?

私がこの仕事をするのを手伝うためにあなたたちが提供できるどんな助けにも感謝します!

編集:

CreateFile関数が呼び出されないことに気づき、これが私の問題の原因であると感じています。DllEntryの前にMYD_Initが呼び出されないように、この関数をどこに配置する必要があるかを理解するために実行できるいくつかの手順は何ですか?

または多分ActivateDevice/ActiveDeviceEx関数?OSは、[HKEY_LOCAL_MACHINE \ Drivers \ BuiltIn]の下にリストされているドライバーに対してこれらを自動的に呼び出しますか、それとも手動で呼び出す必要がありますか?

提供できる洞察に改めて感謝します!

編集2:

読みやすいレジストリ設定は次のとおりです。

[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\MyDriver]
    "Prefix"="MYD"
    "Dll"="myDriver.dll"
    "Index"=dword:1
    "Flags"=dword:0

編集3:

これは、アプリケーションを介してドライバーを開こうとした後の出力です。

USBFN: dwDeviceStatus: 0x11, m_fAttached: Attached
USBFN: dwDeviceStatus: 0x1, m_fAttached: Attached
MyDriver - Process Attached 
MyDriver - Process Detached 
COM_Open
COM_Open
IOCTL_SERIAL_SET_COMMTIMEOUTS (50,1,50,5,500)
IOCTL_SERIAL_SET_COMMTIMEOUTS (50,1,50,5,500)
IOCTL_SERIAL_SET_COMMTIMEOUTS (-1,0,0,2,500)
Testing Driver 
MyDriver - Process Attached 
MyDriver - Process Detached 
Driver Tested

3行目と4行目は、システムの起動中のロードの試行です。最後の4行は、ドライバーをロードするアプリケーションの実行時に出力されます。「TestingDriver」と「DriverTested」は、アプリケーションの最初と最後に配置されました。

編集4:ダンプビン出力

Dump of file myDriver.dll

File Type: DLL

Section contains the following exports for myDriver.dll

    00000000 characteristics
    501012DA time date stamp Wed Jul 25 10:38:02 2012
        0.00 version
           1 ordinal base
           9 number of functions
           9 number of names

    ordinal hint RVA      name

          1    0 000013D4 DllEntry = DllEntry
          2    1 00001348 MYD_Close = MYD_Close
          3    2 0000130C MYD_Deinit = MYD_Deinit
          4    3 000013B8 MYD_IOControl = MYD_IOControl
          5    4 000012B8 MYD_Init = MYD_Init
          6    5 00001328 MYD_Open = MYD_Open
          7    6 00001364 MYD_Read = MYD_Read
          8    7 0000139C MYD_Seek = MYD_Seek
          9    8 00001380 MYD_Write = MYD_Write

Summary

        1000 .data
        1000 .pdata
        1000 .reloc
        1000 .text
4

1 に答える 1

1

Xxx_Initドライバがロードされたときに呼び出されます。これは、ActivateDeviceを手動で呼び出すか、で適切なレジストリ設定を設定してDeviceManagerによって自動的にロードされるようにすることでロードできます[HKLM\Drivers\BuiltIn](使用しているキーを表示してください)。

Xxx_InitDllEntryDLLがOSによってロードされるときに呼び出されるため、後で呼び出されることが保証されますDllEntry。これは、DeviceManagerがロードする前に発生する必要があります。

CreateFileXxx_Openこれらのすべてのアクションが発生した後、ドライバーのメソッドを呼び出します。

したがって、イベントの順序は次のとおりです。

  1. OSがDLLをロードし、DllEntry
  2. Device Managerは、ドライバーを(手動または自動で)ロードし、Xxx_Init
  3. アプリはを呼び出すことCreateFileでドライバーを開き、デバイスマネージャーを呼び出しますXxx_Open

リストに2.5に該当する可能性のある電力管理要素がいくつかある可能性がありますが、それらはオプションであり、発生している問題とは無関係である可能性があります。

通常、ドライバーの起動を最初にテストするときに、テストアプリへのActivateDevice/からの明示的な呼び出しを使用します。DeactivateDevice毎回システムを再起動しなくても、ドライバDLLを置き換えることができます。

したがって、あなたへの質問は次のとおりです。

  1. アプリから手動でActivateDeviceを呼び出すと、どうなりますか?
  2. デバイスマネージャにドライバをロードさせるために現在使用しているレジストリキーは何ですか?
于 2012-07-24T17:48:31.340 に答える