Partager via


Technique 1 : définition d’un champ « 64 Bits »

Le champ « 64 Bits » est défini dans le code de contrôle IOCTL ou FSCTL. Ce champ contient un indicateur de bits qui est toujours défini pour les appelants 64 bits, mais est toujours clair pour 32 bits. Le bit du code de contrôle choisi comme champ « 64 Bits » est spécifique au pilote, mais il doit s’agir d’un bit qui n’est jamais défini pour les appelants 32 bits. Un bon choix pour la plupart des pilotes est le bit le plus significatif (MSB) dans le champ Fonction.

Par exemple, les codes de contrôle IOCTL (FSCTL) utilisés dans les pilotes 32 bits contiennent quatre champs de bits :

Type d’appareil Access Fonction Méthode

16 bits

2 bits

12 bits

2 bits

Tant qu’aucun des codes de contrôle existants définis par le pilote ne définit le msb dans le champ Fonction, ces codes de contrôle peuvent continuer à être utilisés par les applications en mode utilisateur 32 bits.

Pour prendre en charge les appelants 64 bits, le pilote définit un champ de fonction plus court d’un bit. Ce bit est redéfini en tant que champ « 64 Bits » :

Type d’appareil Access 64 Bits Fonction Méthode

16 bits

2 bits

1 bit

11 bits

2 bits

L’exemple de code suivant montre comment définir un champ « 64 Bits » dans un fichier d’en-tête de pilote :

#define REGISTER_FUNCTION 0     // Define the IOCTL function code

#ifdef  _WIN64
#define CLIENT_64BIT   0x800
#define REGISTER_FUNCTION 0
#define IOCTL_REGISTER   CTL_CODE(FILE_DEVICE_UNKNOWN, \
  CLIENT_64BIT|REGISTER_FUNCTION, METHOD_BUFFERED, FILE_ANY_ACCESS)
#else
#define IOCTL_REGISTER   CTL_CODE(FILE_DEVICE_UNKNOWN, \
  REGISTER_FUNCTION, METHOD_BUFFERED, FILE_ANY_ACCESS)
#endif

typedef struct _IOCTL_PARAMETERS {
    PVOID   Addr;
    SIZE_T  Length;
    HANDLE  Handle;
} IOCTL_PARAMETERS, *PIOCTL_PARAMETERS;