1

USB ドライバと通信しようとしています。ハンドルを取得できますが、一度使用するDeviceIoControlと失敗し、GetLastError()エラーは正しくない関数であると表示されます。これをデバッグする方法に困惑しています。XP 32ビットマシンを使用しています。

Handle =     CREATEFILE(   DevicePath1,
                            GENERIC_READ | GENERIC_WRITE,
                 FILE_SHARE_READ,                                                        
                             NULL,
                             OPEN_EXISTING,
                             FILE_FLAG_OVERLAPPED,
                             NULL);
                    if (INVALID_HANDLE_VALUE == Handle)
                    {
                        printf("INVALIDHANDLE USB\n");
                        return PHNFCSTVAL(CID_NFC_DAL, NFCSTATUS_INVALID_DEVICE);
                    }
                    else
                    {

                        //  Call device IO Control interface (USB_TEST_IOCTL_VERSION_NUMBER) in driver
                        if ( !DeviceIoControl(Handle,
                                            USB_TEST_IOCTL_VERSION_NUMBER,
                                            NULL,
                                            0,
                                            version,
                                            sizeof(version),
                                            &lenght,
                                            NULL)
                        )
                        {

//Display the last error killing my program

void* lpBuffer;

FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
               NULL,
              GetLastError(),
              MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
              (LPTSTR) &lpBuffer,
              0,
              NULL );
printf(" Version: %x\n", version);
printf("USB_TEST_IOCTL_VERSION_NUMBER, %x\n", USB_TEST_IOCTL_VERSION_NUMBER);
printf(" &lenght: %x\n", &lenght);
MessageBox( NULL, (LPCTSTR)lpBuffer, TEXT("LastRrror"), MB_OK );
LocalFree( lpBuffer );

            printf("USB HIO Control interface FAIL\n");
                            return PHNFCSTVAL(CID_NFC_DAL, NFCSTATUS_INVALID_DEVICE);
4

1 に答える 1

0

最も可能性の高い原因は (Xearinox が指摘したように)、新しいバージョンのデバイス ドライバーにその特定の制御コードがないことです。更新されたドキュメントやヘッダー ファイルをベンダーから入手する必要があります。

また、非同期ハンドルを開き、それを同期 I/O に使用しようとしています。DeviceIoControl のドキュメントから:

hDevice が FILE_FLAG_OVERLAPPED フラグで開かれた場合、操作はオーバーラップ (非同期) 操作として実行されます。この場合、lpOverlapped は、イベント オブジェクトへのハンドルを含む有効な OVERLAPPED 構造体を指している必要があります。

于 2014-08-04T04:40:01.480 に答える