_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. |