_Code de contrôle COPYCHUNK IOCTL

Le code de contrôle IOCTL _ COPYCHUNK initie une copie côté serveur d’une plage de données, également appelée un segment.

Pour effectuer cette opération, appelez la fonction DeviceIoControl avec les paramètres suivants.

BOOL DeviceIoControl(
  (HANDLE) hDevice,             // handle to device
  IOCTL_COPYCHUNK,              // dwIoControlCode
  (LPVOID) lpInBuffer,          // input buffer
  (DWORD) nInBufferSize,        // size of input buffer
  (LPVOID) lpOutBuffer,         // output buffer
  (DWORD) nOutBufferSize,       // size of output buffer
  (LPDWORD) lpBytesReturned,    // number of bytes returned
  (LPOVERLAPPED) lpOverlapped   // OVERLAPPED structure
);

Paramètres

hDevice [ dans]

Handle du fichier qui est la cible de l’opération de copie côté serveur. Pour obtenir ce descripteur, appelez la fonction CreateFile .

dwIoControlCode [ dans]

Code de contrôle de l’opération. Utilisez IOCTL _ COPYCHUNK pour cette opération.

lpInBuffer

Pointeur vers la mémoire tampon d’entrée, une structure de _ _ copie COPYCHUNK SRV . Pour plus d'informations, consultez la section Notes.

nInBufferSize [ dans]

Taille de la mémoire tampon d’entrée, en octets.

lpOutBuffer [ à]

Pointeur vers la mémoire tampon de sortie, une structure de _ _ réponse SRV COPYCHUNK . Pour plus d'informations, consultez la section Notes.

nOutBufferSize [ dans]

Taille de la mémoire tampon de sortie en octets.

lpBytesReturned [ à]

Pointeur vers une variable qui reçoit la taille des données stockées dans la mémoire tampon de sortie, en octets.

Si la mémoire tampon de sortie est trop petite, l’appel échoue, la fonction GetLastError retourne l' erreur _ _ mémoire tampon insuffisante et lpBytesReturned est égal à zéro.

Si le paramètre lpOverlapped a la valeur null, lpBytesReturned ne peut pas avoir la valeur null. Même lorsqu’une opération ne retourne aucune donnée de sortie et que le paramètre lpOutBuffer a la valeur null, DeviceIoControl utilise lpBytesReturned. Après une telle opération, la valeur de lpBytesReturned est sans signification.

Si lpOverlapped n’a pas la valeur null, LpBytesReturned peut avoir la valeur null. Si lpOverlapped n’a pas la valeur null et que l’opération retourne des données, lpBytesReturned n’a aucun sens tant que l’opération avec chevauchement n’est pas terminée. Pour récupérer le nombre d’octets retournés, appelez la fonction GetOverlappedResult . Si le paramètre hDevice est associé à un port de terminaison d’e/s, vous pouvez récupérer le nombre d’octets renvoyés en appelant la fonction GetQueuedCompletionStatus .

lpOverlapped [ dans]

Pointeur vers une structure OVERLAPPED .

Si le paramètre hDevice a été ouvert sans spécifier d' indicateur de fichier avec _ _ chevauchement, lpOverlapped est ignoré.

Si hDevice a été ouvert avec l’indicateur de fichier avec l' indicateur de _ _ chevauchement , l’opération est exécutée en tant qu’opération Overlapped (asynchrone). Dans ce cas, lpOverlapped doit pointer vers une structure OVERLAPPED valide qui contient un handle vers un objet d’événement. Dans le cas contraire, la fonction échoue de façon imprévisible.

Pour les opérations avec chevauchement, DeviceIoControl retourne immédiatement, et l’objet d’événement est signalé lorsque l’opération est terminée. Sinon, la fonction ne retourne pas jusqu’à ce que l’opération soit terminée ou jusqu’à ce qu’une erreur se produise.

Valeur retournée

Si l’opération se termine correctement, DeviceIoControl retourne une valeur différente de zéro.

Si l’opération échoue ou est en attente, DeviceIoControl retourne la valeur zéro. Pour obtenir des informations détaillées sur l’erreur, appelez GetLastError.

Remarques

Ce code de contrôle n’a aucun fichier d’en-tête associé. Vous devez définir le code de contrôle et les structures de données comme suit.

#define IOCTL_COPYCHUNK CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 262, METHOD_BUFFERED,  FILE_READ_ACCESS)

typedef struct _SRV_COPYCHUNK {
    LARGE_INTEGER SourceOffset;
    LARGE_INTEGER DestinationOffset;
    ULONG  Length;
} SRV_COPYCHUNK, *PSRV_COPYCHUNK;

typedef struct _SRV_COPYCHUNK_COPY {
    SRV_RESUME_KEY SourceFile;
    ULONG          ChunkCount;
    ULONG          Reserved;
    SRV_COPYCHUNK  Chunk[1];    // Array
} SRV_COPYCHUNK_COPY, *PSRV_COPYCHUNK_COPY;

typedef struct _SRV_COPYCHUNK_RESPONSE {
    ULONG          ChunksWritten;
    ULONG          ChunkBytesWritten;
    ULONG          TotalBytesWritten;
} SRV_COPYCHUNK_RESPONSE, *PSRV_COPYCHUNK_RESPONSE;

Ces membres peuvent être décrits comme suit.

Membre Description
SourceOffset
Offset, en octets, entre le début du fichier source et le segment à copier.
DestinationOffset
Offset, en octets, entre le début du fichier cible et l’emplacement où le segment doit être copié.
Base
Nombre d’octets de données dans le bloc à copier. Doit être supérieur à zéro et inférieur ou égal à 1 Mo. Longueur * ChunkCount doit être inférieur ou égal à 16 Mo.
SourceFile
Clé qui représente le fichier source avec les données à copier. Cette clé est obtenue via la _ _ clé de _ reprise _ de la demande FSCTL SRV.
ChunkCount
Nombre de segments à copier. Doit être supérieur à zéro et inférieur ou égal à 256.
Réservé
Ce membre est réservé à l’usage du système ; n’utilisez pas.
Transfert
Tableau de structures ChunkCount SRV _ COPYCHUNK , un pour chaque segment à copier. La longueur, en octets, de ce tableau doit être ChunkCount * sizeof (SRV _ COPYCHUNK).
ChunksWritten
Si l’opération a échoué avec un paramètre d’erreur _ non valide _, cette valeur indique le nombre maximal de segments que le serveur acceptera dans une seule requête, qui est 256. Sinon, cette valeur indique le nombre de segments qui ont été écrits avec succès.
ChunkBytesWritten
Si l’opération a échoué avec un paramètre d’erreur _ non valide _, cette valeur indique le nombre maximal d’octets que le serveur autorisera à écrire en un seul segment, soit 1 Mo. Sinon, cette valeur indique le nombre d’octets qui ont été correctement écrits dans le dernier segment qui n’a pas été traité avec succès (si une écriture partielle s’est produite).
TotalBytesWritten
Si l’opération a échoué avec un paramètre d’erreur _ non valide _, cette valeur indique le nombre maximal d’octets que le serveur doit copier dans une seule requête, qui est de 16 Mo. Sinon, cette valeur indique le nombre d’octets qui ont été écrits avec succès.

Voir aussi

DeviceIoControl

clé de reprise de la _ demande FSCTL SRV _ _ _