2012-10-15 3 views
2

J'essaie d'appeler IOCTL_BTH_GET_LOCAL_INFO en utilisant DeviceIoControl, ce que je crois que cela peut être fait (en conséquence à Bluetooth Profile Driver IOCTLs).DeviceIoControl renvoie ERROR_INVALID_USER_BUFFER

Je suis sur un Windows 7 x64 en utilisant Visual Studio 2012 (probablement avec la configuration par défaut).

Les descripteurs ont une valeur valide (j'ai supprimé le code de validation) mais DeviceIoControl renvoie toujours ERROR_INVALID_USER_BUFFER (erreur 1784).

Voici le code:

int main() { 

    BTH_LOCAL_RADIO_INFO buffer; 
    BOOL fStatus; 
    HANDLE h; 
    DWORD returned = 0; 

    h = CreateFile(
     TEXT("\\\\.\\BthPan"), 
     GENERIC_READ | GENERIC_WRITE , 
     FILE_SHARE_READ | FILE_SHARE_WRITE, 
     NULL, 
     OPEN_EXISTING, 
     0, 
     NULL); 


    fStatus = DeviceIoControl(
      h, 
      IOCTL_BTH_GET_LOCAL_INFO, 
      NULL, 0, 
      (LPVOID)&buffer, sizeof(BTH_LOCAL_RADIO_INFO), 
      &returned, 
      (LPOVERLAPPED) NULL 
      ); 
(...) 

Après quelques recherches, j'ai essayé les solutions suivantes:

  1. Changer l'alignement pack structure 1/4/8 octet (avec des options VS);
  2. Utilisation de valeurs alignées sur 8 octets (plus tard, j'ai découvert que c'était déjà le cas pour , même avec des types de données inférieurs à 8 octets). Après un moment, j'ai lu quelque part que DeviceIoControl s'occupe de désalignement pour vous, donc probablement pas besoin de s'inquiéter à ce sujet.

Toutes les solutions ci-dessus ont échoué. Que pense tu que cela soit? VS a un tas de configurations pour Win32, mais cela ne m'a jamais donné de problème avant (la première fois avec IOCTL cependant).

J'ai vu une partie de ce code sur 32feet.NET, donc c'est probablement une de mes erreurs (je ne vois pas de différence).

Répondre

1

Vous envoyez le IOCTL_BTH_GET_LOCAL_INFO au mauvais périphérique (réseau personnel Bluetooth au lieu de Bluetooth Radio).

Donc je vous suggère d'utiliser BluetoothFindFirstRadio, BluetoothFindNextRadio et BluetoothFindRadioClose pour simplement parcourir les radios Bluetooth locales, plutôt que de deviner les noms de périphériques DOS corrects pour eux.

Questions connexes