Partager via


Fonction DuplicateHandle (handleapi.h)

Dupliquer un handle d’objet.

Syntaxe

BOOL DuplicateHandle(
  [in]  HANDLE   hSourceProcessHandle,
  [in]  HANDLE   hSourceHandle,
  [in]  HANDLE   hTargetProcessHandle,
  [out] LPHANDLE lpTargetHandle,
  [in]  DWORD    dwDesiredAccess,
  [in]  BOOL     bInheritHandle,
  [in]  DWORD    dwOptions
);

Paramètres

[in] hSourceProcessHandle

Handle vers le processus avec le handle à dupliquer.

Le handle doit disposer du droit d’accès PROCESS_DUP_HANDLE. Pour plus d’informations, consultez Processus de sécurité et de droits d’accès.

[in] hSourceHandle

Handle à dupliquer. Il s’agit d’un handle d’objet ouvert valide dans le contexte du processus source. Pour obtenir la liste des objets dont les handles peuvent être dupliqués, consultez la section Remarques suivante.

Si hSourceHandle est un pseudo-handle retourné par GetCurrentProcess ou GetCurrentThread, hSourceProcessHandle doit être un handle pour le processus appelant DuplicateHandle.

[in] hTargetProcessHandle

Handle du processus qui doit recevoir le handle dupliqué. Le handle doit disposer du droit d’accès PROCESS_DUP_HANDLE.

Ce paramètre est facultatif et peut être spécifié comme NULL si l’indicateur de DUPLICATE_CLOSE_SOURCE est défini dans Options.

[out] lpTargetHandle

Pointeur vers une variable qui reçoit le handle en double. Cette valeur de handle est valide dans le contexte du processus cible.

Si hSourceHandle est un pseudo-handle retourné par GetCurrentProcess ou GetCurrentThread, DuplicateHandle le convertit en handle réel en processus ou thread, respectivement.

Si lpTargetHandle a la valeur NULL, la fonction dupliquera le handle, mais ne retourne pas la valeur de handle dupliquée à l’appelant. Ce comportement existe uniquement pour la compatibilité descendante avec les versions précédentes de cette fonction. Vous ne devez pas utiliser cette fonctionnalité, car vous perdrez les ressources système jusqu’à ce que le processus cible se termine.

Ce paramètre est ignoré si hTargetProcessHandle a la valeur NULL.

[in] dwDesiredAccess

Accès demandé pour le nouveau handle. Pour connaître les indicateurs qui peuvent être spécifiés pour chaque type d’objet, consultez la section Remarques suivante.

Ce paramètre est ignoré si le paramètre dwOptions spécifie l’indicateur DUPLICATE_SAME_ACCESS. Sinon, les indicateurs qui peuvent être spécifiés dépendent du type d’objet dont le handle doit être dupliqué.

Ce paramètre est ignoré si hTargetProcessHandle a la valeur NULL.

[in] bInheritHandle

Variable qui indique si le handle est hériter. Si la valeur est TRUE, le handle dupliqué peut être hérité par de nouveaux processus créés par le processus cible. Si la valeur est FALSE, le nouveau handle ne peut pas être hérité.

Ce paramètre est ignoré si hTargetProcessHandle a la valeur NULL.

[in] dwOptions

Actions facultatives. Ce paramètre peut être égal à zéro ou n’importe quelle combinaison des valeurs suivantes.

Valeur Sens
DUPLICATE_CLOSE_SOURCE
0x00000001
Ferme le handle source. Cela se produit quel que soit l’état d’erreur retourné.
DUPLICATE_SAME_ACCESS
0x00000002
Ignore le paramètre dwDesiredAccess . Le handle en double a le même accès que le handle source.

Valeur retournée

Si la fonction réussit, la valeur de retour est différente de zéro.

Si la fonction échoue, la valeur de retour est égale à zéro. Pour obtenir des informations d’erreur étendues, appelez GetLastError.

Remarques

