2012-08-12 287 views
1

我想用我的USB驱动程序进行通信。我能够获得一个句柄,但一旦我用DeviceIoControl失败,GetLastError()说,错误是不正确的函数。我难以理解如何进行调试。我正在使用XP 32位机器。为什么DeviceIoControl的失败,“不正确的函数”

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); 
+0

,驱动程序代码是在哪里呢? – Xearinox 2012-08-12 13:45:14

+0

@Xearinox如果我下正常站在你,我的控制代码'#定义USB_TEST_IOCTL_VERSION_NUMBER CTL_CODE(FILE_DEVICE_UNKNOWN,0x807,METHOD_BUFFERED,FILE_ANY_ACCESS)''那里CTL_CODE' is'#定义CTL_CODE(设备类型,函数,方法,访问)(\ ( (设备类型)<< 16)|((访问)<< 14)|((功能)<< 2)|(方法)\ )'这是传递给设备驱动程序,并最终于USB。我的驱动程序位于WINDOWS \ system32 \ DRIVERS \ myDriver.sys' – IPA8654 2012-08-12 21:43:18

+0

OK。但是,在驱动程序中响应这个IOCTL的代码在哪里? – Xearinox 2012-08-12 21:58:04

回答

0

最可能的原因(如Xearinox指出)是该装置的驱动程序的较新版本不具有该特定控制代码。您需要从供应商处获得更新的文档和/或头文件。

此外,您打开一个异步句柄,然后试图将其用于同步I/O。从DeviceIoControl的文档:

如果用FILE_FLAG_OVERLAPPED标志打开hDevice,该操作将作为重叠(异步)操作执行。在这种情况下,lpOverlapped必须指向包含事件对象句柄的有效OVERLAPPED结构。

相关问题