none
createfile  ring3ソフトと filterDevice の交信について RRS feed

  • 質問

  • driver&日本語新米です(え・・
    わが国のmsdn forumはdevice driverの部分がないためここへきた
    よろしくw


    最近driver勉強として、keyMappingのdriver作ってみたが
    ring3ソフトとfilterDeviceの交信はできません
    createfileは失敗、handle入手できない


    以下はcodeです
    ring3部分:
    hDevice = CreateFile(L"\\Device\\kbdFilter",  // drive to open
    0, // no access to the drive
    FILE_SHARE_READ | // share mode
    FILE_SHARE_WRITE,
    NULL, // default security attributes
    OPEN_EXISTING, // disposition
    0, // file attributes
    NULL); // do not copy file attributes
    ring0部分:
    わたしのdriverはdevice作ったが、symbolic linkは作ってない
    RtlInitUnicodeString(&filterName,L"\\Device\\kbdFilter");
    
            status = IoCreateDevice( 
                IN DriverObject, 
                IN sizeof(C2P_DEV_EXT), 
                IN &filterName, 
                IN pTargetDeviceObject->DeviceType, 
                IN pTargetDeviceObject->Characteristics, 
                IN FALSE, 
                OUT &pFilterDeviceObject 
                );
    symbolic linkがないため、普通みたいに hDevice = CreateFile(L"\\\\.\\com1"...) はできません
    こんな状態で、どうやってhandleを入手するのか?
    わさびなんかいらない
    • 移動 Mike Wang (MSCS) 2012年10月2日 12:26 (移動元:Windows デバイスドライバー開発)
    2009年8月21日 9:27

すべての返信

  • 千羽ましろさん、こんにちは。

    誰も返信していないようなので、ご参考まで。。。
    User Mode 側の CreateFile() でハンドルを取得したいのであれば、たぶん DefineDosDevice() API を使えば取れるんじゃないかなと思います。
    たとえば、Keyboard Filter Driver 側で以下のように実装しているのであれば、

    -----------------------
    RtlInitUnicodeString(&filterName,L"\\Device\\kbdFilter");

            status = IoCreateDevice(
                IN DriverObject,
                IN sizeof(C2P_DEV_EXT),
                IN &filterName,
                IN pTargetDeviceObject->DeviceType,
                IN pTargetDeviceObject->Characteristics,
                IN FALSE,
                OUT &pFilterDeviceObject
                );
    -----------------------

    User Mode 側では、

    -----------------------
    #define MY_DEVICE_NAME  L"MykbFilter"
    #define MY_TARGET_PATH  L"\\Device\\kbdFilter"

    ....

        BOOL        bResult;

        bResult = DefineDosDevice( DDD_RAW_TARGET_PATH, MY_DEVICE_NAME, MY_TARGET_PATH );
        if ( bResult )
        {
            HANDLE  hTargetDevice = INVALID_HANDLE_VALUE;
            TCHAR   tszDeviceName[MAX_PATH];

            wsprintf( tszDeviceName, TEXT("\\\\.\\%s"), MY_DEVICE_NAME );
            hTargetDevice = CreateFile( tszDeviceName,
                                        0,
                                        FILE_SHARE_READ | FILE_SHARE_WRITE,
                                        NULL,
                                        OPEN_EXISTING,
                                        0,
                                        NULL );

            if ( hTargetDevice != INVALID_HANDLE_VALUE )
            {
                // TODO:
                ....
                ....


                CloseHandle( hTargetDevice );
            }

            bResult = DefineDosDevice( DDD_RAW_TARGET_PATH | DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, MY_DEVICE_NAME, MY_TARGET_PATH );
        }
    ....

    -----------------------

    みたいな感じで、DefineDosDevice() API で自分で適当な DOS デバイス名を付けて、その名前で CreateFile() をコールすればハンドルが取得できるかも知れません。
    ただ実際には自分では試したことないので、自信ないですけど。
    (それとも、もう解決済みかな?)

     

    2009年8月25日 9:33