Le handle dupliqué fait référence au même objet que le handle d’origine. Par conséquent, toutes les modifications apportées à l’objet sont reflétées par les deux handles. Par exemple, si vous dupliquez un handle de fichier, la position de fichier actuelle est toujours la même pour les deux handles. Pour que les handles de fichiers aient des positions de fichier différentes, utilisez la fonction CreateFile pour créer des handles de fichier qui partagent l’accès au même fichier.

DuplicateHandle peut être appelé par le processus source ou le processus cible (ou un processus qui est à la fois la source et le processus cible). Par exemple, un processus peut utiliser DuplicateHandle pour créer un doublon non modifiable d’un handle hériter ou un handle avec un accès différent de celui du handle d’origine.

Le processus source utilise la fonction GetCurrentProcess pour obtenir un handle à lui-même. Ce handle est un pseudo-handle, mais DuplicateHandle le convertit en handle de processus réel. Pour obtenir le handle de processus cible, il peut être nécessaire d’utiliser une forme de communication interprocesseur (par exemple, un canal nommé ou une mémoire partagée) pour communiquer l’identificateur de processus au processus source. Le processus source peut utiliser cet identificateur dans la fonction OpenProcess pour obtenir un handle au processus cible.

Si le processus qui appelle DuplicateHandle n’est pas également le processus cible, le processus source doit utiliser la communication interprocess pour transmettre la valeur du handle dupliqué au processus cible.

DuplicateHandle peut être utilisé pour dupliquer un handle entre un processus 32 bits et un processus 64 bits. Le handle résultant est correctement dimensionné pour fonctionner dans le processus cible. Pour plus d’informations, consultez l’interopérabilité des processus.

DuplicateHandle peut dupliquer des handles aux types d’objets suivants.

Objet Descriptif
Access token (Jeton d'accès) Le handle est retourné par la fonction CreateRestrictedToken, DuplicateToken, DuplicateTokenEx, OpenProcessToken ou OpenThreadToken .
Modifier la notification Le handle est retourné par la fonction FindFirstChangeNotification .
Appareil de communication Le handle est retourné par la fonction CreateFile .
Entrée de console Le handle est retourné par la fonction CreateFile lorsque CONIN$ est spécifié, ou par la fonction GetStdHandle lorsque STD_INPUT_HANDLE est spécifié. Les handles de console peuvent être dupliqués pour une utilisation uniquement dans le même processus.
Mémoire tampon d’écran de la console Le handle est retourné par la fonction CreateFile lorsque CONOUT$ est spécifié, ou par la fonction GetStdHandle lorsque STD_OUTPUT_HANDLE est spécifié. Les handles de console peuvent être dupliqués pour une utilisation uniquement dans le même processus.
Bureau (informatique) Le handle est retourné par la fonction GetThreadDesktop .
Événement Le handle est retourné par la fonction CreateEvent ou OpenEvent .
Fichier Le handle est retourné par la fonction CreateFile .
Mappage de fichiers Le handle est retourné par la fonction CreateFileMapping .
Travail Le handle est retourné par la fonction CreateJobObject .
Mailslot Le handle est retourné par la fonction CreateMailslot .
Mutex Le handle est retourné par CreateMutex ou [OpenMutex](.. Fonction /synchapi/nf-synchapi-openmutexw.md).
Tuyau Un handle de canal nommé est retourné par la fonction CreateNamedPipe ou CreateFile . Un handle de canal anonyme est retourné par la fonction CreatePipe .
Processus Le handle est retourné par la fonction CreateProcess, GetCurrentProcess ou OpenProcess .
Clé du Registre Le handle est retourné par la fonction RegCreateKey, RegCreateKeyEx, RegOpenKey ou RegOpenKeyEx . Notez que les handles de clé de Registre retournés par la fonction RegConnectRegistry ne peuvent pas être utilisés dans un appel à DuplicateHandle.
Sémaphore Le handle est retourné par la fonction CreateSemaphore ou OpenSemaphore .
Fil de discussion Le handle est retourné par la fonction CreateProcess, CreateThread, CreateRemoteThread ou GetCurrentThread
Minuteur Le handle est retourné par la fonction CreateWaitableTimerW ou OpenWaitableTimerW .
Transaction Le handle est retourné par la fonction CreateTransaction .
Station de fenêtre Le handle est retourné par la fonction GetProcessWindowStation .
 

Vous ne devez pas utiliser DuplicateHandle pour dupliquer les handles aux objets suivants :

  • Ports d’achèvement des E/S. Aucune erreur n’est retournée, mais le handle dupliqué ne peut pas être utilisé.
  • Prises. Aucune erreur n’est retournée, mais le handle dupliqué peut ne pas être reconnu par Winsock au niveau du processus cible. En outre, l’utilisation de DuplicateHandle interfère avec le comptage de référence interne sur l’objet sous-jacent. Pour dupliquer un handle de socket, utilisez la fonction WSADuplicateSocket .
  • Pseudo-handles autres que ceux retournés par les fonctions GetCurrentProcess ou GetCurrentThread .
Le paramètre dwDesiredAccess spécifie les droits d’accès du nouveau handle. Tous les objets prennent en charge les droits d’accès standard. Les objets peuvent également prendre en charge des droits d’accès supplémentaires en fonction du type d’objet. Pour plus d’informations, consultez les rubriques suivantes : Dans certains cas, le nouveau handle peut avoir plus de droits d’accès que le handle d’origine. Toutefois, dans d’autres cas, DuplicateHandle ne peut pas créer de handle avec plus de droits d’accès que l’original. Par exemple, un handle de fichier créé avec le droit d’accès GENERIC_READ ne peut pas être dupliqué afin qu’il dispose à la fois de la GENERIC_READ et du droit d’accès GENERIC_WRITE.

Normalement, le processus cible ferme un handle dupliqué lorsque ce processus est terminé à l’aide du handle. Pour fermer un handle dupliqué à partir du processus source, appelez DuplicateHandle avec les paramètres suivants :

  • Définissez hSourceProcessHandle sur le processus cible à partir de l’appel DuplicateHandle qui a créé le handle.
  • Définissez hSourceHandle sur le handle dupliqué pour fermer.
  • Définissez hTargetProcessHandle sur NULL.
  • Définissez dwOptions sur DUPLICATE_CLOSE_SOURCE.

Exemples

L’exemple suivant crée un mutex, duplique un handle au mutex et le transmet à un autre thread. La duplication du handle garantit que le nombre de références est augmenté afin que l’objet mutex ne soit pas détruit tant que les deux threads n’ont pas fermé le handle.

#include <windows.h>

DWORD CALLBACK ThreadProc(PVOID pvParam);

int main()
{
    HANDLE hMutex = CreateMutex(NULL, FALSE, NULL);
    HANDLE hMutexDup, hThread;
    DWORD dwThreadId;

    DuplicateHandle(GetCurrentProcess(), 
                    hMutex, 
                    GetCurrentProcess(),
                    &hMutexDup, 
                    0,
                    FALSE,
                    DUPLICATE_SAME_ACCESS);

    hThread = CreateThread(NULL, 0, ThreadProc, 
        (LPVOID) hMutexDup, 0, &dwThreadId);

    // Perform work here, closing the handle when finished with the
    // mutex. If the reference count is zero, the object is destroyed.
    CloseHandle(hMutex);

    // Wait for the worker thread to terminate and clean up.
    WaitForSingleObject(hThread, INFINITE);
    CloseHandle(hThread);
    return 0;
}

DWORD CALLBACK ThreadProc(PVOID pvParam)
{
    HANDLE hMutex = (HANDLE)pvParam;

    // Perform work here, closing the handle when finished with the
    // mutex. If the reference count is zero, the object is destroyed.
    CloseHandle(hMutex);
    return 0;
}

Spécifications

Besoin Valeur
Client minimum requis Windows 2000 Professionnel [applications de bureau | Applications UWP]
Serveur minimal pris en charge Windows 2000 Server [applications de bureau | Applications UWP]
plateforme cible Fenêtres
En-tête handleapi.h (include Windows.h)
Bibliothèque Kernel32.lib
DLL Kernel32.dll

Voir aussi

closeHandle

Gérer l’héritage

handle et fonctions d’objet